package org.modeldriven.fuml.test.model; import java.io.File; import junit.framework.Test; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.modeldriven.fuml.Fuml; import org.modeldriven.fuml.environment.Environment; import org.modeldriven.fuml.environment.ExecutionEnvironment; import org.modeldriven.fuml.test.FUMLTest; import org.modeldriven.fuml.test.FUMLTestSetup; import fUML.Semantics.Activities.IntermediateActivities.ActivityExecution; import fUML.Semantics.Classes.Kernel.BooleanValue; import fUML.Semantics.Classes.Kernel.ExtensionalValueList; import fUML.Semantics.Classes.Kernel.FeatureValueList; import fUML.Semantics.Classes.Kernel.Reference; import fUML.Semantics.Classes.Kernel.Value; import fUML.Semantics.Classes.Kernel.ValueList; import fUML.Semantics.CommonBehaviors.BasicBehaviors.ParameterValueList; import fUML.Syntax.Classes.Kernel.Class_; import fUML.Syntax.CommonBehaviors.BasicBehaviors.Behavior; /** * */ public class ExecutionTestCase extends FUMLTest { private static Log log = LogFactory.getLog(ExecutionTestCase.class); private static Environment environment; // JUnit creates a new test class for every test! private static String namespaceURI = "http://org.modeldriven.fuml/test/uml/magicdraw/fUML-Tests.uml"; public static Test suite() { return FUMLTestSetup.newTestSetup(ExecutionTestCase.class); } public void setUp() throws Exception { if (ExecutionTestCase.environment == null) { ExecutionTestCase.environment = Environment.getInstance(); String filename = "./target/test-classes/mdxml/fUML-Tests.mdxml"; File file = new File(filename); assertTrue("file '" + filename + "' does not exist", file.exists()); Fuml.load(file, namespaceURI); //Fuml.loadIncrementally(file, namespaceURI); } } public void tearDown() throws Exception { environment.locus.extensionalValues.clear(); } public void testCopier() throws Exception { ParameterValueList output = execute("Copier"); log.info("done"); assertEquals("output.size()", 1, output.size()); assertEqualValues("output", output.get(0), 0); } public void testCopierCaller() throws Exception { ParameterValueList output = execute("CopierCaller"); log.info("done"); assertEquals("output.size()", 1, output.size()); assertEqualValues("output", output.get(0), 888); } public void testSimpleDecision() throws Exception { ParameterValueList output = execute("SimpleDecision"); log.info("done"); assertEquals("output.size()", 2, output.size()); assertEqualValues("output_0", output.get(0), 0); assertEqualValues("output_1", output.get(1)); } public void testForkJoin() throws Exception { execute("ForkJoin"); log.info("done"); } public void testDecisionJoin() throws Exception { ParameterValueList output = execute("DecisionJoin"); log.info("done"); assertEquals("output.size()", 1, output.size()); assertEqualValues("output", output.get(0), 0, 1); } public void testForkMerge() throws Exception { ParameterValueList output = execute("ForkMerge"); log.info("done"); assertEquals("output.size()", 1, output.size()); assertEqualValues("output", output.get(0), 0, 0); } public void testTestClassExtentReader() throws Exception { ParameterValueList output = execute("TestClassExtentReader"); log.info("done"); Class_ testClass = (Class_)environment.findElementById("TestClass"); assertEquals("output.size()", 2, output.size()); assertTrue("object.hasType(testClass)", output.get(0).values.size() == 1 && output.get(0).values.get(0).hasType(testClass)); Value objectValue = output.get(0).values.get(0); for (Value value: output.get(1).values) { if (value.equals(objectValue)) { // NOTE: Uses fUML-specific Value::equals method. return; } } fail("extent.contains(object)"); } public void testSelfReader() throws Exception { ParameterValueList output = execute("SelfReader"); log.info("done"); assertTrue("Two output values", output.size() == 2 && output.get(0).values.size() == 1 && output.get(1).values.size() == 1); Value value1 = output.get(0).values.get(0); assertTrue("value1.referent instanceof ActivityExecution", value1 instanceof Reference && ((Reference)value1).referent instanceof ActivityExecution); Value value2 = output.get(1).values.get(0); assertTrue("value2.value", value2 instanceof BooleanValue && ((BooleanValue)value2).value); } public void testTestClassIdentityTester() throws Exception { ParameterValueList output = execute("TestClassIdentityTester"); log.info("done"); assertTrue("One output value", output.size() == 1 && output.get(0).values.size() == 1); Value value = output.get(0).values.get(0); assertFalse("value", value instanceof BooleanValue && ((BooleanValue)value).value); } public void testTestClassObjectCreator() throws Exception { ParameterValueList output = execute("TestClassObjectCreator"); log.info("done"); Class_ testClass = (Class_)environment.findElementById("TestClass"); assertEquals("output.size()", 1, output.size()); ValueList values = output.get(0).values; assertTrue("value.hasType(testClass)", values.size() == 1 && values.get(0).hasType(testClass)); } public void testTestClassObjectDestroyer() throws Exception { ParameterValueList output = execute("TestClassObjectDestroyer"); log.info("done"); assertTrue("One output value", output.size() == 1 && output.get(0).values.size() == 1); Value value = output.get(0).values.get(0); assertTrue("value.getTypes().isEmpty()", value.getTypes().isEmpty()); } public void testTestClassWriterReader() throws Exception { ParameterValueList output = execute("TestClassWriterReader"); log.info("done"); assertEquals("output.size()", 1, output.size()); assertEqualValues("output", output.get(0), 999); } public void testTestClassAttributeWriter() throws Exception { ParameterValueList output = execute("TestClassAttributeWriter"); log.info("done"); assertTrue("One output value", output.size() == 1 && output.get(0).values.size() == 1); Value value = output.get(0).values.get(0); assertTrue("value instanceof Reference", value instanceof Reference); FeatureValueList featureValues = ((Reference)value).getFeatureValues(); assertEquals("featureValues.size()", 2, featureValues.size()); assertEqualValues("y", featureValues.get(1).values, 0, 0); } public void testTestGeneralizationAssembly() throws Exception { execute("TestGeneralizationAssembly"); log.info("done"); Class_ specificClass = (Class_) environment.findElementById("TestGeneralizationAssembly-Specific"); ExtensionalValueList extent = environment.locus.getExtent(specificClass); assertEquals("extent.size()", 1, extent.size()); assertEquals("featureValues.size()", 2, extent.get(0).featureValues.size()); } public void testTestSimpleActivities() throws Exception { ParameterValueList output = execute("TestSimpleActivities"); log.info("done"); assertEquals("output.size()", 9, output.size()); assertEqualValues("Coper.output", output.get(0), 0); assertEqualValues("CoperCaller.output", output.get(1), 888); assertEqualValues("SimpleDecision_0.output_0", output.get(2), 0); assertEqualValues("SimpleDecision_0.output_1", output.get(3)); assertEqualValues("SimpleDecision_1.output_0", output.get(4)); assertEqualValues("SimpleDecision_1.output_1", output.get(5), 1); assertEqualValues("DecisionJoin.output", output.get(6), 0, 1); assertEqualValues("ForkMerge", output.get(7), 0, 0); assertEqualValues("ForkMergeData", output.get(8), 0, 0); } public void testTestClassValueRemover() throws Exception { ParameterValueList output = execute("TestClassAttributeValueRemover"); log.info("done"); Class_ testClass = (Class_)environment.findElementById("TestClass"); assertEquals("output.size()", 1, output.size()); ValueList values = output.get(0).values; assertTrue("value.hasType(testClass)", values.size() == 1 && values.get(0).hasType(testClass)); FeatureValueList featureValues = ((Reference)values.get(0)).getFeatureValues(); assertEquals("featureValues.size()", 2, featureValues.size()); ValueList yValues = featureValues.get(1).values; assertEqualValues("y", yValues, 2, 0); } public void testTestAssociationEndWriterReader() throws Exception { ParameterValueList output = execute("TestAssociationEndWriterReader"); log.info("done"); assertEquals("output.size()", 3, output.size()); assertEquals("expected.size()", 1, output.get(2).values.size()); Value expected = output.get(2).values.get(0); ValueList output1 = output.get(0).values; assertEquals("output1.size()", 2, output1.size()); assertAllEquals("output1", expected, output1); ValueList output2 = output.get(1).values; assertEquals("output2.size()", 1, output2.size()); assertAllEquals("output2", expected, output2); } public void testTestClassReclassifier() throws Exception { ParameterValueList output = execute("TestClassReclassifier"); log.info("done"); Class_ subclass = (Class_)environment.findElementById("Subclass2"); assertEquals("output.size()", 1, output.size()); ValueList values = output.get(0).values; assertTrue("value.hasType(subclass)", values.size() == 1 && values.get(0).hasType(subclass)); FeatureValueList featureValues = ((Reference)values.get(0)).getFeatureValues(); assertEquals("featureValues.size()", 3, featureValues.size()); assertEquals("b: values.size()", 0, featureValues.get(0).values.size()); assertEqualValues("x", featureValues.get(1).values, 1); assertEqualValues("y", featureValues.get(2).values, 2); } public void testTestSpecializedSignalSend() throws Exception { execute("TestSpecializedSignalSend"); log.info("done"); Class_ signalReceiverClass = (Class_)environment.findElementById("TestSignalReceiver"); ExtensionalValueList extent = environment.locus.getExtent(signalReceiverClass); assertEquals("extent.size()", 1, extent.size()); FeatureValueList featureValues = extent.get(0).getFeatureValues(); assertEquals("featureValues.size()", 1, featureValues.size()); assertEquals("signal: values.size()", 1, featureValues.get(0).values.size()); } public void testTestCallSend() throws Exception { execute("TestCallSend"); log.info("done"); Class_ callSenderClass = (Class_)environment.findElementById("TestCallSender"); ExtensionalValueList extent = environment.locus.getExtent(callSenderClass); assertEquals("extent.size()", 1, extent.size()); FeatureValueList featureValues = extent.get(0).getFeatureValues(); assertEquals("featureValues.size()", 1, featureValues.size()); assertEqualValues("value", featureValues.get(0).values, 0); } public void testNodeEnabler() throws Exception { ParameterValueList output = execute("TestNodeEnabler"); log.info("done"); assertTrue("One output value", output.size() == 1 && output.get(0).values.size() == 1); } public void testActiveClassBehaviorSender() throws Exception { execute("ActiveClassBehaviorSender"); log.info("done"); Class_ activeClass = (Class_)environment.findElementById("ActiveClass"); ExtensionalValueList extent = environment.locus.getExtent(activeClass); assertEquals("extent.size()", 1, extent.size()); FeatureValueList featureValues = extent.get(0).getFeatureValues(); assertEquals("featureValues.size()", 2, featureValues.size()); assertEquals("signal1: values.size()", 1, featureValues.get(0).values.size()); assertEquals("signal2: values.size()", 1, featureValues.get(1).values.size()); } public void testTestCentralBuffer() throws Exception { ParameterValueList output = execute("TestCentralBuffer"); log.info("done"); assertNotNull(output); assertEquals("output.size()", 1, output.size()); assertEqualValues("output", output.get(0), 0, 0); } public void testTestDataStore() throws Exception { ParameterValueList output = execute("TestDataStore"); log.info("done"); assertNotNull(output); assertEquals("output.size()", 1, output.size()); assertEqualValues("output", output.get(0), 1, 2); } private ParameterValueList execute(String activityName) { Behavior behavior = environment.findBehavior(activityName); if (behavior == null) throw new RuntimeException("invalid behavior, " + activityName); log.info("executing behavior: " + behavior.name); ExecutionEnvironment execution = new ExecutionEnvironment(environment); return execution.execute(behavior); } }