2
0

ExtensionMethodsTest.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. using Jint.Native;
  2. using Jint.Tests.Runtime.Domain;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using Xunit;
  6. namespace Jint.Tests.Runtime.ExtensionMethods
  7. {
  8. public class ExtensionMethodsTest
  9. {
  10. [Fact]
  11. public void ShouldInvokeObjectExtensionMethod()
  12. {
  13. var person = new Person();
  14. person.Name = "Mickey Mouse";
  15. person.Age = 35;
  16. var options = new Options();
  17. options.AddExtensionMethods(typeof(PersonExtensions));
  18. var engine = new Engine(options);
  19. engine.SetValue("person", person);
  20. var age = engine.Evaluate("person.MultiplyAge(2)").AsInteger();
  21. Assert.Equal(70, age);
  22. }
  23. [Fact]
  24. public void ShouldInvokeStringExtensionMethod()
  25. {
  26. var options = new Options();
  27. options.AddExtensionMethods(typeof(CustomStringExtensions));
  28. var engine = new Engine(options);
  29. var result = engine.Evaluate("\"Hello World!\".Backwards()").AsString();
  30. Assert.Equal("!dlroW olleH", result);
  31. }
  32. [Fact]
  33. public void ShouldInvokeNumberExtensionMethod()
  34. {
  35. var options = new Options();
  36. options.AddExtensionMethods(typeof(DoubleExtensions));
  37. var engine = new Engine(options);
  38. var result = engine.Evaluate("let numb = 27; numb.Add(13)").AsInteger();
  39. Assert.Equal(40, result);
  40. }
  41. [Fact]
  42. public void ShouldPrioritizingNonGenericMethod()
  43. {
  44. var options = new Options();
  45. options.AddExtensionMethods(typeof(CustomStringExtensions));
  46. var engine = new Engine(options);
  47. var result = engine.Evaluate("\"{'name':'Mickey'}\".DeserializeObject()").ToObject() as dynamic;
  48. Assert.Equal("Mickey", result.name);
  49. }
  50. [Fact]
  51. public void PrototypeFunctionsShouldNotBeOverridden()
  52. {
  53. var engine = new Engine(opts =>
  54. {
  55. opts.AddExtensionMethods(typeof(CustomStringExtensions));
  56. });
  57. //uses split function from StringPrototype
  58. var arr = engine.Evaluate("'yes,no'.split(',')").AsArray();
  59. Assert.Equal("yes", arr[0]);
  60. Assert.Equal("no", arr[1]);
  61. //uses split function from CustomStringExtensions
  62. var arr2 = engine.Evaluate("'yes,no'.split(2)").AsArray();
  63. Assert.Equal("ye", arr2[0]);
  64. Assert.Equal("s,no", arr2[1]);
  65. }
  66. [Fact]
  67. public void OverridePrototypeFunctions()
  68. {
  69. var engine = new Engine(opts =>
  70. {
  71. opts.AddExtensionMethods(typeof(OverrideStringPrototypeExtensions));
  72. });
  73. //uses the overridden split function from OverrideStringPrototypeExtensions
  74. var arr = engine.Evaluate("'yes,no'.split(',')").AsArray();
  75. Assert.Equal("YES", arr[0]);
  76. Assert.Equal("NO", arr[1]);
  77. }
  78. [Fact]
  79. public void HasOwnPropertyShouldWorkCorrectlyInPresenceOfExtensionMethods()
  80. {
  81. var person = new Person();
  82. var options = new Options();
  83. options.AddExtensionMethods(typeof(PersonExtensions));
  84. var engine = new Engine(options);
  85. engine.SetValue("person", person);
  86. var isBogusInPerson = engine.Evaluate("'bogus' in person").AsBoolean();
  87. Assert.False(isBogusInPerson);
  88. var propertyValue = engine.Evaluate("person.bogus");
  89. Assert.Equal(JsValue.Undefined, propertyValue);
  90. }
  91. private Engine GetLinqEngine()
  92. {
  93. return new Engine(opts =>
  94. {
  95. opts.AddExtensionMethods(typeof(Enumerable));
  96. });
  97. }
  98. [Fact]
  99. public void LinqExtensionMethodWithoutGenericParameter()
  100. {
  101. var engine = GetLinqEngine();
  102. var intList = new List<int>() { 0, 1, 2, 3 };
  103. engine.SetValue("intList", intList);
  104. var intSumRes = engine.Evaluate("intList.Sum()").AsNumber();
  105. Assert.Equal(6, intSumRes);
  106. }
  107. [Fact]
  108. public void LinqExtensionMethodWithSingleGenericParameter()
  109. {
  110. var engine = GetLinqEngine();
  111. var stringList = new List<string>() { "working", "linq" };
  112. engine.SetValue("stringList", stringList);
  113. var stringSumRes = engine.Evaluate("stringList.Sum(x => x.length)").AsNumber();
  114. Assert.Equal(11, stringSumRes);
  115. }
  116. [Fact]
  117. public void LinqExtensionMethodWithMultipleGenericParameters()
  118. {
  119. var engine = GetLinqEngine();
  120. var stringList = new List<string>() { "working", "linq" };
  121. engine.SetValue("stringList", stringList);
  122. var stringRes = engine.Evaluate("stringList.Select((x) => x + 'a').ToArray().join()").AsString();
  123. Assert.Equal("workinga,linqa", stringRes);
  124. // The method ambiguity resolver is not so smart to choose the Select method with the correct number of parameters
  125. // Thus, the following script will not work as expected.
  126. // stringList.Select((x, i) => x + i).ToArray().join()
  127. }
  128. }
  129. }