ladybird/Libraries/LibJS/Tests/try-catch-finally.js

172 lines
5.3 KiB
JavaScript

test("try/catch without exception", () => {
var tryHasBeenExecuted = false;
var catchHasBeenExecuted = false;
try {
tryHasBeenExecuted = true;
} catch (e) {
catchHasBeenExecuted = true;
}
expect(tryHasBeenExecuted).toBeTrue();
expect(catchHasBeenExecuted).toBeFalse();
});
test("try/catch with exception in try", () => {
var tryHasBeenExecuted = false;
var catchHasBeenExecuted = false;
var tryError = Error("Error in try");
try {
tryHasBeenExecuted = true;
throw tryError;
expect().fail();
} catch (e) {
catchHasBeenExecuted = true;
expect(e).toBe(tryError);
}
expect(tryHasBeenExecuted).toBeTrue();
expect(catchHasBeenExecuted).toBeTrue();
});
test("try/catch with exception in try and catch", () => {
var tryHasBeenExecuted = false;
var catchHasBeenExecuted = false;
var tryError = Error("Error in try");
var catchError = Error("Error in catch");
expect(() => {
try {
tryHasBeenExecuted = true;
throw tryError;
expect().fail();
} catch (e) {
catchHasBeenExecuted = true;
expect(e).toBe(tryError);
throw catchError;
expect().fail();
}
}).toThrow(Error, "Error in catch");
expect(tryHasBeenExecuted).toBeTrue();
expect(catchHasBeenExecuted).toBeTrue();
});
test("try/catch/finally without exception", () => {
var tryHasBeenExecuted = false;
var catchHasBeenExecuted = false;
var finallyHasBeenExecuted = false;
try {
tryHasBeenExecuted = true;
} catch (e) {
catchHasBeenExecuted = true;
} finally {
finallyHasBeenExecuted = true;
}
expect(tryHasBeenExecuted).toBeTrue();
expect(catchHasBeenExecuted).toBeFalse();
expect(finallyHasBeenExecuted).toBeTrue();
});
test("try/catch/finally with exception in try and catch", () => {
var tryHasBeenExecuted = false;
var catchHasBeenExecuted = false;
var finallyHasBeenExecuted = false;
var tryError = Error("Error in try");
var catchError = Error("Error in catch");
expect(() => {
try {
tryHasBeenExecuted = true;
throw tryError;
expect().fail();
} catch (e) {
catchHasBeenExecuted = true;
expect(e).toBe(tryError);
throw catchError;
expect().fail();
} finally {
finallyHasBeenExecuted = true;
}
}).toThrow(Error, "Error in catch");
expect(tryHasBeenExecuted).toBeTrue();
expect(catchHasBeenExecuted).toBeTrue();
expect(finallyHasBeenExecuted).toBeTrue();
});
test("try/catch/finally with exception in finally", () => {
var tryHasBeenExecuted = false;
var catchHasBeenExecuted = false;
var finallyHasBeenExecuted = false;
var finallyError = Error("Error in finally");
expect(() => {
try {
tryHasBeenExecuted = true;
} catch (e) {
catchHasBeenExecuted = true;
} finally {
finallyHasBeenExecuted = true;
throw finallyError;
expect().fail();
}
}).toThrow(Error, "Error in finally");
expect(tryHasBeenExecuted).toBeTrue();
expect(catchHasBeenExecuted).toBeFalse();
expect(finallyHasBeenExecuted).toBeTrue();
});
test("try/catch/finally with exception in try and finally", () => {
var tryHasBeenExecuted = false;
var catchHasBeenExecuted = false;
var finallyHasBeenExecuted = false;
var tryError = Error("Error in try");
var finallyError = Error("Error in finally");
expect(() => {
try {
tryHasBeenExecuted = true;
throw tryError;
expect().fail();
} catch (e) {
catchHasBeenExecuted = true;
expect(e).toBe(tryError);
} finally {
finallyHasBeenExecuted = true;
throw finallyError;
expect().fail();
}
}).toThrow(Error, "Error in finally");
expect(tryHasBeenExecuted).toBeTrue();
expect(catchHasBeenExecuted).toBeTrue();
expect(finallyHasBeenExecuted).toBeTrue();
});
test("try/catch/finally with exception in try, catch and finally", () => {
var tryHasBeenExecuted = false;
var catchHasBeenExecuted = false;
var finallyHasBeenExecuted = false;
var tryError = Error("Error in try");
var catchError = Error("Error in catch");
var finallyError = Error("Error in finally");
expect(() => {
try {
tryHasBeenExecuted = true;
throw tryError;
expect().fail();
} catch (e) {
catchHasBeenExecuted = true;
expect(e).toBe(tryError);
throw catchError;
expect().fail();
} finally {
finallyHasBeenExecuted = true;
throw finallyError;
expect().fail();
}
}).toThrow(Error, "Error in finally");
expect(tryHasBeenExecuted).toBeTrue();
expect(catchHasBeenExecuted).toBeTrue();
expect(finallyHasBeenExecuted).toBeTrue();
});
test("try statement must have either 'catch' or 'finally' clause", () => {
expect("try {} catch {}").toEval();
expect("try {} catch (e) {}").toEval();
expect("try {} finally {}").toEval();
expect("try {} catch {} finally {}").toEval();
expect("try {} catch (e) {} finally {}").toEval();
expect("try {}").not.toEval();
});