clarity-pattern-parser 5.0.0 → 6.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 +328 -38
- package/TODO.md +55 -1
- package/dist/ast/Node.d.ts +8 -2
- package/dist/index.browser.js +470 -205
- package/dist/index.browser.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.esm.js +469 -206
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +470 -205
- package/dist/index.js.map +1 -1
- package/dist/intellisense/AutoComplete.d.ts +28 -0
- package/dist/intellisense/Suggestion.d.ts +11 -0
- package/dist/intellisense/SuggestionOption.d.ts +4 -0
- package/dist/patterns/And.d.ts +7 -7
- package/dist/patterns/Cursor.d.ts +6 -4
- package/dist/patterns/CursorHistory.d.ts +2 -2
- package/dist/patterns/Literal.d.ts +7 -8
- package/dist/patterns/Not.d.ts +8 -5
- package/dist/patterns/Or.d.ts +7 -5
- package/dist/patterns/Pattern.d.ts +7 -4
- package/dist/patterns/Reference.d.ts +10 -7
- package/dist/patterns/Regex.d.ts +7 -8
- package/dist/patterns/Repeat.d.ts +7 -7
- package/package.json +1 -1
- package/src/ast/Node.test.ts +110 -0
- package/src/ast/Node.ts +71 -5
- package/src/index.ts +14 -3
- package/src/intellisense/AutoComplete.test.ts +90 -12
- package/src/intellisense/AutoComplete.ts +66 -12
- package/src/intellisense/Suggestion.ts +3 -4
- package/src/intellisense/javascript/Javascript.test.ts +56 -56
- package/src/intellisense/javascript/escapedCharacter.ts +0 -1
- package/src/intellisense/javascript/exponent.ts +0 -2
- package/src/intellisense/javascript/fraction.ts +0 -2
- package/src/patterns/And.test.ts +63 -52
- package/src/patterns/And.ts +58 -36
- package/src/patterns/Cursor.ts +17 -14
- package/src/patterns/CursorHistory.ts +8 -8
- package/src/patterns/Literal.test.ts +70 -38
- package/src/patterns/Literal.ts +31 -42
- package/src/patterns/Not.test.ts +88 -8
- package/src/patterns/Not.ts +54 -14
- package/src/patterns/Or.test.ts +117 -13
- package/src/patterns/Or.ts +36 -13
- package/src/patterns/Pattern.ts +7 -4
- package/src/patterns/Reference.test.ts +117 -28
- package/src/patterns/Reference.ts +58 -32
- package/src/patterns/Regex.test.ts +67 -35
- package/src/patterns/Regex.ts +31 -43
- package/src/patterns/Repeat.test.ts +63 -41
- package/src/patterns/Repeat.ts +51 -38
- package/src/patterns/getNextPattern.test.ts +0 -39
- package/src/patterns/getNextPattern.ts +0 -18
|
@@ -10,191 +10,191 @@ import { prefixOperator } from "./prefixOperator";
|
|
|
10
10
|
|
|
11
11
|
describe("Ecmascript 3", () => {
|
|
12
12
|
test("Escaped Character", () => {
|
|
13
|
-
let result = escapedCharacter.
|
|
13
|
+
let result = escapedCharacter.exec(`\\"`);
|
|
14
14
|
expect(result.ast?.value).toBe(`\\"`)
|
|
15
15
|
|
|
16
|
-
result = escapedCharacter.
|
|
16
|
+
result = escapedCharacter.exec(`\\'`)
|
|
17
17
|
expect(result.ast?.value).toBe(`\\'`)
|
|
18
18
|
|
|
19
|
-
result = escapedCharacter.
|
|
19
|
+
result = escapedCharacter.exec(`\\\\`)
|
|
20
20
|
expect(result.ast?.value).toBe(`\\\\`)
|
|
21
21
|
|
|
22
|
-
result = escapedCharacter.
|
|
22
|
+
result = escapedCharacter.exec(`\\/`)
|
|
23
23
|
expect(result.ast?.value).toBe(`\\/`)
|
|
24
24
|
|
|
25
|
-
result = escapedCharacter.
|
|
25
|
+
result = escapedCharacter.exec(`\\f`)
|
|
26
26
|
expect(result.ast?.value).toBe(`\\f`)
|
|
27
27
|
|
|
28
|
-
result = escapedCharacter.
|
|
28
|
+
result = escapedCharacter.exec(`\\t`)
|
|
29
29
|
expect(result.ast?.value).toBe(`\\t`)
|
|
30
30
|
|
|
31
|
-
result = escapedCharacter.
|
|
31
|
+
result = escapedCharacter.exec(`\\u00E9`)
|
|
32
32
|
expect(result.ast?.value).toBe(`\\u00E9`)
|
|
33
33
|
});
|
|
34
34
|
|
|
35
35
|
test("Exponent", () => {
|
|
36
|
-
let result = exponent.
|
|
36
|
+
let result = exponent.exec("e+1");
|
|
37
37
|
expect(result.ast?.value).toBe("e+1")
|
|
38
38
|
|
|
39
|
-
result = exponent.
|
|
39
|
+
result = exponent.exec("e-1");
|
|
40
40
|
expect(result.ast?.value).toBe("e-1")
|
|
41
41
|
|
|
42
|
-
result = exponent.
|
|
42
|
+
result = exponent.exec("E+1");
|
|
43
43
|
expect(result.ast?.value).toBe("E+1")
|
|
44
44
|
|
|
45
|
-
result = exponent.
|
|
45
|
+
result = exponent.exec("E-1");
|
|
46
46
|
expect(result.ast?.value).toBe("E-1")
|
|
47
47
|
|
|
48
|
-
result = exponent.
|
|
48
|
+
result = exponent.exec("e+11");
|
|
49
49
|
expect(result.ast?.value).toBe("e+11")
|
|
50
50
|
|
|
51
|
-
result = exponent.
|
|
51
|
+
result = exponent.exec("11");
|
|
52
52
|
expect(result.ast).toBeNull()
|
|
53
53
|
});
|
|
54
54
|
|
|
55
55
|
test("Integer", () => {
|
|
56
|
-
let result = integer.
|
|
56
|
+
let result = integer.exec("0");
|
|
57
57
|
expect(result.ast?.value).toBe("0");
|
|
58
58
|
|
|
59
|
-
result = integer.
|
|
59
|
+
result = integer.exec("1");
|
|
60
60
|
expect(result.ast?.value).toBe("1");
|
|
61
61
|
|
|
62
|
-
result = integer.
|
|
62
|
+
result = integer.exec("100");
|
|
63
63
|
expect(result.ast?.value).toBe("100");
|
|
64
64
|
|
|
65
|
-
result = integer.
|
|
65
|
+
result = integer.exec(".1");
|
|
66
66
|
expect(result.ast).toBeNull();
|
|
67
67
|
});
|
|
68
68
|
|
|
69
69
|
test("Infix Operator", () => {
|
|
70
|
-
let result = infixOperator.
|
|
70
|
+
let result = infixOperator.exec("*");
|
|
71
71
|
expect(result.ast?.value).toBe("*");
|
|
72
72
|
|
|
73
|
-
result = infixOperator.
|
|
73
|
+
result = infixOperator.exec("/");
|
|
74
74
|
expect(result.ast?.value).toBe("/");
|
|
75
75
|
|
|
76
|
-
result = infixOperator.
|
|
76
|
+
result = infixOperator.exec("%");
|
|
77
77
|
expect(result.ast?.value).toBe("%");
|
|
78
78
|
|
|
79
|
-
result = infixOperator.
|
|
79
|
+
result = infixOperator.exec("+");
|
|
80
80
|
expect(result.ast?.value).toBe("+");
|
|
81
81
|
|
|
82
|
-
result = infixOperator.
|
|
82
|
+
result = infixOperator.exec("-");
|
|
83
83
|
expect(result.ast?.value).toBe("-");
|
|
84
84
|
|
|
85
|
-
result = infixOperator.
|
|
85
|
+
result = infixOperator.exec(">=");
|
|
86
86
|
expect(result.ast?.value).toBe(">=");
|
|
87
87
|
|
|
88
|
-
result = infixOperator.
|
|
88
|
+
result = infixOperator.exec("<=");
|
|
89
89
|
expect(result.ast?.value).toBe("<=");
|
|
90
90
|
|
|
91
|
-
result = infixOperator.
|
|
91
|
+
result = infixOperator.exec(">");
|
|
92
92
|
expect(result.ast?.value).toBe(">");
|
|
93
93
|
|
|
94
|
-
result = infixOperator.
|
|
94
|
+
result = infixOperator.exec("<");
|
|
95
95
|
expect(result.ast?.value).toBe("<");
|
|
96
96
|
|
|
97
|
-
result = infixOperator.
|
|
97
|
+
result = infixOperator.exec("===");
|
|
98
98
|
expect(result.ast?.value).toBe("===");
|
|
99
99
|
|
|
100
|
-
result = infixOperator.
|
|
100
|
+
result = infixOperator.exec("!==");
|
|
101
101
|
expect(result.ast?.value).toBe("!==");
|
|
102
102
|
|
|
103
|
-
result = infixOperator.
|
|
103
|
+
result = infixOperator.exec("||");
|
|
104
104
|
expect(result.ast?.value).toBe("||");
|
|
105
105
|
|
|
106
|
-
result = infixOperator.
|
|
106
|
+
result = infixOperator.exec("&&");
|
|
107
107
|
expect(result.ast?.value).toBe("&&");
|
|
108
108
|
|
|
109
|
-
result = infixOperator.
|
|
109
|
+
result = infixOperator.exec("bad");
|
|
110
110
|
expect(result.ast).toBeNull();
|
|
111
111
|
});
|
|
112
112
|
|
|
113
113
|
|
|
114
114
|
test("Name", () => {
|
|
115
|
-
let result = name.
|
|
115
|
+
let result = name.exec("p_0");
|
|
116
116
|
expect(result.ast?.value).toBe("p_0");
|
|
117
117
|
|
|
118
|
-
result = name.
|
|
118
|
+
result = name.exec("_0");
|
|
119
119
|
expect(result.ast?.value).toBe("_0");
|
|
120
120
|
|
|
121
|
-
result = name.
|
|
121
|
+
result = name.exec("0");
|
|
122
122
|
expect(result.ast).toBeNull();
|
|
123
123
|
|
|
124
|
-
result = name.
|
|
124
|
+
result = name.exec("_");
|
|
125
125
|
expect(result.ast?.value).toBe("_");
|
|
126
126
|
});
|
|
127
127
|
|
|
128
128
|
test("Parameters", () => {
|
|
129
|
-
let result = parameters.
|
|
129
|
+
let result = parameters.exec("(param1)");
|
|
130
130
|
expect(result.ast?.value).toBe("(param1)");
|
|
131
131
|
|
|
132
|
-
result = parameters.
|
|
132
|
+
result = parameters.exec("(param1, param2)");
|
|
133
133
|
expect(result.ast?.value).toBe("(param1, param2)");
|
|
134
134
|
|
|
135
|
-
result = parameters.
|
|
135
|
+
result = parameters.exec("(param1, param2,)");
|
|
136
136
|
expect(result.ast).toBeNull();
|
|
137
137
|
});
|
|
138
138
|
|
|
139
139
|
test("Prefix Operator", () => {
|
|
140
|
-
let result = prefixOperator.
|
|
140
|
+
let result = prefixOperator.exec("typeof ");
|
|
141
141
|
expect(result.ast?.value).toBe("typeof ");
|
|
142
142
|
|
|
143
|
-
result = prefixOperator.
|
|
143
|
+
result = prefixOperator.exec("+");
|
|
144
144
|
expect(result.ast?.value).toBe("+");
|
|
145
145
|
|
|
146
|
-
result = prefixOperator.
|
|
146
|
+
result = prefixOperator.exec("-");
|
|
147
147
|
expect(result.ast?.value).toBe("-");
|
|
148
148
|
|
|
149
|
-
result = prefixOperator.
|
|
149
|
+
result = prefixOperator.exec("!");
|
|
150
150
|
expect(result.ast?.value).toBe("!");
|
|
151
151
|
|
|
152
|
-
result = prefixOperator.
|
|
152
|
+
result = prefixOperator.exec("a");
|
|
153
153
|
expect(result.ast).toBeNull();
|
|
154
154
|
});
|
|
155
155
|
|
|
156
156
|
test("Object Literal", () => {
|
|
157
|
-
let result = expression.
|
|
157
|
+
let result = expression.exec(`{}`)
|
|
158
158
|
expect(result.ast?.value).toBe("{}");
|
|
159
159
|
|
|
160
|
-
result = expression.
|
|
160
|
+
result = expression.exec(`{prop:{}}`)
|
|
161
161
|
expect(result.ast?.value).toBe("{prop:{}}");
|
|
162
162
|
|
|
163
|
-
result = expression.
|
|
163
|
+
result = expression.exec(`{prop:"value"}`)
|
|
164
164
|
expect(result.ast?.value).toBe(`{prop:"value"}`);
|
|
165
165
|
|
|
166
|
-
result = expression.
|
|
166
|
+
result = expression.exec(`{prop:0.9}`)
|
|
167
167
|
expect(result.ast?.value).toBe(`{prop:0.9}`);
|
|
168
168
|
|
|
169
|
-
result = expression.
|
|
169
|
+
result = expression.exec(`{prop:1}`)
|
|
170
170
|
expect(result.ast?.value).toBe(`{prop:1}`);
|
|
171
171
|
|
|
172
|
-
result = expression.
|
|
172
|
+
result = expression.exec(`{"prop":1}`)
|
|
173
173
|
expect(result.ast?.value).toBe(`{"prop":1}`);
|
|
174
174
|
});
|
|
175
175
|
|
|
176
176
|
test("Array Literal", () => {
|
|
177
|
-
let result = expression.
|
|
177
|
+
let result = expression.exec("[]")
|
|
178
178
|
expect(result.ast?.value).toBe("[]");
|
|
179
179
|
|
|
180
|
-
result = expression.
|
|
180
|
+
result = expression.exec("[{}, 9, 0.9e-10, [1, 2]]")
|
|
181
181
|
expect(result.ast?.value).toBe("[{}, 9, 0.9e-10, [1, 2]]");
|
|
182
182
|
});
|
|
183
183
|
|
|
184
184
|
test("Expression Statement", () => {
|
|
185
|
-
let result = expressionStatement.
|
|
185
|
+
let result = expressionStatement.exec(`name = "John"`);
|
|
186
186
|
expect(result.ast?.value).toBe(`name = "John"`);
|
|
187
187
|
|
|
188
|
-
result = expressionStatement.
|
|
188
|
+
result = expressionStatement.exec(`name = othername = "John"`)
|
|
189
189
|
expect(result.ast?.value).toBe(`name = othername = "John"`);
|
|
190
190
|
|
|
191
|
-
result = expressionStatement.
|
|
191
|
+
result = expressionStatement.exec(`name = othername.prop = "John"`)
|
|
192
192
|
expect(result.ast?.value).toBe(`name = othername.prop = "John"`);
|
|
193
193
|
|
|
194
|
-
result = expressionStatement.
|
|
194
|
+
result = expressionStatement.exec(`name = othername.prop += 2`)
|
|
195
195
|
expect(result.ast?.value).toBe(`name = othername.prop += 2`);
|
|
196
196
|
|
|
197
|
-
result = expressionStatement.
|
|
197
|
+
result = expressionStatement.exec(`name.prop().method(blah) = blah.prop()`)
|
|
198
198
|
expect(result.ast?.value).toBe(`name.prop().method(blah) = blah.prop()`);
|
|
199
199
|
|
|
200
200
|
});
|
package/src/patterns/And.test.ts
CHANGED
|
@@ -77,7 +77,7 @@ describe("And", () => {
|
|
|
77
77
|
const sequence = new And("sequence", [
|
|
78
78
|
new Literal("a", "A"),
|
|
79
79
|
new Literal("b", "B", true)
|
|
80
|
-
]
|
|
80
|
+
]);
|
|
81
81
|
const cursor = new Cursor("AD");
|
|
82
82
|
const result = sequence.parse(cursor);
|
|
83
83
|
const expected = new Node("and", "sequence", 0, 0, [
|
|
@@ -93,7 +93,7 @@ describe("And", () => {
|
|
|
93
93
|
const sequence = new And("sequence", [
|
|
94
94
|
new Literal("a", "A"),
|
|
95
95
|
new Literal("b", "B", true)
|
|
96
|
-
]
|
|
96
|
+
]);
|
|
97
97
|
const cursor = new Cursor("A");
|
|
98
98
|
const result = sequence.parse(cursor);
|
|
99
99
|
const expected = new Node("and", "sequence", 0, 0, [
|
|
@@ -105,7 +105,7 @@ describe("And", () => {
|
|
|
105
105
|
expect(cursor.index).toBe(0);
|
|
106
106
|
});
|
|
107
107
|
|
|
108
|
-
test("Incomplete Parse", () => {
|
|
108
|
+
test("Incomplete Parse (Optional)", () => {
|
|
109
109
|
const sequence = new And("sequence", [
|
|
110
110
|
new Literal("a", "A"),
|
|
111
111
|
new Literal("b", "B")
|
|
@@ -175,6 +175,32 @@ describe("And", () => {
|
|
|
175
175
|
expect(sequence.children[0].name).toBe("a");
|
|
176
176
|
});
|
|
177
177
|
|
|
178
|
+
test("Exec", () => {
|
|
179
|
+
const sequence = new And("sequence", [new Literal("a", "A")]);
|
|
180
|
+
|
|
181
|
+
const { ast: result, cursor } = sequence.exec("A");
|
|
182
|
+
const expected = new Node("and", "sequence", 0, 0, [
|
|
183
|
+
new Node("literal", "a", 0, 0, undefined, "A")
|
|
184
|
+
]);
|
|
185
|
+
|
|
186
|
+
expect(result).toEqual(expected)
|
|
187
|
+
expect(cursor).not.toBeNull();
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test("Test With Match", () => {
|
|
191
|
+
const sequence = new And("sequence", [new Literal("a", "A")]);
|
|
192
|
+
const hasMatch = sequence.test("A");
|
|
193
|
+
|
|
194
|
+
expect(hasMatch).toBeTruthy();
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
test("Test With No Match", () => {
|
|
198
|
+
const sequence = new And("sequence", [new Literal("a", "A")]);
|
|
199
|
+
const hasMatch = sequence.test("B");
|
|
200
|
+
|
|
201
|
+
expect(hasMatch).toBeFalsy();
|
|
202
|
+
});
|
|
203
|
+
|
|
178
204
|
test("Set Parent", () => {
|
|
179
205
|
const a = new Literal("a", "A", true)
|
|
180
206
|
const sequence = new And("sequence", [
|
|
@@ -186,33 +212,6 @@ describe("And", () => {
|
|
|
186
212
|
expect(parent.children[0].type).toBe("and");
|
|
187
213
|
});
|
|
188
214
|
|
|
189
|
-
test("Reduce Ast", () => {
|
|
190
|
-
const sequence = new And("sequence", [
|
|
191
|
-
new Literal("a", "A"),
|
|
192
|
-
], true);
|
|
193
|
-
sequence.enableAstReduction();
|
|
194
|
-
|
|
195
|
-
const cursor = new Cursor("A");
|
|
196
|
-
let result = sequence.parse(cursor);
|
|
197
|
-
let expected = new Node("and", "sequence", 0, 0, [], "A");
|
|
198
|
-
|
|
199
|
-
expect(result).toEqual(expected);
|
|
200
|
-
expect(cursor.error).toBe(null)
|
|
201
|
-
expect(cursor.index).toBe(0);
|
|
202
|
-
|
|
203
|
-
sequence.disableAstReduction()
|
|
204
|
-
|
|
205
|
-
cursor.moveTo(0)
|
|
206
|
-
result = sequence.parse(cursor);
|
|
207
|
-
expected = new Node("and", "sequence", 0, 0, [
|
|
208
|
-
new Node("literal", "a", 0, 0, [], "A"),
|
|
209
|
-
]);
|
|
210
|
-
|
|
211
|
-
expect(result).toEqual(expected);
|
|
212
|
-
expect(cursor.error).toBe(null)
|
|
213
|
-
expect(cursor.index).toBe(0);
|
|
214
|
-
});
|
|
215
|
-
|
|
216
215
|
test("Get Tokens", () => {
|
|
217
216
|
const sequence = new And("sequence", [
|
|
218
217
|
new Literal("a", "A", true),
|
|
@@ -224,76 +223,88 @@ describe("And", () => {
|
|
|
224
223
|
expect(tokens).toEqual(expected);
|
|
225
224
|
});
|
|
226
225
|
|
|
227
|
-
test("Get
|
|
226
|
+
test("Get Tokens After", () => {
|
|
228
227
|
const sequence = new And("sequence", [
|
|
229
228
|
new Literal("a", "A"),
|
|
230
229
|
new Literal("b", "B", true),
|
|
231
230
|
new Literal("c", "C"),
|
|
232
231
|
], true);
|
|
233
232
|
|
|
234
|
-
const tokens = sequence.
|
|
233
|
+
const tokens = sequence.getTokensAfter(sequence.children[0])
|
|
235
234
|
const expected = ["B", "C"];
|
|
236
235
|
|
|
237
236
|
expect(tokens).toEqual(expected);
|
|
238
237
|
});
|
|
239
238
|
|
|
240
|
-
test("Get
|
|
239
|
+
test("Get Tokens After With Invalid Pattern", () => {
|
|
241
240
|
const sequence = new And("sequence", [
|
|
242
241
|
new Literal("a", "A"),
|
|
243
242
|
new Literal("b", "B", true),
|
|
244
243
|
new Literal("c", "C"),
|
|
245
244
|
], true);
|
|
246
245
|
|
|
247
|
-
const tokens = sequence.
|
|
246
|
+
const tokens = sequence.getTokensAfter(new Literal("not-child", "not-child"))
|
|
248
247
|
|
|
249
248
|
expect(tokens).toEqual([]);
|
|
250
249
|
});
|
|
251
250
|
|
|
252
|
-
test("Get
|
|
251
|
+
test("Get Tokens After With Last Child", () => {
|
|
253
252
|
const sequence = new And("sequence", [
|
|
254
253
|
new Literal("a", "A"),
|
|
255
254
|
], true);
|
|
256
255
|
const parent = new And("parent", [sequence, new Literal("b", "B")]);
|
|
257
256
|
|
|
258
257
|
|
|
259
|
-
const tokens = parent.children[0].
|
|
258
|
+
const tokens = parent.children[0].getTokensAfter(parent.children[0].children[0])
|
|
260
259
|
|
|
261
260
|
expect(tokens).toEqual(["B"]);
|
|
262
261
|
});
|
|
263
262
|
|
|
264
|
-
test("Get
|
|
263
|
+
test("Get Tokens After With Last Optional Child", () => {
|
|
265
264
|
const sequence = new And("sequence", [
|
|
266
265
|
new Literal("a", "A"),
|
|
267
266
|
new Literal("b", "B", true),
|
|
268
267
|
], true);
|
|
269
268
|
const parent = new And("parent", [sequence, new Literal("c", "C")]);
|
|
270
269
|
|
|
271
|
-
|
|
272
|
-
const tokens = parent.children[0].getNextTokens(parent.children[0].children[0])
|
|
270
|
+
const tokens = parent.children[0].getTokensAfter(parent.children[0].children[0])
|
|
273
271
|
|
|
274
272
|
expect(tokens).toEqual(["B", "C"]);
|
|
275
273
|
});
|
|
276
274
|
|
|
277
|
-
test("
|
|
275
|
+
test("Get Next Tokens", () => {
|
|
278
276
|
const sequence = new And("sequence", [new Literal("a", "A")]);
|
|
279
|
-
sequence
|
|
277
|
+
const parent = new And("parent", [sequence, new Literal("b", "B")]);
|
|
280
278
|
|
|
281
|
-
const
|
|
282
|
-
const
|
|
279
|
+
const sequenceClone = parent.findPattern(p => p.name === "sequence");
|
|
280
|
+
const tokens = sequenceClone?.getNextTokens() || [];
|
|
283
281
|
|
|
284
|
-
expect(
|
|
282
|
+
expect(tokens[0]).toBe("B");
|
|
285
283
|
});
|
|
286
284
|
|
|
287
|
-
test("Get Next
|
|
288
|
-
const sequence = new And("sequence", [
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
285
|
+
test("Get Next Tokens With Null Parent", () => {
|
|
286
|
+
const sequence = new And("sequence", [new Literal("a", "A")]);
|
|
287
|
+
const tokens = sequence.getNextTokens();
|
|
288
|
+
|
|
289
|
+
expect(tokens.length).toBe(0);
|
|
290
|
+
});
|
|
293
291
|
|
|
292
|
+
test("Get Next Patterns", () => {
|
|
293
|
+
const sequence = new And("sequence", [new Literal("a", "A")]);
|
|
294
|
+
const parent = new And("parent", [sequence, new Literal("b", "B")]);
|
|
294
295
|
|
|
295
|
-
const
|
|
296
|
+
const sequenceClone = parent.findPattern(p => p.name === "sequence");
|
|
297
|
+
const nextPatterns = sequenceClone?.getNextPatterns() || [];
|
|
298
|
+
const b = parent.findPattern(p => p.name === "b")
|
|
296
299
|
|
|
297
|
-
expect(
|
|
300
|
+
expect(nextPatterns[0]).toBe(b);
|
|
298
301
|
});
|
|
302
|
+
|
|
303
|
+
test("Get Next Patterns With Null Parent", () => {
|
|
304
|
+
const sequence = new And("sequence", [new Literal("a", "A")]);
|
|
305
|
+
const nextPatterns = sequence.getNextPatterns()
|
|
306
|
+
|
|
307
|
+
expect(nextPatterns.length).toBe(0);
|
|
308
|
+
});
|
|
309
|
+
|
|
299
310
|
});
|