clarity-pattern-parser 4.0.3 → 5.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 (132) hide show
  1. package/README.md +176 -1
  2. package/TODO.md +22 -2
  3. package/dist/ast/Node.d.ts +43 -11
  4. package/dist/ast/Visitor.d.ts +31 -31
  5. package/dist/index.browser.js +1248 -1495
  6. package/dist/index.browser.js.map +1 -1
  7. package/dist/index.d.ts +12 -17
  8. package/dist/index.esm.js +1218 -1460
  9. package/dist/index.esm.js.map +1 -1
  10. package/dist/index.js +1217 -1464
  11. package/dist/index.js.map +1 -1
  12. package/dist/patterns/And.d.ts +37 -24
  13. package/dist/patterns/Cursor.d.ts +35 -0
  14. package/dist/patterns/CursorHistory.d.ts +30 -0
  15. package/dist/patterns/Literal.d.ts +36 -19
  16. package/dist/patterns/Not.d.ts +26 -11
  17. package/dist/patterns/Or.d.ts +31 -22
  18. package/dist/patterns/ParseError.d.ts +6 -8
  19. package/dist/patterns/ParseResult.d.ts +6 -0
  20. package/dist/patterns/Pattern.d.ts +17 -26
  21. package/dist/patterns/Reference.d.ts +31 -12
  22. package/dist/patterns/Regex.d.ts +42 -21
  23. package/dist/patterns/Repeat.d.ts +38 -20
  24. package/dist/patterns/clonePatterns.d.ts +2 -0
  25. package/dist/patterns/filterOutNull.d.ts +2 -0
  26. package/dist/patterns/findPattern.d.ts +2 -0
  27. package/dist/patterns/getNextPattern.d.ts +2 -0
  28. package/jest.config.js +2 -1
  29. package/package.json +4 -5
  30. package/rollup.config.js +1 -1
  31. package/src/ast/Node.test.ts +254 -0
  32. package/src/ast/Node.ts +171 -23
  33. package/src/index.ts +11 -24
  34. package/src/intellisense/AutoComplete.test.ts +72 -0
  35. package/src/intellisense/AutoComplete.ts +146 -0
  36. package/src/intellisense/Suggestion.ts +13 -0
  37. package/src/intellisense/SuggestionOption.ts +4 -0
  38. package/src/{tests/cssPatterns → intellisense/css}/cssValue.ts +1 -1
  39. package/src/{tests/cssPatterns → intellisense/css}/divider.ts +2 -1
  40. package/src/intellisense/css/hex.ts +6 -0
  41. package/src/{tests/cssPatterns → intellisense/css}/method.ts +8 -9
  42. package/src/intellisense/css/name.ts +5 -0
  43. package/src/{tests/javascriptPatterns → intellisense/css}/number.ts +3 -3
  44. package/src/intellisense/css/spaces.ts +6 -0
  45. package/src/intellisense/css/unit.ts +10 -0
  46. package/src/{tests/cssPatterns → intellisense/css}/value.ts +1 -1
  47. package/src/{tests/cssPatterns → intellisense/css}/values.ts +1 -1
  48. package/src/intellisense/javascript/Javascript.test.ts +203 -0
  49. package/src/intellisense/javascript/arrayLiteral.ts +25 -0
  50. package/src/intellisense/javascript/deleteStatement.ts +14 -0
  51. package/src/intellisense/javascript/escapedCharacter.ts +50 -0
  52. package/src/intellisense/javascript/exponent.ts +26 -0
  53. package/src/intellisense/javascript/expression.ts +87 -0
  54. package/src/intellisense/javascript/expressionStatement.ts +29 -0
  55. package/src/intellisense/javascript/fraction.ts +13 -0
  56. package/src/intellisense/javascript/infixOperator.ts +36 -0
  57. package/src/intellisense/javascript/integer.ts +7 -0
  58. package/src/intellisense/javascript/invocation.ts +28 -0
  59. package/src/intellisense/javascript/literal.ts +14 -0
  60. package/src/intellisense/javascript/name.ts +3 -0
  61. package/src/intellisense/javascript/numberLiteral.ts +10 -0
  62. package/src/intellisense/javascript/objectLiteral.ts +30 -0
  63. package/src/intellisense/javascript/optionalSpaces.ts +3 -0
  64. package/src/intellisense/javascript/parameters.ts +20 -0
  65. package/src/intellisense/javascript/prefixOperator.ts +13 -0
  66. package/src/intellisense/javascript/propertyAccess.ts +23 -0
  67. package/src/intellisense/javascript/stringLiteral.ts +28 -0
  68. package/src/patterns/And.test.ts +299 -0
  69. package/src/patterns/And.ts +222 -119
  70. package/src/patterns/Cursor.test.ts +93 -0
  71. package/src/patterns/Cursor.ts +130 -0
  72. package/src/patterns/CursorHistory.test.ts +54 -0
  73. package/src/patterns/CursorHistory.ts +95 -0
  74. package/src/patterns/Literal.test.ts +134 -0
  75. package/src/patterns/Literal.ts +151 -61
  76. package/src/patterns/Not.test.ts +88 -0
  77. package/src/patterns/Not.ts +74 -33
  78. package/src/patterns/Or.test.ts +105 -0
  79. package/src/patterns/Or.ts +106 -98
  80. package/src/patterns/ParseError.ts +3 -7
  81. package/src/patterns/ParseResult.ts +7 -0
  82. package/src/patterns/Pattern.ts +18 -150
  83. package/src/patterns/Reference.test.ts +104 -0
  84. package/src/patterns/Reference.ts +94 -94
  85. package/src/patterns/Regex.test.ts +101 -0
  86. package/src/patterns/Regex.ts +129 -60
  87. package/src/patterns/Repeat.test.ts +196 -0
  88. package/src/patterns/Repeat.ts +208 -104
  89. package/src/patterns/clonePatterns.ts +5 -0
  90. package/src/patterns/filterOutNull.ts +13 -0
  91. package/src/patterns/findPattern.ts +25 -0
  92. package/src/patterns/getNextPattern.test.ts +39 -0
  93. package/src/patterns/getNextPattern.ts +18 -0
  94. package/src/Cursor.ts +0 -141
  95. package/src/CursorHistory.ts +0 -146
  96. package/src/TextSuggester.ts +0 -317
  97. package/src/ast/Visitor.ts +0 -271
  98. package/src/patterns/LookAhead.ts +0 -32
  99. package/src/patterns/Recursive.ts +0 -92
  100. package/src/tests/And.test.ts +0 -180
  101. package/src/tests/ComplexExamples.test.ts +0 -86
  102. package/src/tests/CssPatterns.test.ts +0 -90
  103. package/src/tests/CursorHistory.test.ts +0 -107
  104. package/src/tests/Cusor.test.ts +0 -174
  105. package/src/tests/HtmlPatterns.test.ts +0 -34
  106. package/src/tests/Literal.test.ts +0 -79
  107. package/src/tests/LookAhead.test.ts +0 -44
  108. package/src/tests/Not.test.ts +0 -51
  109. package/src/tests/Or.test.ts +0 -113
  110. package/src/tests/Pattern.test.ts +0 -290
  111. package/src/tests/Recursive.test.ts +0 -64
  112. package/src/tests/Reference.test.ts +0 -16
  113. package/src/tests/Repeat.test.ts +0 -75
  114. package/src/tests/SpeedTest.test.ts +0 -31
  115. package/src/tests/TextSuggester.test.ts +0 -297
  116. package/src/tests/Visitor.test.ts +0 -331
  117. package/src/tests/cssPatterns/hex.ts +0 -5
  118. package/src/tests/cssPatterns/name.ts +0 -5
  119. package/src/tests/cssPatterns/number.ts +0 -8
  120. package/src/tests/cssPatterns/spaces.ts +0 -5
  121. package/src/tests/cssPatterns/unit.ts +0 -8
  122. package/src/tests/htmlPatterns/element.ts +0 -49
  123. package/src/tests/javascriptPatterns/boolean.ts +0 -10
  124. package/src/tests/javascriptPatterns/json.ts +0 -67
  125. package/src/tests/javascriptPatterns/name.ts +0 -5
  126. package/src/tests/javascriptPatterns/objectLiteral.ts +0 -40
  127. package/src/tests/javascriptPatterns/string.ts +0 -84
  128. package/src/tests/javascriptPatterns/unit.ts +0 -8
  129. package/src/tests/javascriptPatterns/whitespace.ts +0 -44
  130. package/src/tests/naturalLanguage/filter.ts +0 -37
  131. package/src/tests/patterns/sentence.ts +0 -37
  132. /package/src/{tests/cssPatterns → intellisense/css}/optionalSpaces.ts +0 -0
