Skip to content

Commit 7db916b

Browse files
authored
Merge pull request #32 from jsr-core/cross-test
test: Test codes with Node/Bun
2 parents 6eaad95 + 385cf52 commit 7db916b

20 files changed

+837
-702
lines changed

.github/workflows/test.yml

+32-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ jobs:
2626
- name: Type check
2727
run: deno task check
2828

29-
test:
29+
test-deno:
3030
runs-on: ubuntu-latest
3131
steps:
3232
- uses: actions/checkout@v4
@@ -45,6 +45,37 @@ jobs:
4545
files: ./coverage.lcov
4646
token: ${{ secrets.CODECOV_TOKEN }}
4747

48+
test-node:
49+
runs-on: ubuntu-latest
50+
steps:
51+
- uses: actions/checkout@v4
52+
- uses: actions/setup-node@v1
53+
with:
54+
version: 22.x
55+
- name: Install deps
56+
run: |
57+
npx jsr install
58+
- name: Test
59+
run: |
60+
npx --yes tsx --test *_test.ts
61+
timeout-minutes: 5
62+
63+
test-bun:
64+
runs-on: ubuntu-latest
65+
steps:
66+
- uses: actions/checkout@v4
67+
- uses: antongolub/action-setup-bun@v1
68+
with:
69+
bun-version: v1.x # Uses latest bun 1
70+
- name: Install deps
71+
run: |
72+
bun install
73+
- name: Test
74+
run: |
75+
# https://github.com/cross-org/test/issues/1
76+
ls -v1 *_test.ts | xargs -n1 bun test '{}'
77+
timeout-minutes: 5
78+
4879
jsr-publish:
4980
runs-on: ubuntu-latest
5081
steps:

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1+
/node_modules
12
/.tools
23
/.deno

.npmrc

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@jsr:registry=https://npm.jsr.io

_testutil.ts

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Using `deadline` in `@std/[email protected]` cause the following error:
2+
// 'Promise resolution is still pending but the event loop has already resolved'
3+
// So we need to implement `deadline` by ourselves.
4+
export async function deadline<T>(
5+
promise: Promise<T>,
6+
timeout: number,
7+
): Promise<T> {
8+
const waiter = Promise.withResolvers<never>();
9+
const timer = setTimeout(
10+
() => waiter.reject(new DOMException("Signal timed out.")),
11+
timeout,
12+
);
13+
return await Promise.race([
14+
waiter.promise,
15+
promise.finally(() => clearTimeout(timer)),
16+
]);
17+
}

async_value_test.ts

+10-11
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1+
import { test } from "@cross/test";
12
import { assertEquals } from "@std/assert";
23
import { AsyncValue } from "./async_value.ts";
34

4-
Deno.test("AsyncValue", async (t) => {
5-
await t.step(
6-
"'get' returns a promise that resolves to the value set by 'set'",
7-
async () => {
8-
const v = new AsyncValue(0);
9-
assertEquals(await v.get(), 0);
10-
await v.set(1);
11-
assertEquals(await v.get(), 1);
12-
},
13-
);
14-
});
5+
test(
6+
"AsyncValue 'get' returns a promise that resolves to the value set by 'set'",
7+
async () => {
8+
const v = new AsyncValue(0);
9+
assertEquals(await v.get(), 0);
10+
await v.set(1);
11+
assertEquals(await v.get(), 1);
12+
},
13+
);

barrier_test.ts

+82-82
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,94 @@
1+
import { test } from "@cross/test";
12
import { assertEquals, assertRejects, assertThrows } from "@std/assert";
2-
import { deadline, delay } from "@std/async";
3+
import { delay } from "@std/async";
34
import { Barrier } from "./barrier.ts";
5+
import { deadline } from "./_testutil.ts";
46

