data-structure-typed 2.2.7 → 2.3.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/.github/workflows/ci.yml +9 -0
- package/CHANGELOG.md +1 -1
- package/README.md +14 -3
- package/README_CN.md +119 -275
- package/benchmark/report.html +1 -1
- package/benchmark/report.json +20 -324
- package/dist/cjs/index.cjs +689 -182
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs-legacy/index.cjs +693 -185
- package/dist/cjs-legacy/index.cjs.map +1 -1
- package/dist/esm/index.mjs +689 -182
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm-legacy/index.mjs +693 -185
- package/dist/esm-legacy/index.mjs.map +1 -1
- package/dist/leetcode/avl-tree-counter.mjs +2957 -0
- package/dist/leetcode/avl-tree-multi-map.mjs +2889 -0
- package/dist/leetcode/avl-tree.mjs +2720 -0
- package/dist/leetcode/binary-tree.mjs +1594 -0
- package/dist/leetcode/bst.mjs +2398 -0
- package/dist/leetcode/deque.mjs +683 -0
- package/dist/leetcode/directed-graph.mjs +1733 -0
- package/dist/leetcode/doubly-linked-list.mjs +709 -0
- package/dist/leetcode/hash-map.mjs +493 -0
- package/dist/leetcode/heap.mjs +542 -0
- package/dist/leetcode/max-heap.mjs +375 -0
- package/dist/leetcode/max-priority-queue.mjs +383 -0
- package/dist/leetcode/min-heap.mjs +363 -0
- package/dist/leetcode/min-priority-queue.mjs +371 -0
- package/dist/leetcode/priority-queue.mjs +363 -0
- package/dist/leetcode/queue.mjs +943 -0
- package/dist/leetcode/red-black-tree.mjs +2765 -0
- package/dist/leetcode/singly-linked-list.mjs +754 -0
- package/dist/leetcode/stack.mjs +217 -0
- package/dist/leetcode/tree-counter.mjs +3039 -0
- package/dist/leetcode/tree-multi-map.mjs +2913 -0
- package/dist/leetcode/trie.mjs +413 -0
- package/dist/leetcode/undirected-graph.mjs +1650 -0
- package/dist/types/data-structures/base/linear-base.d.ts +6 -6
- package/dist/types/data-structures/binary-tree/avl-tree-counter.d.ts +1 -1
- package/dist/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +2 -2
- package/dist/types/data-structures/binary-tree/avl-tree.d.ts +10 -10
- package/dist/types/data-structures/binary-tree/binary-tree.d.ts +25 -27
- package/dist/types/data-structures/binary-tree/bst.d.ts +13 -12
- package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +151 -21
- package/dist/types/data-structures/binary-tree/tree-counter.d.ts +4 -4
- package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +2 -2
- package/dist/types/interfaces/binary-tree.d.ts +1 -1
- package/dist/umd/data-structure-typed.js +689 -181
- package/dist/umd/data-structure-typed.js.map +1 -1
- package/dist/umd/data-structure-typed.min.js +3 -3
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +50 -172
- package/src/data-structures/base/linear-base.ts +2 -12
- package/src/data-structures/binary-tree/avl-tree-counter.ts +6 -6
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +13 -13
- package/src/data-structures/binary-tree/avl-tree.ts +15 -15
- package/src/data-structures/binary-tree/binary-tree.ts +57 -60
- package/src/data-structures/binary-tree/bst.ts +100 -26
- package/src/data-structures/binary-tree/red-black-tree.ts +586 -76
- package/src/data-structures/binary-tree/tree-counter.ts +25 -13
- package/src/data-structures/binary-tree/tree-multi-map.ts +13 -13
- package/src/data-structures/queue/deque.ts +10 -0
- package/src/interfaces/binary-tree.ts +1 -1
- package/test/performance/data-structures/binary-tree/red-black-tree.test.ts +1 -2
- package/test/unit/data-structures/base/iterable-element-base.coverage.test.ts +106 -0
- package/test/unit/data-structures/base/iterable-element-base.more-branches.coverage.test.ts +61 -0
- package/test/unit/data-structures/base/linear-base.array.coverage.test.ts +168 -0
- package/test/unit/data-structures/base/linear-base.concat-else.coverage.test.ts +82 -0
- package/test/unit/data-structures/base/linear-base.coverage.test.ts +72 -0
- package/test/unit/data-structures/base/linear-base.more-branches.coverage.test.ts +417 -0
- package/test/unit/data-structures/binary-tree/avl-tree-counter.more-branches-3.coverage.test.ts +146 -0
- package/test/unit/data-structures/binary-tree/avl-tree-counter.more-branches.coverage.test.ts +93 -0
- package/test/unit/data-structures/binary-tree/avl-tree-counter.test.ts +30 -30
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.coverage.test.ts +108 -0
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.more-branches-2.coverage.test.ts +85 -0
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +46 -46
- package/test/unit/data-structures/binary-tree/avl-tree-node.familyPosition-root-left.coverage.test.ts +17 -0
- package/test/unit/data-structures/binary-tree/avl-tree.more-branches-2.coverage.test.ts +99 -0
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +43 -43
- package/test/unit/data-structures/binary-tree/binary-indexed-tree.more-branches.coverage.test.ts +18 -0
- package/test/unit/data-structures/binary-tree/binary-tree.more-branches.coverage.test.ts +56 -0
- package/test/unit/data-structures/binary-tree/binary-tree.remaining-branches.coverage.test.ts +229 -0
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +151 -151
- package/test/unit/data-structures/binary-tree/bst.bound-by-predicate.coverage.test.ts +33 -0
- package/test/unit/data-structures/binary-tree/bst.coverage.test.ts +94 -0
- package/test/unit/data-structures/binary-tree/bst.deletebykey.coverage.test.ts +70 -0
- package/test/unit/data-structures/binary-tree/bst.deletewhere.coverage.test.ts +37 -0
- package/test/unit/data-structures/binary-tree/bst.floor-lower-predicate.coverage.test.ts +29 -0
- package/test/unit/data-structures/binary-tree/bst.floor-setmany.coverage.test.ts +72 -0
- package/test/unit/data-structures/binary-tree/bst.getnode.range-ensure.coverage.test.ts +22 -0
- package/test/unit/data-structures/binary-tree/bst.misc-branches.coverage.test.ts +100 -0
- package/test/unit/data-structures/binary-tree/bst.more-branches-2.coverage.test.ts +133 -0
- package/test/unit/data-structures/binary-tree/bst.more-branches-3.coverage.test.ts +45 -0
- package/test/unit/data-structures/binary-tree/bst.more-branches-4.coverage.test.ts +36 -0
- package/test/unit/data-structures/binary-tree/bst.more-branches-5.coverage.test.ts +40 -0
- package/test/unit/data-structures/binary-tree/bst.more.coverage.test.ts +39 -0
- package/test/unit/data-structures/binary-tree/bst.node-family.coverage.test.ts +29 -0
- package/test/unit/data-structures/binary-tree/bst.range-pruning.coverage.test.ts +43 -0
- package/test/unit/data-structures/binary-tree/bst.search-fastpath.coverage.test.ts +30 -0
- package/test/unit/data-structures/binary-tree/bst.test.ts +124 -154
- package/test/unit/data-structures/binary-tree/overall.test.ts +20 -20
- package/test/unit/data-structures/binary-tree/red-black-tree.boundary-corruption-repair.coverage.test.ts +66 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.boundary-max-update.coverage.test.ts +18 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.boundary-null.coverage.test.ts +53 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.boundary-stale-cache.coverage.test.ts +25 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.boundary-update.coverage.test.ts +23 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.cache-delete.coverage.test.ts +49 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.cache-edge.coverage.test.ts +37 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.cache-stale-insert.coverage.test.ts +39 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.coverage.test.ts +334 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.delete-fixup.coverage.test.ts +68 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.delete-successor.coverage.test.ts +75 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.factories.coverage.test.ts +26 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.hint-cache-compare-update.coverage.test.ts +74 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.hint-cache-no-update.coverage.test.ts +44 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.hint-cache-nullish.coverage.test.ts +61 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.hint-mapmode-defined.coverage.test.ts +35 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.hint-mapmode-undefined.coverage.test.ts +43 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.hint-more.coverage.test.ts +99 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.hint.coverage.test.ts +60 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.insert-cache-nullish.coverage.test.ts +29 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.insert-header-parent-nullish.coverage.test.ts +17 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.internal-walk.coverage.test.ts +57 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.minmax-cache.test.ts +65 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.misc-inputs.coverage.test.ts +17 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.more-branches-2.coverage.test.ts +121 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.more-branches-3.coverage.test.ts +55 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.more-branches-4.coverage.test.ts +44 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.predsucc.coverage.test.ts +40 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.remaining-branches.coverage.test.ts +123 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.set-inputs.coverage.test.ts +64 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.setkvnode-parent-cache.coverage.test.ts +79 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.setkvnode-remaining.coverage.test.ts +44 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.setkvnode-uncovered.coverage.test.ts +74 -0
- package/test/unit/data-structures/binary-tree/red-black-tree.test.ts +141 -141
- package/test/unit/data-structures/binary-tree/red-black-tree.update-branches.coverage.test.ts +30 -0
- package/test/unit/data-structures/binary-tree/segment-tree.more-branches.coverage.test.ts +31 -0
- package/test/unit/data-structures/binary-tree/tree-counter.coverage.test.ts +115 -0
- package/test/unit/data-structures/binary-tree/tree-counter.more-branches.coverage.test.ts +244 -0
- package/test/unit/data-structures/binary-tree/tree-counter.test.ts +41 -39
- package/test/unit/data-structures/binary-tree/tree-multi-map.coverage.test.ts +104 -0
- package/test/unit/data-structures/binary-tree/tree-multi-map.more-branches-2.coverage.test.ts +59 -0
- package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +145 -145
- package/test/unit/data-structures/graph/abstract-graph.more-branches-2.coverage.test.ts +40 -0
- package/test/unit/data-structures/graph/abstract-graph.more-branches-3.coverage.test.ts +65 -0
- package/test/unit/data-structures/graph/abstract-graph.more-branches-4.coverage.test.ts +98 -0
- package/test/unit/data-structures/graph/abstract-graph.more-branches-5.coverage.test.ts +51 -0
- package/test/unit/data-structures/graph/abstract-graph.more-branches.coverage.test.ts +62 -0
- package/test/unit/data-structures/graph/directed-graph.more-branches-2.coverage.test.ts +38 -0
- package/test/unit/data-structures/graph/directed-graph.more-branches-3.coverage.test.ts +25 -0
- package/test/unit/data-structures/graph/directed-graph.more-branches.coverage.test.ts +82 -0
- package/test/unit/data-structures/graph/map-graph.more-branches.coverage.test.ts +22 -0
- package/test/unit/data-structures/graph/undirected-graph.more-branches-2.coverage.test.ts +35 -0
- package/test/unit/data-structures/graph/undirected-graph.more-branches.coverage.test.ts +87 -0
- package/test/unit/data-structures/hash/hash-map.more-branches.coverage.test.ts +64 -0
- package/test/unit/data-structures/hash/hash-map.toEntryFn-branch.coverage.test.ts +9 -0
- package/test/unit/data-structures/heap/heap.misc-branches.coverage.test.ts +110 -0
- package/test/unit/data-structures/heap/heap.remaining-branches.coverage.test.ts +22 -0
- package/test/unit/data-structures/heap/max-heap.coverage.test.ts +29 -0
- package/test/unit/data-structures/linked-list/doubly-linked-list.more-branches.coverage.test.ts +72 -0
- package/test/unit/data-structures/linked-list/linked-list.unshiftMany-else.coverage.test.ts +15 -0
- package/test/unit/data-structures/linked-list/singly-linked-list.coverage.test.ts +221 -0
- package/test/unit/data-structures/linked-list/singly-linked-list.more-branches.coverage.test.ts +86 -0
- package/test/unit/data-structures/linked-list/skip-linked-list.more-branches.coverage.test.ts +31 -0
- package/test/unit/data-structures/matrix/matrix.more-branches.coverage.test.ts +81 -0
- package/test/unit/data-structures/matrix/matrix.pivotElement-nullish.coverage.test.ts +28 -0
- package/test/unit/data-structures/priority-queue/max-priority-queue.more-branches.coverage.test.ts +10 -0
- package/test/unit/data-structures/priority-queue/priority-queue.coverage.test.ts +21 -0
- package/test/unit/data-structures/queue/deque.coverage.test.ts +173 -0
- package/test/unit/data-structures/queue/deque.more-branches-2.coverage.test.ts +39 -0
- package/test/unit/data-structures/queue/deque.more-branches-3.coverage.test.ts +9 -0
- package/test/unit/data-structures/queue/deque.more-branches.coverage.test.ts +95 -0
- package/test/unit/data-structures/queue/queue.coverage.test.ts +138 -0
- package/test/unit/data-structures/queue/queue.more-branches-2.coverage.test.ts +27 -0
- package/test/unit/data-structures/stack/stack.coverage.test.ts +112 -0
- package/test/unit/data-structures/tree/tree.more-branches.coverage.test.ts +9 -0
- package/test/unit/data-structures/trie/trie.more-branches-2.coverage.test.ts +51 -0
- package/test/utils/patch.ts +33 -0
- package/tsup.config.js +50 -21
- package/tsup.umd.config.js +29 -0
- package/tsup.node.config.js +0 -83
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { BinaryTree } from '../../../../src';
|
|
2
|
+
|
|
3
|
+
describe('BinaryTree remaining branch coverage', () => {
|
|
4
|
+
it('set() BFS loop hits `if (!cur) continue` by monkeypatching Queue.shift to return undefined once', () => {
|
|
5
|
+
const t = new BinaryTree<number, number>([], { isMapMode: false });
|
|
6
|
+
t.set(1, 1);
|
|
7
|
+
|
|
8
|
+
// set() constructs a Queue internally; easiest deterministic way is to patch Queue.prototype.shift.
|
|
9
|
+
const { Queue } = require('../../../../src');
|
|
10
|
+
const orig = Queue.prototype.shift;
|
|
11
|
+
let once = true;
|
|
12
|
+
Queue.prototype.shift = function () {
|
|
13
|
+
if (once) {
|
|
14
|
+
once = false;
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
return orig.apply(this);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
expect(t.set(2, 2)).toBe(true);
|
|
22
|
+
} finally {
|
|
23
|
+
Queue.prototype.shift = orig;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('isBST(ITERATIVE) executes checkBST() default-arg branch (checkMax default false)', () => {
|
|
28
|
+
const t = new BinaryTree<number, number>([], { isMapMode: false });
|
|
29
|
+
t.set(2, 2);
|
|
30
|
+
t.set(1, 1);
|
|
31
|
+
t.set(3, 3);
|
|
32
|
+
|
|
33
|
+
expect(t.isBST(t.root as any, 'ITERATIVE' as any)).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('getPathToRoot returns reversed path when isReverse=true', () => {
|
|
37
|
+
const t = new BinaryTree<number, number>([], { isMapMode: false });
|
|
38
|
+
const root = t.createNode(1, 1);
|
|
39
|
+
const child = t.createNode(2, 2);
|
|
40
|
+
root.left = child;
|
|
41
|
+
child.parent = root;
|
|
42
|
+
(t as any)._setRoot(root);
|
|
43
|
+
|
|
44
|
+
const out = t.getPathToRoot(child as any, (n: any) => n?.key, true);
|
|
45
|
+
expect(out).toEqual([1, 2]);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('_dfs(ITERATIVE) hits onlyOne early-return branch when onlyOne=true', () => {
|
|
49
|
+
const t = new BinaryTree<number, number>([], { isMapMode: false });
|
|
50
|
+
t.set(1, 1);
|
|
51
|
+
t.set(2, 2);
|
|
52
|
+
const out = (t as any)._dfs((n: any) => n?.key, 'IN', true, t.root, 'ITERATIVE', false);
|
|
53
|
+
expect(out.length).toBe(1);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('_dfs(RECURSIVE) pattern PRE hits onlyOne return (covers line 1998)', () => {
|
|
57
|
+
const t = new BinaryTree<number, number>([], { isMapMode: false });
|
|
58
|
+
t.set(1, 1);
|
|
59
|
+
t.set(2, 2);
|
|
60
|
+
const out = (t as any)._dfs((n: any) => n?.key, 'PRE', true, t.root, 'RECURSIVE', false);
|
|
61
|
+
expect(out.length).toBe(1);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('_dfs(RECURSIVE) pattern POST hits onlyOne return (covers line 2008)', () => {
|
|
65
|
+
const t = new BinaryTree<number, number>([], { isMapMode: false });
|
|
66
|
+
t.set(1, 1);
|
|
67
|
+
t.set(2, 2);
|
|
68
|
+
const out = (t as any)._dfs((n: any) => n?.key, 'POST', true, t.root, 'RECURSIVE', false);
|
|
69
|
+
// POST visits children before root, so we may already have processed some nodes before early return.
|
|
70
|
+
expect(out.length).toBeGreaterThanOrEqual(1);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('_dfs(ITERATIVE) can hit `if (cur === undefined) continue` by patching Array.prototype.pop', () => {
|
|
74
|
+
const t = new BinaryTree<number, number>([], { isMapMode: false });
|
|
75
|
+
t.set(1, 1);
|
|
76
|
+
|
|
77
|
+
const origPop = Array.prototype.pop;
|
|
78
|
+
let once = true;
|
|
79
|
+
Array.prototype.pop = function () {
|
|
80
|
+
if (once) {
|
|
81
|
+
once = false;
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
// @ts-ignore
|
|
85
|
+
return origPop.apply(this);
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
try {
|
|
89
|
+
const out = (t as any)._dfs((n: any) => n?.key, 'IN', false, t.root, 'ITERATIVE', false);
|
|
90
|
+
expect(out.length).toBeGreaterThan(0);
|
|
91
|
+
} finally {
|
|
92
|
+
Array.prototype.pop = origPop;
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('_dfs startNode ensureNode fails returns []', () => {
|
|
97
|
+
const t = new BinaryTree<number, number>([], { isMapMode: false });
|
|
98
|
+
t.set(1, 1);
|
|
99
|
+
const out = (t as any)._dfs((n: any) => n?.key, 'IN', false, null, 'ITERATIVE', false);
|
|
100
|
+
expect(out).toEqual([]);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('_getIterator default-arg path returns without yielding when root is undefined', () => {
|
|
104
|
+
const t = new BinaryTree<number, number>([], { isMapMode: false });
|
|
105
|
+
// direct call to generator
|
|
106
|
+
const iter = (t as any)._getIterator();
|
|
107
|
+
const first = iter.next();
|
|
108
|
+
expect(first.done).toBe(true);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('_getIterator recursive branch visits left and right and yields mapMode values when mapMode=true', () => {
|
|
112
|
+
const t = new BinaryTree<number, number>([], { isMapMode: true });
|
|
113
|
+
// Build a small tree manually to avoid BFS quirks.
|
|
114
|
+
const root: any = t.createNode(2, 200);
|
|
115
|
+
const left: any = t.createNode(1, 100);
|
|
116
|
+
const right: any = t.createNode(3, 300);
|
|
117
|
+
root.left = left;
|
|
118
|
+
root.right = right;
|
|
119
|
+
left.parent = root;
|
|
120
|
+
right.parent = root;
|
|
121
|
+
(t as any)._setRoot(root);
|
|
122
|
+
|
|
123
|
+
// Ensure store has values.
|
|
124
|
+
(t as any)._store.set(1, 1000);
|
|
125
|
+
(t as any)._store.set(2, 2000);
|
|
126
|
+
(t as any)._store.set(3, 3000);
|
|
127
|
+
|
|
128
|
+
// Force recursive iterator branch.
|
|
129
|
+
(t as any).iterationType = 'RECURSIVE';
|
|
130
|
+
|
|
131
|
+
const got: any[] = [];
|
|
132
|
+
for (const kv of t) got.push(kv);
|
|
133
|
+
expect(got).toEqual([
|
|
134
|
+
[1, 1000],
|
|
135
|
+
[2, 2000],
|
|
136
|
+
[3, 3000]
|
|
137
|
+
]);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it('_getIterator recursive branch yields node.value when mapMode=false (covers else yield)', () => {
|
|
141
|
+
const t = new BinaryTree<number, number>([], { isMapMode: false });
|
|
142
|
+
const root: any = t.createNode(2, 200);
|
|
143
|
+
const left: any = t.createNode(1, 100);
|
|
144
|
+
const right: any = t.createNode(3, 300);
|
|
145
|
+
root.left = left;
|
|
146
|
+
root.right = right;
|
|
147
|
+
left.parent = root;
|
|
148
|
+
right.parent = root;
|
|
149
|
+
(t as any)._setRoot(root);
|
|
150
|
+
|
|
151
|
+
(t as any).iterationType = 'RECURSIVE';
|
|
152
|
+
|
|
153
|
+
const got: any[] = [];
|
|
154
|
+
for (const kv of t) got.push(kv);
|
|
155
|
+
expect(got).toEqual([
|
|
156
|
+
[1, 100],
|
|
157
|
+
[2, 200],
|
|
158
|
+
[3, 300]
|
|
159
|
+
]);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('_createLike default-arg path can be called with no args', () => {
|
|
163
|
+
const t = new BinaryTree<number, number>([], { isMapMode: false });
|
|
164
|
+
const like = (t as any)._createLike();
|
|
165
|
+
expect(like.size).toBe(0);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it('_displayAux: node is undefined and isShowUndefined=true uses "U" leaf rendering (covers U branch)', () => {
|
|
169
|
+
const t = new BinaryTree<number, number>([], { isMapMode: false });
|
|
170
|
+
const layout = (t as any)._displayAux(undefined, { isShowNull: true, isShowUndefined: true, isShowRedBlackNIL: true });
|
|
171
|
+
expect(layout[0][0]).toContain('U');
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it('_displayAux: node is null and isShowNull=true uses "N" leaf rendering (covers N branch)', () => {
|
|
175
|
+
const t = new BinaryTree<number, number>([], { isMapMode: false });
|
|
176
|
+
const layout = (t as any)._displayAux(null, { isShowNull: true, isShowUndefined: true, isShowRedBlackNIL: true });
|
|
177
|
+
expect(layout[0][0]).toContain('N');
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it('_displayAux: node is null and isShowNull=false returns empty layout', () => {
|
|
181
|
+
const t = new BinaryTree<number, number>([], { isMapMode: false });
|
|
182
|
+
const layout = (t as any)._displayAux(null, { isShowNull: false, isShowUndefined: true, isShowRedBlackNIL: true });
|
|
183
|
+
expect(layout[0][0]).toBe('─');
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
it('_displayAux: isNIL(node) shows "S" when isShowRedBlackNIL=true', () => {
|
|
187
|
+
const t = new BinaryTree<number, number>([], { isMapMode: false } as any);
|
|
188
|
+
const NIL = (t as any)._NIL;
|
|
189
|
+
const layout = (t as any)._displayAux(NIL, { isShowNull: true, isShowUndefined: true, isShowRedBlackNIL: true });
|
|
190
|
+
expect(layout[0][0]).toContain('S');
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it('_swapProperties updates value when mapMode=false (covers !this._isMapMode assignments)', () => {
|
|
194
|
+
const t = new BinaryTree<number, number>([], { isMapMode: false });
|
|
195
|
+
const a: any = t.createNode(1, 10);
|
|
196
|
+
const b: any = t.createNode(2, 20);
|
|
197
|
+
(t as any)._swapProperties(a, b);
|
|
198
|
+
expect(a.key).toBe(2);
|
|
199
|
+
expect(a.value).toBe(20);
|
|
200
|
+
expect(b.key).toBe(1);
|
|
201
|
+
expect(b.value).toBe(10);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
it('_ensurePredicate for nullish input returns a predicate (covers nullish early return + ternary branch)', () => {
|
|
205
|
+
const t = new BinaryTree<number, number>([], { isMapMode: false });
|
|
206
|
+
const p = (t as any)._ensurePredicate(undefined);
|
|
207
|
+
expect(p(null)).toBe(false);
|
|
208
|
+
// also call with a truthy node to cover the other arm of (node ? false : false)
|
|
209
|
+
expect(p(t.createNode(1, 1) as any)).toBe(false);
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
it('_ensurePredicate for entry and for key returns false on null node (covers `if (!node) return false`)', () => {
|
|
213
|
+
const t = new BinaryTree<number, number>([], { isMapMode: false });
|
|
214
|
+
const pEntry = (t as any)._ensurePredicate([1, 1]);
|
|
215
|
+
const pKey = (t as any)._ensurePredicate(1);
|
|
216
|
+
expect(pEntry(null)).toBe(false);
|
|
217
|
+
expect(pKey(null)).toBe(false);
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
it('_extractKey returns undefined when passing _NIL', () => {
|
|
221
|
+
const t = new BinaryTree<number, number>([], { isMapMode: false } as any);
|
|
222
|
+
expect((t as any)._extractKey((t as any)._NIL)).toBeUndefined();
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
it('_setValue returns false when value is undefined (covers value===undefined guard)', () => {
|
|
226
|
+
const t = new BinaryTree<number, number>([], { isMapMode: true });
|
|
227
|
+
expect((t as any)._setValue(1, undefined)).toBe(false);
|
|
228
|
+
});
|
|
229
|
+
});
|