@@ -1,26 +1,17 @@
1
- import Cursor from "../Cursor";
2
- import Node from "../ast/Node";
3
- export default abstract class Pattern {
4
- protected _type: string;
5
- protected _name: string;
6
- protected _children: Pattern[];
7
- protected _parent: Pattern | null;
8
- protected _isOptional: boolean;
9
- get isOptional(): boolean;
10
- constructor(type: string, name: string, children?: Pattern[], isOptional?: boolean);
11
- abstract parse(cursor: Cursor): Node | null;
12
- exec(text: string): Node | null;
13
- test(text: string): boolean;
14
- get name(): string;
15
- get type(): string;
16
- get parent(): Pattern | null;
17
- set parent(value: Pattern | null);
18
- get children(): Pattern[];
19
- set children(value: Pattern[]);
20
- abstract clone(name?: string): Pattern;
21
- abstract getTokens(): string[];
22
- getTokenValue(): string | null;
23
- getNextTokens(): string[];
24
- private cloneChildren;
25
- private assignAsParent;
26
- }
1
+ import { Cursor } from "./Cursor";
2
+ import { Node } from "../ast/Node";
3
+ import { ParseResult } from "./ParseResult";
4
+ export interface Pattern {
5
+ type: string;
6
+ name: string;
7
+ parent: Pattern | null;
8
+ children: Pattern[];
9
+ isOptional: boolean;
10
+ parse(cursor: Cursor): Node | null;
11
+ parseText(text: string): ParseResult;
12
+ clone(name?: string, isOptional?: boolean): Pattern;
13
+ getTokens(): string[];
14
+ getNextTokens(lastMatched: Pattern): string[];
15
+ getNextPattern(): Pattern | null;
16
+ findPattern(isMatch: (p: Pattern) => boolean): Pattern | null;
17
+ }
@@ -1,12 +1,31 @@
1
- import Pattern from "./Pattern";
2
- import Cursor from "../Cursor";
3
- export default class Reference extends Pattern {
4
- constructor(name: string, isOptional?: boolean);
5
- private getRoot;
6
- private findPattern;
7
- private walkTheTree;
8
- parse(cursor: Cursor): import("..").Node | null;
9
- clone(name?: string, isOptional?: boolean): Reference;
10
- private safelyGetPattern;
11
- getTokens(): string[];
12
- }
1
+ import { Node } from "../ast/Node";
2
+ import { Cursor } from "./Cursor";
3
+ import { Pattern } from "./Pattern";
4
+ export declare class Reference implements Pattern {
5
+ private _type;
6
+ private _name;
7
+ private _parent;
8
+ private _isOptional;
9
+ private _pattern;
10
+ private _children;
11
+ get type(): string;
12
+ get name(): string;
13
+ get isOptional(): boolean;
14
+ get parent(): Pattern | null;
15
+ set parent(pattern: Pattern | null);
16
+ get children(): Pattern[];
17
+ constructor(name: string, isOptional?: boolean);
18
+ parseText(text: string): {
19
+ ast: Node | null;
20
+ cursor: Cursor;
21
+ };
22
+ parse(cursor: Cursor): Node | null;
23
+ clone(name?: string, isOptional?: boolean): Pattern;
24
+ getTokens(): string[];
25
+ getNextTokens(_lastMatched: Pattern): string[];
26
+ getNextPattern(): Pattern | null;
27
+ findPattern(_isMatch: (p: Pattern) => boolean): Pattern | null;
28
+ private _getPatternSafely;
29
+ private _findPattern;
30
+ private _getRoot;
31
+ }
@@ -1,21 +1,42 @@
1
- import Node from "../ast/Node";
2
- import Pattern from "./Pattern";
3
- import Cursor from "../Cursor";
4
- export default class Regex extends Pattern {
5
- private regexString;
6
- private regex;
7
- private node;
8
- private cursor;
9
- private substring;
10
- constructor(name: string, regex: string, isOptional?: boolean);
11
- private assertArguments;
12
- parse(cursor: Cursor): Node | null;
13
- private resetState;
14
- private tryToParse;
15
- private processResult;
16
- private processError;
17
- private safelyGetCursor;
18
- clone(name?: string, isOptional?: boolean): Regex;
19
- getTokenValue(): string;
20
- getTokens(): string[];
21
- }
1
+ import { Node } from "../ast/Node";
2
+ import { Pattern } from "./Pattern";
3
+ import { Cursor } from "./Cursor";
4
+ export declare class Regex implements Pattern {
5
+ private _type;
6
+ private _name;
7
+ private _isOptional;
8
+ private _parent;
9
+ private _originalRegexString;
10
+ private _regex;
11
+ private _node;
12
+ private _cursor;
13
+ private _substring;
14
+ private _tokens;
15
+ private _hasContextualTokenAggregation;
16
+ private _isRetrievingContextualTokens;
17
+ get type(): string;
18
+ get name(): string;
19
+ get parent(): Pattern | null;
20
+ set parent(pattern: Pattern | null);
21
+ get children(): Pattern[];
22
+ get isOptional(): boolean;
23
+ constructor(name: string, regex: string, isOptional?: boolean);
24
+ private assertArguments;
25
+ parseText(text: string): {
26
+ ast: Node | null;
27
+ cursor: Cursor;
28
+ };
29
+ parse(cursor: Cursor): Node | null;
30
+ private resetState;
31
+ private tryToParse;
32
+ private processResult;
33
+ private processError;
34
+ clone(name?: string, isOptional?: boolean): Regex;
35
+ getTokens(): string[];
36
+ getNextTokens(_reference: Pattern): string[];
37
+ getNextPattern(): Pattern | null;
38
+ findPattern(_isMatch: (p: Pattern) => boolean): Pattern | null;
39
+ setTokens(tokens: string[]): void;
40
+ enableContextualTokenAggregation(): void;
41
+ disableContextualTokenAggregation(): void;
42
+ }
@@ -1,20 +1,38 @@
1
- import Pattern from "./Pattern";
2
- import Node from "../ast/Node";
3
- import Cursor from "../Cursor";
4
- export default class Repeat extends Pattern {
5
- _pattern: Pattern;
6
- _divider: Pattern;
7
- nodes: Node[];
8
- cursor: Cursor;
9
- mark: number;
10
- node: Node | null;
11
- constructor(name: string, pattern: Pattern, divider?: Pattern, isOptional?: boolean);
12
- private assertArguments;
13
- private _reset;
14
- parse(cursor: Cursor): Node | null;
15
- private tryToParse;
16
- private processResult;
17
- private safelyGetCursor;
18
- clone(name?: string, isOptional?: boolean): Repeat;
19
- getTokens(): string[];
20
- }
1
+ import { Node } from "../ast/Node";
2
+ import { Cursor } from "./Cursor";
3
+ import { Pattern } from "./Pattern";
4
+ export declare class Repeat implements Pattern {
5
+ private _type;
6
+ private _name;
7
+ private _parent;
8
+ private _children;
9
+ private _pattern;
10
+ private _divider;
11
+ private _isOptional;
12
+ private _nodes;
13
+ private _firstIndex;
14
+ private _shouldReduceAst;
15
+ get type(): string;
16
+ get name(): string;
17
+ get parent(): Pattern | null;
18
+ set parent(pattern: Pattern | null);
19
+ get children(): Pattern[];
20
+ get isOptional(): boolean;
21
+ constructor(name: string, pattern: Pattern, divider?: Pattern, isOptional?: boolean);
22
+ private _assignChildrenToParent;
23
+ parseText(text: string): {
24
+ ast: Node | null;
25
+ cursor: Cursor;
26
+ };
27
+ parse(cursor: Cursor): Node | null;
28
+ private tryToParse;
29
+ private createNode;
30
+ private getLastValidNode;
31
+ enableAstReduction(): void;
32
+ disableAstReduction(): void;
33
+ getTokens(): string[];
34
+ getNextTokens(lastMatched: Pattern): string[];
35
+ getNextPattern(): Pattern | null;
36
+ findPattern(isMatch: (p: Pattern) => boolean): Pattern | null;
37
+ clone(name?: string, isOptional?: boolean): Pattern;
38
+ }
@@ -0,0 +1,2 @@
1
+ import { Pattern } from "./Pattern";
2
+ export declare function clonePatterns(patterns: Pattern[], isOptional?: boolean): Pattern[];
@@ -0,0 +1,2 @@
1
+ import { Node } from "../ast/Node";
2
+ export declare function filterOutNull(nodes: (Node | null)[]): Node[];
@@ -0,0 +1,2 @@
1
+ import { Pattern } from "./Pattern";
2
+ export declare function findPattern(pattern: Pattern, predicate: (pattern: Pattern) => boolean): Pattern | null;
@@ -0,0 +1,2 @@
1
+ import { Pattern } from "./Pattern";
2
+ export declare function getNextPattern(pattern: Pattern): Pattern | null;
package/jest.config.js CHANGED
@@ -9,4 +9,5 @@ module.exports = {
9
9
  "transform": {
10
10
  "^.+\\.(ts|tsx)$": "ts-jest"
11
11
  },
12
- }
12
+ coverageReporters: ["lcov", "text-summary"],
13
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clarity-pattern-parser",
3
- "version": "4.0.3",
3
+ "version": "5.0.0",
4
4
  "description": "Parsing Library for Typescript and Javascript.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.esm.js",
