Procházet zdrojové kódy

Added test for checkGuard validation rule

Andreas Mülder před 12 roky
rodič
revize
fff974ccd3

+ 84 - 139
test-plugins/org.yakindu.sct.model.stext.test/src/org/yakindu/sct/model/stext/test/STextJavaValidatorTest.java

@@ -104,11 +104,10 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 	 */
 	@Test
 	public void checkVariableDefinition() {
-		Scope context = (Scope) parseExpression("interface if : var i : void",
-				null, InterfaceScope.class.getSimpleName());
+		Scope context = (Scope) parseExpression("interface if : var i : void", null,
+				InterfaceScope.class.getSimpleName());
 		AssertableDiagnostics validationResult = tester.validate(context);
-		validationResult
-				.assertErrorContains(STextJavaValidator.VARIABLE_VOID_TYPE);
+		validationResult.assertErrorContains(STextJavaValidator.VARIABLE_VOID_TYPE);
 	}
 
 	/**
@@ -117,29 +116,23 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 	@Test
 	public void checkAssignmentExpression() {
 
-		Scope context = (Scope) parseExpression(
-				"interface: var i : integer = 42 var j : integer =23", null,
+		Scope context = (Scope) parseExpression("interface: var i : integer = 42 var j : integer =23", null,
 				InterfaceScope.class.getSimpleName());
 
-		EObject expression = super.parseExpression("i += (i+=3) +4", context,
-				Expression.class.getSimpleName());
+		EObject expression = super.parseExpression("i += (i+=3) +4", context, Expression.class.getSimpleName());
 		AssertableDiagnostics validationResult = tester.validate(expression);
-		validationResult
-				.assertErrorContains(STextJavaValidator.ASSIGNMENT_EXPRESSION);
+		validationResult.assertErrorContains(STextJavaValidator.ASSIGNMENT_EXPRESSION);
 
-		expression = super.parseExpression("i += (j+=3) +4", context,
-				Expression.class.getSimpleName());
+		expression = super.parseExpression("i += (j+=3) +4", context, Expression.class.getSimpleName());
 		validationResult = tester.validate(expression);
 		validationResult.assertOK();
 	}
 
 	@Test
 	public void checkTimeEventSpecValueExpression() {
-		EObject expression = super.parseExpression("after true s",
-				ReactionTrigger.class.getSimpleName());
+		EObject expression = super.parseExpression("after true s", ReactionTrigger.class.getSimpleName());
 		AssertableDiagnostics validationResult = tester.validate(expression);
-		validationResult
-				.assertErrorContains(STextJavaValidator.TIME_EXPRESSION);
+		validationResult.assertErrorContains(STextJavaValidator.TIME_EXPRESSION);
 	}
 
 	@Test
@@ -153,10 +146,9 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 	@Test
 	public void checkOperationArguments_FeatureCall() {
 		Scope scope = (Scope) parseExpression(
-				"interface if : operation myOperation(param1 : integer, param2: boolean)",
-				null, InterfaceScope.class.getSimpleName());
-		EObject model = super.parseExpression("if.myOperation(5,true)",
-				Expression.class.getSimpleName(), scope);
+				"interface if : operation myOperation(param1 : integer, param2: boolean)", null,
+				InterfaceScope.class.getSimpleName());
+		EObject model = super.parseExpression("if.myOperation(5,true)", Expression.class.getSimpleName(), scope);
 		AssertableDiagnostics validationResult = tester.validate(model);
 		validationResult.assertOK();
 	}
@@ -167,8 +159,7 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 	@Test
 	public void checkOperationArguments_TypedElementReferenceExpression() {
 		Scope context = createInternalScope("internal: operation myOperation(param1 : integer, param2: boolean)");
-		EObject model = super.parseExpression("myOperation(5,true)", context,
-				Expression.class.getSimpleName());
+		EObject model = super.parseExpression("myOperation(5,true)", context, Expression.class.getSimpleName());
 		AssertableDiagnostics validationResult = tester.validate(model);
 		validationResult.assertOK();
 	}
@@ -177,22 +168,17 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 	 * @see STextJavaValidator#checkGuardHasBooleanExpression(org.yakindu.sct.model.stext.stext.ReactionTrigger)
 	 */
 	@Test
