示例#1
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
                                        JsonSerializer serializer)
        {
            JToken token = JToken.Load(reader);

            if (token.Type == JTokenType.String)
            {
                string molang = token.Value <string>();
                return(MoLangParser.Parse(molang));
            }
            else if (token.Type == JTokenType.Integer)
            {
                return(new NumberExpression(token.Value <double>()));
            }
            else if (token.Type == JTokenType.Float)
            {
                return(new NumberExpression(token.Value <double>()));
            }
            else if (token.Type == JTokenType.Boolean)
            {
                return(new BooleanExpression(token.Value <bool>()));
            }

            return(existingValue);
        }
示例#2
0
    public void ZeroReturnsFalse()
    {
        var parsed = MoLangParser.Parse("return 0 ?? 'test'");
        var result = _runtime.Execute(parsed);

        Assert.AreEqual(result.AsString(), "test");
    }
示例#3
0
    public void ZeroVariableReturnsFalse()
    {
        _runtime.Environment.SetValue(new MoPath("variable.lastNumber"), new DoubleValue(0));
        var parsed = MoLangParser.Parse("return variable.lastNumber ?? 'test'");
        var result = _runtime.Execute(parsed);

        Assert.AreEqual(result.AsString(), "test");
    }
示例#4
0
    public void ArithmeticsDivision()
    {
        const double a = 1200;
        const double b = 800;
        const double expectedResult = a / b;

        var expression = MoLangParser.Parse("v.a / v.b");
        var runtime    = Setup(a, b);

        var result = runtime.Execute(expression);

        Assert.AreEqual(expectedResult, result.AsDouble());
    }
示例#5
0
    public void PropertyWrite()
    {
        var expression = MoLangParser.Parse("query.life_time = 5");

        MoLangRuntime runtime = new MoLangRuntime();

        var testStruct = new TestClass(Environment.TickCount);

        runtime.Environment.Structs.TryAdd(
            "query", new InteropStruct(testStruct));

        runtime.Execute(expression);
        Assert.AreEqual(5d, testStruct.Lifetime);
    }
示例#6
0
    public void PropertyRead()
    {
        var expression = MoLangParser.Parse("query.life_time");

        var           expected = Environment.TickCount * 3.5d;
        MoLangRuntime runtime  = new MoLangRuntime();

        runtime.Environment.Structs.TryAdd(
            "query", new InteropStruct(new TestClass(expected)));

        var result = runtime.Execute(expression);

        Assert.AreEqual(expected, result.AsDouble());
    }
示例#7
0
    public void OrderOfOperations()
    {
        var runtime = Setup(10, 20);

        var expr   = MoLangParser.Parse("v.b + (7 + 2 * (6 + 3) / 3 - 7) + v.a");
        var result = runtime.Execute(expr);

        Assert.AreEqual(36, result.AsDouble());

        result = runtime.Execute(MoLangParser.Parse("10 * 2 - (7 + 9)"));
        Assert.AreEqual(4, result.AsDouble());

        result = runtime.Execute(MoLangParser.Parse("12 + 2 * 44"));
        Assert.AreEqual(100, result.AsDouble());
    }
    public void MathFunctions()
    {
        MoLangParser parser = new MoLangParser(new TokenIterator("math.floor(10.1 + 20.1)"));

        parser.ExpressionTraverser.Visitors.Add(new MathOptimizationVisitor());

        var expr = parser.Parse();

        Assert.IsInstanceOfType(expr, typeof(NumberExpression));

        MoLangRuntime runtime = new MoLangRuntime();
        var           result  = runtime.Execute(expr);

        Assert.AreEqual(30, result.AsDouble());
    }
    public void Constants()
    {
        MoLangParser parser = new MoLangParser(new TokenIterator("7 + 2 * (6 + 3) / 3 - 7"));

        parser.ExpressionTraverser.Visitors.Add(new MathOptimizationVisitor());

        var expr = parser.Parse();

        Assert.IsInstanceOfType(expr, typeof(NumberExpression));

        MoLangRuntime runtime = new MoLangRuntime();
        var           result  = runtime.Execute(expr);

        Assert.AreEqual(6, result.AsDouble());
    }
示例#10
0
    public void EqualityOperatorTest()
    {
        var parsed = MoLangParser.Parse(@"
t.a = 10;
loop(10, {
t.a = t.a - 1;
t.a == 5 ? break : continue;
});
return t.a;
");

        Assert.IsNotNull(parsed);

        var result = _runtime.Execute(parsed);

        Assert.AreEqual(5, result.AsDouble());
    }
示例#11
0
    public void BiggerOrEqualTest()
    {
        var parsed = MoLangParser.Parse(@"
t.a = 1;
loop(10, {
t.a = t.a + 1;
t.a >= 5 ? break : continue;
});
return t.a;
");

        Assert.IsNotNull(parsed);

        var result = _runtime.Execute(parsed);

        Assert.AreEqual(5, result.AsDouble());
    }
示例#12
0
    public void ScriptRun()
    {
        _sw.Start();
        var parsed = MoLangParser.Parse(@"
        t.a = 213 + 2 / 0.5 + 5 + 2 * 3;

        query.debug_output(1 + 2 * 3);

        array.test.0 = 100;
        array.test[1] = 200;
        array.test[2] = 10.5;

        query.debug_output(array.test[1]);

        t.b = 3;

        loop(10, {
	        array.test[t.b] = array.test[t.b - 1] + 2;
	        t.b = t.b + 1;
        });

        for_each(v.r, array.test, {
            t.a = t.a + v.r;
            query.debug_output('hello1', t.a, v.r);
        });

        t.b = 0;

        loop(100, {
            t.b = t.b + 1;
            t.a = t.a + math.cos((Math.PI / 180.0f) * 270) + t.b;
            query.debug_output(array.test[t.b]);
            query.debug_output('hello', 'test', t.a, array.test[2], t.b);
        });

        query.debug_output(query.life_time());
        return t.a;
");

        _sw.Stop();
        var timeElapsedOnParsing = _sw.Elapsed;

        Assert.IsNotNull(parsed);

        Console.WriteLine($"Parser completed in {timeElapsedOnParsing.TotalMilliseconds}ms");

        const int runs       = 1000;
        const int warmupRuns = 10;

        TimeSpan totalElapsed = TimeSpan.Zero;
        TimeSpan max          = TimeSpan.Zero;
        TimeSpan min          = TimeSpan.MaxValue;

        for (int i = 0; i < runs + warmupRuns; i++)
        {
            _sw.Restart();
            _runtime.Execute(parsed);
            _sw.Stop();

            if (i >= warmupRuns)
            {
                totalElapsed += _sw.Elapsed;

                if (_sw.Elapsed < min)
                {
                    min = _sw.Elapsed;
                }

                if (_sw.Elapsed > max)
                {
                    max = _sw.Elapsed;
                }
            }
        }

        Console.WriteLine($"Executed {runs} runs. Total={totalElapsed.TotalMilliseconds}ms Avg={totalElapsed.TotalMilliseconds / runs}ms Max={max.TotalMilliseconds}ms Min={min.TotalMilliseconds}ms");
    }