ArgumentsCacheBehaviorTests.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. using Jint.Native;
  2. namespace Jint.Tests.Runtime;
  3. public class ArgumentsCacheBehaviorTests
  4. {
  5. [Fact]
  6. public void ArgsForGeneratorsAreNotReusedFromCache()
  7. {
  8. // Arrange
  9. List<JsValue> logValues = new();
  10. var engine = new Engine();
  11. engine.SetValue("log", logValues.Add);
  12. // Act
  13. engine.Evaluate(
  14. """
  15. function *method() {
  16. log(arguments[0]);
  17. log(arguments[1]);
  18. }
  19. function *other() {
  20. log(arguments[0]);
  21. log(arguments[1]);
  22. }
  23. var generator1 = method(42, undefined);
  24. var generator2 = other(10, undefined);
  25. generator1.next();
  26. generator2.next();
  27. """);
  28. // Assert
  29. Assert.Equal([
  30. JsNumber.Create(42),
  31. JsValue.Undefined,
  32. JsNumber.Create(10),
  33. JsValue.Undefined,
  34. ], logValues);
  35. }
  36. [Fact]
  37. public void NamedArgsForGeneratorsAreNotReusedFromCache()
  38. {
  39. // Arrange
  40. List<JsValue> logValues = new();
  41. var engine = new Engine();
  42. engine.SetValue("log", logValues.Add);
  43. // Act
  44. engine.Evaluate(
  45. """
  46. function *method(a, b) {
  47. log(a);
  48. log(b);
  49. }
  50. function *other(a, b) {
  51. log(a);
  52. log(b);
  53. }
  54. var generator1 = method(42, undefined);
  55. var generator2 = other(10, undefined);
  56. generator1.next();
  57. generator2.next();
  58. """);
  59. // Assert
  60. Assert.Equal([
  61. JsNumber.Create(42),
  62. JsValue.Undefined,
  63. JsNumber.Create(10),
  64. JsValue.Undefined,
  65. ], logValues);
  66. }
  67. [Fact]
  68. public void ArgsForGeneratorsWithBindAreNotReusedFromCache()
  69. {
  70. // Arrange
  71. List<JsValue> logValues = new();
  72. var engine = new Engine();
  73. engine.SetValue("log", logValues.Add);
  74. // Act
  75. engine.Evaluate(
  76. """
  77. function *method() {
  78. log(arguments[0]);
  79. log(arguments[1]);
  80. }
  81. function *other() {
  82. log(arguments[0]);
  83. log(arguments[1]);
  84. }
  85. var methodWithBind = method.bind({});
  86. var otherWithBind = other.bind({});
  87. var generator1 = methodWithBind(42, undefined);
  88. var generator2 = otherWithBind(10, undefined);
  89. generator1.next();
  90. generator2.next();
  91. """);
  92. // Assert
  93. Assert.Equal([
  94. JsNumber.Create(42),
  95. JsValue.Undefined,
  96. JsNumber.Create(10),
  97. JsValue.Undefined,
  98. ], logValues);
  99. }
  100. [Fact]
  101. public void ArgsForAsyncFunctionsAreNotReused()
  102. {
  103. // Arrange
  104. List<JsValue> logValues = new();
  105. var engine = new Engine(new Options(){ ExperimentalFeatures = ExperimentalFeature.All });
  106. engine.SetValue("log", logValues.Add);
  107. // Act
  108. engine.Execute(
  109. """
  110. async function method() {
  111. log(arguments[0]);
  112. log(arguments[1]);
  113. }
  114. async function other() {
  115. log(arguments[0]);
  116. log(arguments[1]);
  117. }
  118. method(42, undefined);
  119. other(10, undefined);
  120. """);
  121. engine.RunAvailableContinuations();
  122. // Assert
  123. Assert.Equal([
  124. JsNumber.Create(42),
  125. JsValue.Undefined,
  126. JsNumber.Create(10),
  127. JsValue.Undefined,
  128. ], logValues);
  129. }
  130. }