clarity-pattern-parser 4.0.3 → 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.
Files changed (133) hide show
  1. package/README.md +466 -1
  2. package/TODO.md +76 -2
  3. package/dist/ast/Node.d.ts +49 -11
  4. package/dist/ast/Visitor.d.ts +31 -31
  5. package/dist/index.browser.js +1513 -1495
  6. package/dist/index.browser.js.map +1 -1
  7. package/dist/index.d.ts +17 -17
  8. package/dist/index.esm.js +1480 -1459
  9. package/dist/index.esm.js.map +1 -1
  10. package/dist/index.js +1481 -1463
  11. package/dist/index.js.map +1 -1
  12. package/dist/intellisense/AutoComplete.d.ts +28 -0
  13. package/dist/intellisense/Suggestion.d.ts +11 -0
  14. package/dist/intellisense/SuggestionOption.d.ts +4 -0
  15. package/dist/patterns/And.d.ts +37 -24
  16. package/dist/patterns/Cursor.d.ts +37 -0
  17. package/dist/patterns/CursorHistory.d.ts +30 -0
  18. package/dist/patterns/Literal.d.ts +35 -19
  19. package/dist/patterns/Not.d.ts +29 -11
  20. package/dist/patterns/Or.d.ts +33 -22
  21. package/dist/patterns/ParseError.d.ts +6 -8
  22. package/dist/patterns/ParseResult.d.ts +6 -0
  23. package/dist/patterns/Pattern.d.ts +20 -26
  24. package/dist/patterns/Reference.d.ts +34 -12
  25. package/dist/patterns/Regex.d.ts +41 -21
  26. package/dist/patterns/Repeat.d.ts +38 -20
  27. package/dist/patterns/clonePatterns.d.ts +2 -0
  28. package/dist/patterns/filterOutNull.d.ts +2 -0
  29. package/dist/patterns/findPattern.d.ts +2 -0
  30. package/dist/patterns/getNextPattern.d.ts +2 -0
  31. package/jest.config.js +2 -1
  32. package/package.json +4 -5
  33. package/rollup.config.js +1 -1
  34. package/src/ast/Node.test.ts +364 -0
  35. package/src/ast/Node.ts +237 -23
  36. package/src/index.ts +25 -27
  37. package/src/intellisense/AutoComplete.test.ts +150 -0
  38. package/src/intellisense/AutoComplete.ts +200 -0
  39. package/src/intellisense/Suggestion.ts +12 -0
  40. package/src/intellisense/SuggestionOption.ts +4 -0
  41. package/src/{tests/cssPatterns → intellisense/css}/cssValue.ts +1 -1
  42. package/src/{tests/cssPatterns → intellisense/css}/divider.ts +2 -1
  43. package/src/intellisense/css/hex.ts +6 -0
  44. package/src/{tests/cssPatterns → intellisense/css}/method.ts +8 -9
  45. package/src/intellisense/css/name.ts +5 -0
  46. package/src/{tests/javascriptPatterns → intellisense/css}/number.ts +3 -3
  47. package/src/intellisense/css/spaces.ts +6 -0
  48. package/src/intellisense/css/unit.ts +10 -0
  49. package/src/{tests/cssPatterns → intellisense/css}/value.ts +1 -1
  50. package/src/{tests/cssPatterns → intellisense/css}/values.ts +1 -1
  51. package/src/intellisense/javascript/Javascript.test.ts +203 -0
  52. package/src/intellisense/javascript/arrayLiteral.ts +25 -0
  53. package/src/intellisense/javascript/deleteStatement.ts +14 -0
  54. package/src/intellisense/javascript/escapedCharacter.ts +49 -0
  55. package/src/intellisense/javascript/exponent.ts +24 -0
  56. package/src/intellisense/javascript/expression.ts +87 -0
  57. package/src/intellisense/javascript/expressionStatement.ts +29 -0
  58. package/src/intellisense/javascript/fraction.ts +11 -0
  59. package/src/intellisense/javascript/infixOperator.ts +36 -0
  60. package/src/intellisense/javascript/integer.ts +7 -0
  61. package/src/intellisense/javascript/invocation.ts +28 -0
  62. package/src/intellisense/javascript/literal.ts +14 -0
  63. package/src/intellisense/javascript/name.ts +3 -0
  64. package/src/intellisense/javascript/numberLiteral.ts +10 -0
  65. package/src/intellisense/javascript/objectLiteral.ts +30 -0
  66. package/src/intellisense/javascript/optionalSpaces.ts +3 -0
  67. package/src/intellisense/javascript/parameters.ts +20 -0
  68. package/src/intellisense/javascript/prefixOperator.ts +13 -0
  69. package/src/intellisense/javascript/propertyAccess.ts +23 -0
  70. package/src/intellisense/javascript/stringLiteral.ts +28 -0
  71. package/src/patterns/And.test.ts +310 -0
  72. package/src/patterns/And.ts +244 -119
  73. package/src/patterns/Cursor.test.ts +93 -0
  74. package/src/patterns/Cursor.ts +133 -0
  75. package/src/patterns/CursorHistory.test.ts +54 -0
  76. package/src/patterns/CursorHistory.ts +95 -0
  77. package/src/patterns/Literal.test.ts +166 -0
  78. package/src/patterns/Literal.ts +141 -62
  79. package/src/patterns/Not.test.ts +168 -0
  80. package/src/patterns/Not.ts +113 -32
  81. package/src/patterns/Or.test.ts +209 -0
  82. package/src/patterns/Or.ts +128 -97
  83. package/src/patterns/ParseError.ts +3 -7
  84. package/src/patterns/ParseResult.ts +7 -0
  85. package/src/patterns/Pattern.ts +21 -150
  86. package/src/patterns/Reference.test.ts +193 -0
  87. package/src/patterns/Reference.ts +114 -88
  88. package/src/patterns/Regex.test.ts +133 -0
  89. package/src/patterns/Regex.ts +117 -60
  90. package/src/patterns/Repeat.test.ts +218 -0
  91. package/src/patterns/Repeat.ts +220 -103
  92. package/src/patterns/clonePatterns.ts +5 -0
  93. package/src/patterns/filterOutNull.ts +13 -0
  94. package/src/patterns/findPattern.ts +25 -0
  95. package/src/Cursor.ts +0 -141
  96. package/src/CursorHistory.ts +0 -146
  97. package/src/TextSuggester.ts +0 -317
  98. package/src/ast/Visitor.ts +0 -271
  99. package/src/patterns/LookAhead.ts +0 -32
  100. package/src/patterns/Recursive.ts +0 -92
  101. package/src/tests/And.test.ts +0 -180
  102. package/src/tests/ComplexExamples.test.ts +0 -86
  103. package/src/tests/CssPatterns.test.ts +0 -90
  104. package/src/tests/CursorHistory.test.ts +0 -107
  105. package/src/tests/Cusor.test.ts +0 -174
  106. package/src/tests/HtmlPatterns.test.ts +0 -34
  107. package/src/tests/Literal.test.ts +0 -79
  108. package/src/tests/LookAhead.test.ts +0 -44
  109. package/src/tests/Not.test.ts +0 -51
  110. package/src/tests/Or.test.ts +0 -113
  111. package/src/tests/Pattern.test.ts +0 -290
  112. package/src/tests/Recursive.test.ts +0 -64
  113. package/src/tests/Reference.test.ts +0 -16
  114. package/src/tests/Repeat.test.ts +0 -75
  115. package/src/tests/SpeedTest.test.ts +0 -31
  116. package/src/tests/TextSuggester.test.ts +0 -297
  117. package/src/tests/Visitor.test.ts +0 -331
  118. package/src/tests/cssPatterns/hex.ts +0 -5
  119. package/src/tests/cssPatterns/name.ts +0 -5
  120. package/src/tests/cssPatterns/number.ts +0 -8
  121. package/src/tests/cssPatterns/spaces.ts +0 -5
  122. package/src/tests/cssPatterns/unit.ts +0 -8
  123. package/src/tests/htmlPatterns/element.ts +0 -49
  124. package/src/tests/javascriptPatterns/boolean.ts +0 -10
  125. package/src/tests/javascriptPatterns/json.ts +0 -67
  126. package/src/tests/javascriptPatterns/name.ts +0 -5
  127. package/src/tests/javascriptPatterns/objectLiteral.ts +0 -40
  128. package/src/tests/javascriptPatterns/string.ts +0 -84
  129. package/src/tests/javascriptPatterns/unit.ts +0 -8
  130. package/src/tests/javascriptPatterns/whitespace.ts +0 -44
  131. package/src/tests/naturalLanguage/filter.ts +0 -37
  132. package/src/tests/patterns/sentence.ts +0 -37
  133. /package/src/{tests/cssPatterns → intellisense/css}/optionalSpaces.ts +0 -0
