예제 #1
0
        public void CreateAssignDotCommand()
        {
            DotExpression        leftvalue = (DotExpression)(new Parser("a.b")).ParseExpression();
            IExpression          value     = new ConstantExpression(1);
            AssignDotExpressions cmd       = new AssignDotExpressions(leftvalue, value);

            Assert.AreSame(leftvalue, cmd.LeftValue);
            Assert.AreSame(value, cmd.Expression);
        }
예제 #2
0
        public void ParseAssignDotCommand()
        {
            Parser        parser   = new Parser("a.b = 2");
            DotExpression dotexpr  = (DotExpression)(new Parser("a.b")).ParseExpression();
            var           expected = new AssignDotExpressions(dotexpr, new ConstantExpression(2));
            var           result   = parser.ParseCommand();

            Assert.IsNotNull(result);
            Assert.AreEqual(expected, result);

            Assert.IsNull(parser.ParseCommand());
        }
예제 #3
0
        public IExpression ParseExpression()
        {
            IExpression expr = this.ParseNoAssignExpression();

            if (expr == null)
            {
                return(null);
            }

            if (!(expr is NameExpression) && !(expr is ClassVarExpression) && !(expr is InstanceVarExpression) && !(expr is DotExpression) && !(expr is IndexedExpression))
            {
                return(expr);
            }

            var token = this.lexer.NextToken();

            if (token == null)
            {
                return(expr);
            }

            if (token.Type != TokenType.Operator || token.Value != "=")
            {
                this.lexer.PushToken(token);
                return(expr);
            }

            IExpression assignexpr = null;

            if (expr is NameExpression)
            {
                assignexpr = new AssignExpression(((NameExpression)expr).Name, this.ParseExpression());
            }
            else if (expr is DotExpression)
            {
                assignexpr = new AssignDotExpressions((DotExpression)expr, this.ParseExpression());
            }
            else if (expr is InstanceVarExpression)
            {
                assignexpr = new AssignInstanceVarExpression(((InstanceVarExpression)expr).Name, this.ParseExpression());
            }
            else if (expr is ClassVarExpression)
            {
                assignexpr = new AssignClassVarExpression(((ClassVarExpression)expr).Name, this.ParseExpression());
            }
            else if (expr is IndexedExpression)
            {
                assignexpr = new AssignIndexedExpression(((IndexedExpression)expr).Expression, ((IndexedExpression)expr).IndexExpression, this.ParseExpression());
            }

            return(assignexpr);
        }
예제 #4
0
        public void ExecuteAssignDotCommandOnNativeProperty()
        {
            Person  person  = new Person();
            Machine machine = new Machine();

            machine.RootContext.SetLocalValue("p", person);
            var leftvalue            = (DotExpression)(new Parser("p.FirstName")).ParseExpression();
            var value                = new ConstantExpression("Adam");
            AssignDotExpressions cmd = new AssignDotExpressions(leftvalue, value);

            var result = cmd.Evaluate(machine.RootContext);

            Assert.IsNotNull(result);
            Assert.AreEqual("Adam", result);
            Assert.AreEqual("Adam", person.FirstName);
        }
예제 #5
0
        public void Equals()
        {
            DotExpression expr1 = (DotExpression)(new Parser("a.b")).ParseExpression();
            DotExpression expr2 = (DotExpression)(new Parser("a.c")).ParseExpression();

            AssignDotExpressions cmd1 = new AssignDotExpressions(expr1, new ConstantExpression(1));
            AssignDotExpressions cmd2 = new AssignDotExpressions(expr1, new ConstantExpression(2));
            AssignDotExpressions cmd3 = new AssignDotExpressions(expr2, new ConstantExpression(1));
            AssignDotExpressions cmd4 = new AssignDotExpressions(expr1, new ConstantExpression(1));

            Assert.IsTrue(cmd1.Equals(cmd4));
            Assert.IsTrue(cmd4.Equals(cmd1));
            Assert.AreEqual(cmd1.GetHashCode(), cmd4.GetHashCode());

            Assert.IsFalse(cmd1.Equals(null));
            Assert.IsFalse(cmd1.Equals(cmd2));
            Assert.IsFalse(cmd1.Equals(cmd3));
            Assert.IsFalse(cmd1.Equals(123));
        }
예제 #6
0
        public void ExecuteAssignDotCommand()
        {
            Machine machine = new Machine();
            var     @class  = new DynamicClass("Dog");
            var     method  = new DefinedFunction((new Parser("@name = name")).ParseCommand(), new string[] { "name" }, machine.RootContext);

            @class.SetInstanceMethod("name=", method);
            var nero = @class.CreateInstance();

            machine.RootContext.SetLocalValue("nero", nero);
            var leftvalue            = (DotExpression)(new Parser("nero.name")).ParseExpression();
            var value                = new ConstantExpression("Nero");
            AssignDotExpressions cmd = new AssignDotExpressions(leftvalue, value);

            var result = cmd.Evaluate(machine.RootContext);

            Assert.IsNotNull(result);
            Assert.AreEqual("Nero", result);
            Assert.AreEqual("Nero", nero.GetValue("name"));
        }
예제 #7
0
        public void ExecuteAssignDotCommandWithUnknownMethod()
        {
            Machine machine = new Machine();
            var     @class  = new DynamicClass("Dog");
            var     nero    = @class.CreateInstance();

            machine.RootContext.SetLocalValue("nero", nero);
            var leftvalue            = (DotExpression)(new Parser("nero.name")).ParseExpression();
            var value                = new ConstantExpression("Nero");
            AssignDotExpressions cmd = new AssignDotExpressions(leftvalue, value);

            try
            {
                cmd.Evaluate(machine.RootContext);
                Assert.Fail();
            }
            catch (Exception ex)
            {
                Assert.IsInstanceOfType(ex, typeof(NoMethodError));
            }
        }