Skip to content

Commit 5386107

Browse files
committed
change to object representation
1 parent 2cec420 commit 5386107

File tree

3 files changed

+150
-39
lines changed

3 files changed

+150
-39
lines changed

src/material/tree/testing/shared.spec.ts

Lines changed: 89 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -100,32 +100,101 @@ export function runHarnessTests(
100100
it ('should correctly get tree structure', async () => {
101101
const trees = await loader.getAllHarnesses(treeHarness);
102102
const flatTree = trees[0];
103-
expect(await flatTree.getStructureText()).toEqual(
104-
`Flat Group 1
105-
Flat Group 2`);
103+
104+
expect(await flatTree.getTreeStructure()).toEqual({
105+
children: [
106+
{text: 'Flat Group 1'},
107+
{text: 'Flat Group 2'}
108+
]
109+
});
110+
111+
const firstGroup = (await flatTree.getNodes({text: /Flat Group 1/}))[0];
112+
await firstGroup.expand();
113+
114+
expect(await flatTree.getTreeStructure()).toEqual({
115+
children: [
116+
{
117+
text: 'Flat Group 1', children: [
118+
{text: 'Flat Leaf 1.1'},
119+
{text: 'Flat Leaf 1.2'},
120+
{text: 'Flat Leaf 1.3'}]
121+
},
122+
{text: 'Flat Group 2'}
123+
]
124+
});
125+
126+
const secondGroup = (await flatTree.getNodes({text: /Flat Group 2/}))[0];
127+
await secondGroup.expand();
128+
129+
expect(await flatTree.getTreeStructure()).toEqual({
130+
children: [
131+
{
132+
text: 'Flat Group 1', children: [
133+
{text: 'Flat Leaf 1.1'},
134+
{text: 'Flat Leaf 1.2'},
135+
{text: 'Flat Leaf 1.3'}]
136+
},
137+
{
138+
text: 'Flat Group 2', children: [
139+
{text: 'Flat Group 2.1'},
140+
]
141+
}
142+
]
143+
});
106144
});
107145

108146
it('should correctly get tree structure', async () => {
109147
const trees = await loader.getAllHarnesses(treeHarness);
110148
const nestedTree = trees[1];
111-
expect(await nestedTree.getStructureText()).toEqual(
112-
`Nested Group 1
113-
\tNested Leaf 1.1
114-
\tNested Leaf 1.2
115-
\tNested Leaf 1.3
116-
Nested Group 2
117-
\tNested Group 2.1
118-
\t\tNested Leaf 2.1.1
119-
\t\tNested Leaf 2.1.2`);
149+
expect(await nestedTree.getTreeStructure()).toEqual({
150+
children: [
151+
{text: 'Nested Group 1'},
152+
{text: 'Nested Group 2'}
153+
]
154+
});
155+
156+
const firstGroup = (await nestedTree.getNodes({text: /Nested Group 1/}))[0];
157+
await firstGroup.expand();
158+
expect(await nestedTree.getTreeStructure()).toEqual(
159+
{
160+
children: [
161+
{
162+
text: 'Nested Group 1', children: [
163+
{text: 'Nested Leaf 1.1'},
164+
{text: 'Nested Leaf 1.2'},
165+
{text: 'Nested Leaf 1.3'}]
166+
},
167+
{text: 'Nested Group 2'}
168+
]
169+
});
170+
171+
const secondGroup = (await nestedTree.getNodes({text: /Nested Group 2/}))[0];
172+
await secondGroup.expand();
173+
expect(await nestedTree.getTreeStructure()).toEqual(
174+
{
175+
children: [
176+
{
177+
text: 'Nested Group 1', children: [
178+
{text: 'Nested Leaf 1.1'},
179+
{text: 'Nested Leaf 1.2'},
180+
{text: 'Nested Leaf 1.3'}]
181+
},
182+
{
183+
text: 'Nested Group 2', children: [
184+
{text: 'Nested Group 2.1'},
185+
]
186+
}
187+
]
188+
});
120189
});
121190
}
122191

