@@ -6,6 +6,7 @@ import assert from 'assert'
6
6
import * as codewhispererClient from 'aws-core-vscode/codewhisperer'
7
7
import * as EditorContext from 'aws-core-vscode/codewhisperer'
8
8
import {
9
+ createMockDocument ,
9
10
createMockTextEditor ,
10
11
createMockClientRequest ,
11
12
resetCodeWhispererGlobalVariables ,
@@ -15,6 +16,27 @@ import {
15
16
} from 'aws-core-vscode/test'
16
17
import { globals } from 'aws-core-vscode/shared'
17
18
import { GenerateCompletionsRequest } from 'aws-core-vscode/codewhisperer'
19
+ import * as vscode from 'vscode'
20
+
21
+ export function createNotebookCell (
22
+ document : vscode . TextDocument = createMockDocument ( 'def example():\n return "test"' ) ,
23
+ kind : vscode . NotebookCellKind = vscode . NotebookCellKind . Code ,
24
+ notebook : vscode . NotebookDocument = { } as any ,
25
+ index : number = 0 ,
26
+ outputs : vscode . NotebookCellOutput [ ] = [ ] ,
27
+ metadata : { readonly [ key : string ] : any } = { } ,
28
+ executionSummary ?: vscode . NotebookCellExecutionSummary
29
+ ) : vscode . NotebookCell {
30
+ return {
31
+ document,
32
+ kind,
33
+ notebook,
34
+ index,
35
+ outputs,
36
+ metadata,
37
+ executionSummary,
38
+ }
39
+ }
18
40
19
41
describe ( 'editorContext' , function ( ) {
20
42
let telemetryEnabledDefault : boolean
@@ -63,6 +85,44 @@ describe('editorContext', function () {
63
85
}
64
86
assert . deepStrictEqual ( actual , expected )
65
87
} )
88
+
89
+ it ( 'Should include context from other cells when in a notebook' , async function ( ) {
90
+ const cells : vscode . NotebookCellData [ ] = [
91
+ new vscode . NotebookCellData ( vscode . NotebookCellKind . Markup , 'Previous cell' , 'python' ) ,
92
+ new vscode . NotebookCellData (
93
+ vscode . NotebookCellKind . Code ,
94
+ 'import numpy as np\nimport pandas as pd\n\ndef analyze_data(df):\n # Current cell with cursor here' ,
95
+ 'python'
96
+ ) ,
97
+ new vscode . NotebookCellData (
98
+ vscode . NotebookCellKind . Code ,
99
+ '# Process the data\nresult = analyze_data(df)\nprint(result)' ,
100
+ 'python'
101
+ ) ,
102
+ ]
103
+
104
+ const document = await vscode . workspace . openNotebookDocument (
105
+ 'jupyter-notebook' ,
106
+ new vscode . NotebookData ( cells )
107
+ )
108
+ const editor : any = {
109
+ document : document . cellAt ( 1 ) . document ,
110
+ selection : { active : new vscode . Position ( 4 , 13 ) } ,
111
+ }
112
+
113
+ const actual = EditorContext . extractContextForCodeWhisperer ( editor )
114
+ const expected : codewhispererClient . FileContext = {
115
+ filename : 'Untitled-1.py' ,
116
+ programmingLanguage : {
117
+ languageName : 'python' ,
118
+ } ,
119
+ leftFileContent :
120
+ '# Previous cell\nimport numpy as np\nimport pandas as pd\n\ndef analyze_data(df):\n # Current' ,
121
+ rightFileContent :
122
+ ' cell with cursor here\n# Process the data\nresult = analyze_data(df)\nprint(result)\n' ,
123
+ }
124
+ assert . deepStrictEqual ( actual , expected )
125
+ } )
66
126
} )
67
127
68
128
describe ( 'getFileName' , function ( ) {
@@ -115,6 +175,170 @@ describe('editorContext', function () {
115
175
} )
116
176
} )
117
177
178
+ describe ( 'extractSingleCellContext' , function ( ) {
179
+ it ( 'Should return cell text for python code cells when language is python' , function ( ) {
180
+ const mockCodeCell = createNotebookCell ( createMockDocument ( 'def example():\n return "test"' ) )
181
+ const result = EditorContext . extractSingleCellContext ( mockCodeCell , 'python' )
182
+ assert . strictEqual ( result , 'def example():\n return "test"' )
183
+ } )
184
+
185
+ it ( 'Should return java comments for python code cells when language is java' , function ( ) {
186
+ const mockCodeCell = createNotebookCell ( createMockDocument ( 'def example():\n return "test"' ) )
187
+ const result = EditorContext . extractSingleCellContext ( mockCodeCell , 'java' )
188
+ assert . strictEqual ( result , '// def example():\n// return "test"' )
189
+ } )
190
+
191
+ it ( 'Should return python comments for java code cells when language is python' , function ( ) {
192
+ const mockCodeCell = createNotebookCell ( createMockDocument ( 'println(1 + 1);' , 'somefile.ipynb' , 'java' ) )
193
+ const result = EditorContext . extractSingleCellContext ( mockCodeCell , 'python' )
194
+ assert . strictEqual ( result , '# println(1 + 1);' )
195
+ } )
196
+
197
+ it ( 'Should add python comment prefixes for markdown cells when language is python' , function ( ) {
198
+ const mockMarkdownCell = createNotebookCell (
199
+ createMockDocument ( '# Heading\nThis is a markdown cell' ) ,
200
+ vscode . NotebookCellKind . Markup
201
+ )
202
+ const result = EditorContext . extractSingleCellContext ( mockMarkdownCell , 'python' )
203
+ assert . strictEqual ( result , '# # Heading\n# This is a markdown cell' )
204
+ } )
205
+
206
+ it ( 'Should add java comment prefixes for markdown cells when language is java' , function ( ) {
207
+ const mockMarkdownCell = createNotebookCell (
208
+ createMockDocument ( '# Heading\nThis is a markdown cell' ) ,
209
+ vscode . NotebookCellKind . Markup
210
+ )
211
+ const result = EditorContext . extractSingleCellContext ( mockMarkdownCell , 'java' )
212
+ assert . strictEqual ( result , '// # Heading\n// This is a markdown cell' )
213
+ } )
214
+ } )
215
+
216
+ describe ( 'extractPrefixCellsContext' , function ( ) {
217
+ it ( 'Should extract content from cells in reverse order up to maxLength' , function ( ) {
218
+ const mockCells = [
219
+ createNotebookCell ( createMockDocument ( 'First cell content' ) ) ,
220
+ createNotebookCell ( createMockDocument ( 'Second cell content' ) ) ,
221
+ createNotebookCell ( createMockDocument ( 'Third cell content' ) ) ,
222
+ ]
223
+
224
+ const result = EditorContext . extractPrefixCellsContext ( mockCells , 100 , 'python' )
225
+ assert . strictEqual ( result , 'First cell content\nSecond cell content\nThird cell content\n' )
226
+ } )
227
+
228
+ it ( 'Should respect maxLength parameter' , function ( ) {
229
+ const mockCells = [
230
+ createNotebookCell ( createMockDocument ( 'First' ) ) ,
231
+ createNotebookCell ( createMockDocument ( 'Second' ) ) ,
232
+ createNotebookCell ( createMockDocument ( 'Third' ) ) ,
233
+ createNotebookCell ( createMockDocument ( 'Fourth' ) ) ,
234
+ ]
235
+
236
+ const result = EditorContext . extractPrefixCellsContext ( mockCells , 15 , 'python' )
237
+ assert . strictEqual ( result , 'd\nThird\nFourth\n' )
238
+ } )
239
+
240
+ it ( 'Should handle empty cells array' , function ( ) {
241
+ const result = EditorContext . extractPrefixCellsContext ( [ ] , 100 , '' )
242
+ assert . strictEqual ( result , '' )
243
+ } )
244
+
245
+ it ( 'Should add python comments to markdown cells' , function ( ) {
246
+ const mockCells = [
247
+ createNotebookCell ( createMockDocument ( '# Heading\nThis is markdown' ) , vscode . NotebookCellKind . Markup ) ,
248
+ createNotebookCell ( createMockDocument ( 'def example():\n return "test"' ) ) ,
249
+ ]
250
+ const result = EditorContext . extractPrefixCellsContext ( mockCells , 100 , 'python' )
251
+ assert . strictEqual ( result , '# # Heading\n# This is markdown\ndef example():\n return "test"\n' )
252
+ } )
253
+
254
+ it ( 'Should add java comments to markdown and python cells when language is java' , function ( ) {
255
+ const mockCells = [
256
+ createNotebookCell ( createMockDocument ( '# Heading\nThis is markdown' ) , vscode . NotebookCellKind . Markup ) ,
257
+ createNotebookCell ( createMockDocument ( 'def example():\n return "test"' ) ) ,
258
+ ]
259
+ const result = EditorContext . extractPrefixCellsContext ( mockCells , 100 , 'java' )
260
+ assert . strictEqual ( result , '// # Heading\n// This is markdown\n// def example():\n// return "test"\n' )
261
+ } )
262
+
263
+ it ( 'Should handle code cells with different languages' , function ( ) {
264
+ const mockCells = [
265
+ createNotebookCell (
266
+ createMockDocument ( 'println(1 + 1);' , 'somefile.ipynb' , 'java' ) ,
267
+ vscode . NotebookCellKind . Code
268
+ ) ,
269
+ createNotebookCell ( createMockDocument ( 'def example():\n return "test"' ) ) ,
270
+ ]
271
+ const result = EditorContext . extractPrefixCellsContext ( mockCells , 100 , 'python' )
272
+ assert . strictEqual ( result , '# println(1 + 1);\ndef example():\n return "test"\n' )
273
+ } )
274
+ } )
275
+
276
+ describe ( 'extractSuffixCellsContext' , function ( ) {
277
+ it ( 'Should extract content from cells in order up to maxLength' , function ( ) {
278
+ const mockCells = [
279
+ createNotebookCell ( createMockDocument ( 'First cell content' ) ) ,
280
+ createNotebookCell ( createMockDocument ( 'Second cell content' ) ) ,
281
+ createNotebookCell ( createMockDocument ( 'Third cell content' ) ) ,
282
+ ]
283
+
284
+ const result = EditorContext . extractSuffixCellsContext ( mockCells , 100 , 'python' )
285
+ assert . strictEqual ( result , 'First cell content\nSecond cell content\nThird cell content\n' )
286
+ } )
287
+
288
+ it ( 'Should respect maxLength parameter' , function ( ) {
289
+ const mockCells = [
290
+ createNotebookCell ( createMockDocument ( 'First' ) ) ,
291
+ createNotebookCell ( createMockDocument ( 'Second' ) ) ,
292
+ createNotebookCell ( createMockDocument ( 'Third' ) ) ,
293
+ createNotebookCell ( createMockDocument ( 'Fourth' ) ) ,
294
+ ]
295
+
296
+ // Should only include first cell and part of second cell
297
+ const result = EditorContext . extractSuffixCellsContext ( mockCells , 15 , 'plaintext' )
298
+ assert . strictEqual ( result , 'First\nSecond\nTh' )
299
+ } )
300
+
301
+ it ( 'Should handle empty cells array' , function ( ) {
302
+ const result = EditorContext . extractSuffixCellsContext ( [ ] , 100 , 'plaintext' )
303
+ assert . strictEqual ( result , '' )
304
+ } )
305
+
306
+ it ( 'Should add python comments to markdown cells' , function ( ) {
307
+ const mockCells = [
308
+ createNotebookCell ( createMockDocument ( '# Heading\nThis is markdown' ) , vscode . NotebookCellKind . Markup ) ,
309
+ createNotebookCell ( createMockDocument ( 'def example():\n return "test"' ) ) ,
310
+ ]
311
+
312
+ const result = EditorContext . extractSuffixCellsContext ( mockCells , 100 , 'python' )
313
+ assert . strictEqual ( result , '# # Heading\n# This is markdown\ndef example():\n return "test"\n' )
314
+ } )
315
+
316
+ it ( 'Should add java comments to markdown cells' , function ( ) {
317
+ const mockCells = [
318
+ createNotebookCell ( createMockDocument ( '# Heading\nThis is markdown' ) , vscode . NotebookCellKind . Markup ) ,
319
+ createNotebookCell (
320
+ createMockDocument ( 'println(1 + 1);' , 'somefile.ipynb' , 'java' ) ,
321
+ vscode . NotebookCellKind . Code
322
+ ) ,
323
+ ]
324
+
325
+ const result = EditorContext . extractSuffixCellsContext ( mockCells , 100 , 'java' )
326
+ assert . strictEqual ( result , '// # Heading\n// This is markdown\nprintln(1 + 1);\n' )
327
+ } )
328
+
329
+ it ( 'Should handle code cells with different languages' , function ( ) {
330
+ const mockCells = [
331
+ createNotebookCell (
332
+ createMockDocument ( 'println(1 + 1);' , 'somefile.ipynb' , 'java' ) ,
333
+ vscode . NotebookCellKind . Code
334
+ ) ,
335
+ createNotebookCell ( createMockDocument ( 'def example():\n return "test"' ) ) ,
336
+ ]
337
+ const result = EditorContext . extractSuffixCellsContext ( mockCells , 100 , 'python' )
338
+ assert . strictEqual ( result , '# println(1 + 1);\ndef example():\n return "test"\n' )
339
+ } )
340
+ } )
341
+
118
342
describe ( 'validateRequest' , function ( ) {
119
343
it ( 'Should return false if request filename.length is invalid' , function ( ) {
120
344
const req = createMockClientRequest ( )
0 commit comments