示例#1
0
        public void MethodCall()
        {
            var engine = new ScriptEngine();

            // Create a new object.
            dynamic obj = new DynamicMetaObjectWrapper((ObjectInstance)engine.Evaluate("({ f: function(a) { return a + 5; } })"));

            // Check calling the method works.
            Assert.AreEqual(8, obj.f(3));
            Assert.AreEqual(9, obj.f(4, 5));
            Assert.AreEqual(double.NaN, obj.f());

            // Attempting to call an invalid function should throw an exception.
            TestUtils.ExpectException <Microsoft.CSharp.RuntimeBinder.RuntimeBinderException>(() => obj.g(3));
        }
        public void SetGlobalValueType()
        {
            var engine = new ScriptEngine();

            TestUtils.ExpectException <JavaScriptException>(() => engine.SetGlobalValue("Math", typeof(Math)));

            engine.EnableExposedClrTypes = true;

            // Try setting a few Types.
            engine.SetGlobalValue("Math", typeof(Math));
            engine.SetGlobalValue("TestClass", typeof(TestClass));

            // Basic tests.
            Assert.AreEqual(-0.9589242746631384, engine.Evaluate("Math.Sin(5)"));
            Assert.AreEqual(Undefined.Value, engine.Evaluate("TestClass.Test1()"));
            Assert.AreEqual(false, engine.Evaluate("TestClass.Test2(false)"));
            Assert.AreEqual(true, engine.Evaluate("TestClass.Test2(true)"));
            Assert.AreEqual(250, engine.Evaluate("TestClass.Test3(255)"));
            Assert.AreEqual(-123, engine.Evaluate("TestClass.Test4(-100)"));
            Assert.AreEqual(-1234, engine.Evaluate("TestClass.Test5(-1001)"));
            Assert.AreEqual(60123, engine.Evaluate("TestClass.Test6(61234)"));
            Assert.AreEqual(-1234567890, engine.Evaluate("TestClass.Test7(-123456789)"));
            Assert.AreEqual(-1234567890, engine.Evaluate("TestClass.Test7(-123456789.9)"));
            Assert.AreEqual(0, engine.Evaluate("TestClass.Test7(-123456788.9)"));
            Assert.AreEqual(1234567890, engine.Evaluate("TestClass.Test8(123456789)"));
            Assert.AreEqual(1234567890, engine.Evaluate("TestClass.Test8(123456789.9)"));
            Assert.AreEqual(0, engine.Evaluate("TestClass.Test8(123456788.9)"));
            Assert.AreEqual(-12345678901234d, engine.Evaluate("TestClass.Test9(-123456789012345)"));
            Assert.AreEqual(12345678901234d, engine.Evaluate("TestClass.Test10(123456789012345)"));
            Assert.AreEqual(2.7182817459106445, engine.Evaluate("TestClass.Test11(3.14159265358979323)"));
            Assert.AreEqual(2.71828182845904523, engine.Evaluate("TestClass.Test12(3.14159265358979323)"));
            Assert.AreEqual(3.75, engine.Evaluate("TestClass.Test13(1.25)"));
            Assert.AreEqual("b", engine.Evaluate("TestClass.Test14('a')"));
            Assert.AreEqual("correct", engine.Evaluate("TestClass.Test15('test')"));
            Assert.AreEqual(Null.Value, engine.Evaluate("TestClass.Test16()"));
            Assert.AreEqual("correct", engine.Evaluate("TestClass.Test17(null)"));
            Assert.AreEqual("correct", engine.Evaluate("TestClass.Test18('test')"));
            Assert.AreEqual("correct", engine.Evaluate("TestClass.Test19(null)"));
            Assert.AreEqual(6.1, engine.Evaluate("TestClass.Test20(5.1)"));

            // Optional parameters.
            Assert.AreEqual(6, engine.Evaluate("TestClass.Optional1(1)"));
            Assert.AreEqual(9, engine.Evaluate("TestClass.Optional1(1, 5)"));
            Assert.AreEqual(12, engine.Evaluate("TestClass.Optional1(1, 5, 6)"));
            Assert.AreEqual(0, engine.Evaluate("TestClass.Optional2()"));

            // ParamArray.
            Assert.AreEqual(false, engine.Evaluate("TestClass.Params1()"));
            Assert.AreEqual(false, engine.Evaluate("TestClass.Params1(1)"));
            Assert.AreEqual(true, engine.Evaluate("TestClass.Params1(1, 2)"));

            // Overload test.
            Assert.AreEqual(4, engine.Evaluate("Math.Max(3, 4)"));
            Assert.AreEqual(3, engine.Evaluate("Math.Abs(-3)"));
            Assert.AreEqual(false, engine.Evaluate("TestClass.Overload1(1, 2)"));
            Assert.AreEqual("Hello, world", engine.Evaluate <string>("TestClass.Overload1('Hello, ', 'world')"));
            engine.SetGlobalValue("Int32", typeof(int));
            Assert.AreEqual(true, engine.Evaluate("TestClass.Overload1(new Int32(1), new Int32(2))"));

            // Incorrect number of arguments.
            TestUtils.ExpectException <JavaScriptException>(() => engine.Evaluate("Math.Sin()"));
            TestUtils.ExpectException <JavaScriptException>(() => engine.Evaluate("Math.Sin(5, 6)"));

            // Cannot convert between types.
            TestUtils.ExpectException <JavaScriptException>(() => engine.Evaluate("TestClass.Test2(5)"));
            TestUtils.ExpectException <JavaScriptException>(() => engine.Evaluate("TestClass.Test7('test')"));
            TestUtils.ExpectException <JavaScriptException>(() => engine.Evaluate("TestClass.Test12('test')"));
            TestUtils.ExpectException <JavaScriptException>(() => engine.Evaluate("TestClass.Test15(5)"));

            // Strings are converted to characters, but only if they are exactly one character in length.
            TestUtils.ExpectException <JavaScriptException>(() => engine.Evaluate("TestClass.Test14('')"));
            TestUtils.ExpectException <JavaScriptException>(() => engine.Evaluate("TestClass.Test14('abc')"));

            // Undefined can only be passed as an argument if the argument is object.
            TestUtils.ExpectException <JavaScriptException>(() => engine.Evaluate("TestClass.Test2(undefined)"));
            TestUtils.ExpectException <JavaScriptException>(() => engine.Evaluate("TestClass.Test7(undefined)"));
            TestUtils.ExpectException <JavaScriptException>(() => engine.Evaluate("TestClass.Test12(undefined)"));

            // Null can only be passed if the target type is a reference type.
            TestUtils.ExpectException <JavaScriptException>(() => engine.Evaluate("TestClass.Test2(null)"));
            TestUtils.ExpectException <JavaScriptException>(() => engine.Evaluate("TestClass.Test7(null)"));
            TestUtils.ExpectException <JavaScriptException>(() => engine.Evaluate("TestClass.Test12(null)"));
        }