public void TestUpdateFunction()
        {
            Dictionary       dictionary = CreateDictionary("Test");
            NameSpace        nameSpace  = CreateNameSpace(dictionary, "N1");
            Structure        structure  = CreateStructure(nameSpace, "S");
            StructureElement el1        = CreateStructureElement(structure, "A", "Boolean");
            RuleCondition    condition  = CreateRuleAndCondition(structure, "Cond");
            Action           action     = CreateAction(condition, "A <- True");
            Procedure        procedure  = CreateProcedure(structure, "P");
            Parameter        parameter  = CreateParameter(procedure, "V", "Boolean");
            RuleCondition    condition2 = CreateRuleAndCondition(procedure, "Cond");
            Action           action2    = CreateAction(condition2, "A <- V");

            Dictionary dictionary2 = CreateDictionary("TestUpdate");

            dictionary2.setUpdates(dictionary.Guid);

            Structure updatedStructure = structure.CreateStructureUpdate(dictionary2);

            Compiler.Compile_Synchronous(true);
            RuleCheckerVisitor visitor = new RuleCheckerVisitor(dictionary);

            visitor.visit(updatedStructure);

            Assert.IsNull(ErrorMessage(updatedStructure));
        }
        public void TestStructureDereference()
        {
            Dictionary       dictionary = CreateDictionary("Test");
            NameSpace        nameSpace  = CreateNameSpace(dictionary, "N1");
            Structure        structure  = CreateStructure(nameSpace, "Struct");
            StructureElement el1        = CreateStructureElement(structure, "e1", "Boolean");
            Function         f          = CreateFunction(nameSpace, "f", "Struct");
            Variable         v          = CreateVariable(nameSpace, "v", "Struct");
            Variable         v2         = CreateVariable(nameSpace, "v2", "Boolean");

            Parser parser = new Parser();
            {
                DerefExpression expression = parser.Expression(nameSpace, "N1.v.e1") as DerefExpression;
                Assert.IsNotNull(expression);
                Assert.AreEqual(3, expression.Arguments.Count);
                Assert.AreEqual(v, expression.Arguments[1].Ref);
                Assert.AreEqual(el1, expression.Arguments [2].Ref);
            }
            {
                DerefExpression expression = parser.Expression(nameSpace, "N1.f().e1") as DerefExpression;
                Assert.IsNotNull(expression);
                Assert.AreEqual(2, expression.Arguments.Count);
                Assert.AreEqual(structure, expression.Arguments [0].Ref);
                Assert.AreEqual(el1, expression.Arguments [1].Ref);
            }
            {
                DerefExpression expression = parser.Expression(nameSpace, "N1.Struct.e1") as DerefExpression;
                Assert.IsNotNull(expression);
                Assert.AreEqual(3, expression.Arguments.Count);
                Assert.AreEqual(structure, expression.Arguments[1].Ref);
                Assert.AreEqual(el1, expression.Arguments[2].Ref);
            }

            RuleCondition condition = CreateRuleAndCondition(nameSpace, "Test");
            Action        action1   = CreateAction(condition, "Struct.e1 <- True");
            Action        action2   = CreateAction(condition, "v2 <- Struct.e1");
            Action        action3   = CreateAction(condition, "f().e1 <- True");
            Action        action4   = CreateAction(condition, "v2 <- f().e1");

            Collection collection = CreateCollection(nameSpace, "Col", "Struct", 10);
            Variable   v3         = CreateVariable(nameSpace, "v3", "Col");
            Action     action5    = CreateAction(condition, "(FIRST X IN v3).e1 <- True");

            RuleCondition ruleCondition2 = CreateRuleAndCondition(structure, "Rule");
            Action        action6        = CreateAction(ruleCondition2, "THIS.e1 <- True");
            Action        action7        = CreateAction(ruleCondition2, "v2 <- THIS.e1");

            RuleCheckerVisitor visitor = new RuleCheckerVisitor(dictionary);

            visitor.visit(nameSpace);

            Assert.True(HasMessagePart(action1, "structure should not be used to reference an instance"));
            Assert.True(HasMessagePart(action2, "structure should not be used to reference an instance"));
            Assert.False(HasMessagePart(action3, "structure should not be used to reference an instance"));
            Assert.False(HasMessagePart(action4, "structure should not be used to reference an instance"));
            Assert.False(HasMessagePart(action5, "structure should not be used to reference an instance"));
            Assert.False(HasMessagePart(action6, "structure should not be used to reference an instance"));
            Assert.False(HasMessagePart(action7, "structure should not be used to reference an instance"));
        }
        /// <summary>
        ///     Checks the node
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Check(object sender, EventArgs e)
        {
            MarkingHistory.PerformMark(() =>
            {
                ModelElement modelElement = Model as ModelElement;
                if (modelElement != null)
                {
                    RuleCheckerVisitor visitor = new RuleCheckerVisitor(modelElement.Dictionary);

                    visitor.visit(modelElement, true);
                }
            });
        }
        public void TestEnclosing()
        {
            Dictionary       dictionary   = CreateDictionary("Test");
            NameSpace        nameSpace    = CreateNameSpace(dictionary, "N1");
            Structure        structure    = CreateStructure(nameSpace, "S");
            StructureElement element      = CreateStructureElement(structure, "E", "Integer");
            StateMachine     stateMachine = CreateStateMachine(structure, "SM");
            RuleCondition    condition    = CreateRuleAndCondition(stateMachine, "Cond");
            PreCondition     preCondition = CreatePreCondition(condition, "ENCLOSING.E == 0");

            RuleCheckerVisitor visitor = new RuleCheckerVisitor(dictionary);

            visitor.visit(nameSpace);

            Assert.Null(ErrorMessage(preCondition));
        }
        public void TestApplyOnFunctionCallNoSideEffect()
        {
            Dictionary dictionary = CreateDictionary("Test");
            NameSpace nameSpace = CreateNameSpace(dictionary, "N1");
            Collection collection = CreateCollection(nameSpace, "Col", "Integer", 10);
            Function f = CreateFunction(nameSpace, "f", "Col");
            Procedure p = CreateProcedure(nameSpace, "P");
            Parameter param = CreateParameter(p, "x", "Integer");

            RuleCondition condition = CreateRuleAndCondition(nameSpace, "Test");
            Action action1 = CreateAction(condition, "APPLY P(X) ON f()");

            RuleCheckerVisitor visitor = new RuleCheckerVisitor(dictionary);
            visitor.visit(nameSpace);
            Assert.Null(ErrorMessage(action1));
        }
        public void TestCollectionConcatenation()
        {
            Dictionary dictionary = CreateDictionary("Test");
            NameSpace  nameSpace  = CreateNameSpace(dictionary, "NameSpace");

            Structure        structure  = CreateStructure(nameSpace, "ModelElement");
            StructureElement structElem = CreateStructureElement(structure, "Value", "Boolean");

            structElem.setDefault("True");

            Collection collection = CreateCollection(nameSpace, "Coll", "ModelElement", 10);

            collection.Type = structure;
            collection.setMaxSize(3);
            collection.Default = "[]";

            Variable variable = CreateVariable(nameSpace, "V", "Coll");

            RuleCondition ruleCondition = CreateRuleAndCondition(nameSpace, "Test");
            Action        action        = CreateAction(ruleCondition, "V <- V + [ModelElement{Value => True}] ");

            RuleCheckerVisitor visitor = new RuleCheckerVisitor(dictionary);

            visitor.visit(nameSpace);

            Util.IsThereAnyError isThereAnyError = new Util.IsThereAnyError();
            Assert.AreEqual(0, isThereAnyError.ErrorsFound.Count);
            Assert.AreEqual("[]", variable.Value.LiteralName);

            Runner runner = new Runner(false);

            runner.Cycle();
            Assert.AreEqual("[" + structure.DefaultValue.LiteralName + "]", variable.Value.LiteralName);

            runner.Cycle();
            Assert.AreEqual("[" + structure.DefaultValue.LiteralName + ", " + structure.DefaultValue.LiteralName + "]", variable.Value.LiteralName);

            runner.Cycle();
            Assert.AreEqual("[" + structure.DefaultValue.LiteralName + ", " + structure.DefaultValue.LiteralName + ", " + structure.DefaultValue.LiteralName + "]", variable.Value.LiteralName);

            // In this case, the new collection cannot be placed in the variable
            runner.Cycle();
            Assert.AreEqual(1, action.Messages.Count);
            Assert.AreEqual(ElementLog.LevelEnum.Error, action.Messages[0].Level);
        }
        public void TestApplyOnFunctionCallWithSideEffect()
        {
            Dictionary dictionary = CreateDictionary("Test");
            NameSpace nameSpace = CreateNameSpace(dictionary, "N1");
            Collection collection = CreateCollection(nameSpace, "Col", "Integer", 10);
            Function f = CreateFunction(nameSpace, "f", "Col");
            Procedure p = CreateProcedure(nameSpace, "P");
            Parameter param = CreateParameter(p, "x", "Integer");
            RuleCondition condition2 = CreateRuleAndCondition(p, "Condition with side effect");
            Action action2 = CreateAction(condition2, "x <- 2");

            RuleCondition condition = CreateRuleAndCondition(nameSpace, "Test");
            Action action1 = CreateAction(condition, "APPLY P(X) ON f()");

            RuleCheckerVisitor visitor = new RuleCheckerVisitor(dictionary);
            visitor.visit(nameSpace);
            Assert.False(HasMessagePart(action1, "APPLY expression whose applied statement depends on the iterator should reference a variable for the input list"));
        }
        public void TestApplyOnFunctionCall()
        {
            Dictionary dictionary = CreateDictionary("Test");
            NameSpace  nameSpace  = CreateNameSpace(dictionary, "N1");
            Collection collection = CreateCollection(nameSpace, "Col", "Integer", 10);
            Function   f          = CreateFunction(nameSpace, "f", "Col");
            Procedure  p          = CreateProcedure(nameSpace, "P");
            Parameter  param      = CreateParameter(p, "x", "Integer");

            RuleCondition condition = CreateRuleAndCondition(nameSpace, "Test");
            Action        action1   = CreateAction(condition, "APPLY P(X) ON f()");

            RuleCheckerVisitor visitor = new RuleCheckerVisitor(dictionary);

            visitor.visit(nameSpace);

            Assert.Null(ErrorMessage(action1));
        }
        public void TestParameterTypeName_RelativePath()
        {
            Dictionary dictionary   = CreateDictionary("Test");
            NameSpace  nameSpace    = CreateNameSpace(dictionary, "N1");
            NameSpace  subNameSpace = CreateNameSpace(nameSpace, "N2");

            Enum      enumeration = CreateEnum(subNameSpace, "Enum");
            EnumValue value1      = CreateEnumValue(enumeration, "First");
            EnumValue value2      = CreateEnumValue(enumeration, "Second");

            Function function = CreateFunction(nameSpace, "F1", "Boolean");

            Parameter param = new Parameter();

            param.setTypeName("N2.Enum");
            param.setName("Value");
            function.appendParameters(param);

            Case cas1 = CreateCase(function, "Case 1", "True", "Value == N2.Enum.First");
            Case cas2 = CreateCase(function, "Case 2", "False");

            Dictionary dictionary2 = CreateDictionary("TestUpdate");

            dictionary2.setUpdates(dictionary.Guid);

            Function     updatedFunction = function.CreateFunctionUpdate(dictionary2);
            Case         cas3            = (Case)updatedFunction.Cases[0];
            PreCondition preCondition    = (PreCondition)cas3.PreConditions[0];

            preCondition.ExpressionText = "Value == N2.Enum.Second";

            Compiler.Compile_Synchronous(true);

            RuleCheckerVisitor ruleChecker = new RuleCheckerVisitor(dictionary2);

            ruleChecker.visit(updatedFunction);
            Assert.IsNull(ErrorMessage(updatedFunction));

            Expression expression = new Parser().Expression(dictionary, "N1.F1(N1.N2.Enum.Second)");
            IValue     value      = expression.GetExpressionValue(new InterpretationContext(), null);

            Assert.AreEqual(System.BoolType.True, value);
        }
        public void TestCollectionConcatenation()
        {
            Dictionary dictionary = CreateDictionary("Test");
            NameSpace nameSpace = CreateNameSpace(dictionary, "NameSpace");

            Structure structure = CreateStructure(nameSpace, "ModelElement");
            StructureElement structElem = CreateStructureElement(structure, "Value", "Boolean");
            structElem.setDefault("True");

            Collection collection = CreateCollection(nameSpace, "Coll", "ModelElement", 10);
            collection.Type = structure;
            collection.setMaxSize(3);
            collection.Default = "[]";

            Variable variable = CreateVariable(nameSpace, "V", "Coll");

            RuleCondition ruleCondition = CreateRuleAndCondition(nameSpace, "Test");
            Action action = CreateAction(ruleCondition, "V <- V + [ModelElement{Value => True}] ");

            RuleCheckerVisitor visitor = new RuleCheckerVisitor(dictionary);
            visitor.visit(nameSpace);

            Util.IsThereAnyError isThereAnyError = new Util.IsThereAnyError();
            Assert.AreEqual(0, isThereAnyError.ErrorsFound.Count);
            Assert.AreEqual("[]", variable.Value.LiteralName);

            Runner runner = new Runner(false);
            runner.Cycle();
            Assert.AreEqual("[" + structure.DefaultValue.LiteralName + "]", variable.Value.LiteralName);

            runner.Cycle();
            Assert.AreEqual("[" + structure.DefaultValue.LiteralName + ", " + structure.DefaultValue.LiteralName + "]", variable.Value.LiteralName);

            runner.Cycle();
            Assert.AreEqual("[" + structure.DefaultValue.LiteralName + ", " + structure.DefaultValue.LiteralName + ", " + structure.DefaultValue.LiteralName + "]", variable.Value.LiteralName);

            // In this case, the new collection cannot be placed in the variable
            runner.Cycle();
            Assert.AreEqual(1, action.Messages.Count);
            Assert.AreEqual(ElementLog.LevelEnum.Error, action.Messages[0].Level);
        }
        public void TestMaxMinValuesInRange()
        {
            Dictionary dictionary = CreateDictionary("Test");
            NameSpace nameSpace = CreateNameSpace(dictionary, "NameSpace");

            Range r1 = CreateRange(nameSpace, "r1", acceptor.PrecisionEnum.aIntegerPrecision, "0.5", "100");
            Range r2 = CreateRange(nameSpace, "r2", acceptor.PrecisionEnum.aDoublePrecision, "0.0", "100");
            Range r3 = CreateRange(nameSpace, "r3", acceptor.PrecisionEnum.aIntegerPrecision, "A", "100.0");

            RuleCheckerVisitor visitor = new RuleCheckerVisitor(dictionary);
            visitor.visit(nameSpace);

            Assert.True(HasMessage(r1, "Invalid min value for integer range : must be an integer"));
            Assert.False(HasMessage(r1, "Invalid max value for integer range : must be an integer"));

            Assert.False(HasMessage(r2, "Invalid min value for float range : must have a decimal part"));
            Assert.True(HasMessage(r2, "Invalid max value for float range : must have a decimal part"));

            Assert.True(HasMessage(r3, "Cannot parse min value for range"));
            Assert.False(HasMessage(r3, "Cannot parse max value for range"));
        }
        public void TestMaxMinValuesInRange()
        {
            Dictionary dictionary = CreateDictionary("Test");
            NameSpace  nameSpace  = CreateNameSpace(dictionary, "NameSpace");

            Range r1 = CreateRange(nameSpace, "r1", Generated.acceptor.PrecisionEnum.aIntegerPrecision, "0.5", "100");
            Range r2 = CreateRange(nameSpace, "r2", Generated.acceptor.PrecisionEnum.aDoublePrecision, "0.0", "100");
            Range r3 = CreateRange(nameSpace, "r3", Generated.acceptor.PrecisionEnum.aIntegerPrecision, "A", "100.0");

            RuleCheckerVisitor visitor = new RuleCheckerVisitor(dictionary);

            visitor.visit(nameSpace);

            Assert.True(HasMessage(r1, "Type08: Invalid min value for integer range : must be an integer"));
            Assert.False(HasMessage(r1, "Type08: Invalid max value for integer range : must be an integer"));

            Assert.False(HasMessage(r2, "Type09: Invalid min value for float range : must have a decimal part"));
            Assert.True(HasMessage(r2, "Type09: Invalid max value for float range : must have a decimal part"));

            Assert.True(HasMessage(r3, "Type10: Cannot parse min value for range"));
            Assert.False(HasMessage(r3, "Type10: Cannot parse max value for range"));
        }
        public void TestParameterTypeInDefaultNameSpace()
        {
            Dictionary dictionary = CreateDictionary("Test");
            NameSpace defaultNameSpace = CreateNameSpace(dictionary, "Default");
            NameSpace nameSpace = CreateNameSpace(dictionary, "N1");

            Enum enumeration = CreateEnum(defaultNameSpace, "Enum");
            EnumValue value1 = CreateEnumValue(enumeration, "First");
            EnumValue value2 = CreateEnumValue(enumeration, "Second");

            Function function = CreateFunction(nameSpace, "F1", "Boolean");

            Parameter param = new Parameter();
            param.setTypeName("Enum");
            param.setName("Value");
            function.appendParameters(param);

            Case cas1 = CreateCase(function, "Case 1", "True", "Value == Enum.First");
            Case cas2 = CreateCase(function, "Case 2", "False");

            Dictionary dictionary2 = CreateDictionary("TestUpdate");
            dictionary2.setUpdates(dictionary.Guid);

            Function updatedFunction = function.CreateFunctionUpdate(dictionary2);
            Case cas3 = (Case) updatedFunction.Cases[0];
            PreCondition preCondition = (PreCondition) cas3.PreConditions[0];
            preCondition.ExpressionText = "Value == Enum.Second";

            Compiler.Compile_Synchronous(true);

            RuleCheckerVisitor ruleChecker = new RuleCheckerVisitor(dictionary2);
            ruleChecker.visit(updatedFunction);
            Assert.IsNull(ErrorMessage(updatedFunction));

            Expression expression = Parser.Expression(dictionary, "N1.F1(Enum.Second)");
            IValue value = expression.GetValue(new InterpretationContext(), null);
            Assert.AreEqual(System.BoolType.True, value);
        }
        public void TestUpdateFunction()
        {
            Dictionary dictionary = CreateDictionary("Test");
            NameSpace nameSpace = CreateNameSpace(dictionary, "N1");
            Structure structure = CreateStructure(nameSpace, "S");
            StructureElement el1 = CreateStructureElement(structure, "A", "Boolean");
            RuleCondition condition = CreateRuleAndCondition(structure, "Cond");
            Action action = CreateAction(condition, "A <- True");
            Procedure procedure = CreateProcedure(structure, "P");
            Parameter parameter = CreateParameter(procedure, "V", "Boolean");
            RuleCondition condition2 = CreateRuleAndCondition(procedure, "Cond");
            Action action2 = CreateAction(condition2, "A <- V");

            Dictionary dictionary2 = CreateDictionary("TestUpdate");
            dictionary2.setUpdates(dictionary.Guid);

            Structure updatedStructure = structure.CreateStructureUpdate(dictionary2);

            Compiler.Compile_Synchronous(true);
            RuleCheckerVisitor visitor = new RuleCheckerVisitor(dictionary);
            visitor.visit(updatedStructure);

            Assert.IsNull(ErrorMessage(updatedStructure));
        }
