/** * 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 org.junit.Assert.fail; import static org.yakindu.sct.generator.genmodel.validation.SGenJavaValidator.DEPRECATED; import static org.yakindu.sct.generator.genmodel.validation.SGenJavaValidator.DUPLICATE_FEATURE; import static org.yakindu.sct.generator.genmodel.validation.SGenJavaValidator.DUPLICATE_PARAMETER; import static org.yakindu.sct.generator.genmodel.validation.SGenJavaValidator.INCOMPATIBLE_TYPE_STRING_EXPECTED; import static org.yakindu.sct.generator.genmodel.validation.SGenJavaValidator.MISSING_REQUIRED_FEATURE; import static org.yakindu.sct.generator.genmodel.validation.SGenJavaValidator.MISSING_REQUIRED_PARAMETER; import static org.yakindu.sct.generator.genmodel.validation.SGenJavaValidator.UNKNOWN_CONTENT_TYPE; import static org.yakindu.sct.generator.genmodel.validation.SGenJavaValidator.UNKOWN_GENERATOR; 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; import org.eclipse.xtext.junit4.validation.AssertableDiagnostics; import org.eclipse.xtext.junit4.validation.ValidatorTester; import org.eclipse.xtext.validation.Check; import org.junit.After; import org.junit.Before; 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.generator.genmodel.validation.SGenJavaValidator; import org.yakindu.sct.model.sgen.FeatureConfiguration; import org.yakindu.sct.model.sgen.GeneratorEntry; import org.yakindu.sct.model.sgen.GeneratorModel; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.inject.Inject; import com.google.inject.Injector; /** * @author andreas muelder - Initial contribution and API * */ @RunWith(XtextRunner.class) @InjectWith(SGenInjectorProvider.class) public class SGenJavaValidatorTest extends AbstractSGenTest { @Inject private SGenJavaValidator validator; @Inject private Injector injector; private ValidatorTester<SGenJavaValidator> tester; @Before public void setup() { tester = new ValidatorTester<SGenJavaValidator>(validator, injector); } @After public void teardown() { tester = null; } /** * @see SGenJavaValidator#checkContentType(org.yakindu.sct.model.sgen.GeneratorEntry) */ @Test public void checkContentType() { EObject model = parseExpression( "GeneratorModel for yakindu::java { unkownType Example {}}", GeneratorModel.class.getSimpleName()); AssertableDiagnostics result = tester.validate(model); result.assertAny(new MsgPredicate(UNKNOWN_CONTENT_TYPE)); } /** * @see SGenJavaValidator#checkParameterValueType(org.yakindu.sct.model.sgen.FeatureParameterValue) * */ @Test public void checkParameterValueType() { 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() { // Nothing to test } /** * @see SGenJavaValidator#checkGeneratorExists(GeneratorModel) */ @Test public void checkGeneratorExists() { 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() { 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() { 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() { 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() { 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)); } /** * @see SGenJavaValidator#checkDeprecatedFeatures(GeneratorEntry) */ @Test public void checkDeprecatedFeatures() { EObject model = parseExpression( "GeneratorModel for yakindu::java { statechart Example { feature Outlet {targetFolder = \"src-gen\" targetProject = \"TestProject\" }}}", GeneratorModel.class.getSimpleName()); if (!(model instanceof GeneratorModel)) { fail("Model is of the wrong type"); } else { GeneratorModel genModel = (GeneratorModel) model; genModel.getEntries().get(0).getFeatures().get(0).getType() .setDeprecated(true); AssertableDiagnostics result = tester.validate(genModel); result.assertAny(new MsgPredicate(DEPRECATED)); } } /** * @see SGenJavaValidator#checkDeprecatedParameters(GeneratorEntry) */ @Test public void checkDeprecatedParameters() { EObject model = parseExpression( "GeneratorModel for yakindu::java { statechart Example { feature Outlet {targetFolder = \"src-gen\" targetProject = \"TestProject\" }}}", GeneratorModel.class.getSimpleName()); if (!(model instanceof GeneratorModel)) { fail("Model is of the wrong type"); } else { GeneratorModel genModel = (GeneratorModel) model; genModel.getEntries().get(0).getFeatures().get(0).getType() .getParameters().get(0).setDeprecated(true); AssertableDiagnostics result = tester.validate(genModel); result.assertAny(new MsgPredicate(DEPRECATED)); } } /** * checks that each @Check method of {@link STextJavaValidator} has a @Test * method in this class with the same name */ @Test public void testAllChecksHaveTests() throws Exception { Iterable<Method> methods = Lists.newArrayList(SGenJavaValidator.class .getMethods()); methods = Iterables.filter(methods, new Predicate<Method>() { public boolean apply(Method input) { return input.getAnnotation(Check.class) != null; } }); for (Method checkMethod : methods) { try { getClass().getMethod(checkMethod.getName()); } catch (NoSuchMethodException ex) { fail("Missing @Test Annotation for method " + checkMethod.getName()); } } } 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); } } }