@@ -8,17 +8,16 @@
8
8
  "types": "./dist/index.d.ts",
9
9
  "scripts": {
10
10
  "build": "rollup -c -m",
11
- "test": "jest"
11
+ "test": "jest --coverage"
12
12
  },
13
13
  "keywords": [],
14
14
  "devDependencies": {
15
15
  "@types/jest": "^26.0.23",
16
16
  "jest": "^26.6.3",
17
17
  "rollup": "^2.41.2",
18
- "rollup-plugin-typescript2": "^0.30.0",
18
+ "@rollup/plugin-typescript": "^11.1.6",
19
19
  "ts-jest": "^26.5.3",
20
20
  "tslib": "^2.1.0",
21
21
  "typescript": "^4.2.3"
22
- },
23
- "dependencies": {}
22
+ }
24
23
  }
package/rollup.config.js CHANGED
@@ -1,4 +1,4 @@
1
- import typescript from "rollup-plugin-typescript2";
1
+ import typescript from "@rollup/plugin-typescript";
2
2
  import pkg from "./package.json";
3
3
 
4
4
  export default {
@@ -0,0 +1,254 @@
1
+ import { Node } from "./Node";
2
+
3
+ describe("Node", () => {
4
+ test("Create", () => {
5
+ const node = new Node("type", "name", 0, 0, [], "value");
6
+
7
+ expect(node.type).toBe("type");
8
+ expect(node.name).toBe("name");
9
+ expect(node.value).toBe("value");
10
+ expect(node.firstIndex).toBe(0);
11
+ expect(node.lastIndex).toBe(0);
12
+ expect(node.startIndex).toBe(0);
13
+ expect(node.endIndex).toBe(1);
14
+ expect(node.parent).toBeNull();
15
+ expect(node.children.length).toBe(0);
16
+ });
17
+
18
+ test("Create Tree", () => {
19
+ const child = new Node("child", "child", 0, 0, [], "Child");
20
+ const parent = new Node("parent", "parent", 0, 0, [child]);
21
+
22
+ expect(parent.value).toBe(child.value);
23
+ });
24
+
25
+ test("Remove Child", () => {
26
+ const child = new Node("child", "child", 0, 0, [], "Child");
27
+ const parent = new Node("parent", "parent", 0, 0, [child]);
28
+
29
+ parent.removeChild(child);
30
+
31
+ expect(parent.children.length).toBe(0);
32
+ expect(child.parent).toBeNull();
33
+ expect(parent.value).toBe("");
34
+ expect(child.value).toBe("Child");
35
+ });
36
+
37
+ test("Remove all Child", () => {
38
+ const a = new Node("a", "a", 0, 0, [], "A");
39
+ const b = new Node("b", "b", 0, 0, [], "B");
40
+ const parent = new Node("parent", "parent", 0, 0, [a, b], "Fallback Value");
41
+
42
+ expect(parent.children.length).toBe(2);
43
+ expect(a.parent).toBe(parent);
44
+ expect(b.parent).toBe(parent);
45
+ expect(parent.value).toBe("AB");
46
+ expect(a.value).toBe("A");
47
+ expect(b.value).toBe("B");
48
+
49
+ parent.removeAllChildren();
50
+
51
+ expect(parent.children.length).toBe(0);
52
+ expect(a.parent).toBeNull();
53
+ expect(b.parent).toBeNull();
54
+ expect(parent.value).toBe("Fallback Value");
55
+ expect(a.value).toBe("A");
56
+ expect(b.value).toBe("B");
57
+ });
58
+
59
+ test("Replace Child", () => {
60
+ const a = new Node("a", "a", 0, 0, [], "A");
61
+ const b = new Node("b", "b", 0, 0, [], "B");
62
+ const parent = new Node("parent", "parent", 0, 0, [a]);
63
+
64
+ parent.replaceChild(b, a);
65
+
66
+ expect(parent.children.length).toBe(1);
67
+ expect(a.parent).toBeNull();
68
+ expect(b.parent).toBe(parent);
69
+ expect(a.value).toBe("A");
70
+ expect(b.value).toBe("B");
71
+ });
72
+
73
+ test("Insert Child", () => {
74
+ const a = new Node("a", "a", 0, 0, [], "A");
75
+ const b = new Node("b", "b", 0, 0, [], "B");
76
+ const parent = new Node("parent", "parent", 0, 0, [a]);
77
+
78
+ expect(parent.value).toBe("A");
79
+
80
+ parent.insertBefore(b, a);
81
+
82
+ expect(parent.children.length).toBe(2);
83
+ expect(parent.value).toBe("BA")
84
+ expect(parent.children[0]).toBe(b);
85
+ expect(parent.children[1]).toBe(a);
86
+ expect(a.parent).toBe(parent);
87
+ expect(b.parent).toBe(parent);
88
+ expect(a.value).toBe("A");
89
+ expect(b.value).toBe("B");
90
+ });
91
+
92
+ test("Insert Child With Null Reference", () => {
93
+ const a = new Node("a", "a", 0, 0, [], "A");
94
+ const b = new Node("b", "b", 0, 0, [], "B");
95
+ const parent = new Node("parent", "parent", 0, 0, [a]);
96
+
97
+ expect(parent.value).toBe("A");
98
+
99
+ parent.insertBefore(b, null);
100
+
101
+ expect(parent.children.length).toBe(2);
102
+ expect(parent.value).toBe("AB")
103
+ expect(parent.children[0]).toBe(a);
104
+ expect(parent.children[1]).toBe(b);
105
+ expect(a.parent).toBe(parent);
106
+ expect(b.parent).toBe(parent);
107
+ expect(a.value).toBe("A");
108
+ expect(b.value).toBe("B");
109
+ });
110
+
111
+ test("Append Child", () => {
112
+ const a = new Node("a", "a", 0, 0, [], "A");
113
+ const b = new Node("b", "b", 0, 0, [], "B");
114
+ const parent = new Node("parent", "parent", 0, 0, [a]);
115
+
116
+ expect(parent.value).toBe("A");
117
+
118
+ parent.appendChild(b);
119
+
120
+ expect(parent.children.length).toBe(2);
121
+ expect(parent.value).toBe("AB")
122
+ expect(parent.children[0]).toBe(a);
123
+ expect(parent.children[1]).toBe(b);
124
+ expect(a.parent).toBe(parent);
125
+ expect(b.parent).toBe(parent);
126
+ expect(a.value).toBe("A");
127
+ expect(b.value).toBe("B");
128
+ });
129
+
130
+ test("Splice Children", () => {
131
+ const a = new Node("a", "a", 0, 0, [], "A");
132
+ const b = new Node("b", "b", 0, 0, [], "B");
133
+ const parent = new Node("parent", "parent", 0, 0, [a]);
134
+
135
+ expect(parent.value).toBe("A");
136
+
137
+ parent.spliceChildren(0, 0, b);
138
+
139
+ expect(parent.children.length).toBe(2);
140
+ expect(parent.value).toBe("BA")
141
+ expect(parent.children[0]).toBe(b);
142
+ expect(parent.children[1]).toBe(a);
143
+ expect(a.parent).toBe(parent);
144
+ expect(b.parent).toBe(parent);
145
+ expect(a.value).toBe("A");
146
+ expect(b.value).toBe("B");
147
+ });
148
+
149
+ test("Splice Children (Replace)", () => {
150
+ const a = new Node("a", "a", 0, 0, [], "A");
151
+ const b = new Node("b", "b", 0, 0, [], "B");
152
+ const parent = new Node("parent", "parent", 0, 0, [a]);
153
+
154
+ expect(parent.value).toBe("A");
155
+
156
+ parent.spliceChildren(0, 1, b);
157
+
158
+ expect(parent.children.length).toBe(1);
159
+ expect(parent.value).toBe("B")
160
+ expect(parent.children[0]).toBe(b);
161
+ expect(a.parent).toBeNull();
162
+ expect(b.parent).toBe(parent);
163
+ expect(a.value).toBe("A");
164
+ expect(b.value).toBe("B");
165
+ });
166
+
167
+
168
+ test("Find", () => {
169
+ const a = new Node("a", "a", 0, 0, [], "A");
170
+ const b = new Node("b", "b", 0, 0, [], "B");
171
+ const parent = new Node("parent", "parent", 0, 0, [a, b]);
172
+
173
+ const result = parent.find(n => n.name === "a");
174
+
175
+ expect(result).toBe(a)
176
+ });
177
+
178
+ test("Walk Down", () => {
179
+ const result: Node[] = [];
180
+ const a = new Node("a", "a", 0, 0, [], "A");
181
+ const b = new Node("b", "b", 0, 0, [], "B");
182
+ const parent = new Node("parent", "parent", 0, 0, [a, b]);
183
+
184
+ parent.walkDown((n) => {
185
+ result.push(n)
186
+ });
187
+
188
+ const expected = [parent, a, b];
189
+
190
+ expect(result).toEqual(expected);
191
+ });
192
+
193
+ test("Walk Up", () => {
194
+ const result: Node[] = [];
195
+ const a = new Node("a", "a", 0, 0, [], "A");
196
+ const b = new Node("b", "b", 0, 0, [], "B");
197
+ const parent = new Node("parent", "parent", 0, 0, [a, b]);
198
+
199
+ parent.walkUp((n) => {
200
+ result.push(n)
201
+ });
202
+
203
+ const expected = [a, b, parent];
204
+
205
+ expect(result).toEqual(expected);
206
+ });
207
+
208
+ test("Clone", () => {
209
+ const a = new Node("a", "a", 0, 0, [], "A");
210
+ const b = new Node("b", "b", 0, 0, [], "B");
211
+ const parent = new Node("parent", "parent", 0, 0, [a, b]);
212
+ const clone = parent.clone();
213
+
214
+ expect(clone).toEqual(parent)
215
+ });
216
+
217
+ test("Turn Into JSON", () => {
218
+ const a = new Node("a", "a", 0, 0, [], "A");
219
+ const b = new Node("b", "b", 0, 0, [], "B");
220
+ const parent = new Node("parent", "parent", 0, 0, [a, b]);
221
+ const result = parent.toJson();
222
+ const expected = JSON.stringify({
223
+ type: "parent",
224
+ name: "parent",
225
+ value: "AB",
226
+ firstIndex: 0,
227
+ lastIndex: 0,
228
+ startIndex: 0,
229
+ endIndex: 1,
230
+ children: [{
231
+ type: "a",
232
+ name: "a",
233
+ value: "A",
234
+ firstIndex: 0,
235
+ lastIndex: 0,
236
+ startIndex: 0,
237
+ endIndex: 1,
238
+ children: [],
239
+ }, {
240
+ type: "b",
241
+ name: "b",
242
+ value: "B",
243
+ firstIndex: 0,
244
+ lastIndex: 0,
245
+ startIndex: 0,
246
+ endIndex: 1,
247
+ children: [],
248
+ }],
249
+ });
250
+
251
+ expect(result).toEqual(expected)
252
+ });
253
+
254
+ });