123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- test("Nested try/catch/finally with exceptions", () => {
- // This test uses a combination of boolean "checkpoint" flags
- // and expect().fail() to ensure certain code paths have been
- // reached and others haven't.
- var level1TryHasBeenExecuted = false;
- var level1CatchHasBeenExecuted = false;
- var level1FinallyHasBeenExecuted = false;
- var level2TryHasBeenExecuted = false;
- var level2CatchHasBeenExecuted = false;
- var level3TryHasBeenExecuted = false;
- var level3CatchHasBeenExecuted = false;
- var level3FinallyHasBeenExecuted = false;
- expect(() => {
- try {
- level1TryHasBeenExecuted = true;
- foo();
- expect().fail();
- } catch (e) {
- level1CatchHasBeenExecuted = true;
- try {
- level2TryHasBeenExecuted = true;
- try {
- level3TryHasBeenExecuted = true;
- bar();
- expect().fail();
- } catch (e) {
- level3CatchHasBeenExecuted = true;
- } finally {
- level3FinallyHasBeenExecuted = true;
- baz();
- expect().fail();
- }
- expect().fail();
- } catch (e) {
- level2CatchHasBeenExecuted = true;
- qux();
- expect().fail();
- }
- expect().fail();
- } finally {
- level1FinallyHasBeenExecuted = true;
- throw Error("Error in final finally");
- expect().fail();
- }
- expect().fail();
- }).toThrow(Error, "Error in final finally");
- expect(level1TryHasBeenExecuted).toBeTrue();
- expect(level1CatchHasBeenExecuted).toBeTrue();
- expect(level1FinallyHasBeenExecuted).toBeTrue();
- expect(level2TryHasBeenExecuted).toBeTrue();
- expect(level2CatchHasBeenExecuted).toBeTrue();
- expect(level3TryHasBeenExecuted).toBeTrue();
- expect(level3CatchHasBeenExecuted).toBeTrue();
- expect(level3FinallyHasBeenExecuted).toBeTrue();
- });
- test("Nested try/catch/finally with return in inner context", () => {
- success = false;
- (() => {
- try {
- try {
- return;
- } catch (e) {
- expect().fail();
- }
- } finally {
- success = true;
- }
- expect().fail();
- })();
- expect(success).toBeTrue();
- });
- test("Deeply nested try/catch/finally with return in inner context", () => {
- success = 0;
- (() => {
- try {
- try {
- try {
- try {
- try {
- return;
- } catch (e) {
- expect().fail();
- } finally {
- success += 4;
- }
- } catch (e) {
- expect().fail();
- }
- } catch (e) {
- expect().fail();
- } finally {
- success += 2;
- }
- } catch (e) {
- expect().fail();
- }
- } finally {
- success += 1;
- }
- expect().fail();
- })();
- expect(success).toBe(7);
- });
- test("Nested try/finally/catch with exception in inner context ", () => {
- success = 0;
- try {
- try {
- throw Error("Error in inner try");
- } finally {
- success += 1;
- }
- expect.fail();
- } catch (e) {
- success += 1;
- }
- expect(success).toBe(2);
- });
- test("Nested try/catch/finally with exception in inner most finally inside loop", () => {
- success = 0;
- try {
- try {
- do {
- try {
- throw 1;
- } finally {
- break;
- }
- expect.fail();
- } while (expect.fail());
- } catch (e) {
- expect.fail();
- }
- } finally {
- success = 1;
- }
- expect(success).toBe(1);
- });
|