Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
掘金者说
vscode
提交
a3f414cf
V
vscode
项目概览
掘金者说
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a3f414cf
编写于
8月 28, 2020
作者:
J
Johannes Rieken
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add some integration tests for notebook editing,
https://github.com/microsoft/vscode/issues/105283
上级
dd3e9ee0
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
104 addition
and
17 deletion
+104
-17
extensions/vscode-notebook-tests/src/notebook.test.ts
extensions/vscode-notebook-tests/src/notebook.test.ts
+95
-8
src/vs/workbench/api/browser/mainThreadNotebook.ts
src/vs/workbench/api/browser/mainThreadNotebook.ts
+1
-1
src/vs/workbench/api/common/extHost.protocol.ts
src/vs/workbench/api/common/extHost.protocol.ts
+1
-1
src/vs/workbench/api/common/extHostNotebook.ts
src/vs/workbench/api/common/extHostNotebook.ts
+7
-7
未找到文件。
extensions/vscode-notebook-tests/src/notebook.test.ts
浏览文件 @
a3f414cf
...
@@ -70,8 +70,11 @@ async function saveFileAndCloseAll(resource: vscode.Uri) {
...
@@ -70,8 +70,11 @@ async function saveFileAndCloseAll(resource: vscode.Uri) {
await
documentClosed
;
await
documentClosed
;
}
}
async
function
saveAllFilesAndCloseAll
(
resource
:
vscode
.
Uri
)
{
async
function
saveAllFilesAndCloseAll
(
resource
:
vscode
.
Uri
|
undefined
)
{
const
documentClosed
=
new
Promise
((
resolve
,
_reject
)
=>
{
const
documentClosed
=
new
Promise
((
resolve
,
_reject
)
=>
{
if
(
!
resource
)
{
return
resolve
();
}
const
d
=
vscode
.
notebook
.
onDidCloseNotebookDocument
(
e
=>
{
const
d
=
vscode
.
notebook
.
onDidCloseNotebookDocument
(
e
=>
{
if
(
e
.
uri
.
toString
()
===
resource
.
toString
())
{
if
(
e
.
uri
.
toString
()
===
resource
.
toString
())
{
d
.
dispose
();
d
.
dispose
();
...
@@ -393,23 +396,107 @@ suite('Notebook API tests', () => {
...
@@ -393,23 +396,107 @@ suite('Notebook API tests', () => {
await
saveFileAndCloseAll
(
resource
);
await
saveFileAndCloseAll
(
resource
);
});
});
test
(
'
edit API
'
,
async
function
()
{
test
(
'
edit API
(replaceCells)
'
,
async
function
()
{
assertInitalState
();
assertInitalState
();
const
resource
=
await
createRandomFile
(
''
,
undefined
,
'
first
'
,
'
.vsctestnb
'
);
const
resource
=
await
createRandomFile
(
''
,
undefined
,
'
first
'
,
'
.vsctestnb
'
);
await
vscode
.
commands
.
executeCommand
(
'
vscode.openWith
'
,
resource
,
'
notebookCoreTest
'
);
await
vscode
.
commands
.
executeCommand
(
'
vscode.openWith
'
,
resource
,
'
notebookCoreTest
'
);
const
cellsChangeEvent
=
getEventOncePromise
<
vscode
.
NotebookCellsChangeEvent
>
(
vscode
.
notebook
.
onDidChangeNotebookCells
);
const
cellsChangeEvent
=
getEventOncePromise
<
vscode
.
NotebookCellsChangeEvent
>
(
vscode
.
notebook
.
onDidChangeNotebookCells
);
await
vscode
.
notebook
.
activeNotebookEditor
!
.
edit
(
editBuilder
=>
{
await
vscode
.
notebook
.
activeNotebookEditor
!
.
edit
(
editBuilder
=>
{
editBuilder
.
insert
(
1
,
'
test 2
'
,
'
javascript
'
,
vscode
.
CellKind
.
Code
,
[],
undefined
);
editBuilder
.
replaceCells
(
1
,
0
,
[{
cellKind
:
vscode
.
CellKind
.
Code
,
language
:
'
javascript
'
,
source
:
'
test 2
'
,
outputs
:
[],
metadata
:
undefined
}]
);
});
});
const
cellChangeEventRet
=
await
cellsChangeEvent
;
const
cellChangeEventRet
=
await
cellsChangeEvent
;
assert
.
equal
(
cellChangeEventRet
.
document
,
vscode
.
notebook
.
activeNotebookEditor
?.
document
);
assert
.
strictEqual
(
cellChangeEventRet
.
document
===
vscode
.
notebook
.
activeNotebookEditor
?.
document
,
true
);
assert
.
equal
(
cellChangeEventRet
.
changes
.
length
,
1
);
assert
.
strictEqual
(
cellChangeEventRet
.
document
.
isDirty
,
true
);
assert
.
deepEqual
(
cellChangeEventRet
.
changes
[
0
].
start
,
1
);
assert
.
strictEqual
(
cellChangeEventRet
.
changes
.
length
,
1
);
assert
.
deepEqual
(
cellChangeEventRet
.
changes
[
0
].
deletedCount
,
0
);
assert
.
strictEqual
(
cellChangeEventRet
.
changes
[
0
].
start
,
1
);
assert
.
equal
(
cellChangeEventRet
.
changes
[
0
].
items
[
0
],
vscode
.
notebook
.
activeNotebookEditor
!
.
document
.
cells
[
1
]);
assert
.
strictEqual
(
cellChangeEventRet
.
changes
[
0
].
deletedCount
,
0
);
assert
.
strictEqual
(
cellChangeEventRet
.
changes
[
0
].
items
[
0
]
===
vscode
.
notebook
.
activeNotebookEditor
!
.
document
.
cells
[
1
],
true
);
await
saveAllFilesAndCloseAll
(
resource
);
});
test
(
'
edit API (replaceOutput)
'
,
async
function
()
{
// no output events yet...
this
.
skip
();
assertInitalState
();
const
resource
=
await
createRandomFile
(
''
,
undefined
,
'
first
'
,
'
.vsctestnb
'
);
await
vscode
.
commands
.
executeCommand
(
'
vscode.openWith
'
,
resource
,
'
notebookCoreTest
'
);
await
vscode
.
notebook
.
activeNotebookEditor
!
.
edit
(
editBuilder
=>
{
editBuilder
.
replaceOutput
(
0
,
[{
outputKind
:
vscode
.
CellOutputKind
.
Rich
,
data
:
{
foo
:
'
bar
'
}
}]);
});
const
document
=
vscode
.
notebook
.
activeNotebookEditor
?.
document
!
;
assert
.
strictEqual
(
document
.
isDirty
,
false
);
assert
.
strictEqual
(
document
.
cells
.
length
,
1
);
assert
.
strictEqual
(
document
.
cells
[
0
].
outputs
.
length
,
1
);
assert
.
strictEqual
(
document
.
cells
[
0
].
outputs
[
0
].
outputKind
,
vscode
.
CellOutputKind
.
Rich
);
await
saveAllFilesAndCloseAll
(
undefined
);
});
test
(
'
edit API (replaceOutput, event)
'
,
async
function
()
{
// no output events yet...
this
.
skip
();
assertInitalState
();
const
resource
=
await
createRandomFile
(
''
,
undefined
,
'
first
'
,
'
.vsctestnb
'
);
await
vscode
.
commands
.
executeCommand
(
'
vscode.openWith
'
,
resource
,
'
notebookCoreTest
'
);
const
outputChangeEvent
=
getEventOncePromise
<
vscode
.
NotebookCellOutputsChangeEvent
>
(
vscode
.
notebook
.
onDidChangeCellOutputs
);
await
vscode
.
notebook
.
activeNotebookEditor
!
.
edit
(
editBuilder
=>
{
editBuilder
.
replaceOutput
(
0
,
[{
outputKind
:
vscode
.
CellOutputKind
.
Rich
,
data
:
{
foo
:
'
bar
'
}
}]);
});
const
value
=
await
outputChangeEvent
;
assert
.
strictEqual
(
value
.
document
===
vscode
.
notebook
.
activeNotebookEditor
?.
document
,
true
);
assert
.
strictEqual
(
value
.
cells
.
length
,
1
);
assert
.
strictEqual
(
value
.
cells
[
0
].
outputs
.
length
,
1
);
assert
.
strictEqual
(
value
.
cells
[
0
].
outputs
[
0
].
outputKind
,
vscode
.
CellOutputKind
.
Rich
);
await
saveAllFilesAndCloseAll
(
undefined
);
});
test
(
'
edit API (replaceMetadata)
'
,
async
function
()
{
assertInitalState
();
const
resource
=
await
createRandomFile
(
''
,
undefined
,
'
first
'
,
'
.vsctestnb
'
);
await
vscode
.
commands
.
executeCommand
(
'
vscode.openWith
'
,
resource
,
'
notebookCoreTest
'
);
await
vscode
.
notebook
.
activeNotebookEditor
!
.
edit
(
editBuilder
=>
{
editBuilder
.
replaceMetadata
(
0
,
{
inputCollapsed
:
true
,
executionOrder
:
17
});
});
const
document
=
vscode
.
notebook
.
activeNotebookEditor
?.
document
!
;
assert
.
strictEqual
(
document
.
cells
.
length
,
1
);
assert
.
strictEqual
(
document
.
cells
[
0
].
metadata
.
executionOrder
,
17
);
assert
.
strictEqual
(
document
.
cells
[
0
].
metadata
.
inputCollapsed
,
true
);
assert
.
strictEqual
(
document
.
isDirty
,
true
);
await
saveFileAndCloseAll
(
resource
);
});
test
(
'
edit API (replaceMetadata, event)
'
,
async
function
()
{
assertInitalState
();
const
resource
=
await
createRandomFile
(
''
,
undefined
,
'
first
'
,
'
.vsctestnb
'
);
await
vscode
.
commands
.
executeCommand
(
'
vscode.openWith
'
,
resource
,
'
notebookCoreTest
'
);
const
event
=
getEventOncePromise
<
vscode
.
NotebookCellMetadataChangeEvent
>
(
vscode
.
notebook
.
onDidChangeCellMetadata
);
await
vscode
.
notebook
.
activeNotebookEditor
!
.
edit
(
editBuilder
=>
{
editBuilder
.
replaceMetadata
(
0
,
{
inputCollapsed
:
true
,
executionOrder
:
17
});
});
const
data
=
await
event
;
assert
.
strictEqual
(
data
.
document
,
vscode
.
notebook
.
activeNotebookEditor
?.
document
);
assert
.
strictEqual
(
data
.
cell
.
metadata
.
executionOrder
,
17
);
assert
.
strictEqual
(
data
.
cell
.
metadata
.
inputCollapsed
,
true
);
assert
.
strictEqual
(
data
.
document
.
isDirty
,
true
);
await
saveFileAndCloseAll
(
resource
);
await
saveFileAndCloseAll
(
resource
);
});
});
...
...
src/vs/workbench/api/browser/mainThreadNotebook.ts
浏览文件 @
a3f414cf
...
@@ -242,7 +242,7 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo
...
@@ -242,7 +242,7 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo
const
disposableStore
=
new
DisposableStore
();
const
disposableStore
=
new
DisposableStore
();
const
textModel
=
this
.
_notebookService
.
getNotebookTextModel
(
doc
);
const
textModel
=
this
.
_notebookService
.
getNotebookTextModel
(
doc
);
disposableStore
.
add
(
textModel
!
.
onDidModelChangeProxy
(
e
=>
{
disposableStore
.
add
(
textModel
!
.
onDidModelChangeProxy
(
e
=>
{
this
.
_proxy
.
$acceptModelChanged
(
textModel
!
.
uri
,
e
);
this
.
_proxy
.
$acceptModelChanged
(
textModel
!
.
uri
,
e
,
textModel
!
.
isDirty
);
this
.
_proxy
.
$acceptEditorPropertiesChanged
(
doc
,
{
selections
:
{
selections
:
textModel
!
.
selections
},
metadata
:
null
});
this
.
_proxy
.
$acceptEditorPropertiesChanged
(
doc
,
{
selections
:
{
selections
:
textModel
!
.
selections
},
metadata
:
null
});
}));
}));
disposableStore
.
add
(
textModel
!
.
onDidSelectionChange
(
e
=>
{
disposableStore
.
add
(
textModel
!
.
onDidSelectionChange
(
e
=>
{
...
...
src/vs/workbench/api/common/extHost.protocol.ts
浏览文件 @
a3f414cf
...
@@ -1668,7 +1668,7 @@ export interface ExtHostNotebookShape {
...
@@ -1668,7 +1668,7 @@ export interface ExtHostNotebookShape {
$acceptDisplayOrder
(
displayOrder
:
INotebookDisplayOrder
):
void
;
$acceptDisplayOrder
(
displayOrder
:
INotebookDisplayOrder
):
void
;
$acceptNotebookActiveKernelChange
(
event
:
{
uri
:
UriComponents
,
providerHandle
:
number
|
undefined
,
kernelId
:
string
|
undefined
}):
void
;
$acceptNotebookActiveKernelChange
(
event
:
{
uri
:
UriComponents
,
providerHandle
:
number
|
undefined
,
kernelId
:
string
|
undefined
}):
void
;
$onDidReceiveMessage
(
editorId
:
string
,
rendererId
:
string
|
undefined
,
message
:
unknown
):
void
;
$onDidReceiveMessage
(
editorId
:
string
,
rendererId
:
string
|
undefined
,
message
:
unknown
):
void
;
$acceptModelChanged
(
uriComponents
:
UriComponents
,
event
:
NotebookCellsChangedEvent
):
void
;
$acceptModelChanged
(
uriComponents
:
UriComponents
,
event
:
NotebookCellsChangedEvent
,
isDirty
:
boolean
):
void
;
$acceptModelSaved
(
uriComponents
:
UriComponents
):
void
;
$acceptModelSaved
(
uriComponents
:
UriComponents
):
void
;
$acceptEditorPropertiesChanged
(
uriComponents
:
UriComponents
,
data
:
INotebookEditorPropertiesChangeData
):
void
;
$acceptEditorPropertiesChanged
(
uriComponents
:
UriComponents
,
data
:
INotebookEditorPropertiesChangeData
):
void
;
$acceptDocumentAndEditorsDelta
(
delta
:
INotebookDocumentsAndEditorsDelta
):
void
;
$acceptDocumentAndEditorsDelta
(
delta
:
INotebookDocumentsAndEditorsDelta
):
void
;
...
...
src/vs/workbench/api/common/extHostNotebook.ts
浏览文件 @
a3f414cf
...
@@ -213,6 +213,7 @@ export class ExtHostNotebookDocument extends Disposable {
...
@@ -213,6 +213,7 @@ export class ExtHostNotebookDocument extends Disposable {
private
_metadataChangeListener
:
IDisposable
;
private
_metadataChangeListener
:
IDisposable
;
private
_displayOrder
:
string
[]
=
[];
private
_displayOrder
:
string
[]
=
[];
private
_versionId
=
0
;
private
_versionId
=
0
;
private
_isDirty
:
boolean
=
false
;
private
_backupCounter
=
1
;
private
_backupCounter
=
1
;
private
_backup
?:
vscode
.
NotebookDocumentBackup
;
private
_backup
?:
vscode
.
NotebookDocumentBackup
;
private
_disposed
=
false
;
private
_disposed
=
false
;
...
@@ -274,7 +275,7 @@ export class ExtHostNotebookDocument extends Disposable {
...
@@ -274,7 +275,7 @@ export class ExtHostNotebookDocument extends Disposable {
get
version
()
{
return
that
.
_versionId
;
},
get
version
()
{
return
that
.
_versionId
;
},
get
fileName
()
{
return
that
.
uri
.
fsPath
;
},
get
fileName
()
{
return
that
.
uri
.
fsPath
;
},
get
viewType
()
{
return
that
.
_viewType
;
},
get
viewType
()
{
return
that
.
_viewType
;
},
get
isDirty
()
{
return
false
;
},
get
isDirty
()
{
return
that
.
_isDirty
;
},
get
isUntitled
()
{
return
that
.
uri
.
scheme
===
Schemas
.
untitled
;
},
get
isUntitled
()
{
return
that
.
uri
.
scheme
===
Schemas
.
untitled
;
},
get
cells
():
ReadonlyArray
<
vscode
.
NotebookCell
>
{
return
that
.
_cells
.
map
(
cell
=>
cell
.
cell
);
},
get
cells
():
ReadonlyArray
<
vscode
.
NotebookCell
>
{
return
that
.
_cells
.
map
(
cell
=>
cell
.
cell
);
},
get
languages
()
{
return
that
.
_languages
;
},
get
languages
()
{
return
that
.
_languages
;
},
...
@@ -311,8 +312,9 @@ export class ExtHostNotebookDocument extends Disposable {
...
@@ -311,8 +312,9 @@ export class ExtHostNotebookDocument extends Disposable {
this
.
_backup
=
undefined
;
this
.
_backup
=
undefined
;
}
}
acceptModelChanged
(
event
:
NotebookCellsChangedEvent
):
void
{
acceptModelChanged
(
event
:
NotebookCellsChangedEvent
,
isDirty
:
boolean
):
void
{
this
.
_versionId
=
event
.
versionId
;
this
.
_versionId
=
event
.
versionId
;
this
.
_isDirty
=
isDirty
;
if
(
event
.
kind
===
NotebookCellsChangeType
.
Initialize
)
{
if
(
event
.
kind
===
NotebookCellsChangeType
.
Initialize
)
{
this
.
_spliceNotebookCells
(
event
.
changes
,
true
);
this
.
_spliceNotebookCells
(
event
.
changes
,
true
);
}
if
(
event
.
kind
===
NotebookCellsChangeType
.
ModelChange
)
{
}
if
(
event
.
kind
===
NotebookCellsChangeType
.
ModelChange
)
{
...
@@ -1255,12 +1257,10 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN
...
@@ -1255,12 +1257,10 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN
this
.
_webviewComm
.
get
(
editorId
)?.
onDidReceiveMessage
(
forRendererType
,
message
);
this
.
_webviewComm
.
get
(
editorId
)?.
onDidReceiveMessage
(
forRendererType
,
message
);
}
}
$acceptModelChanged
(
uriComponents
:
UriComponents
,
event
:
NotebookCellsChangedEvent
):
void
{
$acceptModelChanged
(
uriComponents
:
UriComponents
,
event
:
NotebookCellsChangedEvent
,
isDirty
:
boolean
):
void
{
const
document
=
this
.
_documents
.
get
(
URI
.
revive
(
uriComponents
));
const
document
=
this
.
_documents
.
get
(
URI
.
revive
(
uriComponents
));
if
(
document
)
{
if
(
document
)
{
document
.
acceptModelChanged
(
event
);
document
.
acceptModelChanged
(
event
,
isDirty
);
}
}
}
}
...
@@ -1401,7 +1401,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN
...
@@ -1401,7 +1401,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN
0
,
0
,
modelData
.
cells
modelData
.
cells
]]
]]
});
}
,
false
);
// add cell document as vscode.TextDocument
// add cell document as vscode.TextDocument
addedCellDocuments
.
push
(...
modelData
.
cells
.
map
(
cell
=>
ExtHostCell
.
asModelAddData
(
document
.
notebookDocument
,
cell
)));
addedCellDocuments
.
push
(...
modelData
.
cells
.
map
(
cell
=>
ExtHostCell
.
asModelAddData
(
document
.
notebookDocument
,
cell
)));
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录