Просмотр исходного кода

Implemented SGen Validation Tests

Andreas Mülder 14 лет назад
Родитель
Сommit
7fb70c5d69

+ 1 - 0
plugins/org.yakindu.sct.generator.genmodel/META-INF/MANIFEST.MF

@@ -33,6 +33,7 @@ Export-Package: org.yakindu.sct.generator.genmodel,
  org.yakindu.sct.generator.genmodel.parser.antlr,
  org.yakindu.sct.generator.genmodel.parser.antlr.internal,
  org.yakindu.sct.generator.genmodel.resource,
+ org.yakindu.sct.generator.genmodel.scoping,
  org.yakindu.sct.generator.genmodel.serializer,
  org.yakindu.sct.generator.genmodel.services,
  org.yakindu.sct.generator.genmodel.validation

+ 4 - 4
plugins/org.yakindu.sct.generator.genmodel/src/org/yakindu/sct/generator/genmodel/scoping/SGenScopeProvider.java

@@ -65,7 +65,7 @@ public class SGenScopeProvider extends XbaseScopeProvider {
 		return super.getScope(context, reference);
 	}
 
-	private IScope scope_GeneratorEntry_elementRef(final EObject context,
+	protected IScope scope_GeneratorEntry_elementRef(final EObject context,
 			final EReference reference) {
 		GeneratorModel generatorModel = (GeneratorModel) EcoreUtil2
 				.getRootContainer(context);
@@ -82,7 +82,7 @@ public class SGenScopeProvider extends XbaseScopeProvider {
 				});
 	}
 
