-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathtree.test.ts
More file actions
102 lines (84 loc) · 3.37 KB
/
Copy pathtree.test.ts
File metadata and controls
102 lines (84 loc) · 3.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import { describe, it, expect } from 'vitest';
import { buildTree, nodeCheckState } from '../src/tree';
import { FileObj, FolderNode, FileNode } from '../src/types';
describe('tree utils', () => {
const createFileObj = (path: string, selected = true): FileObj => ({
file: new File(['content'], path.split('/').pop() || 'file'),
path,
selected,
isBinary: false,
});
describe('buildTree', () => {
it('builds a folder node tree hierarchy from flat file paths', () => {
const files: FileObj[] = [
createFileObj('src/components/Button.tsx'),
createFileObj('src/index.ts'),
createFileObj('README.md'),
];
const tree = buildTree(files);
expect(tree.isFolder).toBe(true);
expect(tree.children.size).toBe(2); // 'src' and 'README.md'
expect(tree.children.has('src')).toBe(true);
expect(tree.children.has('README.md')).toBe(true);
const srcFolder = tree.children.get('src') as FolderNode;
expect(srcFolder.isFolder).toBe(true);
expect(srcFolder.children.size).toBe(2); // 'components' and 'index.ts'
const buttonFile = (srcFolder.children.get('components') as FolderNode).children.get('Button.tsx') as FileNode;
expect(buttonFile.isFolder).toBe(false);
expect(buttonFile.item.path).toBe('src/components/Button.tsx');
});
it('returns empty root node for empty file list', () => {
const tree = buildTree([]);
expect(tree.isFolder).toBe(true);
expect(tree.children.size).toBe(0);
});
});
describe('nodeCheckState', () => {
it('returns 1 for selected file node and 0 for unselected file node', () => {
const selectedFileNode: FileNode = {
isFolder: false,
name: 'a.ts',
path: 'a.ts',
item: createFileObj('a.ts', true),
};
const unselectedFileNode: FileNode = {
isFolder: false,
name: 'b.ts',
path: 'b.ts',
item: createFileObj('b.ts', false),
};
expect(nodeCheckState(selectedFileNode)).toBe(1);
expect(nodeCheckState(unselectedFileNode)).toBe(0);
});
it('returns 1 when all child nodes of a folder are selected', () => {
const files = [createFileObj('src/a.ts', true), createFileObj('src/b.ts', true)];
const tree = buildTree(files);
const srcNode = tree.children.get('src')!;
expect(nodeCheckState(srcNode)).toBe(1);
expect(nodeCheckState(tree)).toBe(1);
});
it('returns 0 when no child nodes of a folder are selected', () => {
const files = [createFileObj('src/a.ts', false), createFileObj('src/b.ts', false)];
const tree = buildTree(files);
const srcNode = tree.children.get('src')!;
expect(nodeCheckState(srcNode)).toBe(0);
expect(nodeCheckState(tree)).toBe(0);
});
it('returns 0.5 when children have mixed selection state (indeterminate)', () => {
const files = [createFileObj('src/a.ts', true), createFileObj('src/b.ts', false)];
const tree = buildTree(files);
const srcNode = tree.children.get('src')!;
expect(nodeCheckState(srcNode)).toBe(0.5);
expect(nodeCheckState(tree)).toBe(0.5);
});
it('returns 0 for empty folder node', () => {
const emptyFolder: FolderNode = {
isFolder: true,
name: 'empty',
path: 'empty',
children: new Map(),
};
expect(nodeCheckState(emptyFolder)).toBe(0);
});
});
});