-	public void checkGuardExpression() {
-		EObject expression = super.parseExpression("[3 * 3]",
-				ReactionTrigger.class.getSimpleName());
+	public void checkGuard() {
+		EObject expression = super.parseExpression("[3 * 3]", ReactionTrigger.class.getSimpleName());
 		AssertableDiagnostics validationResult = tester.validate(expression);
-		validationResult
-				.assertErrorContains(STextJavaValidator.GUARD_EXPRESSION);
+		validationResult.assertErrorContains(STextJavaValidator.GUARD_EXPRESSION);
 
 		Scope context = createInternalScope("internal: var myInt : integer var myBool : boolean = true)");
-		expression = super.parseExpression("[myInt = 5]", context,
-				ReactionTrigger.class.getSimpleName());
+		expression = super.parseExpression("[myInt = 5]", context, ReactionTrigger.class.getSimpleName());
 		validationResult = tester.validate(expression);
-		validationResult
-				.assertErrorContains(STextJavaValidator.GUARD_EXPRESSION);
+		validationResult.assertErrorContains(STextJavaValidator.GUARD_EXPRESSION);
 
-		expression = super.parseExpression("[myInt <= 5 || !myBool ]", context,
-				ReactionTrigger.class.getSimpleName());
+		expression = super.parseExpression("[myInt <= 5 || !myBool ]", context, ReactionTrigger.class.getSimpleName());
 		validationResult = tester.validate(expression);
 		validationResult.assertOK();
 
@@ -204,21 +190,18 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 	 */
 	@Test
 	public void checkFeatureCall() {
-		Scope context = (Scope) parseExpression(
-				"interface if : in event a : integer", null,
+		Scope context = (Scope) parseExpression("interface if : in event a : integer", null,
 				InterfaceScope.class.getSimpleName());
 		EObject model = super.parseExpression("if.a / raise if.a:1", context,
 				TransitionSpecification.class.getSimpleName());
 		AssertableDiagnostics validationResult = tester.validate(model);
 		validationResult.assertOK();
 
-		model = super.parseExpression("if / raise if.a:1", context,
-				TransitionSpecification.class.getSimpleName());
+		model = super.parseExpression("if / raise if.a:1", context, TransitionSpecification.class.getSimpleName());
 		validationResult = tester.validate(model);
 		validationResult.assertError(FEATURE_CALL_TO_SCOPE);
 
-		model = super.parseExpression("if.a / raise if", context,
-				TransitionSpecification.class.getSimpleName());
+		model = super.parseExpression("if.a / raise if", context, TransitionSpecification.class.getSimpleName());
 		validationResult = tester.validate(model);
 		validationResult.assertError(FEATURE_CALL_TO_SCOPE);
 	}
@@ -230,26 +213,22 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 	@Test
 	public void checkReactionTrigger() {
 		// ENTRY, EXIT not allowed in transitions
-		Scope context = (Scope) parseExpression(
-				"internal : event a : integer var myVar : integer", null,
+		Scope context = (Scope) parseExpression("internal : event a : integer var myVar : integer", null,
 				InternalScope.class.getSimpleName());
 		EObject model = super.parseExpression("entry / myVar = 5", context,
 				TransitionSpecification.class.getSimpleName());
 		AssertableDiagnostics validationResult = tester.validate(model);
 		validationResult.assertError(LOCAL_REACTIONS_NOT_ALLOWED);
 
-		model = super.parseExpression("exit / myVar = 5", context,
-				TransitionSpecification.class.getSimpleName());
+		model = super.parseExpression("exit / myVar = 5", context, TransitionSpecification.class.getSimpleName());
 		validationResult = tester.validate(model);
 		validationResult.assertError(LOCAL_REACTIONS_NOT_ALLOWED);
 
-		model = super.parseExpression("oncycle / myVar = 5", context,
-				TransitionSpecification.class.getSimpleName());
+		model = super.parseExpression("oncycle / myVar = 5", context, TransitionSpecification.class.getSimpleName());
 		validationResult = tester.validate(model);
 		validationResult.assertOK();
 
-		model = super.parseExpression("always / myVar = 5", context,
-				TransitionSpecification.class.getSimpleName());
+		model = super.parseExpression("always / myVar = 5", context, TransitionSpecification.class.getSimpleName());
 		validationResult = tester.validate(model);
 		validationResult.assertOK();
 	}
@@ -259,45 +238,36 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 	 */
 	@Test
 	public void checkReactionEffectActions() {
-		Scope s1 = (InternalScope) parseExpression(
-				"internal : var a : integer event e operation o () : void",
-				null, InternalScope.class.getSimpleName());
-		Scope s2 = (InterfaceScope) parseExpression(
-				"interface if : var a : integer in event e operation o()",
-				null, InterfaceScope.class.getSimpleName());
-
-		EObject model = super.parseExpression("a", s1,
-				ReactionEffect.class.getSimpleName());
+		Scope s1 = (InternalScope) parseExpression("internal : var a : integer event e operation o () : void", null,
+				InternalScope.class.getSimpleName());
+		Scope s2 = (InterfaceScope) parseExpression("interface if : var a : integer in event e operation o()", null,
+				InterfaceScope.class.getSimpleName());
+
+		EObject model = super.parseExpression("a", s1, ReactionEffect.class.getSimpleName());
 		AssertableDiagnostics result = tester.validate(model);
 		result.assertError(FEATURE_CALL_HAS_NO_EFFECT);
 
-		model = super.parseExpression("1+3", s1,
-				ReactionEffect.class.getSimpleName());
+		model = super.parseExpression("1+3", s1, ReactionEffect.class.getSimpleName());
 		result = tester.validate(model);
 		result.assertError(FEATURE_CALL_HAS_NO_EFFECT);
 
-		model = super.parseExpression("valueof(e)", s1,
-				ReactionEffect.class.getSimpleName());
+		model = super.parseExpression("valueof(e)", s1, ReactionEffect.class.getSimpleName());
 		result = tester.validate(model);
 		result.assertError(FEATURE_CALL_HAS_NO_EFFECT);
 
-		model = super.parseExpression("o()", s1,
-				ReactionEffect.class.getSimpleName());
+		model = super.parseExpression("o()", s1, ReactionEffect.class.getSimpleName());
 		result = tester.validate(model);
 		result.assertOK();
 
-		model = super.parseExpression("if.a", s2,
-				ReactionEffect.class.getSimpleName());
+		model = super.parseExpression("if.a", s2, ReactionEffect.class.getSimpleName());
 		result = tester.validate(model);
 		result.assertError(FEATURE_CALL_HAS_NO_EFFECT);
 
-		model = super.parseExpression("valueof(if.e)", s2,
-				ReactionEffect.class.getSimpleName());
+		model = super.parseExpression("valueof(if.e)", s2, ReactionEffect.class.getSimpleName());
 		result = tester.validate(model);
 		result.assertError(FEATURE_CALL_HAS_NO_EFFECT);
 
-		model = super.parseExpression("if.o", s2,
-				ReactionEffect.class.getSimpleName());
+		model = super.parseExpression("if.o", s2, ReactionEffect.class.getSimpleName());
 		result = tester.validate(model);
 		result.assertOK();
 
@@ -309,20 +279,17 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 	@Test
 	public void checkEventDefinition() {
 		// No local declarations in interface scope
-		EObject model = super.parseExpression(
-				"interface MyInterface: event Event1", null,
+		EObject model = super.parseExpression("interface MyInterface: event Event1", null,
 				InterfaceScope.class.getSimpleName());
 		AssertableDiagnostics result = tester.validate(model);
 		result.assertErrorContains(LOCAL_DECLARATIONS);
 		// No in declarations in internal scope
-		model = super.parseExpression("internal: in event Event1", null,
-				InternalScope.class.getSimpleName());
+		model = super.parseExpression("internal: in event Event1", null, InternalScope.class.getSimpleName());
 		result = tester.validate(model);
 		result.assertDiagnosticsCount(1);
 		result.assertErrorContains(STextJavaValidator.IN_OUT_DECLARATIONS);
 		// No out declarations in internal scope
-		model = super.parseExpression("internal: out event Event1", null,
-				InternalScope.class.getSimpleName());
+		model = super.parseExpression("internal: out event Event1", null, InternalScope.class.getSimpleName());
 		result = tester.validate(model);
 		result.assertDiagnosticsCount(1);
 		result.assertErrorContains(IN_OUT_DECLARATIONS);
@@ -333,13 +300,11 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 	 */
 	@Test
 	public void checkInterfaceScope() {
-		EObject model = super.parseExpression(
-				"interface: in event event1 interface: in event event2", null,
+		EObject model = super.parseExpression("interface: in event event1 interface: in event event2", null,
 				StatechartSpecification.class.getSimpleName());
 		AssertableDiagnostics result = tester.validate(model);
 		result.assertDiagnosticsCount(2);
-		result.assertAll(errorCode(ONLY_ONE_INTERFACE),
-				errorCode(ONLY_ONE_INTERFACE));
+		result.assertAll(errorCode(ONLY_ONE_INTERFACE), errorCode(ONLY_ONE_INTERFACE));
 	}
 
 	/**
@@ -372,8 +337,7 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 	 */
 	@Test
 	public void testAllChecksHaveTests() throws Exception {
-		Iterable<Method> methods = Lists.newArrayList(STextJavaValidator.class
-				.getMethods());
+		Iterable<Method> methods = Lists.newArrayList(STextJavaValidator.class.getMethods());
 		methods = Iterables.filter(methods, new Predicate<Method>() {
 			public boolean apply(Method input) {
 				return input.getAnnotation(Check.class) != null;
@@ -381,9 +345,7 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 		});
 		for (Method checkMethod : methods) {
 			Method testMethod = getClass().getMethod(checkMethod.getName());
-			assertNotNull(
-					"Missing @Test Annotation for method "
-							+ checkMethod.getName(),
+			assertNotNull("Missing @Test Annotation for method " + checkMethod.getName(),
 					testMethod.getAnnotation(Test.class));
 		}
 	}
@@ -397,8 +359,7 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 		while (iter.hasNext()) {
 			EObject element = iter.next();
 			if (element instanceof Entry) {
-				validator.validate(element, diagnostics,
-						new HashMap<Object, Object>());
+				validator.validate(element, diagnostics, new HashMap<Object, Object>());
 			}
 		}
 
@@ -409,14 +370,12 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 	@Test
 	public void checkUnusedExit() {
 		BasicDiagnostic diagnostics = new BasicDiagnostic();
-		Statechart statechart = AbstractTestModelsUtil
-				.loadStatechart(VALIDATION_TESTMODEL_DIR + "UnusedExitPoint.sct");
+		Statechart statechart = AbstractTestModelsUtil.loadStatechart(VALIDATION_TESTMODEL_DIR + "UnusedExitPoint.sct");
 		Iterator<EObject> iter = statechart.eAllContents();
 		while (iter.hasNext()) {
 			EObject element = iter.next();
 			if (element instanceof Exit) {
-				validator.validate(element, diagnostics,
-						new HashMap<Object, Object>());
+				validator.validate(element, diagnostics, new HashMap<Object, Object>());
 			}
 		}
 
@@ -424,14 +383,12 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 		assertError(diagnostics, EXIT_UNUSED);
 
 		diagnostics = new BasicDiagnostic();
-		statechart = AbstractTestModelsUtil
-				.loadStatechart(VALIDATION_TESTMODEL_DIR + "UnusedDefaultExitPoint.sct");
+		statechart = AbstractTestModelsUtil.loadStatechart(VALIDATION_TESTMODEL_DIR + "UnusedDefaultExitPoint.sct");
 		iter = statechart.eAllContents();
 		while (iter.hasNext()) {
 			EObject element = iter.next();
 			if (element instanceof Exit) {
-				validator.validate(element, diagnostics,
-						new HashMap<Object, Object>());
+				validator.validate(element, diagnostics, new HashMap<Object, Object>());
 			}
 		}
 
@@ -443,14 +400,13 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 	public void checkTransitionPropertySpec() {
 		// Test source state isn't composite
 		BasicDiagnostic diagnostics = new BasicDiagnostic();
-		Statechart statechart = AbstractTestModelsUtil
-				.loadStatechart(VALIDATION_TESTMODEL_DIR + "TransitionEntrySpecNotComposite.sct");
+		Statechart statechart = AbstractTestModelsUtil.loadStatechart(VALIDATION_TESTMODEL_DIR
+				+ "TransitionEntrySpecNotComposite.sct");
 		Iterator<EObject> iter = statechart.eAllContents();
 		while (iter.hasNext()) {
 			EObject element = iter.next();
 			if (element instanceof Transition) {
-				assertTrue(validator.validate(element, diagnostics,
-						new HashMap<Object, Object>()));
+				assertTrue(validator.validate(element, diagnostics, new HashMap<Object, Object>()));
 			}
 		}
 		// Test target state isn't composite
@@ -458,20 +414,20 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 		assertWarning(diagnostics, TRANSITION_ENTRY_SPEC_NOT_COMPOSITE);
 
 		diagnostics = new BasicDiagnostic();
-		statechart = AbstractTestModelsUtil
-				.loadStatechart(VALIDATION_TESTMODEL_DIR + "TransitionExitSpecNotComposite.sct");
+		statechart = AbstractTestModelsUtil.loadStatechart(VALIDATION_TESTMODEL_DIR
+				+ "TransitionExitSpecNotComposite.sct");
 		iter = statechart.eAllContents();
 
-		// create and add triggers to all transitions to prevent to trigger additional warnings 
-		//(see Check in SGrapJavaValidator transitionsWithNoGuard)  
-		Trigger trigger = StextFactoryImpl.init().createDefaultTrigger();		
-		
+		// create and add triggers to all transitions to prevent to trigger
+		// additional warnings
+		// (see Check in SGrapJavaValidator transitionsWithNoGuard)
+		Trigger trigger = StextFactoryImpl.init().createDefaultTrigger();
+
 		while (iter.hasNext()) {
 			EObject element = iter.next();
 			if (element instanceof Transition) {
 				((Transition) element).setTrigger(trigger);
-				assertTrue(validator.validate(element, diagnostics,
-						new HashMap<Object, Object>()));
+				assertTrue(validator.validate(element, diagnostics, new HashMap<Object, Object>()));
 			}
 		}
 
@@ -480,15 +436,14 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 
 		// Test exit spec is used on multiple transition siblings.
 		diagnostics = new BasicDiagnostic();
-		statechart = AbstractTestModelsUtil
-				.loadStatechart(VALIDATION_TESTMODEL_DIR + "TransitionExitSpecOnMultipleSiblings.sct");
+		statechart = AbstractTestModelsUtil.loadStatechart(VALIDATION_TESTMODEL_DIR
+				+ "TransitionExitSpecOnMultipleSiblings.sct");
 		iter = statechart.eAllContents();
 		while (iter.hasNext()) {
 			EObject element = iter.next();
 			if (element instanceof Transition) {
 				((Transition) element).setTrigger(trigger);
-				assertTrue(validator.validate(element, diagnostics,
-						new HashMap<Object, Object>()));
+				assertTrue(validator.validate(element, diagnostics, new HashMap<Object, Object>()));
 			}
 		}
 
@@ -497,15 +452,14 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 
 		// Test transition unbound named exit point spec.
 		diagnostics = new BasicDiagnostic();
-		statechart = AbstractTestModelsUtil
-				.loadStatechart(VALIDATION_TESTMODEL_DIR + "TransitionNotExistingNamedExitPoint.sct");
+		statechart = AbstractTestModelsUtil.loadStatechart(VALIDATION_TESTMODEL_DIR
+				+ "TransitionNotExistingNamedExitPoint.sct");
 		iter = statechart.eAllContents();
 		while (iter.hasNext()) {
 			EObject element = iter.next();
 			if (element instanceof Transition) {
 				((Transition) element).setTrigger(trigger);
-				validator.validate(element, diagnostics,
-						new HashMap<Object, Object>());
+				validator.validate(element, diagnostics, new HashMap<Object, Object>());
 			}
 		}
 
@@ -516,24 +470,23 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 	@Test
 	public void checkUnboundEntryPoints() {
 		BasicDiagnostic diagnostics = new BasicDiagnostic();
-		Statechart statechart = AbstractTestModelsUtil
-				.loadStatechart(VALIDATION_TESTMODEL_DIR + "UnboundDefaultEntryPoints.sct");
+		Statechart statechart = AbstractTestModelsUtil.loadStatechart(VALIDATION_TESTMODEL_DIR
+				+ "UnboundDefaultEntryPoints.sct");
 		Iterator<EObject> iter = statechart.eAllContents();
-		
-		// create and add triggers to all transitions to prevent to trigger additional warnings 
-		//(see Check in SGrapJavaValidator transitionsWithNoGuard)  
+
+		// create and add triggers to all transitions to prevent to trigger
+		// additional warnings
+		// (see Check in SGrapJavaValidator transitionsWithNoGuard)
 		Trigger trigger = StextFactoryImpl.init().createDefaultTrigger();
-		
+
 		while (iter.hasNext()) {
 			EObject element = iter.next();
 			if (element instanceof Transition) {
 				((Transition) element).setTrigger(trigger);
-				validator.validate(element, diagnostics,
-						new HashMap<Object, Object>());
+				validator.validate(element, diagnostics, new HashMap<Object, Object>());
 			}
 			if (element instanceof State) {
-				validator.validate(element, diagnostics,
-						new HashMap<Object, Object>());
+				validator.validate(element, diagnostics, new HashMap<Object, Object>());
 			}
 		}
 
@@ -542,20 +495,17 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 		assertError(diagnostics, REGION_UNBOUND_DEFAULT_ENTRY_POINT);
 
 		diagnostics = new BasicDiagnostic();
-		statechart = AbstractTestModelsUtil
-				.loadStatechart(VALIDATION_TESTMODEL_DIR + "UnboundEntryPoints02.sct");
+		statechart = AbstractTestModelsUtil.loadStatechart(VALIDATION_TESTMODEL_DIR + "UnboundEntryPoints02.sct");
 		iter = statechart.eAllContents();
 
 		while (iter.hasNext()) {
 			EObject element = iter.next();
 			if (element instanceof Transition) {
 				((Transition) element).setTrigger(trigger);
-				validator.validate(element, diagnostics,
-						new HashMap<Object, Object>());
+				validator.validate(element, diagnostics, new HashMap<Object, Object>());
 			}
 			if (element instanceof State) {
-				validator.validate(element, diagnostics,
-						new HashMap<Object, Object>());
+				validator.validate(element, diagnostics, new HashMap<Object, Object>());
 			}
 		}
 		assertIssueCount(diagnostics, 4);
@@ -563,24 +513,19 @@ public class STextJavaValidatorTest extends AbstractSTextTest {
 
 	protected void assertError(BasicDiagnostic diag, String message) {
 		Diagnostic d = issueByName(diag, message);
-		assertNotNull("Issue '" + message + "' does not exist.",
-				issueByName(diag, message));
-		assertEquals("Issue '" + message + "' is no error.", Diagnostic.ERROR,
-				d.getSeverity());
+		assertNotNull("Issue '" + message + "' does not exist.", issueByName(diag, message));
+		assertEquals("Issue '" + message + "' is no error.", Diagnostic.ERROR, d.getSeverity());
 	}
 
 	protected void assertWarning(BasicDiagnostic diag, String message) {
 		Diagnostic d = issueByName(diag, message);
-		assertNotNull("Issue '" + message + "' does not exist.",
-				issueByName(diag, message));
-		assertEquals("Issue '" + message + "' is no warning.",
-				Diagnostic.WARNING, d.getSeverity());
+		assertNotNull("Issue '" + message + "' does not exist.", issueByName(diag, message));
+		assertEquals("Issue '" + message + "' is no warning.", Diagnostic.WARNING, d.getSeverity());
 	}
 
 	protected void assertIssueCount(BasicDiagnostic diag, int count) {
 		int c = diag.getChildren().size();
-		assertEquals("expected " + count + " issue(s) but were " + c + " ["
-				+ diag.toString() + "]", count, c);
+		assertEquals("expected " + count + " issue(s) but were " + c + " [" + diag.toString() + "]", count, c);
 	}
 
 	protected Diagnostic issueByName(BasicDiagnostic diag, String message) {