-	private IScope scope_Parameter(final EObject context, EReference reference) {
+	protected IScope scope_Parameter(final EObject context, EReference reference) {
 		IScope libraryScope = getLibraryScope(context.eResource());
 		return new FilteringScope(libraryScope,
 				new Predicate<IEObjectDescription>() {
@@ -109,7 +109,7 @@ public class SGenScopeProvider extends XbaseScopeProvider {
 				});
 	}
 
-	private IScope scope_Type(EObject context, EReference reference) {
+	protected IScope scope_Type(EObject context, EReference reference) {
 		IScope libraryScope = getLibraryScope(context.eResource());
 		return new FilteringScope(libraryScope,
 				new Predicate<IEObjectDescription>() {
@@ -120,7 +120,7 @@ public class SGenScopeProvider extends XbaseScopeProvider {
 				});
 	}
 
-	private SimpleScope getLibraryScope(Resource resource) {
+	protected SimpleScope getLibraryScope(Resource resource) {
 		GeneratorModel generatorModel = (GeneratorModel) EcoreUtil
 				.getObjectByType(resource.getContents(),
 						SGenPackage.Literals.GENERATOR_MODEL);

+ 22 - 10
plugins/org.yakindu.sct.generator.genmodel/src/org/yakindu/sct/generator/genmodel/validation/SGenJavaValidator.java

@@ -54,6 +54,17 @@ import com.google.common.collect.Lists;
  */
 public class SGenJavaValidator extends AbstractSGenJavaValidator {
 
+	public static final String MISSING_REQUIRED_PARAMETER = "Missing required Parameter";
+	public static final String MISSING_REQUIRED_FEATURE = "Missing required feature";
+	public static final String DUPLICATE_PARAMETER = "Duplicate parameter!";
+	public static final String DUPLICATE_FEATURE = "Duplicate feature!";
+	public static final String UNKOWN_GENERATOR = "Unkown Generator";
+	public static final String INCOMPATIBLE_TYPE_BOOLEAN_EXPECTED = "Incompatible type, Boolean expected";
+	public static final String INCOMPATIBLE_TYPE_INTEGER_EXPECTED = "Incompatible type, Integer expected";
+	public static final String INCOMPATIBLE_TYPE_FLOAT_EXPECTED = "Incompatible type, Float expected";
+	public static final String INCOMPATIBLE_TYPE_STRING_EXPECTED = "Incompatible type, String expected";
+	public static final String UNKNOWN_CONTENT_TYPE = "Unknown content type '";
+
 	@Check
 	public void checkContentType(GeneratorEntry entry) {
 		GeneratorModel generatorModel = EcoreUtil2.getContainerOfType(entry,
@@ -65,7 +76,7 @@ public class SGenJavaValidator extends AbstractSGenJavaValidator {
 			return;
 		}
 		if (!contentType.equals(descriptor.getContentType())) {
-			error("Unknown content type '" + contentType + "'",
+			error(UNKNOWN_CONTENT_TYPE + contentType + "'",
 					SGenPackage.Literals.GENERATOR_ENTRY__CONTENT_TYPE);
 		}
 	}
@@ -81,22 +92,22 @@ public class SGenJavaValidator extends AbstractSGenJavaValidator {
 		switch (parameterType) {
 		case BOOLEAN:
 			if (!(value instanceof BoolLiteral))
-				error("Incompatible type, Boolean expected",
+				error(INCOMPATIBLE_TYPE_BOOLEAN_EXPECTED,
 						SGenPackage.Literals.FEATURE_PARAMETER_VALUE__EXPRESSION);
 			break;
 		case INTEGER:
 			if (!(value instanceof IntLiteral))
-				error("Incompatible type, Integer expected",
+				error(INCOMPATIBLE_TYPE_INTEGER_EXPECTED,
 						SGenPackage.Literals.FEATURE_PARAMETER_VALUE__EXPRESSION);
 			break;
 		case FLOAT:
 			if (!(value instanceof RealLiteral))
-				error("Incompatible type, Float expected",
+				error(INCOMPATIBLE_TYPE_FLOAT_EXPECTED,
 						SGenPackage.Literals.FEATURE_PARAMETER_VALUE__EXPRESSION);
 			break;
 		case STRING:
 			if (!(value instanceof StringLiteral))
-				error("Incompatible type, String expected",
+				error(INCOMPATIBLE_TYPE_STRING_EXPECTED,
 						SGenPackage.Literals.FEATURE_PARAMETER_VALUE__EXPRESSION);
 			break;
 		}
@@ -133,7 +144,8 @@ public class SGenJavaValidator extends AbstractSGenJavaValidator {
 			GeneratorExtensions.getGeneratorDescriptorForId(model
 					.getGeneratorId());
 		} catch (NoSuchElementException e) {
-			error(String.format("Unkown Generator %s!", model.getGeneratorId()),
+			error(String.format(UNKOWN_GENERATOR + " %s!",
+					model.getGeneratorId()),
 					SGenPackage.Literals.GENERATOR_MODEL__GENERATOR_ID);
 		}
 	}
@@ -150,7 +162,7 @@ public class SGenJavaValidator extends AbstractSGenJavaValidator {
 					}
 				});
 		if (Iterables.size(filter) > 1) {
-			error("Duplicate feature!",
+			error(DUPLICATE_FEATURE,
 					SGenPackage.Literals.FEATURE_CONFIGURATION__TYPE);
 		}
 
@@ -168,7 +180,7 @@ public class SGenJavaValidator extends AbstractSGenJavaValidator {
 					}
 				});
 		if (Iterables.size(filter) > 1) {
-			error("Duplicate parameter!",
+			error(DUPLICATE_PARAMETER,
 					SGenPackage.Literals.FEATURE_PARAMETER_VALUE__PARAMETER);
 		}
 	}
@@ -189,7 +201,7 @@ public class SGenJavaValidator extends AbstractSGenJavaValidator {
 		}
 		for (FeatureType featureType : requiredFeatures) {
 			if (!configuredTypes.contains(featureType.getName()))
-				error(String.format("Missing required feature %s",
+				error(String.format(MISSING_REQUIRED_FEATURE + " %s",
 						featureType.getName()),
 						SGenPackage.Literals.GENERATOR_ENTRY__ELEMENT_REF);
 		}
@@ -220,7 +232,7 @@ public class SGenJavaValidator extends AbstractSGenJavaValidator {
 		}
 		for (String string : requiredParameters) {
 			if (!configuredParameters.contains(string))
-				error(String.format("Missing required Parameter %s", string),
+				error(String.format(MISSING_REQUIRED_PARAMETER + " %s", string),
 						SGenPackage.Literals.FEATURE_CONFIGURATION__TYPE);
 		}
 	}

+ 6 - 0
test-plugins/org.yakindu.sct.generator.genmodel.test/.project

@@ -20,9 +20,15 @@
 			<arguments>
 			</arguments>
 		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
 	</buildSpec>
 	<natures>
 		<nature>org.eclipse.pde.PluginNature</nature>
 		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
 	</natures>
 </projectDescription>

+ 1 - 2
test-plugins/org.yakindu.sct.generator.genmodel.test/src/org/yakindu/sct/generator/genmodel/test/AllTests.java

@@ -19,8 +19,7 @@ import org.junit.runners.Suite.SuiteClasses;
  * 
  */
 @RunWith(value = Suite.class)
-@SuiteClasses(value = { SGenJavaValidatorTest.class, SGenParserRuleTest.class,
-		HelpIntegrationTest.class })
+@SuiteClasses(value = { SGenJavaValidatorTest.class, HelpIntegrationTest.class })
 public class AllTests {
 
 }

+ 72 - 13
test-plugins/org.yakindu.sct.generator.genmodel.test/src/org/yakindu/sct/generator/genmodel/test/SGenJavaValidatorTest.java

@@ -14,6 +14,7 @@ import static junit.framework.Assert.fail;
 
 import java.lang.reflect.Method;
 
+import org.eclipse.emf.common.util.Diagnostic;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.xtext.junit4.InjectWith;
 import org.eclipse.xtext.junit4.XtextRunner;
@@ -28,6 +29,8 @@ import org.yakindu.sct.generator.genmodel.test.util.AbstractSGenTest;
 import org.yakindu.sct.generator.genmodel.test.util.SGenInjectorProvider;
 import org.yakindu.sct.generator.genmodel.validation.SGenJavaValidator;
 import org.yakindu.sct.model.sgen.FeatureConfiguration;
+import org.yakindu.sct.model.sgen.GeneratorModel;
+import static org.yakindu.sct.generator.genmodel.validation.SGenJavaValidator.*;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
@@ -65,7 +68,11 @@ public class SGenJavaValidatorTest extends AbstractSGenTest {
 	 */
 	@Test
 	public void checkContentType() {
-		fail("Implement me");
+		EObject model = parseExpression(
+				"GeneratorModel for yakindu::java { unkownType Example {}}",
+				GeneratorModel.class.getSimpleName());
+		AssertableDiagnostics result = tester.validate(model);
+		result.assertAny(new MsgPredicate(UNKNOWN_CONTENT_TYPE));
 	}
 
 	/**
@@ -74,42 +81,79 @@ public class SGenJavaValidatorTest extends AbstractSGenTest {
 	 */
 	@Test
 	public void checkParameterValueType() {
-		EObject result = parseExpression(
-				"feature Outlet { targetFolder = 'folder' }",
-				FeatureConfiguration.class.getSimpleName());
-		AssertableDiagnostics validate = tester.validate(result);
-		validate.assertOK();
-
+		EObject model = parseExpression(
+				"GeneratorModel for yakindu::java { statechart Example { feature Outlet { targetFolder = true }}}",
+				GeneratorModel.class.getSimpleName());
+		AssertableDiagnostics result = tester.validate(model);
+		result.assertAny(new MsgPredicate(INCOMPATIBLE_TYPE_STRING_EXPECTED));
 	}
 
+	/**
+	 * @see SGenJavaValidator#checkParameterValue(org.yakindu.sct.model.sgen.FeatureParameterValue)
+	 */
 	@Test
 	public void checkParameterValue() {
-		fail("Implement me");
+		// Nothing to test
 	}
 
+	/**
+	 * @see SGenJavaValidator#checkGeneratorExists(GeneratorModel)
+	 */
 	@Test
 	public void checkGeneratorExists() {
-		fail("Implement me");
+		EObject model = parseExpression(
+				"GeneratorModel for yakindu::unknown {}",
+				GeneratorModel.class.getSimpleName());
+		AssertableDiagnostics result = tester.validate(model);
+		result.assertAny(new MsgPredicate(UNKOWN_GENERATOR));
 	}
 
+	/**
+	 * @see SGenJavaValidator#checkDuplicateGeneratorEntryFeature(FeatureConfiguration)
+	 */
 	@Test
 	public void checkDuplicateGeneratorEntryFeature() {
-		fail("Implement me");
+		EObject model = parseExpression(
+				"GeneratorModel for yakindu::java { statechart Example { feature Outlet { } feature Outlet { }}}",
+				GeneratorModel.class.getSimpleName());
+		AssertableDiagnostics result = tester.validate(model);
+		result.assertAny(new MsgPredicate(DUPLICATE_FEATURE));
 	}
 
+	/**
+	 * @see SGenJavaValidator#checkDuplicateFeatureParameter(org.yakindu.sct.model.sgen.FeatureParameterValue)
+	 */
 	@Test
 	public void checkDuplicateFeatureParameter() {
-		fail("Implement me");
+		EObject model = parseExpression(
+				"GeneratorModel for yakindu::java { statechart Example { feature Outlet { targetFolder = true  targetFolder = true }}}",
+				GeneratorModel.class.getSimpleName());
+		AssertableDiagnostics result = tester.validate(model);
+		result.assertAny(new MsgPredicate(DUPLICATE_PARAMETER));
 	}
 
+	/**
+	 * @see SGenJavaValidator#checkRequiredFeatures(org.yakindu.sct.model.sgen.GeneratorEntry)
+	 */
 	@Test
 	public void checkRequiredFeatures() {
-		fail("Implement me");
+		EObject model = parseExpression(
+				"GeneratorModel for yakindu::java { statechart Example {}}",
+				GeneratorModel.class.getSimpleName());
+		AssertableDiagnostics result = tester.validate(model);
+		result.assertAny(new MsgPredicate(MISSING_REQUIRED_FEATURE));
 	}
 
+	/**
+	 * @see SGenJavaValidator#checkRequiredParameters(FeatureConfiguration)
+	 */
 	@Test
 	public void checkRequiredParameters() {
-		fail("Implement me");
+		EObject model = parseExpression(
+				"GeneratorModel for yakindu::java { statechart Example { feature Outlet {}}}",
+				GeneratorModel.class.getSimpleName());
+		AssertableDiagnostics result = tester.validate(model);
+		result.assertAny(new MsgPredicate(MISSING_REQUIRED_PARAMETER));
 	}
 
 	/**
@@ -134,4 +178,19 @@ public class SGenJavaValidatorTest extends AbstractSGenTest {
 			}
 		}
 	}
+
+	public static final class MsgPredicate implements
+			AssertableDiagnostics.DiagnosticPredicate {
+
+		private final String msg;
+
+		public MsgPredicate(String msg) {
+			this.msg = msg;
+		}
+
+		public boolean apply(Diagnostic input) {
+			return input.getMessage().contains(msg);
+		}
+
+	}
 }

+ 0 - 71
test-plugins/org.yakindu.sct.generator.genmodel.test/src/org/yakindu/sct/generator/genmodel/test/SGenParserRuleTest.java

@@ -1,71 +0,0 @@
-/**
- * Copyright (c) 2012 committers of YAKINDU and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     committers of YAKINDU - initial API and implementation
- */
-package org.yakindu.sct.generator.genmodel.test;
-
-import static junit.framework.Assert.fail;
-
-import org.eclipse.xtext.junit4.InjectWith;
-import org.eclipse.xtext.junit4.XtextRunner;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.yakindu.sct.generator.genmodel.test.util.AbstractSGenTest;
-import org.yakindu.sct.generator.genmodel.test.util.SGenInjectorProvider;
-import org.yakindu.sct.model.sgen.GeneratorModel;
-
-/**
- * 
- * @author andreas muelder - Initial contribution and API
- * 
- */
-@RunWith(XtextRunner.class)
-@InjectWith(SGenInjectorProvider.class)
-public class SGenParserRuleTest extends AbstractSGenTest {
-
-	/**
-	 * GeneratorModel returns gen::GeneratorModel: 'GeneratorModel' 'for'
-	 * generatorId=QID '{' (entries+=GeneratorEntry)* '}';
-	 */
-	@Test
-	public void testGeneratorModel() {
-		parseExpression("GeneratorModel for yakindu::java { }", GeneratorModel.class.getSimpleName());
-	}
-
-	/**
-	 * GeneratorEntry returns gen::GeneratorEntry: contentType=ID
-	 * elementRef=[ecore::EObject|QID] '{' (features+=FeatureConfiguration)*
-	 * '}';
-	 */
-	@Test
-	public void testGeneratorEntry() {
-		fail("Implement me");
-	}
-
-	/**
-	 * FeatureConfiguration returns gen::FeatureConfiguration:
-	 * {gen::FeatureConfiguration} 'feature' type=[gen::FeatureType] '{'
-	 * (parameterValues+=FeatureParameterValue)+ '}';
-	 */
-	@Test
-	public void testFeatureConfiguration() {
-		fail("Implement me");
-	}
-
-	/**
-	 * FeatureParameterValue returns gen::FeatureParameterValue:
-	 * {gen::FeatureParameterValue} parameter=[gen::FeatureParameter] '='
-	 * expression=Literal;
-	 */
-	@Test
-	public void testFeatureParameterValue() {
-		fail("Implement me");
-	}
-
-}

+ 1 - 0
test-plugins/org.yakindu.sct.generator.genmodel.test/src/org/yakindu/sct/generator/genmodel/test/util/AbstractSGenTest.java

@@ -41,6 +41,7 @@ public abstract class AbstractSGenTest {
 	@Inject
 	private Provider<XtextResource> resourceProvider;
 
+	
 	protected EObject parseExpression(String expression, String ruleName) {
 		XtextResource resource = resourceProvider.get();
 		resource.setURI(URI.createPlatformPluginURI("path", true));

+ 1 - 2
test-plugins/org.yakindu.sct.generator.genmodel.test/src/org/yakindu/sct/generator/genmodel/test/util/SGenInjectorProvider.java

@@ -11,7 +11,6 @@
 package org.yakindu.sct.generator.genmodel.test.util;
 
 import org.eclipse.xtext.junit4.IInjectorProvider;
-import org.yakindu.sct.generator.genmodel.SGenRuntimeModule;
 
 import com.google.inject.Guice;
 import com.google.inject.Injector;
@@ -24,7 +23,7 @@ import com.google.inject.Injector;
 public class SGenInjectorProvider implements IInjectorProvider {
 
 	public Injector getInjector() {
-		return Guice.createInjector(new SGenRuntimeModule());
+		return Guice.createInjector(new SGenTestRuntimeModule());
 	}
 
 }

+ 27 - 0
test-plugins/org.yakindu.sct.generator.genmodel.test/src/org/yakindu/sct/generator/genmodel/test/util/SGenTestRuntimeModule.java

@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2012 committers of YAKINDU and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * Contributors:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+package org.yakindu.sct.generator.genmodel.test.util;
+
+import org.eclipse.xtext.scoping.IScopeProvider;
+import org.yakindu.sct.generator.genmodel.SGenRuntimeModule;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class SGenTestRuntimeModule extends SGenRuntimeModule {
+
+	@Override
+	public Class<? extends IScopeProvider> bindIScopeProvider() {
+		return SGenTestScopeProvider.class;
+	}
+}

+ 50 - 0
test-plugins/org.yakindu.sct.generator.genmodel.test/src/org/yakindu/sct/generator/genmodel/test/util/SGenTestScopeProvider.java

@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2012 committers of YAKINDU and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * Contributors:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+package org.yakindu.sct.generator.genmodel.test.util;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.xtext.resource.XtextResource;
+import org.eclipse.xtext.scoping.IScope;
+import org.eclipse.xtext.scoping.Scopes;
+import org.yakindu.sct.generator.genmodel.scoping.SGenScopeProvider;
+import org.yakindu.sct.model.sgraph.SGraphFactory;
+import org.yakindu.sct.model.sgraph.Statechart;
+
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+
+/**
+ * Adds an example Statechart to scope
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class SGenTestScopeProvider extends SGenScopeProvider {
+
+	@Inject
+	private XtextResource resource;
+
+	@Override
+	protected IScope scope_GeneratorEntry_elementRef(EObject context,
+			EReference reference) {
+		return Scopes.scopeFor(Lists.newArrayList(createDummyModel()));
+
+	}
+
+	private Statechart createDummyModel() {
+		Statechart chart = SGraphFactory.eINSTANCE.createStatechart();
+		chart.setName("Example");
+		resource.getContents().add(chart);
+		return chart;
+	}
+
+}