Skip to content

Commit a8e7ed0

Browse files
committed
first successful CollapsibleTreeModel tests, woo
1 parent dd5e23b commit a8e7ed0

3 files changed

Lines changed: 48 additions & 2 deletions

File tree

src/vs/base/browser/ui/list/treeModel.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
'use strict';
77

88
import { ISpliceable } from 'vs/base/common/sequence';
9-
import { IIterator, map, collect, forEach, iter } from 'vs/base/common/iterator';
9+
import { IIterator, map, collect, forEach, iter, empty } from 'vs/base/common/iterator';
1010
import { last } from 'vs/base/common/arrays';
1111
import { Tree } from 'vs/base/common/tree';
1212

@@ -127,6 +127,17 @@ interface ICollapsibleElement<T> {
127127
export type ICollapsibleTreeElement<T> = ITreeElement<ICollapsibleElement<T>>;
128128
export type ICollapsibleTreeListElement<T> = ITreeListElement<ICollapsibleElement<T>>;
129129

130+
function asVisibleElement<T>(element: ICollapsibleTreeElement<T>): ICollapsibleTreeElement<T> {
131+
if (element.element.collapsed) {
132+
return { element: element.element, children: empty() };
133+
}
134+
135+
return {
136+
element: element.element,
137+
children: map(element.children, asVisibleElement)
138+
};
139+
}
140+
130141
export class CollapsibleTreeModel<T> {
131142

132143
private model = new Tree<ICollapsibleElement<T>>();
@@ -145,7 +156,7 @@ export class CollapsibleTreeModel<T> {
145156
const isVisible = ancestors.every(el => !el.collapsed);
146157

147158
if (isVisible) {
148-
this.viewModel.splice(location, deleteCount, elementsToInsert);
159+
this.viewModel.splice(location, deleteCount, map(elementsToInsert, asVisibleElement));
149160
}
150161

151162
return result;

src/vs/base/common/iterator.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,16 @@ export interface IIterator<T> {
1414
next(): IIteratorResult<T>;
1515
}
1616

17+
const _empty: IIterator<any> = {
18+
next() {
19+
return { done: true, value: undefined };
20+
}
21+
};
22+
23+
export function empty<T>(): IIterator<T> {
24+
return _empty;
25+
}
26+
1727
export function iter<T>(array: T[], index = 0, length = array.length): IIterator<T> {
1828
return {
1929
next(): IIteratorResult<T> {

src/vs/base/test/browser/ui/list/treeModel.test.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,4 +205,29 @@ suite('CollapsibleTreeModel', () => {
205205
assert.deepEqual(list[5].element.element, 2);
206206
assert.deepEqual(list[5].depth, 1);
207207
});
208+
209+
test('deep insert collapsed', () => {
210+
const list = [] as ICollapsibleTreeListElement<number>[];
211+
const model = new CollapsibleTreeModel<number>(toSpliceable(list));
212+
213+
model.splice([0], 0, iter([
214+
{
215+
element: { element: 0, collapsed: true }, children: iter([
216+
{ element: { element: 10, collapsed: false }, children: iter([]) },
217+
{ element: { element: 11, collapsed: false }, children: iter([]) },
218+
{ element: { element: 12, collapsed: false }, children: iter([]) },
219+
])
220+
},
221+
{ element: { element: 1, collapsed: false }, children: iter([]) },
222+
{ element: { element: 2, collapsed: false }, children: iter([]) }
223+
]));
224+
225+
assert.deepEqual(list.length, 3);
226+
assert.deepEqual(list[0].element.element, 0);
227+
assert.deepEqual(list[0].depth, 1);
228+
assert.deepEqual(list[1].element.element, 1);
229+
assert.deepEqual(list[1].depth, 1);
230+
assert.deepEqual(list[2].element.element, 2);
231+
assert.deepEqual(list[2].depth, 1);
232+
});
208233
});

0 commit comments

Comments
 (0)