@making-sense/antlr-editor
Version:
ANTLR Typescript editor
182 lines (147 loc) • 6.62 kB
text/typescript
import { describe, it, expect, vi } from "vitest";
// Test error handling scenarios without Monaco Editor
describe("Error Scenarios", () => {
describe("Monaco Disposal Errors", () => {
it("should handle InstantiationService disposal error", () => {
const error = new Error("InstantiationService has been disposed");
expect(error.message).toBe("InstantiationService has been disposed");
});
it("should detect disposal error in error message", () => {
const error = new Error("InstantiationService has been disposed");
const isDisposalError = error.message.includes("InstantiationService has been disposed");
expect(isDisposalError).toBe(true);
});
it("should handle different disposal error formats", () => {
const errors = [
"InstantiationService has been disposed",
"Monaco Editor InstantiationService has been disposed",
"Error: InstantiationService has been disposed"
];
errors.forEach(errorMessage => {
const isDisposalError = errorMessage.includes("InstantiationService has been disposed");
expect(isDisposalError).toBe(true);
});
});
});
describe("Error Event Handling", () => {
it("should create error events", () => {
const error = new Error("Test error");
const errorEvent = new ErrorEvent("error", { error });
expect(errorEvent.type).toBe("error");
expect(errorEvent.error).toBe(error);
});
it("should handle preventDefault", () => {
const error = new Error("Test error");
const errorEvent = new ErrorEvent("error", { error });
// Mock preventDefault
const preventDefault = vi.fn();
Object.defineProperty(errorEvent, "preventDefault", {
value: preventDefault,
writable: true
});
errorEvent.preventDefault();
expect(preventDefault).toHaveBeenCalled();
});
});
describe("Promise Rejection Handling", () => {
it("should create promise rejection events", () => {
const reason = { message: "Promise rejected" };
// Mock PromiseRejectionEvent for testing without creating actual rejection
const rejectionEvent = {
type: "unhandledrejection",
reason,
promise: null
};
expect(rejectionEvent.type).toBe("unhandledrejection");
expect(rejectionEvent.reason).toBe(reason);
});
it("should detect disposal errors in promise rejections", () => {
const reason = { message: "InstantiationService has been disposed" };
const isDisposalError = reason.message.includes("InstantiationService has been disposed");
expect(isDisposalError).toBe(true);
});
});
describe("Error Recovery", () => {
it("should simulate error recovery process", () => {
let hasError = false;
let retryCount = 0;
const maxRetries = 3;
const simulateError = () => {
hasError = true;
retryCount++;
};
const attemptRecovery = () => {
if (hasError && retryCount < maxRetries) {
hasError = false;
return true;
}
return false;
};
// Simulate error
simulateError();
expect(hasError).toBe(true);
expect(retryCount).toBe(1);
// Attempt recovery
const recovered = attemptRecovery();
expect(recovered).toBe(true);
expect(hasError).toBe(false);
});
it("should handle multiple error scenarios", () => {
const errorScenarios = [
{ message: "Network error", recoverable: true },
{ message: "InstantiationService has been disposed", recoverable: true },
{ message: "Fatal error", recoverable: false },
{ message: "Memory error", recoverable: false }
];
errorScenarios.forEach(scenario => {
const isDisposalError = scenario.message.includes(
"InstantiationService has been disposed"
);
const shouldRecover = scenario.recoverable || isDisposalError;
if (isDisposalError) {
expect(shouldRecover).toBe(true);
}
});
});
});
describe("Console Error Handling", () => {
it("should mock console methods", () => {
const originalWarn = console.warn;
const mockWarn = vi.fn();
console.warn = mockWarn;
console.warn("Test warning");
expect(mockWarn).toHaveBeenCalledWith("Test warning");
// Restore
console.warn = originalWarn;
});
it("should handle error logging", () => {
const originalError = console.error;
const mockError = vi.fn();
console.error = mockError;
console.error("Test error");
expect(mockError).toHaveBeenCalledWith("Test error");
// Restore
console.error = originalError;
});
});
describe("Global Error Handlers", () => {
it("should simulate global error handler setup", () => {
const errorHandler = vi.fn();
const rejectionHandler = vi.fn();
// Simulate adding event listeners
const addEventListener = vi.fn();
addEventListener("error", errorHandler, true);
addEventListener("unhandledrejection", rejectionHandler);
expect(addEventListener).toHaveBeenCalledWith("error", errorHandler, true);
expect(addEventListener).toHaveBeenCalledWith("unhandledrejection", rejectionHandler);
});
it("should handle cleanup of event listeners", () => {
const errorHandler = vi.fn();
const removeEventListener = vi.fn();
removeEventListener("error", errorHandler, true);
removeEventListener("unhandledrejection", errorHandler);
expect(removeEventListener).toHaveBeenCalledWith("error", errorHandler, true);
expect(removeEventListener).toHaveBeenCalledWith("unhandledrejection", errorHandler);
});
});
});