소스 검색

Added Type Inferrer Tests for event references

Andreas Mülder 12 년 전
부모
커밋
cd3b78e32d

+ 2 - 1
test-plugins/org.yakindu.sct.model.stext.test/build.properties

@@ -1,4 +1,5 @@
-source.. = src/
+source.. = src/,\
+           src-gen/
 output.. = bin/
 bin.includes = META-INF/,\
                .

+ 57 - 0
test-plugins/org.yakindu.sct.model.stext.test/src/org/yakindu/sct/model/stext/test/STextScopeProviderTest.java

@@ -0,0 +1,57 @@
+package org.yakindu.sct.model.stext.test;
+
+import org.eclipse.xtext.junit4.InjectWith;
+import org.eclipse.xtext.junit4.XtextRunner;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.yakindu.sct.model.sgraph.Scope;
+import org.yakindu.sct.model.stext.stext.ReactionTrigger;
+import org.yakindu.sct.model.stext.test.util.AbstractSTextTest;
+import org.yakindu.sct.model.stext.test.util.STextInjectorProvider;
+
+/**
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+@RunWith(XtextRunner.class)
+@InjectWith(STextInjectorProvider.class)
+public class STextScopeProviderTest extends AbstractSTextTest {
+
+	public static final String INTERNAL_SCOPE = "" + "internal: "
+			+ "	in event e1 : void" + "	in event e2 : void"
+			+ "	var myInt : integer" + "	var myBool : boolean"
+			+ "	operation myOpp(param1 : integer) : void";
+
+	public static final String INTERFACE_SCOPE = "" + "interface Interface1:"
+			+ "	in event e3 : void" + "	in event e4 : void"
+			+ "	var myInt2 : integer" + "	var myBool2 : boolean"
+			+ "	operation myOpp2(param1 : integer) : void";
+
+	private Scope internalScope = null;
+	private Scope interfaceScope = null;
+
+	@Before
+	public void setup() {
+		internalScope = createInternalScope(INTERNAL_SCOPE);
+		interfaceScope = createInternalScope(INTERFACE_SCOPE);
+
+	}
+
+	@Test
+	public void testGuardScopingSuccess() throws Exception {
+		parseExpression("[e1]", ReactionTrigger.class.getSimpleName(),
+				internalScope);
+		parseExpression("[Interface1.e3]",
+			ReactionTrigger.class.getSimpleName(), interfaceScope);
+		parseExpression("[e1 && e2]", ReactionTrigger.class.getSimpleName(),
+				internalScope);
+		parseExpression("[e1 && Interface1.e3]",
+				ReactionTrigger.class.getSimpleName(), internalScope,
+				interfaceScope);
+		parseExpression("[Interface.e4 && Interface1.e3]",
+				ReactionTrigger.class.getSimpleName(), interfaceScope);
+
+	}
+
+}

+ 25 - 5
test-plugins/org.yakindu.sct.model.stext.test/src/org/yakindu/sct/model/stext/test/TypeInferrerTest.java

@@ -72,6 +72,8 @@ public class TypeInferrerTest extends AbstractSTextTest {
 		assertTrue(ts.isBoolean(getType("true")));
 		assertTrue(ts.isBoolean(getType("false")));
 		assertTrue(ts.isBoolean(getType("myBool")));
+		// event
+		assertTrue(ts.isBoolean(getType("event1")));
 	}
 
 	// Add
@@ -323,6 +325,12 @@ public class TypeInferrerTest extends AbstractSTextTest {
 		getType("3.0 /  myString");
 	}
 
+	@Test
+	public void testDivideException9() {
+		expectOperatorDivideException();
+		getType("3.0 /  event1");
+	}
+
 	// mod
 	@Test
 	public void testModSuccess() {
@@ -384,6 +392,12 @@ public class TypeInferrerTest extends AbstractSTextTest {
 		getType("3.0 % myString");
 	}
 
+	@Test
+	public void testModException9() {
+		expectOperatorModException();
+		getType("3.0 % myString");
+	}
+
 	// Logical And Or Not
 	@Test
 	public void testLogicalSuccess() {
@@ -393,7 +407,10 @@ public class TypeInferrerTest extends AbstractSTextTest {
 		assertTrue(ts.isBoolean(getType("true || true &&( false || true)")));
 		assertTrue(ts.isBoolean(getType("!true")));
 		assertTrue(ts.isBoolean(getType("!myBool")));
+		assertTrue(ts.isBoolean(getType("!event1")));
 		assertTrue(ts.isBoolean(getType("!true && !false")));
+		assertTrue(ts.isBoolean(getType("event1 && !event1")));
+		assertTrue(ts.isBoolean(getType("event1 || event1")));
 	}
 
 	@Test
@@ -475,11 +492,13 @@ public class TypeInferrerTest extends AbstractSTextTest {
 		assertTrue(ts.isBoolean(getType("'string' == 'string'")));
 		assertTrue(ts.isBoolean(getType("5.0 == 3")));
 		assertTrue(ts.isBoolean(getType("true == myBool")));
+		assertTrue(ts.isBoolean(getType("true == event1")));
 
 		assertTrue(ts.isBoolean(getType("5 != 3")));
 		assertTrue(ts.isBoolean(getType("'string' != 'string'")));
 		assertTrue(ts.isBoolean(getType("5.0 != 3")));
 		assertTrue(ts.isBoolean(getType("true != myBool")));
+		assertTrue(ts.isBoolean(getType("true != event1")));
 	}
 
 	@Test
@@ -506,6 +525,7 @@ public class TypeInferrerTest extends AbstractSTextTest {
 		getType("1.0 < false");
 	}
 
+
 	@Test
 	public void testLogicalRelationSmallerEqualsException1() {
 		exception.expect(TypeCheckException.class);
@@ -529,7 +549,7 @@ public class TypeInferrerTest extends AbstractSTextTest {
 				.expectMessage("Incompatible operands real and boolean for operator '<='");
 		getType("1.0 <= false");
 	}
-
+	
 	@Test
 	public void testLogicalRelationGreaterException1() {
 		exception.expect(TypeCheckException.class);
@@ -635,6 +655,7 @@ public class TypeInferrerTest extends AbstractSTextTest {
 		getType("myBool = true || false");
 		getType("myString = 'string'");
 		getType("myReal = 2.0 - 7");
+		getType("myBool = event1");
 	}
 
 	@Test
@@ -950,15 +971,14 @@ public class TypeInferrerTest extends AbstractSTextTest {
 		analyzer.getType((Statement) statement);
 	}
 
-	
-	@Test public void parenthesizedExpression() {
+	@Test
+	public void parenthesizedExpression() {
 		assertTrue(ts.isBoolean(getType("( true || false )")));
 		assertTrue(ts.isInteger(getType("( 5 )")));
 		assertTrue(ts.isReal(getType("( 7.5 / 1.2 )")));
 		assertTrue(ts.isString(getType("( 'abc' )")));
 	}
-	
-	
+
 	/**
 	 * 
 	 * exception.expect(TypeCheckException.class); exception .expectMessage(

+ 13 - 3
test-plugins/org.yakindu.sct.model.stext.test/src/org/yakindu/sct/model/stext/test/util/AbstractSTextTest.java

@@ -78,8 +78,13 @@ public abstract class AbstractSTextTest {
 		return parseExpression(expression, null, ruleName);
 	}
 
-	protected EObject parseExpression(String expression, Scope context,
+	protected EObject parseExpression(String expression, Scope scope,
 			String ruleName) {
+		return parseExpression(expression, ruleName, scope);
+	}
+
+	protected EObject parseExpression(String expression, String ruleName,
+			Scope... context) {
 		StextResource resource = getResource();
 		resource.setURI(URI.createURI("path", true));
 		ParserRule parserRule = XtextFactory.eINSTANCE.createParserRule();
@@ -92,8 +97,13 @@ public abstract class AbstractSTextTest {
 		if (context != null) {
 			Statechart sc = _createStatechart("");
 			resource.getContents().add(sc);
-			sc.getScopes().add(context);
-			linker.linkModel(context, diagnosticsConsumer);
+			for (Scope scope : context) {
+				if (scope != null) {
+					sc.getScopes().add(scope);
+					linker.linkModel(scope, diagnosticsConsumer);
+				}
+
+			}
 		}
 		linker.linkModel(result.getRootASTElement(), diagnosticsConsumer);
 		resource.resolveLazyCrossReferences(CancelIndicator.NullImpl);