Skip to content

Commit d8e505e

Browse files
authored
chore: enhance e2e test by extracting common part (#52)
1 parent 5a6b779 commit d8e505e

File tree

9 files changed

+105
-34
lines changed

9 files changed

+105
-34
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,5 @@
1515

1616
/docs/.vitepress/dist
1717
/docs/.vitepress/cache
18+
19+
/tests/e2e/*/tmp
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import path from "node:path";
2+
3+
const __dirname = path.dirname(new URL(import.meta.url).pathname);
4+
5+
export default {
6+
include: [__dirname],
7+
imports(runtime) {
8+
return {
9+
env: {
10+
log: (msg) => {
11+
runtime.framework.log(runtime.exports.__getString(msg));
12+
},
13+
},
14+
};
15+
},
16+
temp: path.join(__dirname, "tmp"),
17+
output: path.join(__dirname, "tmp"),
18+
mode: [],
19+
};

tests/e2e/assertFailed/env.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export declare function log(msg: string): void;

tests/e2e/assertFailed/source.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { test, expect } from "../../../assembly";
2+
import { log } from "./env";
3+
4+
test("failed test", () => {
5+
log("This is a log message for the failed test.");
6+
assert(false, "This is AS assert failure");
7+
});
8+
9+
test("succeed test", () => {
10+
log("This is a log message for the succeed test.");
11+
expect(1 + 1).equal(2);
12+
});

tests/e2e/assertFailed/stdout.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
code analysis: OK
2+
compile testcases: OK
3+
instrument: OK

tests/e2e/assertFailed/tsconfig.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"extends": "assemblyscript/std/assembly.json",
3+
"include": ["./**/*.ts"]
4+
}
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import os from "node:os";
22
import path from "node:path";
3+
import { URL } from "node:url";
34

45
const tmpFolder = path.join(os.tmpdir(), "as-test-e2e");
6+
const __dirname = path.dirname(new URL(import.meta.url).pathname);
57

68
export default {
7-
include: ["tests/e2e/printLogInFailedInfo"],
9+
include: [__dirname],
810
imports(runtime) {
911
return {
1012
env: {
@@ -14,7 +16,7 @@ export default {
1416
},
1517
};
1618
},
17-
temp: tmpFolder,
18-
output: tmpFolder,
19+
temp: path.join(__dirname, "tmp"),
20+
output: path.join(__dirname, "tmp"),
1921
mode: [],
2022
};
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
code analysis: OK
2+
compile testcases: OK
3+
instrument: OK
4+
execute testcases: OK
5+
6+
test case: 1/2 (success/total)
7+
8+
Error Message:
9+
failed test:
10+
tests/e2e/printLogInFailedInfo/source.test.ts:6:2 value: 2 expect: = 3
11+
This is a log message for the failed test.

tests/e2e/run.js

Lines changed: 48 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,58 @@ import assert from "node:assert";
22
import { exec } from "node:child_process";
33
import { diffChars } from "diff";
44
import chalk from "chalk";
5+
import { argv } from "node:process";
6+
import { readFileSync } from "node:fs";
57

6-
function assertStringEq(s1, s2) {
7-
const parts = diffChars(s1, s2);
8-
const diffs = [];
9-
let hasDiff = false;
10-
for (const part of parts) {
11-
if (part.added) {
12-
hasDiff = true;
13-
diffs.push(chalk.bgGreen(part.value));
14-
} else if (part.removed) {
15-
hasDiff = true;
16-
diffs.push(chalk.bgRed(part.value));
17-
} else {
18-
diffs.push(part.value);
19-
}
20-
}
21-
assert(!hasDiff, diffs.join(""));
8+
function getDiff(s1, s2) {
9+
const handleEscape = (c) => {
10+
if (c === "\n") return "\n'\\n'";
11+
return c;
12+
};
13+
return diffChars(s1, s2)
14+
.map((part) => {
15+
if (part.added) {
16+
return chalk.bgGreen(handleEscape(part.value));
17+
} else if (part.removed) {
18+
return chalk.bgRed(handleEscape(part.value));
19+
} else {
20+
return part.value;
21+
}
22+
})
23+
.join("");
2224
}
2325

24-
console.log("Running e2e test: printLogInFailedInfo");
25-
exec("node ./bin/as-test.js --config tests/e2e/printLogInFailedInfo/as-test.config.js", (error, stdout, stderr) => {
26-
assert(error.code === 255);
27-
const expectStdOut = `
28-
code analysis: OK
29-
compile testcases: OK
30-
instrument: OK
31-
execute testcases: OK
26+
function isEnabled(name) {
27+
const enabledTests = argv.slice(2);
28+
if (enabledTests.length === 0) {
29+
return true; // Run all tests by default
30+
}
31+
return enabledTests.includes(name);
32+
}
3233

33-
test case: 1/2 (success/total)
34+
function runEndToEndTest(name, handle) {
35+
if (isEnabled(name)) {
36+
console.log(`Running e2e test: ${name}`);
37+
exec(`node ./bin/as-test.js --config tests/e2e/${name}/as-test.config.js`, (error, stdout, stderr) => {
38+
// standard check
39+
const expectStdOut = readFileSync(`tests/e2e/${name}/stdout.txt`, "utf-8");
40+
if (expectStdOut !== stdout) {
41+
console.log(`=========STDOUT ${name}=========`);
42+
console.log(getDiff(expectStdOut, stdout));
43+
console.log(`=========STDERR ${name}=========`);
44+
console.log(stderr);
45+
process.exit(1);
46+
}
47+
// customize check
48+
handle(error, stdout, stderr);
49+
});
50+
}
51+
}
3452

35-
Error Message:
36-
failed test:
37-
tests/e2e/printLogInFailedInfo/source.test.ts:6:2 value: 2 expect: = 3
38-
This is a log message for the failed test.
39-
`.trimStart();
53+
runEndToEndTest("printLogInFailedInfo", (error, stdout, stderr) => {
54+
assert(error.code === 255);
55+
});
4056

41-
assertStringEq(expectStdOut, stdout);
57+
runEndToEndTest("assertFailed", (error, stdout, stderr) => {
58+
assert(error.code === 255);
4259
});

0 commit comments

Comments
 (0)