ExtensionMethodsTest.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using Jint.Native;
  2. using Jint.Tests.Runtime.Domain;
  3. using Xunit;
  4. namespace Jint.Tests.Runtime.ExtensionMethods
  5. {
  6. public class ExtensionMethodsTest
  7. {
  8. [Fact]
  9. public void ShouldInvokeObjectExtensionMethod()
  10. {
  11. var person = new Person();
  12. person.Name = "Mickey Mouse";
  13. person.Age = 35;
  14. var options = new Options();
  15. options.AddExtensionMethods(typeof(PersonExtensions));
  16. var engine = new Engine(options);
  17. engine.SetValue("person", person);
  18. var age = engine.Execute("person.MultiplyAge(2)").GetCompletionValue().AsInteger();
  19. Assert.Equal(70, age);
  20. }
  21. [Fact]
  22. public void ShouldInvokeStringExtensionMethod()
  23. {
  24. var options = new Options();
  25. options.AddExtensionMethods(typeof(CustomStringExtensions));
  26. var engine = new Engine(options);
  27. var result = engine.Execute("\"Hello World!\".Backwards()").GetCompletionValue().AsString();
  28. Assert.Equal("!dlroW olleH", result);
  29. }
  30. [Fact]
  31. public void ShouldInvokeNumberExtensionMethod()
  32. {
  33. var options = new Options();
  34. options.AddExtensionMethods(typeof(DoubleExtensions));
  35. var engine = new Engine(options);
  36. var result = engine.Execute("let numb = 27; numb.Add(13)").GetCompletionValue().AsInteger();
  37. Assert.Equal(40, result);
  38. }
  39. [Fact]
  40. public void ShouldPrioritizingNonGenericMethod()
  41. {
  42. var options = new Options();
  43. options.AddExtensionMethods(typeof(CustomStringExtensions));
  44. var engine = new Engine(options);
  45. var result = engine.Execute("\"{'name':'Mickey'}\".DeserializeObject()").GetCompletionValue().ToObject() as dynamic;
  46. Assert.Equal("Mickey", result.name);
  47. }
  48. [Fact]
  49. public void PrototypeFunctionsShouldNotBeOverridden()
  50. {
  51. var engine = new Engine(opts =>
  52. {
  53. opts.AddExtensionMethods(typeof(CustomStringExtensions));
  54. });
  55. //uses split function from StringPrototype
  56. var arr = engine.Execute("'yes,no'.split(',')").GetCompletionValue().AsArray();
  57. Assert.Equal("yes", arr[0]);
  58. Assert.Equal("no", arr[1]);
  59. //uses split function from CustomStringExtensions
  60. var arr2 = engine.Execute("'yes,no'.split(2)").GetCompletionValue().AsArray();
  61. Assert.Equal("ye", arr2[0]);
  62. Assert.Equal("s,no", arr2[1]);
  63. }
  64. [Fact]
  65. public void OverridePrototypeFunctions()
  66. {
  67. var engine = new Engine(opts =>
  68. {
  69. opts.AddExtensionMethods(typeof(OverrideStringPrototypeExtensions));
  70. });
  71. //uses the overridden split function from OverrideStringPrototypeExtensions
  72. var arr = engine.Execute("'yes,no'.split(',')").GetCompletionValue().AsArray();
  73. Assert.Equal("YES", arr[0]);
  74. Assert.Equal("NO", arr[1]);
  75. }
  76. [Fact]
  77. public void HasOwnPropertyShouldWorkCorrectlyInPresenceOfExtensionMethods()
  78. {
  79. var person = new Person();
  80. var options = new Options();
  81. options.AddExtensionMethods(typeof(PersonExtensions));
  82. var engine = new Engine(options);
  83. engine.SetValue("person", person);
  84. var isBogusInPerson = engine.Execute("'bogus' in person").GetCompletionValue().AsBoolean();
  85. Assert.False(isBogusInPerson);
  86. var propertyValue = engine.Execute("person.bogus").GetCompletionValue();
  87. Assert.Equal(JsValue.Undefined, propertyValue);
  88. }
  89. }
  90. }