InteropTests.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. using System;
  2. using Jint.Native;
  3. using Jint.Native.Object;
  4. using Xunit;
  5. namespace Jint.Tests.Runtime
  6. {
  7. public class InteropTests : IDisposable
  8. {
  9. private readonly Engine _engine;
  10. public InteropTests()
  11. {
  12. _engine = new Engine()
  13. .SetValue("log", new Action<object>(Console.WriteLine))
  14. .SetValue("assert", new Action<bool>(Assert.True))
  15. ;
  16. }
  17. void IDisposable.Dispose()
  18. {
  19. }
  20. private void RunTest(string source)
  21. {
  22. _engine.Execute(source);
  23. }
  24. [Fact]
  25. public void PrimitiveTypesCanBeSet()
  26. {
  27. _engine.SetValue("x", 10);
  28. _engine.SetValue("y", true);
  29. _engine.SetValue("z", "foo");
  30. RunTest(@"
  31. assert(x === 10);
  32. assert(y === true);
  33. assert(z === 'foo');
  34. ");
  35. }
  36. [Fact]
  37. public void DelegatesCanBeSet()
  38. {
  39. _engine.SetValue("square", new Func<double, double>(x => x * x));
  40. RunTest(@"
  41. assert(square(10) === 100);
  42. ");
  43. }
  44. [Fact]
  45. public void CanGetObjectProperties()
  46. {
  47. var p = new Person
  48. {
  49. Name = "Mickey Mouse"
  50. };
  51. _engine.SetValue("p", p);
  52. RunTest(@"
  53. assert(p.Name === 'Mickey Mouse');
  54. ");
  55. }
  56. [Fact]
  57. public void CanInvokeObjectMethods()
  58. {
  59. var p = new Person
  60. {
  61. Name = "Mickey Mouse"
  62. };
  63. _engine.SetValue("p", p);
  64. RunTest(@"
  65. assert(p.ToString() === 'Mickey Mouse');
  66. ");
  67. }
  68. [Fact]
  69. public void CanSetObjectProperties()
  70. {
  71. var p = new Person
  72. {
  73. Name = "Mickey Mouse"
  74. };
  75. _engine.SetValue("p", p);
  76. RunTest(@"
  77. p.Name = 'Donald Duck';
  78. assert(p.Name === 'Donald Duck');
  79. ");
  80. Assert.Equal("Donald Duck", p.Name);
  81. }
  82. [Fact]
  83. public void CanAccessAnonymousObject()
  84. {
  85. var p = new
  86. {
  87. Name = "Mickey Mouse",
  88. };
  89. _engine.SetValue("p", p);
  90. RunTest(@"
  91. assert(p.Name === 'Mickey Mouse');
  92. ");
  93. }
  94. [Fact]
  95. public void CanAccessAnonymousObjectProperties()
  96. {
  97. var p = new
  98. {
  99. Address = new
  100. {
  101. City = "Mouseton"
  102. }
  103. };
  104. _engine.SetValue("p", p);
  105. RunTest(@"
  106. assert(p.Address.City === 'Mouseton');
  107. ");
  108. }
  109. [Fact]
  110. public void PocosCanReturnJsValueDirectly()
  111. {
  112. var o = new
  113. {
  114. x = new JsValue(1),
  115. y = new JsValue("string"),
  116. };
  117. _engine.SetValue("o", o);
  118. RunTest(@"
  119. assert(o.x === 1);
  120. assert(o.y === 'string');
  121. ");
  122. }
  123. [Fact]
  124. public void PocosCanReturnObjectInstanceDirectly()
  125. {
  126. var x = new ObjectInstance(_engine) { Extensible = true};
  127. x.Put("foo", new JsValue("bar"), false);
  128. var o = new
  129. {
  130. x
  131. };
  132. _engine.SetValue("o", o);
  133. RunTest(@"
  134. assert(o.x.foo === 'bar');
  135. ");
  136. }
  137. [Fact]
  138. public void DateTimeIsConvertedToDate()
  139. {
  140. var o = new
  141. {
  142. z = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
  143. };
  144. _engine.SetValue("o", o);
  145. RunTest(@"
  146. assert(o.z.valueOf() === 0);
  147. ");
  148. }
  149. [Fact]
  150. public void EcmaValuesAreAutomaticallyConvertedWhenSetInPoco()
  151. {
  152. var p = new Person
  153. {
  154. Name = "foo",
  155. };
  156. _engine.SetValue("p", p);
  157. RunTest(@"
  158. assert(p.Name === 'foo');
  159. assert(p.Age === 0);
  160. p.Name = 'bar';
  161. p.Age = 10;
  162. ");
  163. Assert.Equal("bar", p.Name);
  164. Assert.Equal(10, p.Age);
  165. }
  166. [Fact]
  167. public void EcmaValuesAreAutomaticallyConvertedToBestMatchWhenSetInPoco()
  168. {
  169. var p = new Person
  170. {
  171. Name = "foo",
  172. };
  173. _engine.SetValue("p", p);
  174. RunTest(@"
  175. p.Name = 10;
  176. p.Age = '20';
  177. ");
  178. Assert.Equal("10", p.Name);
  179. Assert.Equal(20, p.Age);
  180. }
  181. [Fact]
  182. public void ShouldCallInstanceMethodWithoutArgument()
  183. {
  184. _engine.SetValue("a", new A());
  185. RunTest(@"
  186. assert(a.Call1() === 0);
  187. ");
  188. }
  189. [Fact]
  190. public void ShouldCallInstanceMethodOverloadArgument()
  191. {
  192. _engine.SetValue("a", new A());
  193. RunTest(@"
  194. assert(a.Call1(1) === 1);
  195. ");
  196. }
  197. public class Person
  198. {
  199. public string Name { get; set; }
  200. public int Age { get; set; }
  201. public override string ToString()
  202. {
  203. return Name;
  204. }
  205. }
  206. public class A
  207. {
  208. public int Call1()
  209. {
  210. return 0;
  211. }
  212. public int Call1(int x)
  213. {
  214. return x;
  215. }
  216. }
  217. }
  218. }