123-
interface FoodNode {
192+
interface Node {
124193
name: string;
125-
children?: FoodNode[];
194+
children?: Node[];
126195
}
127196

128-
const FLAT_TREE_DATA: FoodNode[] = [
197+
const FLAT_TREE_DATA: Node[] = [
129198
{
130199
name: 'Flat Group 1',
131200
children: [
@@ -148,7 +217,7 @@ const FLAT_TREE_DATA: FoodNode[] = [
148217
},
149218
];
150219

151-
const NESTED_TREE_DATA: FoodNode[] = [
220+
const NESTED_TREE_DATA: Node[] = [
152221
{
153222
name: 'Nested Group 1',
154223
children: [
@@ -210,7 +279,7 @@ interface ExampleFlatNode {
210279
`
211280
})
212281
class TreeHarnessTest {
213-
private _transformer = (node: FoodNode, level: number) => {
282+
private _transformer = (node: Node, level: number) => {
214283
return {
215284
expandable: !!node.children && node.children.length > 0,
216285
name: node.name,
@@ -223,8 +292,8 @@ class TreeHarnessTest {
223292
flatTreeControl = new FlatTreeControl<ExampleFlatNode>(
224293
node => node.level, node => node.expandable);
225294
flatTreeDataSource = new MatTreeFlatDataSource(this.flatTreeControl, this.treeFlattener);
226-
nestedTreeControl = new NestedTreeControl<FoodNode>(node => node.children);
227-
nestedTreeDataSource = new MatTreeNestedDataSource<FoodNode>();
295+
nestedTreeControl = new NestedTreeControl<Node>(node => node.children);
296+
nestedTreeDataSource = new MatTreeNestedDataSource<Node>();
228297

229298
constructor() {
230299
this.flatTreeDataSource.data = FLAT_TREE_DATA;
@@ -233,5 +302,5 @@ class TreeHarnessTest {
233302

234303
flatTreeHasChild = (_: number, node: ExampleFlatNode) => node.expandable;
235304

236-
nestedTreeHasChild = (_: number, node: FoodNode) => !!node.children && node.children.length > 0;
305+
nestedTreeHasChild = (_: number, node: Node) => !!node.children && node.children.length > 0;
237306
}

src/material/tree/testing/tree-harness.ts

Lines changed: 60 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ import {ComponentHarness, HarnessPredicate} from '@angular/cdk/testing';
1010
import {MatTreeNodeHarness} from './node-harness';
1111
import {TreeHarnessFilters, TreeNodeHarnessFilters} from './tree-harness-filters';
1212

13+
type TreeNode = {
14+
text?: string;
15+
children?: TreeNode[];
16+
};
17+
1318
/** Harness for interacting with a standard mat-tree in tests. */
1419
export class MatTreeHarness extends ComponentHarness {
1520
/** The selector for the host element of a `MatTableHarness` instance. */
@@ -30,9 +35,10 @@ export class MatTreeHarness extends ComponentHarness {
3035
}
3136

3237
/**
33-
* String representation of the tree structure.
38+
* Object representation of the visible tree structure.
39+
* If a node is under an unexpanded node it will not be shown here.
3440
* Eg.
35-
* Tree:
41+
* Tree (all nodes expanded):
3642
* `
3743
* <mat-tree>
3844
* <mat-tree-node>Node 1<mat-tree-node>
@@ -50,25 +56,61 @@ export class MatTreeHarness extends ComponentHarness {
5056
* <mat-nested-tree-node>
5157
* </mat-tree>`
5258
*
53-
* Structured text:
54-
* Node 1
55-
* Node 2
56-
* Node 2.1
57-
* Node 2.1.1
58-
* Node 2.2
59+
* Tree structure:
60+
* {
61+
* children: [
62+
* {
63+
* text: 'Node 1', children: [{
64+
* text: 'Node 2', children: [{
65+
* text: 'Node 2.1', children: [{text: 'Node 2.1.1'}]
66+
* },
67+
* {text: 'Node 2.2'}]
68+
* }]
69+
* }]
70+
* };
5971
*/
60-
async getStructureText(): Promise<string> {
61-
let treeString = '';
72+
async getTreeStructure(): Promise<TreeNode> {
6273
const nodes = await this.getNodes();
63-
const levelsAndText = await Promise.all(nodes.map(node => {
64-
return Promise.all([node.getLevel(), node.getText()]);
74+
const nodeInformation = await Promise.all(nodes.map(node => {
75+
return Promise.all([node.getLevel(), node.getText(), node.isExpanded()]);
6576
}));
66-
for (let i = 0; i < nodes.length; i++) {
67-
const [level, text] = levelsAndText[i];
68-
treeString += i === 0 ? '' : '\n';
69-
treeString += '\t'.repeat(level - 1);
70-
treeString += text;
77+
return this._getTreeStructureRecursion(nodeInformation, 1, true);
78+
}
79+
80+
private _getTreeStructureRecursion(tree: [number, string, boolean][],
81+
level: number,
82+
parentExpanded: boolean): TreeNode {
83+
let result: TreeNode = {};
84+
for (let i = 0; i < tree.length; i++) {
85+
const [nodeLevel, text, expanded] = tree[i];
86+
const nextLevel = tree[i + 1]?.[0] ?? -1;
87+
if (nodeLevel < level) {
88+
parentExpanded = true;
89+
return result;
90+
}
91+
if (nodeLevel > level) {
92+
continue;
93+
}
94+
if (parentExpanded) {
95+
if (nextLevel == level) {
96+
this._addChildToNode(result, {text: text});
97+
} else if (nextLevel > level) {
98+
let children = this._getTreeStructureRecursion(tree.slice(i + 1),
99+
nextLevel,
100+
expanded)?.children;
101+
let child = children ? {text: text, children: children} : {text: text};
102+
this._addChildToNode(result, child);
103+
104+
} else {
105+
this._addChildToNode(result, {text: text});
106+
return result;
107+
}
108+
}
71109
}
72-
return treeString;
110+
return result;
111+
}
112+
113+
private _addChildToNode(result: TreeNode, child: TreeNode) {
114+
result.children ? result.children.push(child) : result.children = [child];
73115
}
74116
}

tools/public_api_guard/material/tree/testing.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export declare class MatTreeHarness extends ComponentHarness {
22
getNodes(filter?: TreeNodeHarnessFilters): Promise<MatTreeNodeHarness[]>;
3-
getTreeStructure(): Promise<string>;
3+
getTreeStructure(): Promise<TreeNode>;
44
static hostSelector: string;
55
static with(options?: TreeHarnessFilters): HarnessPredicate<MatTreeHarness>;
66
}

0 commit comments

Comments
 (0)