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.
- package/README.md +176 -1
- package/TODO.md +22 -2
- package/dist/ast/Node.d.ts +43 -11
- package/dist/ast/Visitor.d.ts +31 -31
- package/dist/index.browser.js +1248 -1495
- package/dist/index.browser.js.map +1 -1
- package/dist/index.d.ts +12 -17
- package/dist/index.esm.js +1218 -1460
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1217 -1464
- package/dist/index.js.map +1 -1
- package/dist/patterns/And.d.ts +37 -24
- package/dist/patterns/Cursor.d.ts +35 -0
- package/dist/patterns/CursorHistory.d.ts +30 -0
- package/dist/patterns/Literal.d.ts +36 -19
- package/dist/patterns/Not.d.ts +26 -11
- package/dist/patterns/Or.d.ts +31 -22
- package/dist/patterns/ParseError.d.ts +6 -8
- package/dist/patterns/ParseResult.d.ts +6 -0
- package/dist/patterns/Pattern.d.ts +17 -26
- package/dist/patterns/Reference.d.ts +31 -12
- package/dist/patterns/Regex.d.ts +42 -21
- package/dist/patterns/Repeat.d.ts +38 -20
- package/dist/patterns/clonePatterns.d.ts +2 -0
- package/dist/patterns/filterOutNull.d.ts +2 -0
- package/dist/patterns/findPattern.d.ts +2 -0
- package/dist/patterns/getNextPattern.d.ts +2 -0
- package/jest.config.js +2 -1
- package/package.json +4 -5
- package/rollup.config.js +1 -1
- package/src/ast/Node.test.ts +254 -0
- package/src/ast/Node.ts +171 -23
- package/src/index.ts +11 -24
- package/src/intellisense/AutoComplete.test.ts +72 -0
- package/src/intellisense/AutoComplete.ts +146 -0
- package/src/intellisense/Suggestion.ts +13 -0
- package/src/intellisense/SuggestionOption.ts +4 -0
- package/src/{tests/cssPatterns → intellisense/css}/cssValue.ts +1 -1
- package/src/{tests/cssPatterns → intellisense/css}/divider.ts +2 -1
- package/src/intellisense/css/hex.ts +6 -0
- package/src/{tests/cssPatterns → intellisense/css}/method.ts +8 -9
- package/src/intellisense/css/name.ts +5 -0
- package/src/{tests/javascriptPatterns → intellisense/css}/number.ts +3 -3
- package/src/intellisense/css/spaces.ts +6 -0
- package/src/intellisense/css/unit.ts +10 -0
- package/src/{tests/cssPatterns → intellisense/css}/value.ts +1 -1
- package/src/{tests/cssPatterns → intellisense/css}/values.ts +1 -1
- package/src/intellisense/javascript/Javascript.test.ts +203 -0
- package/src/intellisense/javascript/arrayLiteral.ts +25 -0
- package/src/intellisense/javascript/deleteStatement.ts +14 -0
- package/src/intellisense/javascript/escapedCharacter.ts +50 -0
- package/src/intellisense/javascript/exponent.ts +26 -0
- package/src/intellisense/javascript/expression.ts +87 -0
- package/src/intellisense/javascript/expressionStatement.ts +29 -0
- package/src/intellisense/javascript/fraction.ts +13 -0
- package/src/intellisense/javascript/infixOperator.ts +36 -0
- package/src/intellisense/javascript/integer.ts +7 -0
- package/src/intellisense/javascript/invocation.ts +28 -0
- package/src/intellisense/javascript/literal.ts +14 -0
- package/src/intellisense/javascript/name.ts +3 -0
- package/src/intellisense/javascript/numberLiteral.ts +10 -0
- package/src/intellisense/javascript/objectLiteral.ts +30 -0
- package/src/intellisense/javascript/optionalSpaces.ts +3 -0
- package/src/intellisense/javascript/parameters.ts +20 -0
- package/src/intellisense/javascript/prefixOperator.ts +13 -0
- package/src/intellisense/javascript/propertyAccess.ts +23 -0
- package/src/intellisense/javascript/stringLiteral.ts +28 -0
- package/src/patterns/And.test.ts +299 -0
- package/src/patterns/And.ts +222 -119
- package/src/patterns/Cursor.test.ts +93 -0
- package/src/patterns/Cursor.ts +130 -0
- package/src/patterns/CursorHistory.test.ts +54 -0
- package/src/patterns/CursorHistory.ts +95 -0
- package/src/patterns/Literal.test.ts +134 -0
- package/src/patterns/Literal.ts +151 -61
- package/src/patterns/Not.test.ts +88 -0
- package/src/patterns/Not.ts +74 -33
- package/src/patterns/Or.test.ts +105 -0
- package/src/patterns/Or.ts +106 -98
- package/src/patterns/ParseError.ts +3 -7
- package/src/patterns/ParseResult.ts +7 -0
- package/src/patterns/Pattern.ts +18 -150
- package/src/patterns/Reference.test.ts +104 -0
- package/src/patterns/Reference.ts +94 -94
- package/src/patterns/Regex.test.ts +101 -0
- package/src/patterns/Regex.ts +129 -60
- package/src/patterns/Repeat.test.ts +196 -0
- package/src/patterns/Repeat.ts +208 -104
- package/src/patterns/clonePatterns.ts +5 -0
- package/src/patterns/filterOutNull.ts +13 -0
- package/src/patterns/findPattern.ts +25 -0
- package/src/patterns/getNextPattern.test.ts +39 -0
- package/src/patterns/getNextPattern.ts +18 -0
- package/src/Cursor.ts +0 -141
- package/src/CursorHistory.ts +0 -146
- package/src/TextSuggester.ts +0 -317
- package/src/ast/Visitor.ts +0 -271
- package/src/patterns/LookAhead.ts +0 -32
- package/src/patterns/Recursive.ts +0 -92
- package/src/tests/And.test.ts +0 -180
- package/src/tests/ComplexExamples.test.ts +0 -86
- package/src/tests/CssPatterns.test.ts +0 -90
- package/src/tests/CursorHistory.test.ts +0 -107
- package/src/tests/Cusor.test.ts +0 -174
- package/src/tests/HtmlPatterns.test.ts +0 -34
- package/src/tests/Literal.test.ts +0 -79
- package/src/tests/LookAhead.test.ts +0 -44
- package/src/tests/Not.test.ts +0 -51
- package/src/tests/Or.test.ts +0 -113
- package/src/tests/Pattern.test.ts +0 -290
- package/src/tests/Recursive.test.ts +0 -64
- package/src/tests/Reference.test.ts +0 -16
- package/src/tests/Repeat.test.ts +0 -75
- package/src/tests/SpeedTest.test.ts +0 -31
- package/src/tests/TextSuggester.test.ts +0 -297
- package/src/tests/Visitor.test.ts +0 -331
- package/src/tests/cssPatterns/hex.ts +0 -5
- package/src/tests/cssPatterns/name.ts +0 -5
- package/src/tests/cssPatterns/number.ts +0 -8
- package/src/tests/cssPatterns/spaces.ts +0 -5
- package/src/tests/cssPatterns/unit.ts +0 -8
- package/src/tests/htmlPatterns/element.ts +0 -49
- package/src/tests/javascriptPatterns/boolean.ts +0 -10
- package/src/tests/javascriptPatterns/json.ts +0 -67
- package/src/tests/javascriptPatterns/name.ts +0 -5
- package/src/tests/javascriptPatterns/objectLiteral.ts +0 -40
- package/src/tests/javascriptPatterns/string.ts +0 -84
- package/src/tests/javascriptPatterns/unit.ts +0 -8
- package/src/tests/javascriptPatterns/whitespace.ts +0 -44
- package/src/tests/naturalLanguage/filter.ts +0 -37
- package/src/tests/patterns/sentence.ts +0 -37
- /package/src/{tests/cssPatterns → intellisense/css}/optionalSpaces.ts +0 -0
|
@@ -1,26 +1,17 @@
|
|
|
1
|
-
import Cursor from "
|
|
2
|
-
import Node from "../ast/Node";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
|
2
|
-
import Cursor from "
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
private
|
|
6
|
-
private
|
|
7
|
-
private
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
private
|
|
11
|
-
|
|
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
|
+
}
|
package/dist/patterns/Regex.d.ts
CHANGED
|
@@ -1,21 +1,42 @@
|
|
|
1
|
-
import Node from "../ast/Node";
|
|
2
|
-
import Pattern from "./Pattern";
|
|
3
|
-
import Cursor from "
|
|
4
|
-
export
|
|
5
|
-
private
|
|
6
|
-
private
|
|
7
|
-
private
|
|
8
|
-
private
|
|
9
|
-
private
|
|
10
|
-
|
|
11
|
-
private
|
|
12
|
-
|
|
13
|
-
private
|
|
14
|
-
private
|
|
15
|
-
private
|
|
16
|
-
private
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
private
|
|
13
|
-
private
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
+
}
|
package/jest.config.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "clarity-pattern-parser",
|
|
3
|
-
"version": "
|
|
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
|
|
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
|
@@ -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
|
+
});
|