123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488 |
- using System;
- using System.Collections.Generic;
- using Jint.Native;
- using Jint.Native.Object;
- using Xunit;
- namespace Jint.Tests.Runtime
- {
- public class InteropTests : IDisposable
- {
- private readonly Engine _engine;
- public InteropTests()
- {
- _engine = new Engine()
- .SetValue("log", new Action<object>(Console.WriteLine))
- .SetValue("assert", new Action<bool>(Assert.True))
- ;
- }
- void IDisposable.Dispose()
- {
- }
- private void RunTest(string source)
- {
- _engine.Execute(source);
- }
- [Fact]
- public void PrimitiveTypesCanBeSet()
- {
- _engine.SetValue("x", 10);
- _engine.SetValue("y", true);
- _engine.SetValue("z", "foo");
- RunTest(@"
- assert(x === 10);
- assert(y === true);
- assert(z === 'foo');
- ");
- }
- [Fact]
- public void DelegatesCanBeSet()
- {
- _engine.SetValue("square", new Func<double, double>(x => x * x));
- RunTest(@"
- assert(square(10) === 100);
- ");
- }
- [Fact]
- public void CanGetObjectProperties()
- {
- var p = new Person
- {
- Name = "Mickey Mouse"
- };
- _engine.SetValue("p", p);
- RunTest(@"
- assert(p.Name === 'Mickey Mouse');
- ");
- }
- [Fact]
- public void CanInvokeObjectMethods()
- {
- var p = new Person
- {
- Name = "Mickey Mouse"
- };
- _engine.SetValue("p", p);
- RunTest(@"
- assert(p.ToString() === 'Mickey Mouse');
- ");
- }
- [Fact]
- public void CanSetObjectProperties()
- {
- var p = new Person
- {
- Name = "Mickey Mouse"
- };
- _engine.SetValue("p", p);
- RunTest(@"
- p.Name = 'Donald Duck';
- assert(p.Name === 'Donald Duck');
- ");
- Assert.Equal("Donald Duck", p.Name);
- }
- [Fact]
- public void CanAccessAnonymousObject()
- {
- var p = new
- {
- Name = "Mickey Mouse",
- };
- _engine.SetValue("p", p);
- RunTest(@"
- assert(p.Name === 'Mickey Mouse');
- ");
- }
- [Fact]
- public void CanAccessAnonymousObjectProperties()
- {
- var p = new
- {
- Address = new
- {
- City = "Mouseton"
- }
- };
- _engine.SetValue("p", p);
- RunTest(@"
- assert(p.Address.City === 'Mouseton');
- ");
- }
- [Fact]
- public void PocosCanReturnJsValueDirectly()
- {
- var o = new
- {
- x = new JsValue(1),
- y = new JsValue("string"),
- };
- _engine.SetValue("o", o);
- RunTest(@"
- assert(o.x === 1);
- assert(o.y === 'string');
- ");
- }
- [Fact]
- public void PocosCanReturnObjectInstanceDirectly()
- {
- var x = new ObjectInstance(_engine) { Extensible = true};
- x.Put("foo", new JsValue("bar"), false);
- var o = new
- {
- x
- };
- _engine.SetValue("o", o);
- RunTest(@"
- assert(o.x.foo === 'bar');
- ");
- }
- [Fact]
- public void DateTimeIsConvertedToDate()
- {
- var o = new
- {
- z = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
- };
- _engine.SetValue("o", o);
- RunTest(@"
- assert(o.z.valueOf() === 0);
- ");
- }
- [Fact]
- public void EcmaValuesAreAutomaticallyConvertedWhenSetInPoco()
- {
- var p = new Person
- {
- Name = "foo",
- };
- _engine.SetValue("p", p);
- RunTest(@"
- assert(p.Name === 'foo');
- assert(p.Age === 0);
- p.Name = 'bar';
- p.Age = 10;
- ");
- Assert.Equal("bar", p.Name);
- Assert.Equal(10, p.Age);
- }
- [Fact]
- public void EcmaValuesAreAutomaticallyConvertedToBestMatchWhenSetInPoco()
- {
- var p = new Person
- {
- Name = "foo",
- };
- _engine.SetValue("p", p);
- RunTest(@"
- p.Name = 10;
- p.Age = '20';
- ");
- Assert.Equal("10", p.Name);
- Assert.Equal(20, p.Age);
- }
- [Fact]
- public void ShouldCallInstanceMethodWithoutArgument()
- {
- _engine.SetValue("a", new A());
- RunTest(@"
- assert(a.Call1() === 0);
- ");
- }
- [Fact]
- public void ShouldCallInstanceMethodOverloadArgument()
- {
- _engine.SetValue("a", new A());
- RunTest(@"
- assert(a.Call1(1) === 1);
- ");
- }
- [Fact]
- public void ShouldCallInstanceMethodWithString()
- {
- var p = new Person();
- _engine.SetValue("a", new A());
- _engine.SetValue("p", p);
- RunTest(@"
- p.Name = a.Call2('foo');
- assert(p.Name === 'foo');
- ");
- Assert.Equal("foo", p.Name);
- }
- [Fact]
- public void CanUseTrim()
- {
- var p = new Person { Name = "Mickey Mouse "};
- _engine.SetValue("p", p);
- RunTest(@"
- assert(p.Name === 'Mickey Mouse ');
- p.Name = p.Name.trim();
- assert(p.Name === 'Mickey Mouse');
- ");
- Assert.Equal("Mickey Mouse", p.Name);
- }
- [Fact]
- public void CanUseMathFloor()
- {
- var p = new Person();
- _engine.SetValue("p", p);
- RunTest(@"
- p.Age = Math.floor(1.6);p
- assert(p.Age === 1);
- ");
- Assert.Equal(1, p.Age);
- }
- [Fact]
- public void CanUseDelegateAsFunction()
- {
- var even = new Func<int, bool>(x => x % 2 == 0);
- _engine.SetValue("even", even);
- RunTest(@"
- assert(even(2) === true);
- ");
- }
- [Fact]
- public void ShouldConvertArrayToArrayInstance()
- {
- var result = _engine
- .SetValue("values", new [] {1,2,3,4,5,6})
- .Execute("values.filter(function(x){ return x % 2 == 0; })");
-
- var parts = result.ToObject();
- Assert.True(parts.GetType().IsArray);
- Assert.Equal(3, ((object[])parts).Length);
- Assert.Equal(2d, ((object[])parts)[0]);
- Assert.Equal(4d, ((object[])parts)[1]);
- Assert.Equal(6d, ((object[])parts)[2]);
- }
- [Fact]
- public void ShouldConvertArrayInstanceToArray()
- {
- var result = _engine.Execute("'[email protected]'.split('@');");
- var parts = result.ToObject();
-
- Assert.True(parts.GetType().IsArray);
- Assert.Equal(2, ((object[])parts).Length);
- Assert.Equal("foo", ((object[])parts)[0]);
- Assert.Equal("bar.com", ((object[])parts)[1]);
- }
- [Fact]
- public void ShouldConvertBooleanInstanceToBool()
- {
- var result = _engine.Execute("new Boolean(true)");
- var value = result.ToObject();
- Assert.Equal(typeof(bool), value.GetType());
- Assert.Equal(true, value);
- }
- [Fact]
- public void ShouldConvertDateInstanceToDateTime()
- {
- var result = _engine.Execute("new Date(0)");
- var value = result.ToObject();
- Assert.Equal(typeof(DateTime), value.GetType());
- Assert.Equal(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc), value);
- }
- [Fact]
- public void ShouldConvertNumberInstanceToDouble()
- {
- var result = _engine.Execute("new Number(10)");
- var value = result.ToObject();
- Assert.Equal(typeof(double), value.GetType());
- Assert.Equal(10d, value);
- }
- [Fact]
- public void ShouldConvertStringInstanceToString()
- {
- var result = _engine.Execute("new String('foo')");
- var value = result.ToObject();
- Assert.Equal(typeof(string), value.GetType());
- Assert.Equal("foo", value);
- }
- [Fact]
- public void ShouldConvertObjectInstanceToExpando()
- {
- _engine.Execute("var o = {a: 1, b: 'foo'}");
- var result = _engine.GetGlobalValue("o");
- dynamic value = result.ToObject();
- Assert.Equal(1, value.a);
- Assert.Equal("foo", value.b);
- var dic = (IDictionary<string, object>)result.ToObject();
- Assert.Equal(1d, dic["a"]);
- Assert.Equal("foo", dic["b"]);
- }
- [Fact]
- public void ShouldNotTryToConvertCompatibleTypes()
- {
- _engine.SetValue("a", new A());
- RunTest(@"
- assert(a.Call3('foo') === 'foo');
- assert(a.Call3(1) === '1');
- ");
- }
- [Fact]
- public void ShouldNotTryToConvertDerivedTypes()
- {
- _engine.SetValue("a", new A());
- _engine.SetValue("p", new Person { Name = "Mickey" });
- RunTest(@"
- assert(a.Call4(p) === 'Mickey');
- ");
- }
- [Fact]
- public void ShouldExecuteFunctionCallBackAsDelegate()
- {
- _engine.SetValue("a", new A());
- RunTest(@"
- assert(a.Call5(function(a,b){ return a+b }) === '1foo');
- ");
- }
- [Fact]
- public void ShouldExecuteFunctionCallBackAsFuncAndThisCanBeAssigned()
- {
- _engine.SetValue("a", new A());
- RunTest(@"
- assert(a.Call6(function(a,b){ return this+a+b }) === 'bar1foo');
- ");
- }
- public interface IPerson
- {
- string Name { get; }
- }
- public class Person : IPerson
- {
- public string Name { get; set; }
- public int Age { get; set; }
-
- public override string ToString()
- {
- return Name;
- }
- }
- public class A
- {
- public int Call1()
- {
- return 0;
- }
- public int Call1(int x)
- {
- return x;
- }
- public string Call2(string x)
- {
- return x;
- }
- public string Call3(object x)
- {
- return x.ToString();
- }
- public string Call4(IPerson x)
- {
- return x.ToString();
- }
- public string Call5(Delegate callback)
- {
- var thisArg = JsValue.Undefined;
- var arguments = new JsValue[] { 1, "foo" };
- return callback.DynamicInvoke(thisArg, arguments).ToString();
- }
- public string Call6(Func<JsValue, JsValue[], JsValue> callback)
- {
- var thisArg = new JsValue("bar");
- var arguments = new JsValue[] { 1, "foo" };
- return callback(thisArg, arguments).ToString();
- }
- }
- }
- }
|