mirror of
https://github.com/oven-sh/bun
synced 2026-02-10 02:48:50 +00:00
147 lines
3.2 KiB
TypeScript
147 lines
3.2 KiB
TypeScript
// tbh, we should have more tests for this
|
|
test("Symbol.dispose exists", () => {
|
|
expect(Symbol.dispose).toBeDefined();
|
|
expect(Symbol.dispose).toBeSymbol();
|
|
expect(Symbol.asyncDispose).toBeDefined();
|
|
expect(Symbol.asyncDispose).toBeSymbol();
|
|
});
|
|
|
|
test("SuppressedError works", () => {
|
|
const e = new SuppressedError(new Error("this is error"), new Error("this was suppressed"), "this is a message");
|
|
expect(e.message).toBe("this is a message");
|
|
expect(() => {
|
|
throw e.suppressed;
|
|
}).toThrow("this was suppressed");
|
|
expect(() => {
|
|
throw e.error;
|
|
}).toThrow("this is error");
|
|
});
|
|
|
|
let disposeOrder = 0;
|
|
function useWithAsync() {
|
|
return {
|
|
status: "none",
|
|
disposeOrder: -1,
|
|
[Symbol.dispose]() {
|
|
this.status = "disposed";
|
|
this.disposeOrder = disposeOrder++;
|
|
},
|
|
[Symbol.asyncDispose]() {
|
|
this.status = "async-disposed";
|
|
this.disposeOrder = disposeOrder++;
|
|
},
|
|
};
|
|
}
|
|
|
|
test("using syntax works and doesnt collide with user symbols", () => {
|
|
disposeOrder = 0;
|
|
{
|
|
let __using = "break";
|
|
let __callDispose = function () {
|
|
throw new Error("should not be called");
|
|
};
|
|
let __stack = {
|
|
push: () => {
|
|
throw new Error("stack corruption");
|
|
},
|
|
};
|
|
|
|
const a1 = useWithAsync();
|
|
{
|
|
using u1 = a1;
|
|
expect(u1.status).toBe("none");
|
|
}
|
|
expect(a1.status).toBe("disposed");
|
|
}
|
|
|
|
{
|
|
const a1 = useWithAsync();
|
|
const a2 = useWithAsync();
|
|
const a3 = useWithAsync();
|
|
{
|
|
using u1 = a1,
|
|
u2 = a2;
|
|
{
|
|
using u3 = a3;
|
|
expect(u3.status).toBe("none");
|
|
}
|
|
expect(u1.status).toBe("none");
|
|
expect(u2.status).toBe("none");
|
|
expect(a3.status).toBe("disposed");
|
|
}
|
|
expect(a1.status).toBe("disposed");
|
|
expect(a2.status).toBe("disposed");
|
|
|
|
expect(a3.disposeOrder).toBe(1);
|
|
expect(a2.disposeOrder).toBe(2);
|
|
expect(a1.disposeOrder).toBe(3);
|
|
}
|
|
|
|
const a1 = useWithAsync();
|
|
{
|
|
using u1 = a1;
|
|
{
|
|
var __stack = 1;
|
|
var _catch = 1;
|
|
var _err = 1;
|
|
var _hasErr = 1;
|
|
}
|
|
}
|
|
});
|
|
|
|
test("await using syntax works and doesnt collide with user symbols", async () => {
|
|
disposeOrder = 0;
|
|
{
|
|
let __using = "break";
|
|
let __callDispose = function () {
|
|
throw new Error("should not be called");
|
|
};
|
|
let __stack = {
|
|
push: () => {
|
|
throw new Error("stack corruption");
|
|
},
|
|
};
|
|
|
|
const a1 = useWithAsync();
|
|
{
|
|
using u1 = a1;
|
|
expect(u1.status).toBe("none");
|
|
}
|
|
expect(a1.status).toBe("disposed");
|
|
}
|
|
|
|
{
|
|
const a1 = useWithAsync();
|
|
const a2 = useWithAsync();
|
|
const a3 = useWithAsync();
|
|
{
|
|
using u1 = a1;
|
|
await using u2 = a2;
|
|
{
|
|
using u3 = a3;
|
|
expect(u3.status).toBe("none");
|
|
}
|
|
expect(u1.status).toBe("none");
|
|
expect(u2.status).toBe("none");
|
|
expect(a3.status).toBe("disposed");
|
|
}
|
|
expect(a1.status).toBe("disposed");
|
|
expect(a2.status).toBe("async-disposed");
|
|
|
|
expect(a3.disposeOrder).toBe(1);
|
|
expect(a2.disposeOrder).toBe(2);
|
|
expect(a1.disposeOrder).toBe(3);
|
|
}
|
|
|
|
const a1 = useWithAsync();
|
|
{
|
|
await using u1 = a1;
|
|
{
|
|
var __stack = 1;
|
|
var _catch = 1;
|
|
var _err = 1;
|
|
var _hasErr = 1;
|
|
}
|
|
}
|
|
});
|