@@ -1,290 +0,0 @@
1
- /** @jest-environment node */
2
- import And from "../patterns/And";
3
- import Or from "../patterns/Or";
4
- import Literal from "../patterns/Literal";
5
- import Repeat from "../patterns/Repeat";
6
-
7
- describe("Pattern", () => {
8
- test("set parent.", () => {
9
- const parent = new Literal("pattern-type", "pattern");
10
- const child = new Literal("pattern-type", "pattern");
11
-
12
- child.parent = parent;
13
- });
14
-
15
- test("getTokens", () => {
16
- const firstName = new Literal("first-name", "John");
17
- const lastName = new Literal("last-name", "Doe");
18
- const fullName = new And("full-name", [firstName, lastName]);
19
-
20
- let tokens = firstName.getTokens();
21
- expect(tokens.length).toBe(1);
22
- expect(tokens[0]).toBe("John");
23
-
24
- tokens = lastName.getTokens();
25
- expect(tokens.length).toBe(1);
26
- expect(tokens[0]).toBe("Doe");
27
-
28
- tokens = fullName.getTokens();
29
- expect(tokens.length).toBe(1);
30
- expect(tokens[0]).toBe("John");
31
- });
32
-
33
- test("getNextToken one deep.", () => {
34
- const firstName = new Literal("first-name", "John");
35
- const lastName = new Literal("last-name", "Doe");
36
- const fullName = new And("full-name", [firstName, lastName]);
37
-
38
- const tokens = fullName.children[0].getNextTokens();
39
- expect(tokens.length).toBe(1);
40
- expect(tokens[0]).toBe("Doe");
41
- });
42
-
43
- test("getNextToken two deep.", () => {
44
- const firstName = new Literal("first-name", "John");
45
- const lastName = new Literal("last-name", "Doe");
46
- const otherLastName = new Literal("other-last-name", "Smith");
47
- const lastNames = new Or("last-names", [lastName, otherLastName]);
48
- const fullName = new And("full-name", [firstName, lastNames]);
49
-
50
- const tokens = fullName.children[0].getNextTokens();
51
- expect(tokens.length).toBe(2);
52
- expect(tokens[0]).toBe("Doe");
53
- expect(tokens[1]).toBe("Smith");
54
- });
55
-
56
- test("getNextToken three deep.", () => {
57
- const firstName = new Literal("first-name", "John");
58
- const lastName = new Literal("last-name", "Doe");
59
- const middleName = new Literal("middle-name", "Moses");
60
- const otherMiddleName = new Literal("other-middle-name", "Joshua");
61
- const middleNames = new Or("middle-names", [middleName, otherMiddleName]);
62
- const otherLastName = new Literal("other-last-name", "Smith");
63
- const lastNames = new Or("last-names", [lastName, otherLastName]);
64
- const fullName = new And("full-name", [firstName, middleNames, lastNames]);
65
-
66
- const tokens = fullName.children[1].children[1].getNextTokens();
67
- expect(tokens.length).toBe(2);
68
- expect(tokens[0]).toBe("Doe");
69
- expect(tokens[1]).toBe("Smith");
70
- });
71
-
72
- test("getNextToken end of patterns.", () => {
73
- const firstName = new Literal("first-name", "John");
74
- const lastName = new Literal("last-name", "Doe");
75
- const middleName = new Literal("middle-name", "Moses");
76
- const otherMiddleName = new Literal("other-middle-name", "Joshua");
77
- const middleNames = new Or("middle-names", [middleName, otherMiddleName]);
78
- const otherLastName = new Literal("other-last-name", "Smith");
79
- const lastNames = new Or("last-names", [lastName, otherLastName]);
80
- const fullName = new And("full-name", [firstName, middleNames, lastNames]);
81
-
82
- const tokens = fullName.children[2].children[1].getNextTokens();
83
- expect(tokens.length).toBe(0);
84
- });
85
-
86
- test("getNextToken end of patterns.", () => {
87
- const firstName = new Literal("first-name", "John");
88
- const lastName = new Literal("last-name", "Doe");
89
- const moses = new Literal("moses", "Moses");
90
- const joshua = new Literal("other-middle-name", "Joshua");
91
- const moreLastNames = new Or("more-last-names", [moses, joshua]);
92
- const otherLastName = new Literal("other-last-name", "Smith");
93
- const lastNames = new Or("last-names", [
94
- moreLastNames,
95
- lastName,
96
- otherLastName,
97
- ]);
98
- const fullName = new And("full-name", [firstName, lastNames]);
99
-
100
- const tokens = fullName.children[0].getNextTokens();
101
- expect(tokens.length).toBe(4);
102
- expect(tokens[0]).toBe("Moses");
103
- expect(tokens[1]).toBe("Joshua");
104
- expect(tokens[2]).toBe("Doe");
105
- expect(tokens[3]).toBe("Smith");
106
- });
107
-
108
- test("getNextTokens, with repeat.", () => {
109
- const firstName = new Literal("first-name", "John");
110
- const edward = new Literal("edward", "Edward");
111
- const middleName = new Repeat("middle-names", edward);
112
- const lastName = new Literal("lastName", "Doe");
113
- const fullName = new And("full-name", [firstName, middleName, lastName]);
114
-
115
- let tokens = fullName.children[0].getNextTokens();
116
- expect(tokens.length).toBe(1);
117
- expect(tokens[0]).toBe("Edward");
118
-
119
- tokens = fullName.children[1].children[0].getNextTokens();
120
- expect(tokens.length).toBe(2);
121
- expect(tokens[0]).toBe("Edward");
122
- expect(tokens[1]).toBe("Doe");
123
- });
124
-
125
- test("getNextTokens, with repeat and divider.", () => {
126
- const firstName = new Literal("first-name", "John");
127
- const edward = new Literal("edward", "Edward");
128
- const stewart = new Literal("stewart", "Stewart");
129
- const middleName = new Repeat("middle-names", edward, stewart);
130
- const lastName = new Literal("lastName", "Doe");
131
- const fullName = new And("full-name", [firstName, middleName, lastName]);
132
-
133
- let tokens = fullName.children[0].getNextTokens();
134
- expect(tokens.length).toBe(1);
135
- expect(tokens[0]).toBe("Edward");
136
-
137
- tokens = fullName.children[1].children[0].getNextTokens();
138
- expect(tokens.length).toBe(2);
139
- expect(tokens[0]).toBe("Stewart");
140
- expect(tokens[1]).toBe("Doe");
141
-
142
- tokens = fullName.children[1].children[1].getNextTokens();
143
- expect(tokens.length).toBe(1);
144
- expect(tokens[0]).toBe("Edward");
145
- });
146
-
147
- test("getNextTokens, has child and at the beginning.", () => {
148
- const firstName = new Literal("first-name", "John");
149
- const edward = new Literal("edward", "Edward");
150
- const stewart = new Literal("stewart", "Stewart");
151
- const middleName = new Repeat("middle-names", edward, stewart);
152
- const lastName = new Literal("lastName", "Doe");
153
- const fullName = new And("full-name", [firstName, middleName, lastName]);
154
-
155
- let tokens = fullName.getTokens();
156
- expect(tokens.length).toBe(1);
157
- expect(tokens[0]).toBe("John");
158
- });
159
-
160
- test("getNextTokens, has no child and is at the beginning.", () => {
161
- const firstName = new Literal("first-name", "John");
162
-
163
- let tokens = firstName.getTokens();
164
- expect(tokens.length).toBe(1);
165
- expect(tokens[0]).toBe("John");
166
- });
167
-
168
- test("getNextTokens, and with optional start.", () => {
169
- const firstName = new Literal("first-name", "John", true);
170
- const middleName = new Literal("middle-name", "Edward");
171
- const lastName = new Literal("last-name", "Doe");
172
- const fullName = new And("full-name", [firstName, middleName, lastName]);
173
-
174
- let tokens = fullName.getTokens();
175
- expect(tokens.length).toBe(2);
176
- expect(tokens[0]).toBe("John");
177
- expect(tokens[1]).toBe("Edward");
178
- });
179
-
180
- test("getNextTokens, and with optional middle.", () => {
181
- const firstName = new Literal("first-name", "John");
182
- const middleName = new Literal("middle-name", "Edward", true);
183
- const lastName = new Literal("last-name", "Doe");
184
- const fullName = new And("full-name", [firstName, middleName, lastName]);
185
-
186
- let tokens = fullName.children[0].getNextTokens();
187
- expect(tokens.length).toBe(2);
188
- expect(tokens[0]).toBe("Edward");
189
- expect(tokens[1]).toBe("Doe");
190
-
191
- tokens = fullName.children[1].getNextTokens();
192
- expect(tokens.length).toBe(1);
193
- expect(tokens[0]).toBe("Doe");
194
-
195
- tokens = fullName.children[2].getNextTokens();
196
- expect(tokens.length).toBe(0);
197
- });
198
-
199
- test("getNextTokens, and with optional last.", () => {
200
- const firstName = new Literal("first-name", "John");
201
- const middleName = new Literal("middle-name", "Edward");
202
- const lastName = new Literal("last-name", "Doe", true);
203
- const fullName = new And("full-name", [firstName, middleName, lastName]);
204
-
205
- let tokens = fullName.children[0].getNextTokens();
206
- expect(tokens.length).toBe(1);
207
- expect(tokens[0]).toBe("Edward");
208
-
209
- tokens = fullName.children[1].getNextTokens();
210
- expect(tokens.length).toBe(1);
211
- expect(tokens[0]).toBe("Doe");
212
-
213
- tokens = fullName.children[2].getNextTokens();
214
- expect(tokens.length).toBe(0);
215
- });
216
-
217
- test("getNextTokens, first two optional.", () => {
218
- const firstName = new Literal("first-name", "John", true);
219
- const middleName = new Literal("middle-name", "Edward", true);
220
- const lastName = new Literal("last-name", "Doe");
221
- const fullName = new And("full-name", [firstName, middleName, lastName]);
222
-
223
- let tokens = fullName.getTokens();
224
- expect(tokens.length).toBe(3);
225
- expect(tokens[0]).toBe("John");
226
- expect(tokens[1]).toBe("Edward");
227
- expect(tokens[2]).toBe("Doe");
228
-
229
- tokens = fullName.children[0].getNextTokens();
230
- expect(tokens.length).toBe(2);
231
- expect(tokens[0]).toBe("Edward");
232
- expect(tokens[1]).toBe("Doe");
233
-
234
- tokens = fullName.children[1].getNextTokens();
235
- expect(tokens.length).toBe(1);
236
- expect(tokens[0]).toBe("Doe");
237
-
238
- tokens = fullName.children[2].getNextTokens();
239
- expect(tokens.length).toBe(0);
240
- });
241
-
242
- test("getNextTokens, last two optional.", () => {
243
- const firstName = new Literal("first-name", "John");
244
- const middleName = new Literal("middle-name", "Edward", true);
245
- const lastName = new Literal("last-name", "Doe", true);
246
- const fullName = new And("full-name", [firstName, middleName, lastName]);
247
-
248
- let tokens = fullName.getTokens();
249
- expect(tokens.length).toBe(1);
250
- expect(tokens[0]).toBe("John");
251
-
252
- tokens = fullName.children[0].getNextTokens();
253
- expect(tokens.length).toBe(2);
254
- expect(tokens[0]).toBe("Edward");
255
- expect(tokens[1]).toBe("Doe");
256
-
257
- tokens = fullName.children[1].getNextTokens();
258
- expect(tokens.length).toBe(1);
259
- expect(tokens[0]).toBe("Doe");
260
-
261
- tokens = fullName.children[2].getNextTokens();
262
- expect(tokens.length).toBe(0);
263
- });
264
-
265
- test("getNextTokens, all three optional.", () => {
266
- const firstName = new Literal("first-name", "John", true);
267
- const middleName = new Literal("middle-name", "Edward", true);
268
- const lastName = new Literal("last-name", "Doe", true);
269
-
270
- const fullName = new And("full-name", [firstName, middleName, lastName]);
271
-
272
- let tokens = fullName.getTokens();
273
- expect(tokens.length).toBe(3);
274
- expect(tokens[0]).toBe("John");
275
- expect(tokens[1]).toBe("Edward");
276
- expect(tokens[2]).toBe("Doe");
277
-
278
- tokens = fullName.children[0].getNextTokens();
279
- expect(tokens.length).toBe(2);
280
- expect(tokens[0]).toBe("Edward");
281
- expect(tokens[1]).toBe("Doe");
282
-
283
- tokens = fullName.children[1].getNextTokens();
284
- expect(tokens.length).toBe(1);
285
- expect(tokens[0]).toBe("Doe");
286
-
287
- tokens = fullName.children[2].getNextTokens();
288
- expect(tokens.length).toBe(0);
289
- });
290
- });
@@ -1,64 +0,0 @@
1
- /** @jest-environment node */
2
- import { Recursive, Cursor } from "../index";
3
- import literals from "./javascriptPatterns/json";
4
-
5
- describe("RecursivePattern", () => {
6
- test("JSON", () => {
7
- const json = JSON.stringify({
8
- string: "This is a string.",
9
- number: 1,
10
- boolean: true,
11
- json: {
12
- string: "This is a nested string.",
13
- },
14
- null: null,
15
- array: [1, "Blah", { prop1: true }],
16
- });
17
-
18
- const cursor = new Cursor(json);
19
- const cursor2 = new Cursor(JSON.stringify([{ foo: "bar" }]));
20
-
21
- const result1 = literals.parse(cursor);
22
- const result2 = literals.parse(cursor2);
23
-
24
- expect(result1?.name).toBe("literals");
25
- expect(result1?.children[0].name).toBe("object-literal");
26
- expect(result2?.name).toBe("literals");
27
- expect(result2?.children[0].name).toBe("array-literal");
28
- expect(result1?.toString()).toBe(json);
29
- });
30
-
31
- test("No pattern", () => {
32
- const node = new Recursive("nothing");
33
- const result = node.exec("Some string.");
34
-
35
- expect(result).toBe(null);
36
- });
37
-
38
- test("clone.", () => {
39
- const node = new Recursive("nothing");
40
- const clone = node.clone();
41
-
42
- expect(node.name).toBe(clone.name);
43
-
44
- const otherClone = node.clone("nothing2");
45
-
46
- expect(otherClone.name).toBe("nothing2");
47
- });
48
-
49
- test("getNextTokens.", () => {
50
- let tokens = literals.getTokens();
51
-
52
- tokens = literals.children[0].getNextTokens();
53
-
54
- tokens = literals.children[4].getTokens();
55
- tokens = literals.children[4].children[1].getNextTokens();
56
- tokens = literals.children[4].children[2].getNextTokens();
57
-
58
- tokens = literals.children[4].children[2].children[0].children[0].children[0].children[0].getTokens();
59
- tokens = literals.children[4].children[2].children[0].children[0].getNextTokens();
60
-
61
- tokens = literals.children[4].children[3].getNextTokens();
62
- });
63
-
64
- });
@@ -1,16 +0,0 @@
1
- import { Cursor, Reference, And, Literal, Or } from "../index";
2
-
3
- describe("ReferencePattern", () => {
4
- test("Reference to node in different branch.", () => {
5
- const a = new Literal("a", "a");
6
- const b = new Literal("b", "b");
7
- const a_b_c = new And("a-and-b-and-c", [a, b, new Reference("c")]);
8
- const c = new Literal("c", "c");
9
- const b_c = new And("b-and-c", [b, c]);
10
- const main = new Or("main", [a_b_c, b_c]);
11
-
12
- const result = main.parse(new Cursor("abc"));
13
-
14
- expect(result).not.toBeNull();
15
- });
16
- });
@@ -1,75 +0,0 @@
1
- /** @jest-environment node */
2
- import {Repeat, Cursor, Literal} from "../index";
3
-
4
- describe("Repeat", function () {
5
-
6
- test("No Match", () => {
7
- const john = new Literal("john", "John");
8
- const johns = new Repeat("johns", john);
9
- const cursor = new Cursor("JaneJane");
10
-
11
- johns.parse(cursor);
12
- expect(cursor.hasUnresolvedError()).toBe(true);
13
- });
14
-
15
- test("Success, one John", () => {
16
- const john = new Literal("john", "John");
17
- const johns = new Repeat("johns", john);
18
- const cursor = new Cursor("John");
19
- const node = johns.parse(cursor);
20
-
21
- expect(node?.name).toBe("johns");
22
- expect(node?.value).toBe("John");
23
- expect(node?.startIndex).toBe(0);
24
- expect(node?.endIndex).toBe(3);
25
- });
26
-
27
- test("Success with a terminating match.", () => {
28
- const john = new Literal("john", "John");
29
- const johns = new Repeat("johns", john);
30
- const cursor = new Cursor("JohnJohnJane");
31
- const node = johns.parse(cursor);
32
-
33
- expect(node?.name).toBe("johns");
34
- expect(node?.value).toBe("JohnJohn");
35
- expect(node?.startIndex).toBe(0);
36
- expect(node?.endIndex).toBe(7);
37
- expect(cursor.getIndex()).toBe(7);
38
- });
39
-
40
- test("Bad cursor.", () => {
41
- const john = new Literal("john", "John");
42
- const johns = new Repeat("johns", john);
43
-
44
- expect(() => {
45
- (johns as any).parse("");
46
- }).toThrow();
47
- });
48
-
49
- test("Clone.", () => {
50
- const john = new Literal("john", "John");
51
- const johns = new Repeat("johns", john);
52
- const clone = johns.clone();
53
-
54
- expect(johns.name).toBe(clone.name);
55
- });
56
-
57
- test("Try Optional.", () => {
58
- const john = new Literal("john", "John", true);
59
-
60
- expect(() => {
61
- new Repeat("johns", john);
62
- });
63
- });
64
-
65
- test("With divider.", () => {
66
- const cursor = new Cursor("John,John");
67
- const john = new Literal("john", "John");
68
- const divider = new Literal("divider", ",");
69
-
70
- const node = new Repeat("johns", john, divider).parse(cursor);
71
-
72
- expect(node?.name).toBe("johns");
73
- expect(node?.value).toBe("John,John");
74
- });
75
- });
@@ -1,31 +0,0 @@
1
- /** @jest-environment node */
2
- import unit from "./javascriptPatterns/unit";
3
- import Cursor from "../Cursor";
4
-
5
- const unitRegex = /(\\d*\\.?\\d+)\\s?(px|em|ex|%|in|cn|mm|pt|pc+)/gim;
6
-
7
- test("SpeedTest: unit", () => {
8
- const simpleUnit = "12px";
9
- const cursor = new Cursor(simpleUnit);
10
-
11
- const regexBeginTime = Date.now();
12
-
13
- for (let x = 0; x < 100000; x++) {
14
- unitRegex.lastIndex = 0;
15
- unitRegex.exec(simpleUnit);
16
- }
17
-
18
- const RegexEndTime = Date.now();
19
- const regexDuration = RegexEndTime - regexBeginTime;
20
-
21
- const cpBeginTime = Date.now();
22
- for (let x = 0; x < 100000; x++) {
23
- cursor.index = 0;
24
- unit.parse(cursor);
25
- }
26
- const cpEndTime = Date.now();
27
- const cpDuration = cpEndTime - cpBeginTime;
28
-
29
- // We need another runner that shows this value. Just not in tests.
30
- // console.log(regexDuration, cpDuration);
31
- });