1+ /*---------------------------------------------------------------------------------------------
2+ * Copyright (c) Microsoft Corporation. All rights reserved.
3+ * Licensed under the MIT License. See License.txt in the project root for license information.
4+ *--------------------------------------------------------------------------------------------*/
5+
6+ import * as assert from 'assert' ;
7+ import { ITreeNode , ITreeRenderer } from 'vs/base/browser/ui/tree/tree' ;
8+ import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list' ;
9+ import { ObjectTree } from 'vs/base/browser/ui/tree/objectTree' ;
10+ import { Iterator } from 'vs/base/common/iterator' ;
11+
12+ suite ( 'ObjectTree' , function ( ) {
13+ suite ( 'TreeNavigator' , function ( ) {
14+ let tree : ObjectTree < number > ;
15+ let filter = ( _ : number ) => true ;
16+
17+ setup ( ( ) => {
18+ const container = document . createElement ( 'div' ) ;
19+ container . style . width = '200px' ;
20+ container . style . height = '200px' ;
21+
22+ const delegate = new class implements IListVirtualDelegate < number > {
23+ getHeight ( ) { return 20 ; }
24+ getTemplateId ( ) : string { return 'default' ; }
25+ } ;
26+
27+ const renderer = new class implements ITreeRenderer < number , void , HTMLElement > {
28+ readonly templateId = 'default' ;
29+ renderTemplate ( container : HTMLElement ) : HTMLElement {
30+ return container ;
31+ }
32+ renderElement ( element : ITreeNode < number , void > , index : number , templateData : HTMLElement ) : void {
33+ templateData . textContent = `${ element . element } ` ;
34+ }
35+ disposeTemplate ( ) : void { }
36+ } ;
37+
38+ tree = new ObjectTree < number > ( container , delegate , [ renderer ] , { filter : { filter : ( el ) => filter ( el ) } } ) ;
39+ tree . layout ( 200 ) ;
40+ } ) ;
41+
42+ teardown ( ( ) => {
43+ tree . dispose ( ) ;
44+ } ) ;
45+
46+ test ( 'should be able to navigate' , ( ) => {
47+ tree . setChildren ( null , Iterator . fromArray ( [
48+ {
49+ element : 0 , children : Iterator . fromArray ( [
50+ { element : 10 } ,
51+ { element : 11 } ,
52+ { element : 12 } ,
53+ ] )
54+ } ,
55+ { element : 1 } ,
56+ { element : 2 }
57+ ] ) ) ;
58+
59+ const navigator = tree . navigate ( ) ;
60+
61+ assert . equal ( navigator . current ( ) , null ) ;
62+ assert . equal ( navigator . next ( ) , 0 ) ;
63+ assert . equal ( navigator . current ( ) , 0 ) ;
64+ assert . equal ( navigator . next ( ) , 10 ) ;
65+ assert . equal ( navigator . current ( ) , 10 ) ;
66+ assert . equal ( navigator . next ( ) , 11 ) ;
67+ assert . equal ( navigator . current ( ) , 11 ) ;
68+ assert . equal ( navigator . next ( ) , 12 ) ;
69+ assert . equal ( navigator . current ( ) , 12 ) ;
70+ assert . equal ( navigator . next ( ) , 1 ) ;
71+ assert . equal ( navigator . current ( ) , 1 ) ;
72+ assert . equal ( navigator . next ( ) , 2 ) ;
73+ assert . equal ( navigator . current ( ) , 2 ) ;
74+ assert . equal ( navigator . previous ( ) , 1 ) ;
75+ assert . equal ( navigator . current ( ) , 1 ) ;
76+ assert . equal ( navigator . previous ( ) , 12 ) ;
77+ assert . equal ( navigator . previous ( ) , 11 ) ;
78+ assert . equal ( navigator . previous ( ) , 10 ) ;
79+ assert . equal ( navigator . previous ( ) , 0 ) ;
80+ assert . equal ( navigator . previous ( ) , null ) ;
81+ assert . equal ( navigator . next ( ) , 0 ) ;
82+ assert . equal ( navigator . next ( ) , 10 ) ;
83+ assert . equal ( navigator . parent ( ) , 0 ) ;
84+ assert . equal ( navigator . parent ( ) , null ) ;
85+ assert . equal ( navigator . first ( ) , 0 ) ;
86+ assert . equal ( navigator . last ( ) , 2 ) ;
87+ } ) ;
88+
89+ test ( 'should skip collapsed nodes' , ( ) => {
90+ tree . setChildren ( null , Iterator . fromArray ( [
91+ {
92+ element : 0 , collapsed : true , children : Iterator . fromArray ( [
93+ { element : 10 } ,
94+ { element : 11 } ,
95+ { element : 12 } ,
96+ ] )
97+ } ,
98+ { element : 1 } ,
99+ { element : 2 }
100+ ] ) ) ;
101+
102+ const navigator = tree . navigate ( ) ;
103+
104+ assert . equal ( navigator . current ( ) , null ) ;
105+ assert . equal ( navigator . next ( ) , 0 ) ;
106+ assert . equal ( navigator . next ( ) , 1 ) ;
107+ assert . equal ( navigator . next ( ) , 2 ) ;
108+ assert . equal ( navigator . next ( ) , null ) ;
109+ assert . equal ( navigator . previous ( ) , 2 ) ;
110+ assert . equal ( navigator . previous ( ) , 1 ) ;
111+ assert . equal ( navigator . previous ( ) , 0 ) ;
112+ assert . equal ( navigator . previous ( ) , null ) ;
113+ assert . equal ( navigator . next ( ) , 0 ) ;
114+ assert . equal ( navigator . parent ( ) , null ) ;
115+ assert . equal ( navigator . first ( ) , 0 ) ;
116+ assert . equal ( navigator . last ( ) , 2 ) ;
117+ } ) ;
118+
119+ test ( 'should skip filtered elements' , ( ) => {
120+ filter = el => el % 2 === 0 ;
121+
122+ tree . setChildren ( null , Iterator . fromArray ( [
123+ {
124+ element : 0 , children : Iterator . fromArray ( [
125+ { element : 10 } ,
126+ { element : 11 } ,
127+ { element : 12 } ,
128+ ] )
129+ } ,
130+ { element : 1 } ,
131+ { element : 2 }
132+ ] ) ) ;
133+
134+ const navigator = tree . navigate ( ) ;
135+
136+ assert . equal ( navigator . current ( ) , null ) ;
137+ assert . equal ( navigator . next ( ) , 0 ) ;
138+ assert . equal ( navigator . next ( ) , 10 ) ;
139+ assert . equal ( navigator . next ( ) , 12 ) ;
140+ assert . equal ( navigator . next ( ) , 2 ) ;
141+ assert . equal ( navigator . next ( ) , null ) ;
142+ assert . equal ( navigator . previous ( ) , 2 ) ;
143+ assert . equal ( navigator . previous ( ) , 12 ) ;
144+ assert . equal ( navigator . previous ( ) , 10 ) ;
145+ assert . equal ( navigator . previous ( ) , 0 ) ;
146+ assert . equal ( navigator . previous ( ) , null ) ;
147+ assert . equal ( navigator . next ( ) , 0 ) ;
148+ assert . equal ( navigator . next ( ) , 10 ) ;
149+ assert . equal ( navigator . parent ( ) , 0 ) ;
150+ assert . equal ( navigator . parent ( ) , null ) ;
151+ assert . equal ( navigator . first ( ) , 0 ) ;
152+ assert . equal ( navigator . last ( ) , 2 ) ;
153+ } ) ;
154+ } ) ;
155+ } ) ;
0 commit comments