5-
Deno.test("Barrier", async (t) => {
6-
await t.step(
7-
"'wait' waits until the number of waiters reached the size specified to the barrier",
8-
async () => {
9-
const barrier = new Barrier(5);
10-
const workers = [];
11-
const results: string[] = [];
12-
for (let i = 0; i < 5; i++) {
13-
workers.push((async () => {
14-
results.push(`before wait ${i}`);
15-
await barrier.wait();
16-
results.push(`after wait ${i}`);
17-
})());
18-
}
19-
await Promise.all(workers);
20-
assertEquals(results, [
21-
"before wait 0",
22-
"before wait 1",
23-
"before wait 2",
24-
"before wait 3",
25-
"before wait 4",
26-
"after wait 0",
27-
"after wait 1",
28-
"after wait 2",
29-
"after wait 3",
30-
"after wait 4",
31-
]);
32-
},
33-
);
7+
test(
8+
"Barrier 'wait' waits until the number of waiters reached the size specified to the barrier",
9+
async () => {
10+
const barrier = new Barrier(5);
11+
const workers = [];
12+
const results: string[] = [];
13+
for (let i = 0; i < 5; i++) {
14+
workers.push((async () => {
15+
results.push(`before wait ${i}`);
16+
await barrier.wait();
17+
results.push(`after wait ${i}`);
18+
})());
19+
}
20+
await Promise.all(workers);
21+
assertEquals(results, [
22+
"before wait 0",
23+
"before wait 1",
24+
"before wait 2",
25+
"before wait 3",
26+
"before wait 4",
27+
"after wait 0",
28+
"after wait 1",
29+
"after wait 2",
30+
"after wait 3",
31+
"after wait 4",
32+
]);
33+
},
34+
);
3435

35-
await t.step(
36-
"'wait' with non-aborted signal",
37-
async () => {
38-
const controller = new AbortController();
39-
const barrier = new Barrier(2);
36+
test(
37+
"Barrier 'wait' with non-aborted signal",
38+
async () => {
39+
const controller = new AbortController();
40+
const barrier = new Barrier(2);
4041

41-
await assertRejects(
42-
() => deadline(barrier.wait({ signal: controller.signal }), 100),
43-
DOMException,
44-
"Signal timed out.",
45-
);
46-
},
47-
);
42+
await assertRejects(
43+
() => deadline(barrier.wait({ signal: controller.signal }), 100),
44+
DOMException,
45+
"Signal timed out.",
46+
);
47+
},
48+
);
4849

49-
await t.step(
50-
"'wait' with signal aborted after delay",
51-
async () => {
52-
const controller = new AbortController();
53-
const barrier = new Barrier(2);
54-
const reason = new Error("Aborted");
50+
test(
51+
"Barrier 'wait' with signal aborted after delay",
52+
async () => {
53+
const controller = new AbortController();
54+
const barrier = new Barrier(2);
55+
const reason = new Error("Aborted");
5556

56-
delay(50).then(() => controller.abort(reason));
57+
delay(50).then(() => controller.abort(reason));
5758

58-
await assertRejects(
59-
() => deadline(barrier.wait({ signal: controller.signal }), 100),
60-
Error,
61-
"Aborted",
62-
);
63-
},
64-
);
59+
await assertRejects(
60+
() => deadline(barrier.wait({ signal: controller.signal }), 100),
61+
Error,
62+
"Aborted",
63+
);
64+
},
65+
);
6566

66-
await t.step(
67-
"'wait' with already aborted signal",
68-
async () => {
69-
const controller = new AbortController();
70-
const barrier = new Barrier(2);
71-
const reason = new Error("Aborted");
67+
test(
68+
"Barrier 'wait' with already aborted signal",
69+
async () => {
70+
const controller = new AbortController();
71+
const barrier = new Barrier(2);
72+
const reason = new Error("Aborted");
7273

73-
controller.abort(reason);
74+
controller.abort(reason);
7475

75-
await assertRejects(
76-
() => deadline(barrier.wait({ signal: controller.signal }), 100),
77-
Error,
78-
"Aborted",
79-
);
80-
},
81-
);
76+
await assertRejects(
77+
() => deadline(barrier.wait({ signal: controller.signal }), 100),
78+
Error,
79+
"Aborted",
80+
);
81+
},
82+
);
8283

83-
await t.step(
84-
"throws RangeError if size is not a positive safe integer",
85-
() => {
86-
assertThrows(() => new Barrier(NaN), RangeError);
87-
assertThrows(() => new Barrier(Infinity), RangeError);
88-
assertThrows(() => new Barrier(-Infinity), RangeError);
89-
assertThrows(() => new Barrier(-1), RangeError);
90-
assertThrows(() => new Barrier(1.1), RangeError);
91-
assertThrows(() => new Barrier(0), RangeError);
92-
},
93-
);
94-
});
84+
test(
85+
"Barrier throws RangeError if size is not a positive safe integer",
86+
() => {
87+
assertThrows(() => new Barrier(NaN), RangeError);
88+
assertThrows(() => new Barrier(Infinity), RangeError);
89+
assertThrows(() => new Barrier(-Infinity), RangeError);
90+
assertThrows(() => new Barrier(-1), RangeError);
91+
assertThrows(() => new Barrier(1.1), RangeError);
92+
assertThrows(() => new Barrier(0), RangeError);
93+
},
94+
);

bun.lockb

3.08 KB
Binary file not shown.

deno.jsonc

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
"@core/asyncutil/stack": "./stack.ts",
4444
"@core/asyncutil/wait-group": "./wait_group.ts",
4545
"@core/iterutil": "jsr:@core/iterutil@^0.6.0",
46+
"@cross/test": "jsr:@cross/test@^0.0.9",
4647
"@std/assert": "jsr:@std/assert@^1.0.2",
4748
"@std/async": "jsr:@std/async@^1.0.2"
4849
},

deno.lock

+29-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)