try-return-finally.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. test("return from try followed by finally with function call inside", () => {
  2. let value = (() => {
  3. try {
  4. return 1;
  5. } finally {
  6. (() => {})();
  7. }
  8. })();
  9. expect(value).toBe(1);
  10. });
  11. test("return from outer finally with nested unwind contexts", () => {
  12. let value = (() => {
  13. try {
  14. try {
  15. return 1;
  16. } finally {
  17. }
  18. } finally {
  19. return 2;
  20. }
  21. })();
  22. expect(value).toBe(2);
  23. });
  24. test("restore exception after generator yield in finally", () => {
  25. let generator = (function* () {
  26. try {
  27. throw new Error("foo");
  28. } finally {
  29. yield 42;
  30. }
  31. })();
  32. expect(generator.next().value).toBe(42);
  33. expect(() => generator.next()).toThrowWithMessage(Error, "foo");
  34. expect(generator.next().done).toBe(true);
  35. });
  36. test("yield, then return from finally", () => {
  37. let test = [];
  38. let generator = (function* () {
  39. try {
  40. yield 1;
  41. test.push(1);
  42. } finally {
  43. test.push(2);
  44. return 2;
  45. }
  46. expect.fail("unreachable");
  47. })();
  48. let result = generator.next();
  49. expect(result.value).toBe(1);
  50. expect(result.done).toBe(false);
  51. result = generator.next();
  52. expect(result.value).toBe(2);
  53. expect(result.done).toBe(true);
  54. expect(test).toEqual([1, 2]);
  55. });
  56. test("return from async through finally", () => {
  57. let test = 0;
  58. let result = (async function () {
  59. try {
  60. return { y: 5 };
  61. } finally {
  62. test = 42;
  63. }
  64. expect.fail("unreachable");
  65. })();
  66. expect(result).toBeInstanceOf(Promise);
  67. expect(test).toBe(42);
  68. result.then(value => {
  69. expect(value).toEqual({ y: 5 });
  70. });
  71. });