Exemple #15
0
        /// <summary>
        ///     Perform all functional tests defined in the .EFS file provided
        /// </summary>
        /// <param name="args"></param>
        /// <returns>the error code of the program</returns>
        private static int Main(string[] args)
        {
            int retVal = 0;

            EfsSystem efsSystem = EfsSystem.Instance;

            try
            {
                Console.Out.WriteLine("EFS Tester");

                // Load the dictionaries provided as parameters
                Util.PleaseLockFiles = false;
                foreach (string arg in args)
                {
                    Console.Out.WriteLine("Loading dictionary " + arg);

                    Dictionary dictionary = Util.Load(efsSystem, new Util.LoadParams(arg)
                    {
                        LockFiles       = false,
                        Errors          = null,
                        UpdateGuid      = false,
                        ConvertObsolete = false
                    });
                    if (dictionary == null)
                    {
                        Console.Out.WriteLine("Cannot load dictionary " + arg);
                        return(-1);
                    }
                }

                // Translate the sub sequences, if required
                Console.Out.WriteLine("Translating sub sequences");
                foreach (Dictionary dictionary in efsSystem.Dictionaries)
                {
                    foreach (Frame frame in dictionary.Tests)
                    {
                        foreach (SubSequence subSequence in frame.SubSequences)
                        {
                            if (subSequence.getCompleted())
                            {
                                if (dictionary.TranslationDictionary != null)
                                {
                                    subSequence.Translate();
                                }
                            }
                        }
                    }
                }

                // Make sure everything is recompiled
                Console.Out.WriteLine("Recompiling everything");
                efsSystem.Compiler.Compile_Synchronous(true);

                // Ensure the model is consistent
                Console.Out.WriteLine("Checking model");
                foreach (Dictionary dictionary in efsSystem.Dictionaries)
                {
                    RuleCheckerVisitor checker = new RuleCheckerVisitor(dictionary);
                    checker.visit(dictionary);
                }

                // Dumps all errors found
                Util.IsThereAnyError isThereAnyError = new Util.IsThereAnyError();
                if (isThereAnyError.ErrorsFound.Count > 0)
                {
                    foreach (ElementLog error in isThereAnyError.ErrorsFound)
                    {
                        Console.Out.WriteLine(error.Log);
                    }
                    return(-1);
                }

                {
                    // Perform functional test for last loaded dictionary
                    Dictionary dictionary = efsSystem.Dictionaries.FindLast(x => true);
                    Console.Out.WriteLine("Processing tests from dictionary " + dictionary.Name);
                    foreach (Frame frame in dictionary.Tests)
                    {
                        Console.Out.WriteLine("Executing frame " + frame.FullName);
                        foreach (SubSequence subSequence in frame.SubSequences)
                        {
                            Console.Out.WriteLine("Executing sub sequence " + subSequence.FullName);
                            if (subSequence.getCompleted())
                            {
                                Runner runner = new Runner(subSequence, false, true);
                                runner.RunUntilStep(null);

                                bool failed = false;
                                foreach (ModelEvent evt in runner.FailedExpectations())
                                {
                                    Expect expect = evt as Expect;
                                    if (expect != null)
                                    {
                                        string message = expect.Message.Replace('\n', ' ');
                                        Console.Out.WriteLine(" failed :" + message);
                                        failed = true;
                                    }
                                    else
                                    {
                                        ModelInterpretationFailure modelInterpretationFailure =
                                            evt as ModelInterpretationFailure;
                                        if (modelInterpretationFailure != null)
                                        {
                                            Console.Out.WriteLine(" failed : " + modelInterpretationFailure.Message);
                                            failed = true;
                                        }
                                    }
                                }

                                if (failed)
                                {
                                    Console.Out.WriteLine("  -> Failed");
                                    retVal = -1;
                                }
                                else
                                {
                                    Console.Out.WriteLine("  -> Success");
                                }
                            }
                            else
                            {
                                Console.Out.WriteLine("  -> Not executed because it is not marked as completed");
                            }
                        }
                    }
                }
            }
            finally
            {
                Util.UnlockAllFiles();
                efsSystem.Stop();
            }

            return(retVal);
        }
        public void TestStructureDereference()
        {
            Dictionary dictionary = CreateDictionary("Test");
            NameSpace nameSpace = CreateNameSpace(dictionary, "N1");
            Structure structure = CreateStructure (nameSpace, "Struct");
            StructureElement el1 = CreateStructureElement (structure, "e1", "Boolean");
            Function f = CreateFunction (nameSpace, "f", "Struct");
            Variable v = CreateVariable (nameSpace, "v", "Struct");
            Variable v2 = CreateVariable(nameSpace, "v2", "Boolean");

            Parser parser = new Parser ();
            {
                DerefExpression expression = parser.Expression (nameSpace, "N1.v.e1") as DerefExpression;
                Assert.IsNotNull (expression);
                Assert.AreEqual(3, expression.Arguments.Count);
                Assert.AreEqual(v, expression.Arguments[1].Ref);
                Assert.AreEqual (el1, expression.Arguments [2].Ref);
            }
            {
                DerefExpression expression = parser.Expression (nameSpace, "N1.f().e1") as DerefExpression;
                Assert.IsNotNull (expression);
                Assert.AreEqual (2, expression.Arguments.Count);
                Assert.AreEqual (structure, expression.Arguments [0].Ref);
                Assert.AreEqual (el1, expression.Arguments [1].Ref);
            }
            {
                DerefExpression expression = parser.Expression(nameSpace, "N1.Struct.e1") as DerefExpression;
                Assert.IsNotNull(expression);
                Assert.AreEqual(3, expression.Arguments.Count);
                Assert.AreEqual(structure, expression.Arguments[1].Ref);
                Assert.AreEqual(el1, expression.Arguments[2].Ref);
            }

            RuleCondition condition = CreateRuleAndCondition (nameSpace, "Test");
            Action action1 = CreateAction (condition, "Struct.e1 <- True");
            Action action2 = CreateAction(condition, "v2 <- Struct.e1");
            Action action3 = CreateAction(condition, "f().e1 <- True");
            Action action4 = CreateAction(condition, "v2 <- f().e1");

            Collection collection = CreateCollection (nameSpace, "Col", "Struct", 10);
            Variable v3 = CreateVariable (nameSpace, "v3", "Col");
            Action action5 = CreateAction (condition, "(FIRST X IN v3).e1 <- True");

            RuleCondition ruleCondition2 = CreateRuleAndCondition(structure, "Rule");
            Action action6 = CreateAction (ruleCondition2, "THIS.e1 <- True");
            Action action7 = CreateAction(ruleCondition2, "v2 <- THIS.e1");

            RuleCheckerVisitor visitor = new RuleCheckerVisitor(dictionary);
            visitor.visit(nameSpace);

            Assert.True(HasMessagePart(action1, "structure should not be used to reference an instance"));
            Assert.True(HasMessagePart(action2, "structure should not be used to reference an instance"));
            Assert.False(HasMessagePart(action3, "structure should not be used to reference an instance"));
            Assert.False(HasMessagePart(action4, "structure should not be used to reference an instance"));
            Assert.False(HasMessagePart(action5, "structure should not be used to reference an instance"));
            Assert.False(HasMessagePart(action6, "structure should not be used to reference an instance"));
            Assert.False(HasMessagePart(action7, "structure should not be used to reference an instance"));
        }
        public void TestEnclosing()
        {
            Dictionary dictionary = CreateDictionary("Test");
            NameSpace nameSpace = CreateNameSpace(dictionary, "N1");
            Structure structure = CreateStructure(nameSpace, "S");
            StructureElement element = CreateStructureElement(structure, "E", "Integer");
            StateMachine stateMachine = CreateStateMachine(structure, "SM");
            RuleCondition condition = CreateRuleAndCondition(stateMachine, "Cond");
            PreCondition preCondition = CreatePreCondition(condition, "ENCLOSING.E == 0");

            RuleCheckerVisitor visitor = new RuleCheckerVisitor(dictionary);
            visitor.visit(nameSpace);

            Assert.Null(ErrorMessage(preCondition));
        }