@@ -6,6 +6,7 @@ import assert from 'assert'
66import * as codewhispererClient from 'aws-core-vscode/codewhisperer'
77import * as EditorContext from 'aws-core-vscode/codewhisperer'
88import {
9+ createMockDocument ,
910 createMockTextEditor ,
1011 createMockClientRequest ,
1112 resetCodeWhispererGlobalVariables ,
@@ -15,6 +16,27 @@ import {
1516} from 'aws-core-vscode/test'
1617import { globals } from 'aws-core-vscode/shared'
1718import { 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+ }
1840
1941describe ( 'editorContext' , function ( ) {
2042 let telemetryEnabledDefault : boolean
@@ -63,6 +85,44 @@ describe('editorContext', function () {
6385 }
6486 assert . deepStrictEqual ( actual , expected )
6587 } )
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+ } )
66126 } )
67127
68128 describe ( 'getFileName' , function ( ) {
@@ -115,6 +175,170 @@ describe('editorContext', function () {
115175 } )
116176 } )
117177
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+
118342 describe ( 'validateRequest' , function ( ) {
119343 it ( 'Should return false if request filename.length is invalid' , function ( ) {
120344 const req = createMockClientRequest ( )
0 commit comments