AwaitTests.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. }