AwaitTests.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. namespace Jint.Tests.Runtime;
  2. public class AsyncTests
  3. {
  4. [Fact]
  5. public void AwaitPropagationAgainstPrimitiveValue()
  6. {
  7. var engine = new Engine();
  8. var result = engine.Evaluate("(async ()=>await '1')()");
  9. result = result.UnwrapIfPromise();
  10. Assert.Equal("1", result);
  11. }
  12. [Fact]
  13. public void ShouldTaskConvertedToPromiseInJS()
  14. {
  15. Engine engine = new();
  16. engine.SetValue("callable", Callable);
  17. var result = engine.Evaluate("callable().then(x=>x*2)");
  18. result = result.UnwrapIfPromise();
  19. Assert.Equal(2, result);
  20. static async Task<int> Callable()
  21. {
  22. await Task.Delay(10);
  23. Assert.True(true);
  24. return 1;
  25. }
  26. }
  27. [Fact]
  28. public void ShouldTaskCatchWhenCancelled()
  29. {
  30. Engine engine = new();
  31. CancellationTokenSource cancel = new();
  32. cancel.Cancel();
  33. engine.SetValue("token", cancel.Token);
  34. engine.SetValue("callable", Callable);
  35. engine.SetValue("assert", new Action<bool>(Assert.True));
  36. var result = engine.Evaluate("callable(token).then(_ => assert(false)).catch(_ => assert(true))");
  37. result = result.UnwrapIfPromise();
  38. static async Task Callable(CancellationToken token)
  39. {
  40. await Task.FromCanceled(token);
  41. }
  42. }
  43. [Fact]
  44. public void ShouldTaskCatchWhenThrowError()
  45. {
  46. Engine engine = new();
  47. engine.SetValue("callable", Callable);
  48. engine.SetValue("assert", new Action<bool>(Assert.True));
  49. var result = engine.Evaluate("callable().then(_ => assert(false)).catch(_ => assert(true))");
  50. static async Task Callable()
  51. {
  52. await Task.Delay(10);
  53. throw new Exception();
  54. }
  55. }
  56. [Fact]
  57. public void ShouldTaskAwaitCurrentStack()
  58. {
  59. //https://github.com/sebastienros/jint/issues/514#issuecomment-1507127509
  60. Engine engine = new();
  61. string log = "";
  62. engine.SetValue("myAsyncMethod", new Func<Task>(async () =>
  63. {
  64. await Task.Delay(1000);
  65. log += "1";
  66. }));
  67. engine.SetValue("myAsyncMethod2", new Action(() =>
  68. {
  69. log += "2";
  70. }));
  71. engine.Execute("async function hello() {await myAsyncMethod();myAsyncMethod2();} hello();");
  72. Assert.Equal("12", log);
  73. }
  74. #if NETFRAMEWORK == false
  75. [Fact]
  76. public void ShouldValueTaskConvertedToPromiseInJS()
  77. {
  78. Engine engine = new();
  79. engine.SetValue("callable", Callable);
  80. var result = engine.Evaluate("callable().then(x=>x*2)");
  81. result = result.UnwrapIfPromise();
  82. Assert.Equal(2, result);
  83. static async ValueTask<int> Callable()
  84. {
  85. await Task.Delay(10);
  86. Assert.True(true);
  87. return 1;
  88. }
  89. }
  90. [Fact]
  91. public void ShouldValueTaskCatchWhenCancelled()
  92. {
  93. Engine engine = new();
  94. CancellationTokenSource cancel = new();
  95. cancel.Cancel();
  96. engine.SetValue("token", cancel.Token);
  97. engine.SetValue("callable", Callable);
  98. engine.SetValue("assert", new Action<bool>(Assert.True));
  99. var result = engine.Evaluate("callable(token).then(_ => assert(false)).catch(_ => assert(true))");
  100. result = result.UnwrapIfPromise();
  101. static async ValueTask Callable(CancellationToken token)
  102. {
  103. await ValueTask.FromCanceled(token);
  104. }
  105. }
  106. [Fact]
  107. public void ShouldValueTaskCatchWhenThrowError()
  108. {
  109. Engine engine = new();
  110. engine.SetValue("callable", Callable);
  111. engine.SetValue("assert", new Action<bool>(Assert.True));
  112. var result = engine.Evaluate("callable().then(_ => assert(false)).catch(_ => assert(true))");
  113. static async ValueTask Callable()
  114. {
  115. await Task.Delay(10);
  116. throw new Exception();
  117. }
  118. }
  119. [Fact]
  120. public void ShouldValueTaskAwaitCurrentStack()
  121. {
  122. //https://github.com/sebastienros/jint/issues/514#issuecomment-1507127509
  123. Engine engine = new();
  124. string log = "";
  125. engine.SetValue("myAsyncMethod", new Func<ValueTask>(async () =>
  126. {
  127. await Task.Delay(1000);
  128. log += "1";
  129. }));
  130. engine.SetValue("myAsyncMethod2", new Action(() =>
  131. {
  132. log += "2";
  133. }));
  134. engine.Execute("async function hello() {await myAsyncMethod();myAsyncMethod2();} hello();");
  135. Assert.Equal("12", log);
  136. }
  137. #endif
  138. }