jit-parser 1.0.0
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/README.md +632 -0
- package/lib/codegen/CodegenAstFactory.d.ts +14 -0
- package/lib/codegen/CodegenAstFactory.js +119 -0
- package/lib/codegen/CodegenAstFactory.js.map +1 -0
- package/lib/codegen/CodegenGrammar.d.ts +21 -0
- package/lib/codegen/CodegenGrammar.js +145 -0
- package/lib/codegen/CodegenGrammar.js.map +1 -0
- package/lib/codegen/CodegenList.d.ts +15 -0
- package/lib/codegen/CodegenList.js +63 -0
- package/lib/codegen/CodegenList.js.map +1 -0
- package/lib/codegen/CodegenProduction.d.ts +15 -0
- package/lib/codegen/CodegenProduction.js +72 -0
- package/lib/codegen/CodegenProduction.js.map +1 -0
- package/lib/codegen/CodegenTerminal.d.ts +14 -0
- package/lib/codegen/CodegenTerminal.js +133 -0
- package/lib/codegen/CodegenTerminal.js.map +1 -0
- package/lib/codegen/CodegenUnion.d.ts +15 -0
- package/lib/codegen/CodegenUnion.js +71 -0
- package/lib/codegen/CodegenUnion.js.map +1 -0
- package/lib/codegen/Pattern.d.ts +8 -0
- package/lib/codegen/Pattern.js +41 -0
- package/lib/codegen/Pattern.js.map +1 -0
- package/lib/context.d.ts +13 -0
- package/lib/context.js +20 -0
- package/lib/context.js.map +1 -0
- package/lib/generator.d.ts +20 -0
- package/lib/generator.js +100 -0
- package/lib/generator.js.map +1 -0
- package/lib/grammars/calculator.d.ts +2 -0
- package/lib/grammars/calculator.js +76 -0
- package/lib/grammars/calculator.js.map +1 -0
- package/lib/grammars/esql.d.ts +2 -0
- package/lib/grammars/esql.js +221 -0
- package/lib/grammars/esql.js.map +1 -0
- package/lib/grammars/javascript.d.ts +2 -0
- package/lib/grammars/javascript.js +251 -0
- package/lib/grammars/javascript.js.map +1 -0
- package/lib/grammars/json-expression.d.ts +2 -0
- package/lib/grammars/json-expression.js +101 -0
- package/lib/grammars/json-expression.js.map +1 -0
- package/lib/grammars/json.d.ts +2 -0
- package/lib/grammars/json.js +79 -0
- package/lib/grammars/json.js.map +1 -0
- package/lib/index.d.ts +0 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/lib/matches.d.ts +15 -0
- package/lib/matches.js +21 -0
- package/lib/matches.js.map +1 -0
- package/lib/print.d.ts +11 -0
- package/lib/print.js +97 -0
- package/lib/print.js.map +1 -0
- package/lib/testing/cli.d.ts +1 -0
- package/lib/testing/cli.js +84 -0
- package/lib/testing/cli.js.map +1 -0
- package/lib/testing/driver.d.ts +21 -0
- package/lib/testing/driver.js +73 -0
- package/lib/testing/driver.js.map +1 -0
- package/lib/testing/index.d.ts +5 -0
- package/lib/testing/index.js +9 -0
- package/lib/testing/index.js.map +1 -0
- package/lib/testing/jest.d.ts +4 -0
- package/lib/testing/jest.js +31 -0
- package/lib/testing/jest.js.map +1 -0
- package/lib/testing/report.d.ts +3 -0
- package/lib/testing/report.js +64 -0
- package/lib/testing/report.js.map +1 -0
- package/lib/testing/runner.d.ts +29 -0
- package/lib/testing/runner.js +93 -0
- package/lib/testing/runner.js.map +1 -0
- package/lib/testing/types.d.ts +34 -0
- package/lib/testing/types.js +3 -0
- package/lib/testing/types.js.map +1 -0
- package/lib/types.d.ts +70 -0
- package/lib/types.js +3 -0
- package/lib/types.js.map +1 -0
- package/lib/util.d.ts +10 -0
- package/lib/util.js +39 -0
- package/lib/util.js.map +1 -0
- package/package.json +103 -0
package/lib/print.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.printCst = exports.printTraceNode = exports.GrammarPrinter = void 0;
|
|
4
|
+
const printTree_1 = require("tree-dump/lib/printTree");
|
|
5
|
+
const util_1 = require("./util");
|
|
6
|
+
class GrammarPrinter {
|
|
7
|
+
constructor(grammar) {
|
|
8
|
+
this.grammar = grammar;
|
|
9
|
+
this.visited = new Set();
|
|
10
|
+
}
|
|
11
|
+
print(tab, type = this.grammar.start) {
|
|
12
|
+
this.visited.add(type);
|
|
13
|
+
return this.printNode(this.grammar.cst[type], type, tab);
|
|
14
|
+
}
|
|
15
|
+
printNode(node, type, tab) {
|
|
16
|
+
if (type)
|
|
17
|
+
this.visited.add(type);
|
|
18
|
+
if ((0, util_1.isTerminalNode)(node)) {
|
|
19
|
+
const pattern = typeof node.t === 'string'
|
|
20
|
+
? JSON.stringify(node.t)
|
|
21
|
+
: Array.isArray(node.t)
|
|
22
|
+
? '(' + node.t.map((c) => JSON.stringify(c)).join(' | ') + ')' + (node.repeat ?? '')
|
|
23
|
+
: node.t;
|
|
24
|
+
return `${node.type ?? type ?? 'Text'} (terminal): ${pattern}`;
|
|
25
|
+
}
|
|
26
|
+
else if ((0, util_1.isTerminalShorthandNode)(node)) {
|
|
27
|
+
return this.printNode({ t: node }, type, tab);
|
|
28
|
+
}
|
|
29
|
+
else if ((0, util_1.isRefNode)(node)) {
|
|
30
|
+
const reference = node.r;
|
|
31
|
+
const visited = this.visited.has(reference);
|
|
32
|
+
if (!type) {
|
|
33
|
+
if (visited)
|
|
34
|
+
return `→ ${reference}`;
|
|
35
|
+
else
|
|
36
|
+
return this.printNode(this.grammar.cst[reference], reference, tab);
|
|
37
|
+
}
|
|
38
|
+
this.visited.add(reference);
|
|
39
|
+
return (`${type ?? 'Reference'} (reference)` +
|
|
40
|
+
(visited ? ' →' : (0, printTree_1.printTree)(tab, [(tab) => this.printNode(this.grammar.cst[reference], reference, tab)])));
|
|
41
|
+
}
|
|
42
|
+
else if ((0, util_1.isProductionNode)(node)) {
|
|
43
|
+
return (`${node.type ?? type ?? 'Production'} (production)` +
|
|
44
|
+
(0, printTree_1.printTree)(tab, node.p.map((n) => (tab) => this.printNode(n, undefined, tab))));
|
|
45
|
+
}
|
|
46
|
+
else if ((0, util_1.isProductionShorthandNode)(node)) {
|
|
47
|
+
return this.printNode({ p: node }, type, tab);
|
|
48
|
+
}
|
|
49
|
+
else if ((0, util_1.isUnionNode)(node)) {
|
|
50
|
+
return (`${node.type ?? type ?? 'Union'} (union)` +
|
|
51
|
+
(0, printTree_1.printTree)(tab, node.u.map((n) => (tab) => this.printNode(n, undefined, tab))));
|
|
52
|
+
}
|
|
53
|
+
else if ((0, util_1.isListNode)(node)) {
|
|
54
|
+
return (`${node.type ?? type ?? 'List'} (list)` + (0, printTree_1.printTree)(tab, [(tab) => this.printNode(node.l, undefined, tab)]));
|
|
55
|
+
}
|
|
56
|
+
return 'unknown';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.GrammarPrinter = GrammarPrinter;
|
|
60
|
+
GrammarPrinter.print = (grammar, tab) => {
|
|
61
|
+
const printer = new GrammarPrinter(grammar);
|
|
62
|
+
return printer.print(tab);
|
|
63
|
+
};
|
|
64
|
+
const formatMatch = (cst, text) => {
|
|
65
|
+
let formatted = ' ' + cst.pos + ':' + cst.end;
|
|
66
|
+
if (text) {
|
|
67
|
+
const end = cst.pos + Math.min(32, cst.end - cst.pos);
|
|
68
|
+
const slice = text.slice(cst.pos, end) + (end !== cst.end ? '...' : '');
|
|
69
|
+
const sliceFormatted = slice.indexOf('"') >= 0 && slice.indexOf("'") === -1
|
|
70
|
+
? "'" + JSON.stringify(slice).slice(1, -1).replaceAll('\\"', '"') + "'"
|
|
71
|
+
: JSON.stringify(slice);
|
|
72
|
+
formatted += ' → ' + sliceFormatted;
|
|
73
|
+
}
|
|
74
|
+
return formatted;
|
|
75
|
+
};
|
|
76
|
+
const printTraceNode = (trace, tab, text) => {
|
|
77
|
+
const pattern = trace.ptr;
|
|
78
|
+
const type = pattern?.type ?? (trace.ptr ? 'Anonymous' : 'Root');
|
|
79
|
+
const match = trace.match;
|
|
80
|
+
return (`${type}` +
|
|
81
|
+
(match ? formatMatch(match, text) : '') +
|
|
82
|
+
(trace.children && trace.children.length
|
|
83
|
+
? (0, printTree_1.printTree)(tab, trace.children.map((n) => (tab) => (0, exports.printTraceNode)(n, tab, text)))
|
|
84
|
+
: ''));
|
|
85
|
+
};
|
|
86
|
+
exports.printTraceNode = printTraceNode;
|
|
87
|
+
const printCst = (cst, tab, text) => {
|
|
88
|
+
const pattern = cst.ptr;
|
|
89
|
+
const type = pattern.type;
|
|
90
|
+
return (`${type}` +
|
|
91
|
+
formatMatch(cst, text) +
|
|
92
|
+
(cst.children && cst.children.length
|
|
93
|
+
? (0, printTree_1.printTree)(tab, cst.children.map((n) => (tab) => (0, exports.printCst)(n, tab, text)))
|
|
94
|
+
: ''));
|
|
95
|
+
};
|
|
96
|
+
exports.printCst = printCst;
|
|
97
|
+
//# sourceMappingURL=print.js.map
|
package/lib/print.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print.js","sourceRoot":"","sources":["../src/print.ts"],"names":[],"mappings":";;;AAAA,uDAAkD;AAClD,iCAQgB;AAGhB,MAAa,cAAc;IAQzB,YAA4B,OAAgB;QAAhB,YAAO,GAAP,OAAO,CAAS;QAFzB,YAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAEA,CAAC;IAEzC,KAAK,CAAC,GAAY,EAAE,OAAe,IAAI,CAAC,OAAO,CAAC,KAAK;QAC1D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3D,CAAC;IAEM,SAAS,CAAC,IAAiB,EAAE,IAAa,EAAE,GAAY;QAC7D,IAAI,IAAI;YAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,IAAA,qBAAc,EAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,OAAO,GACX,OAAO,IAAI,CAAC,CAAC,KAAK,QAAQ;gBACxB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;gBACxB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;oBACrB,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;oBACpF,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACf,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,MAAM,gBAAgB,OAAO,EAAE,CAAC;QACjE,CAAC;aAAM,IAAI,IAAA,8BAAuB,EAAC,IAAI,CAAC,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC,SAAS,CAAC,EAAC,CAAC,EAAE,IAAI,EAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,IAAA,gBAAS,EAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,IAAI,OAAO;oBAAE,OAAO,KAAK,SAAS,EAAE,CAAC;;oBAChC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;YAC1E,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC5B,OAAO,CACL,GAAG,IAAI,IAAI,WAAW,cAAc;gBACpC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,qBAAS,EAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAC1G,CAAC;QACJ,CAAC;aAAM,IAAI,IAAA,uBAAgB,EAAC,IAAI,CAAC,EAAE,CAAC;YAClC,OAAO,CACL,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,YAAY,eAAe;gBACnD,IAAA,qBAAS,EACP,GAAG,EACH,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAC9D,CACF,CAAC;QACJ,CAAC;aAAM,IAAI,IAAA,gCAAyB,EAAC,IAAI,CAAC,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,EAAC,CAAC,EAAE,IAAI,EAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,IAAA,kBAAW,EAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,CACL,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,OAAO,UAAU;gBACzC,IAAA,qBAAS,EACP,GAAG,EACH,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAC9D,CACF,CAAC;QACJ,CAAC;aAAM,IAAI,IAAA,iBAAU,EAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,CACL,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,MAAM,SAAS,GAAG,IAAA,qBAAS,EAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAC5G,CAAC;QACJ,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;;AA/DH,wCAgEC;AA/DwB,oBAAK,GAAG,CAAC,OAAgB,EAAE,GAAY,EAAU,EAAE;IACxE,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;IAC5C,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC,AAH2B,CAG1B;AA8DJ,MAAM,WAAW,GAAG,CAAC,GAAY,EAAE,IAAa,EAAU,EAAE;IAC1D,IAAI,SAAS,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IAC9C,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxE,MAAM,cAAc,GAClB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAClD,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG;YACvE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC5B,SAAS,IAAI,KAAK,GAAG,cAAc,CAAC;IACtC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEK,MAAM,cAAc,GAAG,CAAC,KAAqC,EAAE,GAAY,EAAE,IAAa,EAAU,EAAE;IAC3G,MAAM,OAAO,GAAI,KAAwB,CAAC,GAAG,CAAC;IAC9C,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,CAAE,KAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACrF,MAAM,KAAK,GAAI,KAAwB,CAAC,KAAK,CAAC;IAC9C,OAAO,CACL,GAAG,IAAI,EAAE;QACT,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM;YACtC,CAAC,CAAC,IAAA,qBAAS,EACP,GAAG,EACH,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAA,sBAAc,EAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CACjE;YACH,CAAC,CAAC,EAAE,CAAC,CACR,CAAC;AACJ,CAAC,CAAC;AAdW,QAAA,cAAc,kBAczB;AAEK,MAAM,QAAQ,GAAG,CAAC,GAAY,EAAE,GAAY,EAAE,IAAa,EAAU,EAAE;IAC5E,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC;IACxB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,OAAO,CACL,GAAG,IAAI,EAAE;QACT,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC;QACtB,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM;YAClC,CAAC,CAAC,IAAA,qBAAS,EACP,GAAG,EACH,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAA,gBAAQ,EAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CACzD;YACH,CAAC,CAAC,EAAE,CAAC,CACR,CAAC;AACJ,CAAC,CAAC;AAbW,QAAA,QAAQ,YAanB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const main: (argv: string[]) => number;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.main = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const fs = tslib_1.__importStar(require("fs"));
|
|
6
|
+
const path = tslib_1.__importStar(require("path"));
|
|
7
|
+
const report_1 = require("./report");
|
|
8
|
+
const runner_1 = require("./runner");
|
|
9
|
+
const HELP = `grammar-test — run JSON Grammar test suites
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
grammar-test <suite.json...> [options]
|
|
13
|
+
|
|
14
|
+
Options:
|
|
15
|
+
-u, --update Regenerate and write snapshot channels back into the suites
|
|
16
|
+
--no-color Disable ANSI colors
|
|
17
|
+
-h, --help Show this help
|
|
18
|
+
|
|
19
|
+
The grammar under test is taken from each suite's "grammar" field, resolved
|
|
20
|
+
relative to the suite file (.json grammar object, or a module exporting
|
|
21
|
+
\`grammar\`).`;
|
|
22
|
+
const resolveGrammar = (suitePath, suite) => {
|
|
23
|
+
const ref = suite.grammar;
|
|
24
|
+
if (!ref)
|
|
25
|
+
throw new Error(`suite "${suitePath}" has no "grammar" reference`);
|
|
26
|
+
const abs = path.resolve(path.dirname(suitePath), ref);
|
|
27
|
+
if (abs.endsWith('.json'))
|
|
28
|
+
return JSON.parse(fs.readFileSync(abs, 'utf8'));
|
|
29
|
+
const mod = require(abs);
|
|
30
|
+
return (mod.grammar ?? mod.default ?? mod);
|
|
31
|
+
};
|
|
32
|
+
const main = (argv) => {
|
|
33
|
+
const files = [];
|
|
34
|
+
let update = false;
|
|
35
|
+
let useColor = true;
|
|
36
|
+
for (const arg of argv) {
|
|
37
|
+
switch (arg) {
|
|
38
|
+
case '-u':
|
|
39
|
+
case '--update':
|
|
40
|
+
update = true;
|
|
41
|
+
break;
|
|
42
|
+
case '--no-color':
|
|
43
|
+
useColor = false;
|
|
44
|
+
break;
|
|
45
|
+
case '-h':
|
|
46
|
+
case '--help':
|
|
47
|
+
console.log(HELP);
|
|
48
|
+
return 0;
|
|
49
|
+
default:
|
|
50
|
+
files.push(arg);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (!files.length) {
|
|
54
|
+
console.error(HELP);
|
|
55
|
+
return 1;
|
|
56
|
+
}
|
|
57
|
+
let totalFail = 0;
|
|
58
|
+
for (const file of files) {
|
|
59
|
+
const suitePath = path.resolve(file);
|
|
60
|
+
const suite = JSON.parse(fs.readFileSync(suitePath, 'utf8'));
|
|
61
|
+
let grammar;
|
|
62
|
+
try {
|
|
63
|
+
grammar = resolveGrammar(suitePath, suite);
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
console.error(`✗ ${file}: ${err.message}`);
|
|
67
|
+
totalFail++;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const result = (0, runner_1.runSuite)(grammar, suite, { update });
|
|
71
|
+
console.log((0, report_1.formatSuite)(result, useColor));
|
|
72
|
+
console.log('');
|
|
73
|
+
if (update && result.updated) {
|
|
74
|
+
fs.writeFileSync(suitePath, JSON.stringify(suite, null, 2) + '\n');
|
|
75
|
+
}
|
|
76
|
+
totalFail += result.fail;
|
|
77
|
+
}
|
|
78
|
+
return totalFail ? 1 : 0;
|
|
79
|
+
};
|
|
80
|
+
exports.main = main;
|
|
81
|
+
if (require.main === module) {
|
|
82
|
+
process.exit((0, exports.main)(process.argv.slice(2)));
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/testing/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { CodegenGrammar } from '../codegen/CodegenGrammar';
|
|
2
|
+
import type { CstNode, Grammar, RootTraceNode } from '../types';
|
|
3
|
+
import type { StructuralCst, TestCase } from './types';
|
|
4
|
+
export interface DriveNeeds {
|
|
5
|
+
ast: boolean;
|
|
6
|
+
trace: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface DriveResult {
|
|
9
|
+
src: string;
|
|
10
|
+
matched: boolean;
|
|
11
|
+
end: number;
|
|
12
|
+
cst?: CstNode;
|
|
13
|
+
ast?: unknown;
|
|
14
|
+
trace?: RootTraceNode;
|
|
15
|
+
}
|
|
16
|
+
export type GrammarCache = Map<string, CodegenGrammar>;
|
|
17
|
+
export declare const createCache: () => GrammarCache;
|
|
18
|
+
export declare const mulberry32: (seed: number) => (() => number);
|
|
19
|
+
export declare const resolveInput: (grammar: Grammar, tc: TestCase) => string;
|
|
20
|
+
export declare const drive: (grammar: Grammar, tc: TestCase, needs: DriveNeeds, cache?: GrammarCache) => DriveResult;
|
|
21
|
+
export declare const toStructuralCst: (cst: CstNode) => StructuralCst;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toStructuralCst = exports.drive = exports.resolveInput = exports.mulberry32 = exports.createCache = void 0;
|
|
4
|
+
const CodegenGrammar_1 = require("../codegen/CodegenGrammar");
|
|
5
|
+
const context_1 = require("../context");
|
|
6
|
+
const generator_1 = require("../generator");
|
|
7
|
+
const createCache = () => new Map();
|
|
8
|
+
exports.createCache = createCache;
|
|
9
|
+
const getCodegen = (grammar, debug, cache) => {
|
|
10
|
+
const key = debug ? '1' : '0';
|
|
11
|
+
if (cache) {
|
|
12
|
+
const existing = cache.get(key);
|
|
13
|
+
if (existing)
|
|
14
|
+
return existing;
|
|
15
|
+
}
|
|
16
|
+
const codegen = new CodegenGrammar_1.CodegenGrammar(grammar, new context_1.CodegenContext(true, true, debug));
|
|
17
|
+
if (cache)
|
|
18
|
+
cache.set(key, codegen);
|
|
19
|
+
return codegen;
|
|
20
|
+
};
|
|
21
|
+
const mulberry32 = (seed) => {
|
|
22
|
+
let a = seed >>> 0;
|
|
23
|
+
return () => {
|
|
24
|
+
a = (a + 0x6d2b79f5) | 0;
|
|
25
|
+
let t = Math.imul(a ^ (a >>> 15), 1 | a);
|
|
26
|
+
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
|
|
27
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
exports.mulberry32 = mulberry32;
|
|
31
|
+
const resolveInput = (grammar, tc) => {
|
|
32
|
+
if (tc.src !== undefined && tc.generate !== undefined) {
|
|
33
|
+
throw new Error('a test case must set either "src" or "generate", not both');
|
|
34
|
+
}
|
|
35
|
+
if (tc.src !== undefined)
|
|
36
|
+
return tc.src;
|
|
37
|
+
if (tc.generate !== undefined) {
|
|
38
|
+
const spec = tc.generate === 'sample' ? { sample: true } : tc.generate;
|
|
39
|
+
const rnd = spec.seed !== undefined ? (0, exports.mulberry32)(spec.seed) : undefined;
|
|
40
|
+
const generator = new generator_1.Generator({ grammar, useSamples: spec.sample !== false, rnd });
|
|
41
|
+
return generator.gen(tc.rule ?? grammar.start);
|
|
42
|
+
}
|
|
43
|
+
return '';
|
|
44
|
+
};
|
|
45
|
+
exports.resolveInput = resolveInput;
|
|
46
|
+
const drive = (grammar, tc, needs, cache) => {
|
|
47
|
+
const codegen = getCodegen(grammar, needs.trace, cache);
|
|
48
|
+
const rule = tc.rule ?? grammar.start;
|
|
49
|
+
const pattern = codegen.compileRule(rule);
|
|
50
|
+
const src = (0, exports.resolveInput)(grammar, tc);
|
|
51
|
+
const root = { pos: 0, children: [] };
|
|
52
|
+
const ctx = new context_1.ParseContext(src, needs.ast, needs.trace ? [root] : undefined);
|
|
53
|
+
const cst = pattern.parser(ctx, 0);
|
|
54
|
+
const matched = !!cst;
|
|
55
|
+
const ast = matched && needs.ast ? cst.ptr.toAst(cst, src) : undefined;
|
|
56
|
+
return {
|
|
57
|
+
src,
|
|
58
|
+
matched,
|
|
59
|
+
end: matched ? cst.end : -1,
|
|
60
|
+
cst: cst ?? undefined,
|
|
61
|
+
ast,
|
|
62
|
+
trace: needs.trace ? root : undefined,
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
exports.drive = drive;
|
|
66
|
+
const toStructuralCst = (cst) => {
|
|
67
|
+
const out = { type: cst.ptr.type, pos: cst.pos, end: cst.end };
|
|
68
|
+
if (cst.children)
|
|
69
|
+
out.children = cst.children.map(exports.toStructuralCst);
|
|
70
|
+
return out;
|
|
71
|
+
};
|
|
72
|
+
exports.toStructuralCst = toStructuralCst;
|
|
73
|
+
//# sourceMappingURL=driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../../src/testing/driver.ts"],"names":[],"mappings":";;;AAAA,8DAAyD;AACzD,wCAAwD;AACxD,4CAAuC;AAyChC,MAAM,WAAW,GAAG,GAAiB,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;AAA5C,QAAA,WAAW,eAAiC;AAEzD,MAAM,UAAU,GAAG,CAAC,OAAgB,EAAE,KAAc,EAAE,KAAoB,EAAkB,EAAE;IAC5F,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9B,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;IAChC,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,+BAAc,CAAC,OAAO,EAAE,IAAI,wBAAc,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACnF,IAAI,KAAK;QAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAGK,MAAM,UAAU,GAAG,CAAC,IAAY,EAAkB,EAAE;IACzD,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC;IACnB,OAAO,GAAG,EAAE;QACV,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC;IAC/C,CAAC,CAAC;AACJ,CAAC,CAAC;AARW,QAAA,UAAU,cAQrB;AAGK,MAAM,YAAY,GAAG,CAAC,OAAgB,EAAE,EAAY,EAAU,EAAE;IACrE,IAAI,EAAE,CAAC,GAAG,KAAK,SAAS,IAAI,EAAE,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,EAAE,CAAC,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC,GAAG,CAAC;IACxC,IAAI,EAAE,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAC,MAAM,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC;QACrE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,MAAM,SAAS,GAAG,IAAI,qBAAS,CAAC,EAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,GAAG,EAAC,CAAC,CAAC;QACnF,OAAO,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAZW,QAAA,YAAY,gBAYvB;AAGK,MAAM,KAAK,GAAG,CAAC,OAAgB,EAAE,EAAY,EAAE,KAAiB,EAAE,KAAoB,EAAe,EAAE;IAC5G,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAA,oBAAY,EAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,IAAI,GAAkB,EAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAC,CAAC;IACnD,MAAM,GAAG,GAAG,IAAI,sBAAY,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/E,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC;IACtB,MAAM,GAAG,GAAG,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,OAAO;QACL,GAAG;QACH,OAAO;QACP,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,GAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,GAAG,EAAE,GAAG,IAAI,SAAS;QACrB,GAAG;QACH,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;KACtC,CAAC;AACJ,CAAC,CAAC;AAlBW,QAAA,KAAK,SAkBhB;AAGK,MAAM,eAAe,GAAG,CAAC,GAAY,EAAiB,EAAE;IAC7D,MAAM,GAAG,GAAkB,EAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAC,CAAC;IAC5E,IAAI,GAAG,CAAC,QAAQ;QAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,uBAAe,CAAC,CAAC;IACnE,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAJW,QAAA,eAAe,mBAI1B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./types"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./driver"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./runner"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./report"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./jest"), exports);
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":";;;AAAA,kDAAwB;AACxB,mDAAyB;AACzB,mDAAyB;AACzB,mDAAyB;AACzB,iDAAuB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.jestSuiteFile = exports.jestSuite = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const fs = tslib_1.__importStar(require("fs"));
|
|
6
|
+
const report_1 = require("./report");
|
|
7
|
+
const runner_1 = require("./runner");
|
|
8
|
+
const jestSuite = (grammar, suite) => {
|
|
9
|
+
const label = suite.describe ?? suite.grammar ?? 'grammar';
|
|
10
|
+
const hasOnly = suite.tests.some((t) => t.only);
|
|
11
|
+
describe(label, () => {
|
|
12
|
+
for (const tc of suite.tests) {
|
|
13
|
+
const run = () => {
|
|
14
|
+
const res = (0, runner_1.runCase)(grammar, suite, tc);
|
|
15
|
+
if (res.status === 'fail')
|
|
16
|
+
throw new Error('\n' + (0, report_1.formatCase)(res, false));
|
|
17
|
+
};
|
|
18
|
+
if (tc.skip || (hasOnly && !tc.only))
|
|
19
|
+
test.skip(tc.name, run);
|
|
20
|
+
else
|
|
21
|
+
test(tc.name, run);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
exports.jestSuite = jestSuite;
|
|
26
|
+
const jestSuiteFile = (grammar, suitePath) => {
|
|
27
|
+
const suite = JSON.parse(fs.readFileSync(suitePath, 'utf8'));
|
|
28
|
+
(0, exports.jestSuite)(grammar, suite);
|
|
29
|
+
};
|
|
30
|
+
exports.jestSuiteFile = jestSuiteFile;
|
|
31
|
+
//# sourceMappingURL=jest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jest.js","sourceRoot":"","sources":["../../src/testing/jest.ts"],"names":[],"mappings":";;;;AAAA,+CAAyB;AAEzB,qCAAoC;AACpC,qCAAiC;AAU1B,MAAM,SAAS,GAAG,CAAC,OAAgB,EAAE,KAAgB,EAAQ,EAAE;IACpE,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,IAAI,SAAS,CAAC;IAC3D,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;QACnB,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,GAAG,EAAE;gBACf,MAAM,GAAG,GAAG,IAAA,gBAAO,EAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;gBACxC,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,IAAI,GAAG,IAAA,mBAAU,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;YAC5E,CAAC,CAAC;YACF,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;;gBACzD,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAbW,QAAA,SAAS,aAapB;AAGK,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAE,SAAiB,EAAQ,EAAE;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAc,CAAC;IAC1E,IAAA,iBAAS,EAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC5B,CAAC,CAAC;AAHW,QAAA,aAAa,iBAGxB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatSuite = exports.formatCase = void 0;
|
|
4
|
+
const GREEN = '\x1b[32m';
|
|
5
|
+
const RED = '\x1b[31m';
|
|
6
|
+
const YELLOW = '\x1b[33m';
|
|
7
|
+
const DIM = '\x1b[90m';
|
|
8
|
+
const RESET = '\x1b[0m';
|
|
9
|
+
const color = (on, c, s) => (on ? c + s + RESET : s);
|
|
10
|
+
const show = (value) => {
|
|
11
|
+
if (Array.isArray(value) && value.every((v) => typeof v === 'string')) {
|
|
12
|
+
return '\n' + value.map((l) => ' ' + l).join('\n');
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
const json = JSON.stringify(value);
|
|
16
|
+
return json === undefined ? String(value) : json;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return String(value);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const channelLine = (ch, c) => {
|
|
23
|
+
if (ch.status === 'fail') {
|
|
24
|
+
return (color(c, RED, ` ${ch.channel}: mismatch`) +
|
|
25
|
+
color(c, DIM, `\n expected `) +
|
|
26
|
+
show(ch.expected) +
|
|
27
|
+
color(c, DIM, `\n actual `) +
|
|
28
|
+
show(ch.actual));
|
|
29
|
+
}
|
|
30
|
+
if (ch.status === 'missing') {
|
|
31
|
+
return color(c, YELLOW, ` ${ch.channel}: no snapshot stored — run with --update`);
|
|
32
|
+
}
|
|
33
|
+
return '';
|
|
34
|
+
};
|
|
35
|
+
const formatCase = (res, useColor = true) => {
|
|
36
|
+
if (res.status === 'skip')
|
|
37
|
+
return color(useColor, DIM, ` - ${res.name} (skipped)`);
|
|
38
|
+
if (res.status === 'pass')
|
|
39
|
+
return color(useColor, GREEN, ` ✓ ${res.name}`);
|
|
40
|
+
const head = color(useColor, RED, ` ✗ ${res.name}`);
|
|
41
|
+
if (res.error)
|
|
42
|
+
return head + color(useColor, RED, `\n threw: ${res.error}`);
|
|
43
|
+
const details = res.channels
|
|
44
|
+
.map((ch) => channelLine(ch, useColor))
|
|
45
|
+
.filter(Boolean)
|
|
46
|
+
.join('\n');
|
|
47
|
+
return head + (details ? '\n' + details : '');
|
|
48
|
+
};
|
|
49
|
+
exports.formatCase = formatCase;
|
|
50
|
+
const formatSuite = (res, useColor = true) => {
|
|
51
|
+
const lines = [];
|
|
52
|
+
if (res.describe)
|
|
53
|
+
lines.push(res.describe);
|
|
54
|
+
for (const c of res.cases)
|
|
55
|
+
lines.push((0, exports.formatCase)(c, useColor));
|
|
56
|
+
const summary = ` ${res.pass} passed` +
|
|
57
|
+
(res.fail ? `, ${res.fail} failed` : '') +
|
|
58
|
+
(res.skip ? `, ${res.skip} skipped` : '') +
|
|
59
|
+
(res.updated ? ` (snapshots updated)` : '');
|
|
60
|
+
lines.push(color(useColor, res.fail ? RED : GREEN, summary));
|
|
61
|
+
return lines.join('\n');
|
|
62
|
+
};
|
|
63
|
+
exports.formatSuite = formatSuite;
|
|
64
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/testing/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Grammar } from '../types';
|
|
2
|
+
import { type GrammarCache } from './driver';
|
|
3
|
+
import type { ChannelName, TestCase, TestSuite } from './types';
|
|
4
|
+
export interface ChannelResult {
|
|
5
|
+
channel: ChannelName;
|
|
6
|
+
status: 'pass' | 'fail' | 'missing' | 'wrote';
|
|
7
|
+
expected?: unknown;
|
|
8
|
+
actual?: unknown;
|
|
9
|
+
}
|
|
10
|
+
export interface CaseResult {
|
|
11
|
+
name: string;
|
|
12
|
+
status: 'pass' | 'fail' | 'skip';
|
|
13
|
+
channels: ChannelResult[];
|
|
14
|
+
error?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface SuiteResult {
|
|
17
|
+
describe?: string;
|
|
18
|
+
cases: CaseResult[];
|
|
19
|
+
pass: number;
|
|
20
|
+
fail: number;
|
|
21
|
+
skip: number;
|
|
22
|
+
updated: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface RunOptions {
|
|
25
|
+
update?: boolean;
|
|
26
|
+
cache?: GrammarCache;
|
|
27
|
+
}
|
|
28
|
+
export declare const runCase: (grammar: Grammar, suite: TestSuite, tc: TestCase, opts?: RunOptions) => CaseResult;
|
|
29
|
+
export declare const runSuite: (grammar: Grammar, suite: TestSuite, opts?: RunOptions) => SuiteResult;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runSuite = exports.runCase = void 0;
|
|
4
|
+
const deepEqual_1 = require("@jsonjoy.com/util/lib/json-equal/deepEqual");
|
|
5
|
+
const print_1 = require("../print");
|
|
6
|
+
const driver_1 = require("./driver");
|
|
7
|
+
const SNAPSHOT_CHANNELS = ['ast', 'cst', 'cstPrint', 'trace', 'end'];
|
|
8
|
+
const snapshotSetOf = (suite, tc) => new Set(tc.snapshot ?? suite.snapshot ?? []);
|
|
9
|
+
const actualOf = (channel, d) => {
|
|
10
|
+
switch (channel) {
|
|
11
|
+
case 'ast':
|
|
12
|
+
return d.ast;
|
|
13
|
+
case 'cst':
|
|
14
|
+
return d.cst ? (0, driver_1.toStructuralCst)(d.cst) : null;
|
|
15
|
+
case 'cstPrint':
|
|
16
|
+
return d.cst ? (0, print_1.printCst)(d.cst, '', d.src).split('\n') : [];
|
|
17
|
+
case 'trace':
|
|
18
|
+
return d.trace ? (0, print_1.printTraceNode)(d.trace, '', d.src).split('\n') : [];
|
|
19
|
+
case 'end':
|
|
20
|
+
return d.end;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const runCase = (grammar, suite, tc, opts = {}) => {
|
|
24
|
+
const hasOnly = suite.tests.some((t) => t.only);
|
|
25
|
+
if (tc.skip || (hasOnly && !tc.only))
|
|
26
|
+
return { name: tc.name, status: 'skip', channels: [] };
|
|
27
|
+
const snapshot = snapshotSetOf(suite, tc);
|
|
28
|
+
const needAst = 'ast' in tc || snapshot.has('ast');
|
|
29
|
+
const needTrace = 'trace' in tc || snapshot.has('trace');
|
|
30
|
+
let d;
|
|
31
|
+
try {
|
|
32
|
+
d = (0, driver_1.drive)(grammar, tc, { ast: needAst, trace: needTrace }, opts.cache);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
return { name: tc.name, status: 'fail', channels: [], error: String(err?.message ?? err) };
|
|
36
|
+
}
|
|
37
|
+
const channels = [];
|
|
38
|
+
const considered = new Set([...snapshot, ...SNAPSHOT_CHANNELS.filter((c) => c in tc)]);
|
|
39
|
+
for (const channel of considered) {
|
|
40
|
+
const actual = actualOf(channel, d);
|
|
41
|
+
const bag = tc;
|
|
42
|
+
if (opts.update && snapshot.has(channel)) {
|
|
43
|
+
if (actual === undefined) {
|
|
44
|
+
channels.push({ channel, status: 'fail', actual });
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
bag[channel] = actual;
|
|
48
|
+
channels.push({ channel, status: 'wrote', actual });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else if (channel in tc) {
|
|
52
|
+
const expected = bag[channel];
|
|
53
|
+
channels.push({ channel, status: (0, deepEqual_1.deepEqual)(actual, expected) ? 'pass' : 'fail', expected, actual });
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
channels.push({ channel, status: 'missing', actual });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if ('parses' in tc) {
|
|
60
|
+
channels.push({
|
|
61
|
+
channel: 'parses',
|
|
62
|
+
status: d.matched === tc.parses ? 'pass' : 'fail',
|
|
63
|
+
expected: tc.parses,
|
|
64
|
+
actual: d.matched,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
if ('consumes' in tc) {
|
|
68
|
+
const actual = d.matched && d.end === d.src.length;
|
|
69
|
+
channels.push({ channel: 'consumes', status: actual ? 'pass' : 'fail', expected: true, actual });
|
|
70
|
+
}
|
|
71
|
+
const failed = channels.some((c) => c.status === 'fail' || c.status === 'missing');
|
|
72
|
+
return { name: tc.name, status: failed ? 'fail' : 'pass', channels };
|
|
73
|
+
};
|
|
74
|
+
exports.runCase = runCase;
|
|
75
|
+
const runSuite = (grammar, suite, opts = {}) => {
|
|
76
|
+
const cache = opts.cache ?? (0, driver_1.createCache)();
|
|
77
|
+
const cases = suite.tests.map((tc) => (0, exports.runCase)(grammar, suite, tc, { ...opts, cache }));
|
|
78
|
+
let pass = 0;
|
|
79
|
+
let fail = 0;
|
|
80
|
+
let skip = 0;
|
|
81
|
+
for (const c of cases) {
|
|
82
|
+
if (c.status === 'pass')
|
|
83
|
+
pass++;
|
|
84
|
+
else if (c.status === 'fail')
|
|
85
|
+
fail++;
|
|
86
|
+
else
|
|
87
|
+
skip++;
|
|
88
|
+
}
|
|
89
|
+
const updated = cases.some((c) => c.channels.some((ch) => ch.status === 'wrote'));
|
|
90
|
+
return { describe: suite.describe ?? suite.grammar, cases, pass, fail, skip, updated };
|
|
91
|
+
};
|
|
92
|
+
exports.runSuite = runSuite;
|
|
93
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/testing/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface TestSuite {
|
|
2
|
+
grammar?: string;
|
|
3
|
+
describe?: string;
|
|
4
|
+
snapshot?: SnapshotChannel[];
|
|
5
|
+
tests: TestCase[];
|
|
6
|
+
}
|
|
7
|
+
export interface TestCase {
|
|
8
|
+
name: string;
|
|
9
|
+
rule?: string;
|
|
10
|
+
src?: string;
|
|
11
|
+
generate?: GenerateSpec;
|
|
12
|
+
skip?: boolean;
|
|
13
|
+
only?: boolean;
|
|
14
|
+
snapshot?: SnapshotChannel[];
|
|
15
|
+
ast?: unknown;
|
|
16
|
+
cst?: StructuralCst;
|
|
17
|
+
cstPrint?: string[];
|
|
18
|
+
trace?: string[];
|
|
19
|
+
end?: number;
|
|
20
|
+
parses?: boolean;
|
|
21
|
+
consumes?: 'all';
|
|
22
|
+
}
|
|
23
|
+
export type GenerateSpec = 'sample' | {
|
|
24
|
+
sample?: boolean;
|
|
25
|
+
seed?: number;
|
|
26
|
+
};
|
|
27
|
+
export interface StructuralCst {
|
|
28
|
+
type: string;
|
|
29
|
+
pos: number;
|
|
30
|
+
end: number;
|
|
31
|
+
children?: StructuralCst[];
|
|
32
|
+
}
|
|
33
|
+
export type SnapshotChannel = 'ast' | 'cst' | 'cstPrint' | 'trace' | 'end';
|
|
34
|
+
export type ChannelName = SnapshotChannel | 'parses' | 'consumes';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/testing/types.ts"],"names":[],"mappings":""}
|