@matter/testing 0.12.2 → 0.12.3-alpha.0-20250205-ad3416ca3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/cli.js +1 -1
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/failure-detail.d.ts +7 -6
- package/dist/cjs/failure-detail.d.ts.map +1 -1
- package/dist/cjs/failure-detail.js +26 -75
- package/dist/cjs/failure-detail.js.map +2 -2
- package/dist/cjs/failure-reporter.d.ts +11 -0
- package/dist/cjs/failure-reporter.d.ts.map +1 -0
- package/dist/cjs/failure-reporter.js +78 -0
- package/dist/cjs/failure-reporter.js.map +6 -0
- package/dist/cjs/global-declarations.d.ts +8 -0
- package/dist/cjs/global-declarations.d.ts.map +1 -1
- package/dist/cjs/mocha.d.ts.map +1 -1
- package/dist/cjs/mocha.js +4 -3
- package/dist/cjs/mocha.js.map +1 -1
- package/dist/cjs/mocks/logging.js +2 -12
- package/dist/cjs/mocks/logging.js.map +2 -2
- package/dist/cjs/nodejs-reporter.d.ts +24 -0
- package/dist/cjs/nodejs-reporter.d.ts.map +1 -0
- package/dist/cjs/nodejs-reporter.js +123 -0
- package/dist/cjs/nodejs-reporter.js.map +6 -0
- package/dist/cjs/package.json +2 -1
- package/dist/cjs/reporter.d.ts +0 -23
- package/dist/cjs/reporter.d.ts.map +1 -1
- package/dist/cjs/reporter.js +0 -141
- package/dist/cjs/reporter.js.map +2 -2
- package/dist/cjs/runner.d.ts.map +1 -1
- package/dist/cjs/runner.js +7 -7
- package/dist/cjs/runner.js.map +2 -2
- package/dist/cjs/text-diff.d.ts +10 -0
- package/dist/cjs/text-diff.d.ts.map +1 -0
- package/dist/cjs/text-diff.js +37 -0
- package/dist/cjs/text-diff.js.map +6 -0
- package/dist/cjs/web-reporter.d.ts +22 -0
- package/dist/cjs/web-reporter.d.ts.map +1 -0
- package/dist/cjs/web-reporter.js +58 -0
- package/dist/cjs/web-reporter.js.map +6 -0
- package/dist/cjs/web.d.ts.map +1 -1
- package/dist/cjs/web.js +3 -3
- package/dist/cjs/web.js.map +1 -1
- package/dist/esm/cli.js +2 -2
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/failure-detail.d.ts +7 -6
- package/dist/esm/failure-detail.d.ts.map +1 -1
- package/dist/esm/failure-detail.js +26 -65
- package/dist/esm/failure-detail.js.map +2 -2
- package/dist/esm/failure-reporter.d.ts +11 -0
- package/dist/esm/failure-reporter.d.ts.map +1 -0
- package/dist/esm/failure-reporter.js +58 -0
- package/dist/esm/failure-reporter.js.map +6 -0
- package/dist/esm/global-declarations.d.ts +8 -0
- package/dist/esm/global-declarations.d.ts.map +1 -1
- package/dist/esm/mocha.d.ts.map +1 -1
- package/dist/esm/mocha.js +4 -3
- package/dist/esm/mocha.js.map +1 -1
- package/dist/esm/mocks/logging.js +2 -2
- package/dist/esm/mocks/logging.js.map +1 -1
- package/dist/esm/nodejs-reporter.d.ts +24 -0
- package/dist/esm/nodejs-reporter.d.ts.map +1 -0
- package/dist/esm/nodejs-reporter.js +103 -0
- package/dist/esm/nodejs-reporter.js.map +6 -0
- package/dist/esm/package.json +2 -1
- package/dist/esm/reporter.d.ts +0 -23
- package/dist/esm/reporter.d.ts.map +1 -1
- package/dist/esm/reporter.js +0 -127
- package/dist/esm/reporter.js.map +1 -1
- package/dist/esm/runner.d.ts.map +1 -1
- package/dist/esm/runner.js +8 -8
- package/dist/esm/runner.js.map +1 -1
- package/dist/esm/text-diff.d.ts +10 -0
- package/dist/esm/text-diff.d.ts.map +1 -0
- package/dist/esm/text-diff.js +17 -0
- package/dist/esm/text-diff.js.map +6 -0
- package/dist/esm/web-reporter.d.ts +22 -0
- package/dist/esm/web-reporter.d.ts.map +1 -0
- package/dist/esm/web-reporter.js +38 -0
- package/dist/esm/web-reporter.js.map +6 -0
- package/dist/esm/web.d.ts.map +1 -1
- package/dist/esm/web.js +3 -3
- package/dist/esm/web.js.map +1 -1
- package/package.json +4 -3
- package/src/cli.ts +2 -2
- package/src/failure-detail.ts +41 -64
- package/src/failure-reporter.ts +65 -0
- package/src/global-declarations.ts +8 -0
- package/src/mocha.ts +5 -3
- package/src/mocks/logging.ts +2 -2
- package/src/nodejs-reporter.ts +123 -0
- package/src/reporter.ts +0 -147
- package/src/runner.ts +10 -7
- package/src/text-diff.ts +16 -0
- package/src/tsconfig.json +5 -1
- package/src/web-reporter.ts +51 -0
- package/src/web.ts +4 -3
package/dist/esm/reporter.js
CHANGED
|
@@ -3,131 +3,4 @@
|
|
|
3
3
|
* Copyright 2022-2025 Matter.js Authors
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import colors from "ansi-colors";
|
|
7
|
-
import { FailureDetail } from "./failure-detail.js";
|
|
8
|
-
class ProgressReporter {
|
|
9
|
-
constructor(progress) {
|
|
10
|
-
this.progress = progress;
|
|
11
|
-
}
|
|
12
|
-
#run = "";
|
|
13
|
-
#suite = Array();
|
|
14
|
-
#test;
|
|
15
|
-
#step;
|
|
16
|
-
#stats;
|
|
17
|
-
#failures = Array();
|
|
18
|
-
#lastTitle;
|
|
19
|
-
beginRun(name, stats, supportsSuites = true) {
|
|
20
|
-
this.#run = name;
|
|
21
|
-
this.#suite = [];
|
|
22
|
-
this.#failures = [];
|
|
23
|
-
if (!supportsSuites) {
|
|
24
|
-
this.progress.update(this.#summarize(stats));
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
beginSuite(name) {
|
|
28
|
-
this.#suite = name;
|
|
29
|
-
}
|
|
30
|
-
beginTest(name, stats) {
|
|
31
|
-
this.#test = name;
|
|
32
|
-
this.#stats = stats;
|
|
33
|
-
this.#step = void 0;
|
|
34
|
-
const title = process.stdout.isTTY ? this.#formatName(this.#suite, name) : this.#suite[0];
|
|
35
|
-
this.#updateTitle(title);
|
|
36
|
-
}
|
|
37
|
-
beginStep(name) {
|
|
38
|
-
this.#step = name;
|
|
39
|
-
if (process.stdout.isTTY && this.#test) {
|
|
40
|
-
const title = this.#formatName(this.#suite, this.#test, name);
|
|
41
|
-
this.#updateTitle(title);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
#updateTitle(title) {
|
|
45
|
-
if (title === this.#lastTitle) {
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
this.#lastTitle = title;
|
|
49
|
-
this.progress.update(this.#summarize(this.#stats), title);
|
|
50
|
-
}
|
|
51
|
-
failTest(name, detail) {
|
|
52
|
-
this.#failures.push({
|
|
53
|
-
suite: this.#suite,
|
|
54
|
-
test: name,
|
|
55
|
-
step: this.#step,
|
|
56
|
-
detail
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
endRun(stats) {
|
|
60
|
-
if (this.#failures.length) {
|
|
61
|
-
this.progress.failure(this.#summarize(stats));
|
|
62
|
-
this.#dumpFailures();
|
|
63
|
-
} else if (stats && !stats.complete) {
|
|
64
|
-
this.progress.failure("No tests found");
|
|
65
|
-
} else {
|
|
66
|
-
this.progress.success(this.#summarize(stats));
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
#summarize(stats) {
|
|
70
|
-
let statStr;
|
|
71
|
-
if (stats) {
|
|
72
|
-
const complete = colors.dim(`${stats.complete}/${stats.total}`);
|
|
73
|
-
const failures = stats.failures ? colors.redBright(` ${stats.failures.toString()} failed`) : "";
|
|
74
|
-
statStr = ` ${complete}${failures}`;
|
|
75
|
-
} else {
|
|
76
|
-
statStr = "";
|
|
77
|
-
}
|
|
78
|
-
return `${colors.bold(this.#run)}${statStr}`;
|
|
79
|
-
}
|
|
80
|
-
#dumpFailures() {
|
|
81
|
-
for (let i = 0; i < this.#failures.length; i++) {
|
|
82
|
-
const failure = this.#failures[i];
|
|
83
|
-
const index = `Failure ${colors.bold((i + 1).toString())} of ${this.#failures.length}`;
|
|
84
|
-
process.stdout.write(`
|
|
85
|
-
${index} ${this.#formatName(failure.suite, failure.test, failure.step)}
|
|
86
|
-
|
|
87
|
-
`);
|
|
88
|
-
FailureDetail.dump(failure.detail, " ");
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
#formatName(suite, test, step) {
|
|
92
|
-
const breadcrumb = [...suite, test];
|
|
93
|
-
if (step) {
|
|
94
|
-
breadcrumb.push(step);
|
|
95
|
-
}
|
|
96
|
-
breadcrumb[breadcrumb.length - 1] = colors.bold(breadcrumb[breadcrumb.length - 1]);
|
|
97
|
-
return breadcrumb.join(" \u27A1 ");
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
const actualConsole = console;
|
|
101
|
-
const actualLog = actualConsole.log;
|
|
102
|
-
function proxy(...args) {
|
|
103
|
-
actualLog.call(actualConsole, `${ConsoleProxyReporter.FLAG}${JSON.stringify(args)}`);
|
|
104
|
-
}
|
|
105
|
-
class ConsoleProxyReporter {
|
|
106
|
-
static FLAG = "<<REPORT>> ";
|
|
107
|
-
beginRun(name, stats) {
|
|
108
|
-
proxy("beginRun", name, stats);
|
|
109
|
-
}
|
|
110
|
-
beginSuite(name, stats) {
|
|
111
|
-
proxy("beginSuite", name, stats);
|
|
112
|
-
}
|
|
113
|
-
beginTest(name, stats) {
|
|
114
|
-
proxy("beginTest", name, stats);
|
|
115
|
-
}
|
|
116
|
-
beginStep(name) {
|
|
117
|
-
proxy("beginStep", name);
|
|
118
|
-
}
|
|
119
|
-
endRun(stats) {
|
|
120
|
-
proxy("endRun", stats);
|
|
121
|
-
}
|
|
122
|
-
failTest(name, detail) {
|
|
123
|
-
proxy("failTest", name, detail);
|
|
124
|
-
}
|
|
125
|
-
failRun(detail) {
|
|
126
|
-
proxy("failRun", detail);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
export {
|
|
130
|
-
ConsoleProxyReporter,
|
|
131
|
-
ProgressReporter
|
|
132
|
-
};
|
|
133
6
|
//# sourceMappingURL=reporter.js.map
|
package/dist/esm/reporter.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/reporter.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/esm/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,OAAO,EAAE,QAAQ,EAAO,MAAM,QAAQ,CAAC;AAQtD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAIzC,qBAAa,UAAU;IAKf,QAAQ,CAAC,GAAG,EAAE,OAAO;IACrB,QAAQ,CAAC,QAAQ,EAAE,QAAQ;IAC3B,QAAQ,CAAC,OAAO,EAAE,WAAW;IANjC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,OAAO,CAAC,IAAI,CAAmB;gBAGlB,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,WAAW;IA8B3B,OAAO,CAAC,MAAM,GAAE,KAAK,GAAG,KAAa;IAIrC,MAAM,CAAC,MAAM,UAAQ;IAIrB,SAAS,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK;YAmBvB,GAAG;CAMpB"}
|
package/dist/esm/runner.js
CHANGED
|
@@ -3,14 +3,13 @@
|
|
|
3
3
|
* Copyright 2022-2025 Matter.js Authors
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { Progress } from "#tools";
|
|
7
|
-
import colors from "ansi-colors";
|
|
6
|
+
import { ansi, Progress, std } from "#tools";
|
|
8
7
|
import debug from "debug";
|
|
9
8
|
import { relative } from "path";
|
|
10
9
|
import { chip } from "./chip/chip.js";
|
|
11
|
-
import {
|
|
10
|
+
import { FailureReporter } from "./failure-reporter.js";
|
|
11
|
+
import { NodejsReporter } from "./nodejs-reporter.js";
|
|
12
12
|
import { testNodejs } from "./nodejs.js";
|
|
13
|
-
import { ProgressReporter } from "./reporter.js";
|
|
14
13
|
import { listSupportFiles } from "./util/files.js";
|
|
15
14
|
import { testWeb } from "./web.js";
|
|
16
15
|
class TestRunner {
|
|
@@ -19,13 +18,14 @@ class TestRunner {
|
|
|
19
18
|
this.progress = progress;
|
|
20
19
|
this.options = options;
|
|
21
20
|
chip.runner = this;
|
|
22
|
-
this.reporter = new class extends
|
|
21
|
+
this.reporter = new class extends NodejsReporter {
|
|
23
22
|
constructor() {
|
|
24
23
|
super(progress);
|
|
25
24
|
}
|
|
26
25
|
failRun(detail) {
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
std.err.write("\n");
|
|
27
|
+
FailureReporter.report(std.err, detail, "Test suite crash");
|
|
28
|
+
std.err.write("\n");
|
|
29
29
|
process.exit(1);
|
|
30
30
|
}
|
|
31
31
|
}();
|
|
@@ -71,7 +71,7 @@ class TestRunner {
|
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
function fatal(message) {
|
|
74
|
-
|
|
74
|
+
std.err.write(ansi.bright.red(`
|
|
75
75
|
${message}
|
|
76
76
|
|
|
77
77
|
`));
|
package/dist/esm/runner.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/runner.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,MAAe,UAAU,WAAW;AAC7C,OAAO,WAAW;AAClB,SAAS,gBAAgB;AACzB,SAAS,YAAY;AAErB,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB;AAG3B,SAAS,wBAAwB;AACjC,SAAS,eAAe;AAEjB,MAAM,WAAW;AAAA,EAIpB,YACa,KACA,UACA,SACX;AAHW;AACA;AACA;AAET,SAAK,SAAS;AAEd,SAAK,WAAW,IAAK,cAAc,eAAe;AAAA,MAC9C,cAAc;AACV,cAAM,QAAQ;AAAA,MAClB;AAAA,MAES,QAAQ,QAAuB;AACpC,YAAI,IAAI,MAAM,IAAI;AAClB,wBAAgB,OAAO,IAAI,KAAK,QAAQ,kBAAkB;AAC1D,YAAI,IAAI,MAAM,IAAI;AAClB,gBAAQ,KAAK,CAAC;AAAA,MAClB;AAAA,IACJ,EAAG;AAEH,QAAI,QAAQ,SAAS,QAAW;AAC5B,WAAK,OAAO,CAAC,kBAAkB;AAAA,IACnC,WAAW,MAAM,QAAQ,QAAQ,IAAI,GAAG;AACpC,WAAK,OAAO,QAAQ;AAAA,IACxB,OAAO;AACH,WAAK,OAAO,CAAC,QAAQ,IAAI;AAAA,IAC7B;AAEA,QAAI,QAAQ,OAAO;AACf,YAAM,OAAO,SAAS;AAAA,IAC1B;AAAA,EACJ;AAAA,EAlCS;AAAA,EACD,OAAO,MAAc;AAAA,EAmC7B,MAAM,QAAQ,SAAwB,OAAO;AACzC,UAAM,KAAK,IAAI,KAAK,UAAU,MAAM,WAAW,MAAM,MAAM,CAAC;AAAA,EAChE;AAAA,EAEA,MAAM,OAAO,SAAS,OAAO;AACzB,UAAM,KAAK,IAAI,KAAK,UAAU,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,EAC7D;AAAA,EAEA,MAAM,UAAU,QAAuB;AACnC,UAAM,QAAQ,CAAC;AACf,aAAS,QAAQ,KAAK,MAAM;AACxB,aAAO,KAAK,QAAQ,SAAS,KAAK;AAClC,aAAO,SAAS,KAAK,IAAI,MAAM,IAAI;AACnC,UAAI,CAAC,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,QAAQ,KAAK,CAAC,KAAK,WAAW,OAAO,GAAG;AAClF,eAAO,SAAS,MAAM,IAAI,IAAI;AAAA,MAClC;AAEA,YAAM,KAAK,GAAI,MAAM,KAAK,IAAI,KAAK,IAAI,CAAE;AAAA,IAC7C;AAEA,QAAI,CAAC,MAAM,QAAQ;AACf,YAAM,kBAAkB,KAAK,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,IAClD;AAEA,WAAO,CAAC,GAAG,iBAAiB,MAAM,GAAG,GAAG,KAAK;AAAA,EACjD;AAAA,EAEA,MAAc,IAAI,UAAoB,QAA6B;AAC/D,UAAM,OAAO;AACb,QAAI,SAAS,WAAW,SAAS,OAAO,SAAS;AAC7C,YAAM,QAAQ,SAAS,OAAO,YAAY,CAAC,YAAY;AAAA,IAC3D;AAAA,EACJ;AACJ;AAEA,SAAS,MAAM,SAAiB;AAC5B,MAAI,IAAI,MAAM,KAAK,OAAO,IAAI;AAAA,EAAK,OAAO;AAAA;AAAA,CAAM,CAAC;AACjD,UAAQ,KAAK,CAAC;AAClB;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export declare function TextDiff(actual: string, expected: string): string;
|
|
7
|
+
export declare namespace TextDiff {
|
|
8
|
+
let generator: undefined | ((actual: string, expected: string) => string);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=text-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-diff.d.ts","sourceRoot":"","sources":["../../src/text-diff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAKxD;AAED,yBAAiB,QAAQ,CAAC;IACf,IAAI,SAAS,EAAE,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;CACpF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
function TextDiff(actual, expected) {
|
|
7
|
+
if (TextDiff.generator) {
|
|
8
|
+
return TextDiff.generator(actual, expected);
|
|
9
|
+
}
|
|
10
|
+
return "(no diff generator installed)";
|
|
11
|
+
}
|
|
12
|
+
((TextDiff2) => {
|
|
13
|
+
})(TextDiff || (TextDiff = {}));
|
|
14
|
+
export {
|
|
15
|
+
TextDiff
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=text-diff.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { FailureDetail } from "./failure-detail.js";
|
|
7
|
+
import { Reporter, Stats } from "./reporter.js";
|
|
8
|
+
/**
|
|
9
|
+
* Test UI for web browsers. Encodes each reporting method to the console. This is a simple way to convey messages
|
|
10
|
+
* from the browser to the test harness.
|
|
11
|
+
*/
|
|
12
|
+
export declare class WebReporter implements Reporter {
|
|
13
|
+
static FLAG: string;
|
|
14
|
+
beginRun(name: string, stats?: Stats): void;
|
|
15
|
+
beginSuite(name: string[], stats?: Stats): void;
|
|
16
|
+
beginTest(name: string, stats?: Stats): void;
|
|
17
|
+
beginStep(name: string): void;
|
|
18
|
+
endRun(stats?: Stats): void;
|
|
19
|
+
failTest(name: string, detail: FailureDetail): void;
|
|
20
|
+
failRun(detail: FailureDetail): void;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=web-reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-reporter.d.ts","sourceRoot":"","sources":["../../src/web-reporter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAShD;;;GAGG;AACH,qBAAa,WAAY,YAAW,QAAQ;IACxC,MAAM,CAAC,IAAI,SAAiB;IAE5B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;IAIpC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,KAAK;IAIxC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;IAIrC,SAAS,CAAC,IAAI,EAAE,MAAM;IAItB,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK;IAIpB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa;IAI5C,OAAO,CAAC,MAAM,EAAE,aAAa;CAGhC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
const actualConsole = console;
|
|
7
|
+
const actualLog = actualConsole.log;
|
|
8
|
+
function proxy(...args) {
|
|
9
|
+
actualLog.call(actualConsole, `${WebReporter.FLAG}${JSON.stringify(args)}`);
|
|
10
|
+
}
|
|
11
|
+
class WebReporter {
|
|
12
|
+
static FLAG = "<<REPORT>> ";
|
|
13
|
+
beginRun(name, stats) {
|
|
14
|
+
proxy("beginRun", name, stats);
|
|
15
|
+
}
|
|
16
|
+
beginSuite(name, stats) {
|
|
17
|
+
proxy("beginSuite", name, stats);
|
|
18
|
+
}
|
|
19
|
+
beginTest(name, stats) {
|
|
20
|
+
proxy("beginTest", name, stats);
|
|
21
|
+
}
|
|
22
|
+
beginStep(name) {
|
|
23
|
+
proxy("beginStep", name);
|
|
24
|
+
}
|
|
25
|
+
endRun(stats) {
|
|
26
|
+
proxy("endRun", stats);
|
|
27
|
+
}
|
|
28
|
+
failTest(name, detail) {
|
|
29
|
+
proxy("failTest", name, detail);
|
|
30
|
+
}
|
|
31
|
+
failRun(detail) {
|
|
32
|
+
proxy("failRun", detail);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
WebReporter
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=web-reporter.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/web-reporter.ts"],
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAUA,MAAM,gBAAgB;AACtB,MAAM,YAAY,cAAc;AAChC,SAAS,SAAS,MAAa;AAC3B,YAAU,KAAK,eAAe,GAAG,YAAY,IAAI,GAAG,KAAK,UAAU,IAAI,CAAC,EAAE;AAC9E;AAMO,MAAM,YAAgC;AAAA,EACzC,OAAO,OAAO;AAAA,EAEd,SAAS,MAAc,OAAe;AAClC,UAAM,YAAY,MAAM,KAAK;AAAA,EACjC;AAAA,EAEA,WAAW,MAAgB,OAAe;AACtC,UAAM,cAAc,MAAM,KAAK;AAAA,EACnC;AAAA,EAEA,UAAU,MAAc,OAAe;AACnC,UAAM,aAAa,MAAM,KAAK;AAAA,EAClC;AAAA,EAEA,UAAU,MAAc;AACpB,UAAM,aAAa,IAAI;AAAA,EAC3B;AAAA,EAEA,OAAO,OAAe;AAClB,UAAM,UAAU,KAAK;AAAA,EACzB;AAAA,EAEA,SAAS,MAAc,QAAuB;AAC1C,UAAM,YAAY,MAAM,MAAM;AAAA,EAClC;AAAA,EAEA,QAAQ,QAAuB;AAC3B,UAAM,WAAW,MAAM;AAAA,EAC3B;AACJ;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
package/dist/esm/web.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,wBAAsB,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,iBA0ChE"}
|
package/dist/esm/web.js
CHANGED
|
@@ -9,7 +9,7 @@ import express from "express";
|
|
|
9
9
|
import { writeFile } from "fs/promises";
|
|
10
10
|
import { relative } from "path";
|
|
11
11
|
import { chromium } from "playwright";
|
|
12
|
-
import {
|
|
12
|
+
import { WebReporter } from "./web-reporter.js";
|
|
13
13
|
async function testWeb(runner, manual) {
|
|
14
14
|
const files = await runner.loadFiles("esm");
|
|
15
15
|
const bundlePath = await bundle(files, runner.pkg);
|
|
@@ -76,11 +76,11 @@ function consoleHandler(reporter) {
|
|
|
76
76
|
return;
|
|
77
77
|
}
|
|
78
78
|
const text = message.text();
|
|
79
|
-
if (type !== "log" || !text.startsWith(
|
|
79
|
+
if (type !== "log" || !text.startsWith(WebReporter.FLAG)) {
|
|
80
80
|
console[type](text);
|
|
81
81
|
return;
|
|
82
82
|
}
|
|
83
|
-
const args = JSON.parse(text.slice(
|
|
83
|
+
const args = JSON.parse(text.slice(WebReporter.FLAG.length));
|
|
84
84
|
const method = reporter[args[0]];
|
|
85
85
|
if (typeof method !== "function") {
|
|
86
86
|
throw new Error(`Invalid encoded reporter update method ${args[0]}`);
|
package/dist/esm/web.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/web.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,eAAe;AACxB,SAAS,aAAa;AACtB,OAAO,aAAa;AACpB,SAAS,iBAAiB;AAG1B,SAAS,gBAAgB;AACzB,SAAkB,gBAAsC;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["server", "options"]
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matter/testing",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.3-alpha.0-20250205-ad3416ca3",
|
|
4
4
|
"description": "Test harness for running JavaScript and Matter certification tests",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -41,10 +41,11 @@
|
|
|
41
41
|
},
|
|
42
42
|
"homepage": "https://github.com/project-chip/matter.js#readme",
|
|
43
43
|
"imports": {
|
|
44
|
-
"#tools": "@matter/tools"
|
|
44
|
+
"#tools": "@matter/tools",
|
|
45
|
+
"#tools/ansi-text": "@matter/tools/ansi-text"
|
|
45
46
|
},
|
|
46
47
|
"dependencies": {
|
|
47
|
-
"@matter/tools": "0.12.
|
|
48
|
+
"@matter/tools": "0.12.3-alpha.0-20250205-ad3416ca3",
|
|
48
49
|
"@types/express": "^4.17.21",
|
|
49
50
|
"ansi-colors": "^4.1.3",
|
|
50
51
|
"chai": "^4.4.1",
|
package/src/cli.ts
CHANGED
|
@@ -9,7 +9,7 @@ import "./util/node-shims.js";
|
|
|
9
9
|
|
|
10
10
|
import "./global-definitions.js";
|
|
11
11
|
|
|
12
|
-
import {
|
|
12
|
+
import { Graph, Package, Project, ProjectBuilder } from "#tools";
|
|
13
13
|
import { clear } from "console";
|
|
14
14
|
import yargs from "yargs";
|
|
15
15
|
import { hideBin } from "yargs/helpers";
|
|
@@ -80,7 +80,7 @@ export async function main(argv = process.argv) {
|
|
|
80
80
|
packageLocation = firstSpec;
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
const builder = new
|
|
83
|
+
const builder = new ProjectBuilder();
|
|
84
84
|
const pkg = new Package({ path: packageLocation });
|
|
85
85
|
|
|
86
86
|
// If the location is a workspace, test all packages with test
|
package/src/failure-detail.ts
CHANGED
|
@@ -4,35 +4,24 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import colors from "ansi-colors";
|
|
8
|
-
|
|
9
7
|
export interface FailureDetail {
|
|
10
8
|
message: string;
|
|
11
9
|
stack?: string;
|
|
12
|
-
|
|
10
|
+
stackLines?: string[];
|
|
11
|
+
actual?: string;
|
|
12
|
+
expected?: string;
|
|
13
13
|
logs?: string;
|
|
14
14
|
cause?: FailureDetail;
|
|
15
15
|
errors?: FailureDetail[];
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
if (error.expected && error.actual) {
|
|
24
|
-
if (FailureDetail.diff === undefined) {
|
|
25
|
-
diff = "(no diff implementation installed)";
|
|
26
|
-
} else {
|
|
27
|
-
diff = FailureDetail.diff(error.actual.toString(), error.expected.toString());
|
|
28
|
-
diff = diff.trim().replace(/^ {6}/gm, "");
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Captures all pertinent information about a failed test.
|
|
20
|
+
*/
|
|
21
|
+
export function FailureDetail(error: any, logs?: string[], parentStack?: string[]) {
|
|
22
|
+
const { message, stack, stackLines, cause, errors } = parseError(error, parentStack);
|
|
32
23
|
const result = { message } as FailureDetail;
|
|
33
|
-
|
|
34
|
-
result.diff = diff;
|
|
35
|
-
}
|
|
24
|
+
|
|
36
25
|
if (stack) {
|
|
37
26
|
result.stack = stack;
|
|
38
27
|
}
|
|
@@ -45,46 +34,32 @@ export function FailureDetail(error: any, logs?: string[]) {
|
|
|
45
34
|
if (errors) {
|
|
46
35
|
result.errors = errors;
|
|
47
36
|
}
|
|
37
|
+
if (stackLines) {
|
|
38
|
+
result.stackLines = stackLines;
|
|
39
|
+
}
|
|
48
40
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
if (failure.diff) {
|
|
57
|
-
process.stdout.write(`${prefix} ${failure.diff.replace(/\n/g, "\n ")}\n\n`);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
if (failure.stack) {
|
|
61
|
-
process.stdout.write(`${prefix}${colors.dim(failure.stack.replace(/\n/g, `\n${prefix}`))}\n\n`);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (failure.cause) {
|
|
65
|
-
process.stdout.write(`${prefix}Caused by:\n\n`);
|
|
66
|
-
dump(failure.cause, prefix);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
if (failure.errors?.length) {
|
|
70
|
-
let num = 0;
|
|
71
|
-
for (const cause of failure.errors) {
|
|
72
|
-
process.stdout.write(`${prefix}Cause #${++num}:\n\n`);
|
|
73
|
-
dump(cause, `${prefix} `);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (failure.logs) {
|
|
78
|
-
process.stdout.write(` ${failure.logs.replace(/\n/g, "\n ")}\n\n`);
|
|
79
|
-
}
|
|
41
|
+
const { actual, expected } = error;
|
|
42
|
+
if (actual) {
|
|
43
|
+
result.actual = actual;
|
|
44
|
+
}
|
|
45
|
+
if (expected) {
|
|
46
|
+
result.expected = expected;
|
|
80
47
|
}
|
|
81
48
|
|
|
82
|
-
|
|
49
|
+
return result;
|
|
83
50
|
}
|
|
84
51
|
|
|
85
|
-
function
|
|
86
|
-
|
|
52
|
+
function messageAndStackFor(
|
|
53
|
+
error: Error,
|
|
54
|
+
parentStack?: string[],
|
|
55
|
+
): { message: string; stack?: string; stackLines?: string[] } {
|
|
56
|
+
// If an error formatting hook is installed, use that
|
|
57
|
+
if (MatterHooks?.messageAndStackFor) {
|
|
58
|
+
return MatterHooks.messageAndStackFor(error, parentStack);
|
|
59
|
+
}
|
|
87
60
|
|
|
61
|
+
// Fallback message formatting
|
|
62
|
+
let message, stack;
|
|
88
63
|
if (error === undefined || error === null) {
|
|
89
64
|
message = `(error is ${error})`;
|
|
90
65
|
} else {
|
|
@@ -100,27 +75,29 @@ function parseError(error: Error) {
|
|
|
100
75
|
if (lines.length) {
|
|
101
76
|
stack = lines.map(line => line.trim()).join("\n");
|
|
102
77
|
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (!message) {
|
|
106
81
|
message = error.toString();
|
|
107
82
|
}
|
|
108
83
|
|
|
109
|
-
|
|
84
|
+
return { message, stack };
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function parseError(error: Error, parentStack?: string[]) {
|
|
88
|
+
const { message, stack, stackLines } = messageAndStackFor(error, parentStack);
|
|
110
89
|
|
|
111
|
-
|
|
112
|
-
message = message.slice(0, message.length - 1);
|
|
113
|
-
}
|
|
90
|
+
let cause: FailureDetail | undefined, errors: FailureDetail[] | undefined;
|
|
114
91
|
|
|
115
92
|
const errorCause = error.cause;
|
|
116
93
|
if (errorCause) {
|
|
117
|
-
cause = FailureDetail(errorCause);
|
|
94
|
+
cause = FailureDetail(errorCause, undefined, stackLines);
|
|
118
95
|
}
|
|
119
96
|
|
|
120
97
|
const errorErrors = (error as AggregateError).errors;
|
|
121
98
|
if (Array.isArray(errorErrors)) {
|
|
122
|
-
errors = errorErrors.map(e => FailureDetail(e));
|
|
99
|
+
errors = errorErrors.map(e => FailureDetail(e, undefined, stackLines));
|
|
123
100
|
}
|
|
124
101
|
|
|
125
|
-
return { message, stack, cause, errors };
|
|
102
|
+
return { message, stack, stackLines, cause, errors };
|
|
126
103
|
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { ansi, Printer, screen } from "#tools";
|
|
8
|
+
import { FailureDetail } from "./failure-detail.js";
|
|
9
|
+
import { TextDiff } from "./text-diff.js";
|
|
10
|
+
|
|
11
|
+
const OUTER_PREFIX = `${ansi.red}▌ ${ansi.not.red}`;
|
|
12
|
+
const INNER_PREFIX = `${ansi.dim}┆ ${ansi.not.dim}`;
|
|
13
|
+
|
|
14
|
+
export namespace FailureReporter {
|
|
15
|
+
export function report(out: Printer, failure: FailureDetail, title: string) {
|
|
16
|
+
out.state({ style: ansi.reset.white.bg.red }, () => {
|
|
17
|
+
out(screen.erase.toEol, "\n ", title, screen.erase.toEol, "\n", screen.erase.toEol, "\n");
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
out(screen.erase.toEol);
|
|
21
|
+
|
|
22
|
+
out.state({ linePrefix: OUTER_PREFIX }, () => {
|
|
23
|
+
dumpDetails(out, failure);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function dumpCause(out: Printer, failure: FailureDetail) {
|
|
29
|
+
out.state({ linePrefix: INNER_PREFIX }, () => {
|
|
30
|
+
dumpDetails(out, failure);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function dumpDetails(out: Printer, { message, actual, expected, stack, cause, errors, logs }: FailureDetail) {
|
|
35
|
+
out("\n", ansi.bright.red(message), "\n");
|
|
36
|
+
|
|
37
|
+
if (actual !== undefined && expected !== undefined) {
|
|
38
|
+
out("\n");
|
|
39
|
+
out.state({ linePrefix: " " }, () => out(TextDiff(actual, expected)));
|
|
40
|
+
out("\n");
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (stack) {
|
|
44
|
+
out("\n");
|
|
45
|
+
out.state({ linePrefix: " " }, () => out(stack));
|
|
46
|
+
out("\n");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (cause) {
|
|
50
|
+
out("\n", ansi.bold("Caused by:"), "\n");
|
|
51
|
+
dumpCause(out, cause);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (errors?.length) {
|
|
55
|
+
let num = 0;
|
|
56
|
+
for (const cause of errors) {
|
|
57
|
+
out("\n", ansi.bold(`Cause #${++num}:`), "\n");
|
|
58
|
+
dumpCause(out, cause);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (logs) {
|
|
63
|
+
out("\n", logs, "\n");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -52,6 +52,14 @@ declare global {
|
|
|
52
52
|
* Receive intercepted log messages.
|
|
53
53
|
*/
|
|
54
54
|
loggerSink?: (level: number, message: string) => void;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Extract error details.
|
|
58
|
+
*/
|
|
59
|
+
messageAndStackFor?: (
|
|
60
|
+
error: unknown,
|
|
61
|
+
parentStack?: string[],
|
|
62
|
+
) => { message: string; stack?: string; stackLines?: string[] };
|
|
55
63
|
};
|
|
56
64
|
|
|
57
65
|
namespace Mocha {
|