Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
842fdc7d
V
vscode
项目概览
xxadev
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
842fdc7d
编写于
6月 23, 2018
作者:
J
Joao Moreno
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
unify tree models
上级
a8e7ed08
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
79 addition
and
256 deletion
+79
-256
src/vs/base/browser/ui/list/treeModel.ts
src/vs/base/browser/ui/list/treeModel.ts
+47
-105
src/vs/base/test/browser/ui/list/treeModel.test.ts
src/vs/base/test/browser/ui/list/treeModel.test.ts
+32
-151
未找到文件。
src/vs/base/browser/ui/list/treeModel.ts
浏览文件 @
842fdc7d
...
...
@@ -6,105 +6,91 @@
'
use strict
'
;
import
{
ISpliceable
}
from
'
vs/base/common/sequence
'
;
import
{
IIterator
,
map
,
collect
,
forEach
,
iter
,
empty
}
from
'
vs/base/common/iterator
'
;
import
{
IIterator
,
map
,
collect
,
iter
}
from
'
vs/base/common/iterator
'
;
import
{
last
}
from
'
vs/base/common/arrays
'
;
import
{
Tree
}
from
'
vs/base/common/tree
'
;
/**
* TODO:
* remove trie
* remo
te bas
e tree
* remo
v
e tree
*/
export
interface
ITreeElement
<
T
>
{
readonly
element
:
T
;
readonly
children
:
IIterator
<
ITreeElement
<
T
>>
;
readonly
collapsed
:
boolean
;
}
export
interface
ITreeListElement
<
T
>
{
readonly
element
:
T
;
readonly
collapsed
:
boolean
;
readonly
depth
:
number
;
}
class
TreeNode
<
T
>
implements
ITreeListElement
<
T
>
{
static
createRoot
<
T
>
(
element
:
T
):
TreeNode
<
T
>
{
const
node
=
new
TreeNode
<
T
>
(
element
);
node
.
children
=
[];
node
.
count
=
1
;
node
.
depth
=
0
;
return
node
;
}
static
createNode
<
T
>
(
treeElement
:
ITreeElement
<
T
>
,
depth
:
number
,
list
:
ITreeListElement
<
T
>
[]):
TreeNode
<
T
>
{
const
node
=
new
TreeNode
<
T
>
(
treeElement
.
element
);
list
.
push
(
node
);
let
count
=
1
;
const
children
:
TreeNode
<
T
>
[]
=
[];
forEach
(
treeElement
.
children
,
child
=>
{
const
node
=
TreeNode
.
createNode
<
T
>
(
child
,
depth
+
1
,
list
);
children
.
push
(
node
);
count
+=
node
.
count
;
});
interface
ITreeNode
<
T
>
{
readonly
element
:
T
;
readonly
children
:
ITreeNode
<
T
>
[];
readonly
depth
:
number
;
collapsed
:
boolean
;
visibleCount
:
number
;
}
node
.
children
=
children
;
node
.
count
=
count
;
node
.
depth
=
depth
;
function
treeElementToNode
<
T
>
(
treeElement
:
ITreeElement
<
T
>
,
depth
:
number
,
visible
:
boolean
,
visibleElements
:
ITreeListElement
<
T
>
[]):
ITreeNode
<
T
>
{
const
{
element
,
collapsed
}
=
treeElement
;
return
node
;
if
(
visible
)
{
visibleElements
.
push
({
element
,
collapsed
,
depth
});
}
children
:
TreeNode
<
T
>
[];
count
:
number
;
depth
:
number
;
private
constructor
(
public
element
:
T
)
{
}
const
children
=
collect
(
map
(
treeElement
.
children
,
el
=>
treeElementToNode
(
el
,
depth
+
1
,
visible
&&
!
treeElement
.
collapsed
,
visibleElements
)));
const
visibleCount
=
children
.
reduce
((
r
,
c
)
=>
r
+
(
c
.
collapsed
?
1
:
c
.
visibleCount
),
1
);
splice
(
index
:
number
,
deleteCount
:
number
,
toInsert
:
IIterator
<
ITreeElement
<
T
>>
):
{
listDeleteCount
:
number
;
listElements
:
ITreeListElement
<
T
>
[];
deletedNodes
:
TreeNode
<
T
>
[];
}
{
const
listElements
=
[]
as
ITreeListElement
<
T
>
[];
const
nodesToInsert
=
collect
(
map
(
toInsert
,
e
=>
TreeNode
.
createNode
<
T
>
(
e
,
this
.
depth
+
1
,
listElements
)));
const
listAddCount
=
nodesToInsert
.
reduce
((
r
,
n
)
=>
r
+
n
.
count
,
0
);
const
deletedNodes
=
this
.
children
.
splice
(
index
,
deleteCount
,
...
nodesToInsert
);
const
listDeleteCount
=
deletedNodes
.
reduce
((
r
,
n
)
=>
r
+
n
.
count
,
0
);
this
.
count
+=
listAddCount
-
listDeleteCount
;
return
{
listDeleteCount
,
listElements
,
deletedNodes
};
}
return
{
element
,
children
,
depth
,
collapsed
,
visibleCount
};
}
function
createTreeElementFromTreeNode
<
T
>
(
node
:
TreeNode
<
T
>
):
ITreeElement
<
T
>
{
return
{
element
:
node
.
element
,
children
:
map
(
iter
(
node
.
children
),
createTreeElementFromTreeNode
)
};
function
treeNodeToElement
<
T
>
(
node
:
I
TreeNode
<
T
>
):
ITreeElement
<
T
>
{
const
{
element
,
collapsed
}
=
node
;
const
children
=
map
(
iter
(
node
.
children
),
treeNodeToElement
);
return
{
element
,
children
,
collapsed
};
}
export
class
TreeModel
<
T
>
{
private
root
=
TreeNode
.
createRoot
<
T
>
(
undefined
);
private
root
:
ITreeNode
<
T
>
=
{
element
:
undefined
,
children
:
[],
depth
:
0
,
collapsed
:
false
,
visibleCount
:
1
};
constructor
(
private
spliceable
:
ISpliceable
<
ITreeListElement
<
T
>>
)
{
}
constructor
(
private
list
:
ISpliceable
<
ITreeListElement
<
T
>>
)
{
}
splice
(
location
:
number
[],
deleteCount
:
number
,
toInsert
:
IIterator
<
ITreeElement
<
T
>>
):
IIterator
<
ITreeElement
<
T
>>
{
if
(
location
.
length
===
0
)
{
throw
new
Error
(
'
Invalid tree location
'
);
}
const
{
parentNode
,
parentListIndex
}
=
this
.
findParentNode
(
location
);
const
{
parentNode
,
parentListIndex
,
visible
}
=
this
.
findParentNode
(
location
);
const
listToInsert
:
ITreeListElement
<
T
>
[]
=
[];
const
nodesToInsert
=
collect
(
map
(
toInsert
,
el
=>
treeElementToNode
(
el
,
parentNode
.
depth
+
1
,
visible
,
listToInsert
)));
const
index
=
last
(
location
);
const
{
listDeleteCount
,
listElements
,
deletedNodes
}
=
parentNode
.
splice
(
index
,
deleteCount
,
toInsert
);
const
deletedNodes
=
parentNode
.
children
.
splice
(
index
,
deleteCount
,
...
nodesToInsert
);
parentNode
.
visibleCount
+=
nodesToInsert
.
reduce
((
r
,
c
)
=>
r
+
(
c
.
collapsed
?
1
:
c
.
visibleCount
),
1
)
-
deletedNodes
.
reduce
((
r
,
c
)
=>
r
+
(
c
.
collapsed
?
1
:
c
.
visibleCount
),
1
);
this
.
spliceable
.
splice
(
parentListIndex
+
index
,
listDeleteCount
,
listElements
);
if
(
visible
)
{
const
listDeleteCount
=
deletedNodes
.
reduce
((
r
,
c
)
=>
r
+
(
c
.
collapsed
?
1
:
c
.
visibleCount
),
1
);
this
.
list
.
splice
(
parentListIndex
+
index
,
listDeleteCount
,
listToInsert
);
}
return
map
(
iter
(
deletedNodes
),
createTreeElementFromTreeNode
);
return
map
(
iter
(
deletedNodes
),
treeNodeToElement
);
}
private
findParentNode
(
location
:
number
[],
node
:
TreeNode
<
T
>
=
this
.
root
,
listIndex
:
number
=
0
):
{
parentNode
:
TreeNode
<
T
>
;
parentListIndex
:
number
}
{
private
findParentNode
(
location
:
number
[],
node
:
ITreeNode
<
T
>
=
this
.
root
,
listIndex
:
number
=
0
,
visible
=
true
):
{
parentNode
:
ITreeNode
<
T
>
;
parentListIndex
:
number
;
visible
:
boolean
;
}
{
if
(
location
.
length
===
1
)
{
return
{
parentNode
:
node
,
parentListIndex
:
listIndex
};
return
{
parentNode
:
node
,
parentListIndex
:
listIndex
,
visible
};
}
const
[
i
,
...
rest
]
=
location
;
...
...
@@ -112,53 +98,9 @@ export class TreeModel<T> {
// TODO@joao perf!
for
(
let
j
=
0
;
j
<
limit
;
j
++
)
{
listIndex
+=
node
.
children
[
j
].
c
ount
;
listIndex
+=
node
.
children
[
j
].
visibleC
ount
;
}
return
this
.
findParentNode
(
rest
,
node
.
children
[
i
],
listIndex
+
1
);
return
this
.
findParentNode
(
rest
,
node
.
children
[
i
],
listIndex
+
1
,
visible
&&
!
node
.
collapsed
);
}
}
interface
ICollapsibleElement
<
T
>
{
collapsed
:
boolean
;
element
:
T
;
}
export
type
ICollapsibleTreeElement
<
T
>
=
ITreeElement
<
ICollapsibleElement
<
T
>>
;
export
type
ICollapsibleTreeListElement
<
T
>
=
ITreeListElement
<
ICollapsibleElement
<
T
>>
;
function
asVisibleElement
<
T
>
(
element
:
ICollapsibleTreeElement
<
T
>
):
ICollapsibleTreeElement
<
T
>
{
if
(
element
.
element
.
collapsed
)
{
return
{
element
:
element
.
element
,
children
:
empty
()
};
}
return
{
element
:
element
.
element
,
children
:
map
(
element
.
children
,
asVisibleElement
)
};
}
export
class
CollapsibleTreeModel
<
T
>
{
private
model
=
new
Tree
<
ICollapsibleElement
<
T
>>
();
private
viewModel
:
TreeModel
<
ICollapsibleElement
<
T
>>
;
constructor
(
spliceable
:
ISpliceable
<
ICollapsibleTreeListElement
<
T
>>
)
{
this
.
viewModel
=
new
TreeModel
(
spliceable
);
}
splice
(
location
:
number
[],
deleteCount
:
number
,
toInsert
:
IIterator
<
ICollapsibleTreeElement
<
T
>>
):
IIterator
<
ICollapsibleTreeElement
<
T
>>
{
let
length
=
0
;
toInsert
=
map
(
toInsert
,
el
=>
{
length
++
;
return
el
;
});
const
result
=
this
.
model
.
splice
(
location
,
deleteCount
,
toInsert
);
const
[
ancestors
,
elementsToInsert
]
=
this
.
model
.
getElementRange
(
location
,
length
);
const
isVisible
=
ancestors
.
every
(
el
=>
!
el
.
collapsed
);
if
(
isVisible
)
{
this
.
viewModel
.
splice
(
location
,
deleteCount
,
map
(
elementsToInsert
,
asVisibleElement
));
}
return
result
;
}
}
}
\ No newline at end of file
src/vs/base/test/browser/ui/list/treeModel.test.ts
浏览文件 @
842fdc7d
...
...
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import
*
as
assert
from
'
assert
'
;
import
{
TreeModel
,
ITreeListElement
,
CollapsibleTreeModel
,
ICollapsibleTreeListElement
}
from
'
vs/base/browser/ui/list/treeModel
'
;
import
{
ITreeListElement
,
TreeModel
}
from
'
vs/base/browser/ui/list/treeModel
'
;
import
{
ISpliceable
}
from
'
vs/base/browser/ui/list/splice
'
;
import
{
iter
}
from
'
vs/base/common/iterator
'
;
...
...
@@ -30,17 +30,20 @@ suite('TreeModel2', () => {
const
model
=
new
TreeModel
<
number
>
(
toSpliceable
(
list
));
model
.
splice
([
0
],
0
,
iter
([
{
element
:
0
,
children
:
iter
([])
},
{
element
:
1
,
children
:
iter
([])
},
{
element
:
2
,
children
:
iter
([])
}
{
element
:
0
,
c
ollapsed
:
false
,
c
hildren
:
iter
([])
},
{
element
:
1
,
c
ollapsed
:
false
,
c
hildren
:
iter
([])
},
{
element
:
2
,
c
ollapsed
:
false
,
c
hildren
:
iter
([])
}
]));
assert
.
deepEqual
(
list
.
length
,
3
);
assert
.
deepEqual
(
list
[
0
].
element
,
0
);
assert
.
deepEqual
(
list
[
0
].
collapsed
,
false
);
assert
.
deepEqual
(
list
[
0
].
depth
,
1
);
assert
.
deepEqual
(
list
[
1
].
element
,
1
);
assert
.
deepEqual
(
list
[
1
].
collapsed
,
false
);
assert
.
deepEqual
(
list
[
1
].
depth
,
1
);
assert
.
deepEqual
(
list
[
2
].
element
,
2
);
assert
.
deepEqual
(
list
[
2
].
collapsed
,
false
);
assert
.
deepEqual
(
list
[
2
].
depth
,
1
);
});
...
...
@@ -50,184 +53,62 @@ suite('TreeModel2', () => {
model
.
splice
([
0
],
0
,
iter
([
{
element
:
0
,
children
:
iter
([
{
element
:
10
,
children
:
iter
([])
},
{
element
:
11
,
children
:
iter
([])
},
{
element
:
12
,
children
:
iter
([])
},
element
:
0
,
c
ollapsed
:
false
,
c
hildren
:
iter
([
{
element
:
10
,
c
ollapsed
:
false
,
c
hildren
:
iter
([])
},
{
element
:
11
,
c
ollapsed
:
false
,
c
hildren
:
iter
([])
},
{
element
:
12
,
c
ollapsed
:
false
,
c
hildren
:
iter
([])
},
])
},
{
element
:
1
,
children
:
iter
([])
},
{
element
:
2
,
children
:
iter
([])
}
{
element
:
1
,
c
ollapsed
:
false
,
c
hildren
:
iter
([])
},
{
element
:
2
,
c
ollapsed
:
false
,
c
hildren
:
iter
([])
}
]));
assert
.
deepEqual
(
list
.
length
,
6
);
assert
.
deepEqual
(
list
[
0
].
element
,
0
);
assert
.
deepEqual
(
list
[
0
].
collapsed
,
false
);
assert
.
deepEqual
(
list
[
0
].
depth
,
1
);
assert
.
deepEqual
(
list
[
1
].
element
,
10
);
assert
.
deepEqual
(
list
[
1
].
collapsed
,
false
);
assert
.
deepEqual
(
list
[
1
].
depth
,
2
);
assert
.
deepEqual
(
list
[
2
].
element
,
11
);
assert
.
deepEqual
(
list
[
2
].
collapsed
,
false
);
assert
.
deepEqual
(
list
[
2
].
depth
,
2
);
assert
.
deepEqual
(
list
[
3
].
element
,
12
);
assert
.
deepEqual
(
list
[
3
].
collapsed
,
false
);
assert
.
deepEqual
(
list
[
3
].
depth
,
2
);
assert
.
deepEqual
(
list
[
4
].
element
,
1
);
assert
.
deepEqual
(
list
[
4
].
collapsed
,
false
);
assert
.
deepEqual
(
list
[
4
].
depth
,
1
);
assert
.
deepEqual
(
list
[
5
].
element
,
2
);
assert
.
deepEqual
(
list
[
5
].
collapsed
,
false
);
assert
.
deepEqual
(
list
[
5
].
depth
,
1
);
});
test
(
'
delete
'
,
()
=>
{
const
list
=
[]
as
ITreeListElement
<
number
>
[];
const
model
=
new
TreeModel
<
number
>
(
toSpliceable
(
list
));
model
.
splice
([
0
],
0
,
iter
([
{
element
:
0
,
children
:
iter
([])
},
{
element
:
1
,
children
:
iter
([])
},
{
element
:
2
,
children
:
iter
([])
}
]));
model
.
splice
([
0
],
3
,
iter
([]));
assert
.
equal
(
list
.
length
,
0
);
});
test
(
'
nested delete
'
,
()
=>
{
const
list
=
[]
as
ITreeListElement
<
number
>
[];
const
model
=
new
TreeModel
<
number
>
(
toSpliceable
(
list
));
model
.
splice
([
0
],
0
,
iter
([
{
element
:
0
,
children
:
iter
([
{
element
:
10
,
children
:
iter
([])
},
{
element
:
11
,
children
:
iter
([])
},
{
element
:
12
,
children
:
iter
([])
},
])
},
{
element
:
1
,
children
:
iter
([])
},
{
element
:
2
,
children
:
iter
([])
}
]));
model
.
splice
([
0
,
1
],
1
,
iter
([]));
assert
.
deepEqual
(
list
.
length
,
5
,
'
list has 5 elements
'
);
assert
.
deepEqual
(
list
[
0
].
element
,
0
);
assert
.
deepEqual
(
list
[
0
].
depth
,
1
);
assert
.
deepEqual
(
list
[
1
].
element
,
10
);
assert
.
deepEqual
(
list
[
1
].
depth
,
2
);
assert
.
deepEqual
(
list
[
2
].
element
,
12
);
assert
.
deepEqual
(
list
[
2
].
depth
,
2
);
assert
.
deepEqual
(
list
[
3
].
element
,
1
);
assert
.
deepEqual
(
list
[
3
].
depth
,
1
);
assert
.
deepEqual
(
list
[
4
].
element
,
2
);
assert
.
deepEqual
(
list
[
4
].
depth
,
1
);
});
test
(
'
deep delete
'
,
()
=>
{
test
(
'
deep insert collapsed
'
,
()
=>
{
const
list
=
[]
as
ITreeListElement
<
number
>
[];
const
model
=
new
TreeModel
<
number
>
(
toSpliceable
(
list
));
model
.
splice
([
0
],
0
,
iter
([
{
element
:
0
,
children
:
iter
([
{
element
:
10
,
children
:
iter
([])
},
{
element
:
11
,
children
:
iter
([])
},
{
element
:
12
,
children
:
iter
([])
},
element
:
0
,
c
ollapsed
:
true
,
c
hildren
:
iter
([
{
element
:
10
,
c
ollapsed
:
false
,
c
hildren
:
iter
([])
},
{
element
:
11
,
c
ollapsed
:
false
,
c
hildren
:
iter
([])
},
{
element
:
12
,
c
ollapsed
:
false
,
c
hildren
:
iter
([])
},
])
},
{
element
:
1
,
children
:
iter
([])
},
{
element
:
2
,
children
:
iter
([])
}
]));
model
.
splice
([
0
],
1
,
iter
([]));
assert
.
deepEqual
(
list
.
length
,
2
,
'
list has 2 elements only
'
);
assert
.
deepEqual
(
list
[
0
].
element
,
1
);
assert
.
deepEqual
(
list
[
0
].
depth
,
1
);
assert
.
deepEqual
(
list
[
1
].
element
,
2
);
assert
.
deepEqual
(
list
[
1
].
depth
,
1
);
});
});
suite
(
'
CollapsibleTreeModel
'
,
()
=>
{
test
(
'
ctor
'
,
()
=>
{
const
list
=
[]
as
ICollapsibleTreeListElement
<
number
>
[];
const
model
=
new
CollapsibleTreeModel
<
number
>
(
toSpliceable
(
list
));
assert
(
model
);
assert
.
equal
(
list
.
length
,
0
);
});
test
(
'
insert
'
,
()
=>
{
const
list
=
[]
as
ICollapsibleTreeListElement
<
number
>
[];
const
model
=
new
CollapsibleTreeModel
<
number
>
(
toSpliceable
(
list
));
model
.
splice
([
0
],
0
,
iter
([
{
element
:
{
element
:
0
,
collapsed
:
false
},
children
:
iter
([])
},
{
element
:
{
element
:
1
,
collapsed
:
false
},
children
:
iter
([])
},
{
element
:
{
element
:
2
,
collapsed
:
false
},
children
:
iter
([])
}
{
element
:
1
,
collapsed
:
false
,
children
:
iter
([])
},
{
element
:
2
,
collapsed
:
false
,
children
:
iter
([])
}
]));
assert
.
deepEqual
(
list
.
length
,
3
);
assert
.
deepEqual
(
list
[
0
].
element
.
element
,
0
);
assert
.
deepEqual
(
list
[
0
].
depth
,
1
);
assert
.
deepEqual
(
list
[
1
].
element
.
element
,
1
);
assert
.
deepEqual
(
list
[
1
].
depth
,
1
);
assert
.
deepEqual
(
list
[
2
].
element
.
element
,
2
);
assert
.
deepEqual
(
list
[
2
].
depth
,
1
);
});
test
(
'
deep insert
'
,
()
=>
{
const
list
=
[]
as
ICollapsibleTreeListElement
<
number
>
[];
const
model
=
new
CollapsibleTreeModel
<
number
>
(
toSpliceable
(
list
));
model
.
splice
([
0
],
0
,
iter
([
{
element
:
{
element
:
0
,
collapsed
:
false
},
children
:
iter
([
{
element
:
{
element
:
10
,
collapsed
:
false
},
children
:
iter
([])
},
{
element
:
{
element
:
11
,
collapsed
:
false
},
children
:
iter
([])
},
{
element
:
{
element
:
12
,
collapsed
:
false
},
children
:
iter
([])
},
])
},
{
element
:
{
element
:
1
,
collapsed
:
false
},
children
:
iter
([])
},
{
element
:
{
element
:
2
,
collapsed
:
false
},
children
:
iter
([])
}
]));
assert
.
deepEqual
(
list
.
length
,
6
);
assert
.
deepEqual
(
list
[
0
].
element
.
element
,
0
);
assert
.
deepEqual
(
list
[
0
].
depth
,
1
);
assert
.
deepEqual
(
list
[
1
].
element
.
element
,
10
);
assert
.
deepEqual
(
list
[
1
].
depth
,
2
);
assert
.
deepEqual
(
list
[
2
].
element
.
element
,
11
);
assert
.
deepEqual
(
list
[
2
].
depth
,
2
);
assert
.
deepEqual
(
list
[
3
].
element
.
element
,
12
);
assert
.
deepEqual
(
list
[
3
].
depth
,
2
);
assert
.
deepEqual
(
list
[
4
].
element
.
element
,
1
);
assert
.
deepEqual
(
list
[
4
].
depth
,
1
);
assert
.
deepEqual
(
list
[
5
].
element
.
element
,
2
);
assert
.
deepEqual
(
list
[
5
].
depth
,
1
);
});
test
(
'
deep insert collapsed
'
,
()
=>
{
const
list
=
[]
as
ICollapsibleTreeListElement
<
number
>
[];
const
model
=
new
CollapsibleTreeModel
<
number
>
(
toSpliceable
(
list
));
model
.
splice
([
0
],
0
,
iter
([
{
element
:
{
element
:
0
,
collapsed
:
true
},
children
:
iter
([
{
element
:
{
element
:
10
,
collapsed
:
false
},
children
:
iter
([])
},
{
element
:
{
element
:
11
,
collapsed
:
false
},
children
:
iter
([])
},
{
element
:
{
element
:
12
,
collapsed
:
false
},
children
:
iter
([])
},
])
},
{
element
:
{
element
:
1
,
collapsed
:
false
},
children
:
iter
([])
},
{
element
:
{
element
:
2
,
collapsed
:
false
},
children
:
iter
([])
}
]));
assert
.
deepEqual
(
list
.
length
,
3
);
assert
.
deepEqual
(
list
[
0
].
element
.
element
,
0
);
assert
.
deepEqual
(
list
[
0
].
element
,
0
);
assert
.
deepEqual
(
list
[
0
].
collapsed
,
true
);
assert
.
deepEqual
(
list
[
0
].
depth
,
1
);
assert
.
deepEqual
(
list
[
1
].
element
.
element
,
1
);
assert
.
deepEqual
(
list
[
1
].
element
,
1
);
assert
.
deepEqual
(
list
[
1
].
collapsed
,
false
);
assert
.
deepEqual
(
list
[
1
].
depth
,
1
);
assert
.
deepEqual
(
list
[
2
].
element
.
element
,
2
);
assert
.
deepEqual
(
list
[
2
].
element
,
2
);
assert
.
deepEqual
(
list
[
2
].
collapsed
,
false
);
assert
.
deepEqual
(
list
[
2
].
depth
,
1
);
});
});
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录