Skip to content

Commit d39245a

Browse files
authored
test(amazonq): add back test files for inline completion codes - part 1 (#8000)
## Problem add back test files for inline completion codes - part 1 Test files for #7974 Ref: #7480 --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent 39b60a8 commit d39245a

16 files changed

+3098
-0
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*!
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
import assert from 'assert'
7+
import * as sinon from 'sinon'
8+
import { resetCodeWhispererGlobalVariables, createMockTextEditor } from 'aws-core-vscode/test'
9+
import {
10+
ConfigurationEntry,
11+
invokeRecommendation,
12+
InlineCompletionService,
13+
isInlineCompletionEnabled,
14+
DefaultCodeWhispererClient,
15+
} from 'aws-core-vscode/codewhisperer'
16+
17+
describe('invokeRecommendation', function () {
18+
describe('invokeRecommendation', function () {
19+
let getRecommendationStub: sinon.SinonStub
20+
let mockClient: DefaultCodeWhispererClient
21+
22+
beforeEach(async function () {
23+
await resetCodeWhispererGlobalVariables()
24+
getRecommendationStub = sinon.stub(InlineCompletionService.instance, 'getPaginatedRecommendation')
25+
})
26+
27+
afterEach(function () {
28+
sinon.restore()
29+
})
30+
31+
it('Should call getPaginatedRecommendation with OnDemand as trigger type when inline completion is enabled', async function () {
32+
const mockEditor = createMockTextEditor()
33+
const config: ConfigurationEntry = {
34+
isShowMethodsEnabled: true,
35+
isManualTriggerEnabled: true,
36+
isAutomatedTriggerEnabled: true,
37+
isSuggestionsWithCodeReferencesEnabled: true,
38+
}
39+
await invokeRecommendation(mockEditor, mockClient, config)
40+
assert.strictEqual(getRecommendationStub.called, isInlineCompletionEnabled())
41+
})
42+
})
43+
})
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*!
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
import assert from 'assert'
7+
import * as vscode from 'vscode'
8+
import * as sinon from 'sinon'
9+
import { onAcceptance, AcceptedSuggestionEntry, session, CodeWhispererTracker } from 'aws-core-vscode/codewhisperer'
10+
import { resetCodeWhispererGlobalVariables, createMockTextEditor } from 'aws-core-vscode/test'
11+
12+
describe('onAcceptance', function () {
13+
describe('onAcceptance', function () {
14+
beforeEach(async function () {
15+
await resetCodeWhispererGlobalVariables()
16+
session.reset()
17+
})
18+
19+
afterEach(function () {
20+
sinon.restore()
21+
session.reset()
22+
})
23+
24+
it('Should enqueue an event object to tracker', async function () {
25+
const mockEditor = createMockTextEditor()
26+
const trackerSpy = sinon.spy(CodeWhispererTracker.prototype, 'enqueue')
27+
const fakeReferences = [
28+
{
29+
message: '',
30+
licenseName: 'MIT',
31+
repository: 'http://github.com/fake',
32+
recommendationContentSpan: {
33+
start: 0,
34+
end: 10,
35+
},
36+
},
37+
]
38+
await onAcceptance({
39+
editor: mockEditor,
40+
range: new vscode.Range(new vscode.Position(1, 0), new vscode.Position(1, 26)),
41+
effectiveRange: new vscode.Range(new vscode.Position(1, 0), new vscode.Position(1, 26)),
42+
acceptIndex: 0,
43+
recommendation: "print('Hello World!')",
44+
requestId: '',
45+
sessionId: '',
46+
triggerType: 'OnDemand',
47+
completionType: 'Line',
48+
language: 'python',
49+
references: fakeReferences,
50+
})
51+
const actualArg = trackerSpy.getCall(0).args[0] as AcceptedSuggestionEntry
52+
assert.ok(trackerSpy.calledOnce)
53+
assert.strictEqual(actualArg.originalString, 'def two_sum(nums, target):')
54+
assert.strictEqual(actualArg.requestId, '')
55+
assert.strictEqual(actualArg.sessionId, '')
56+
assert.strictEqual(actualArg.triggerType, 'OnDemand')
57+
assert.strictEqual(actualArg.completionType, 'Line')
58+
assert.strictEqual(actualArg.language, 'python')
59+
assert.deepStrictEqual(actualArg.startPosition, new vscode.Position(1, 0))
60+
assert.deepStrictEqual(actualArg.endPosition, new vscode.Position(1, 26))
61+
assert.strictEqual(actualArg.index, 0)
62+
})
63+
})
64+
})
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*!
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
import assert from 'assert'
7+
import * as vscode from 'vscode'
8+
import * as sinon from 'sinon'
9+
import { resetCodeWhispererGlobalVariables, createMockTextEditor } from 'aws-core-vscode/test'
10+
import { onInlineAcceptance, RecommendationHandler, session } from 'aws-core-vscode/codewhisperer'
11+
12+
describe('onInlineAcceptance', function () {
13+
describe('onInlineAcceptance', function () {
14+
beforeEach(async function () {
15+
await resetCodeWhispererGlobalVariables()
16+
session.reset()
17+
})
18+
19+
afterEach(function () {
20+
sinon.restore()
21+
session.reset()
22+
})
23+
24+
it('Should dispose inline completion provider', async function () {
25+
const mockEditor = createMockTextEditor()
26+
const spy = sinon.spy(RecommendationHandler.instance, 'disposeInlineCompletion')
27+
await onInlineAcceptance({
28+
editor: mockEditor,
29+
range: new vscode.Range(new vscode.Position(1, 0), new vscode.Position(1, 21)),
30+
effectiveRange: new vscode.Range(new vscode.Position(1, 0), new vscode.Position(1, 21)),
31+
acceptIndex: 0,
32+
recommendation: "print('Hello World!')",
33+
requestId: '',
34+
sessionId: '',
35+
triggerType: 'OnDemand',
36+
completionType: 'Line',
37+
language: 'python',
38+
references: undefined,
39+
})
40+
assert.ok(spy.calledWith())
41+
})
42+
})
43+
})
Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
/*!
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
import * as vscode from 'vscode'
7+
import assert from 'assert'
8+
import * as sinon from 'sinon'
9+
import {
10+
InlineCompletionService,
11+
ReferenceInlineProvider,
12+
RecommendationHandler,
13+
ConfigurationEntry,
14+
CWInlineCompletionItemProvider,
15+
session,
16+
DefaultCodeWhispererClient,
17+
} from 'aws-core-vscode/codewhisperer'
18+
import { createMockTextEditor, resetCodeWhispererGlobalVariables, createMockDocument } from 'aws-core-vscode/test'
19+
20+
describe('inlineCompletionService', function () {
21+
beforeEach(async function () {
22+
await resetCodeWhispererGlobalVariables()
23+
})
24+
25+
describe('getPaginatedRecommendation', function () {
26+
const config: ConfigurationEntry = {
27+
isShowMethodsEnabled: true,
28+
isManualTriggerEnabled: true,
29+
isAutomatedTriggerEnabled: true,
30+
isSuggestionsWithCodeReferencesEnabled: true,
31+
}
32+
33+
let mockClient: DefaultCodeWhispererClient
34+
35+
beforeEach(async function () {
36+
mockClient = new DefaultCodeWhispererClient()
37+
await resetCodeWhispererGlobalVariables()
38+
})
39+
40+
afterEach(function () {
41+
sinon.restore()
42+
})
43+
44+
it('should call checkAndResetCancellationTokens before showing inline and next token to be null', async function () {
45+
const mockEditor = createMockTextEditor()
46+
sinon.stub(RecommendationHandler.instance, 'getRecommendations').resolves({
47+
result: 'Succeeded',
48+
errorMessage: undefined,
49+
recommendationCount: 1,
50+
})
51+
const checkAndResetCancellationTokensStub = sinon.stub(
52+
RecommendationHandler.instance,
53+
'checkAndResetCancellationTokens'
54+
)
55+
session.recommendations = [{ content: "\n\t\tconsole.log('Hello world!');\n\t}" }, { content: '' }]
56+
await InlineCompletionService.instance.getPaginatedRecommendation(
57+
mockClient,
58+
mockEditor,
59+
'OnDemand',
60+
config
61+
)
62+
assert.ok(checkAndResetCancellationTokensStub.called)
63+
assert.strictEqual(RecommendationHandler.instance.hasNextToken(), false)
64+
})
65+
})
66+
67+
describe('clearInlineCompletionStates', function () {
68+
it('should remove inline reference and recommendations', async function () {
69+
const fakeReferences = [
70+
{
71+
message: '',
72+
licenseName: 'MIT',
73+
repository: 'http://github.com/fake',
74+
recommendationContentSpan: {
75+
start: 0,
76+
end: 10,
77+
},
78+
},
79+
]
80+
ReferenceInlineProvider.instance.setInlineReference(1, 'test', fakeReferences)
81+
session.recommendations = [{ content: "\n\t\tconsole.log('Hello world!');\n\t}" }, { content: '' }]
82+
session.language = 'python'
83+
84+
assert.ok(session.recommendations.length > 0)
85+
await RecommendationHandler.instance.clearInlineCompletionStates()
86+
assert.strictEqual(ReferenceInlineProvider.instance.refs.length, 0)
87+
assert.strictEqual(session.recommendations.length, 0)
88+
})
89+
})
90+
91+
describe('truncateOverlapWithRightContext', function () {
92+
const fileName = 'test.py'
93+
const language = 'python'
94+
const rightContext = 'return target\n'
95+
const doc = `import math\ndef two_sum(nums, target):\n`
96+
const provider = new CWInlineCompletionItemProvider(0, 0, [], '', new vscode.Position(0, 0), '')
97+
98+
it('removes overlap with right context from suggestion', async function () {
99+
const mockSuggestion = 'return target\n'
100+
const mockEditor = createMockTextEditor(`${doc}${rightContext}`, fileName, language)
101+
const cursorPosition = new vscode.Position(2, 0)
102+
const result = provider.truncateOverlapWithRightContext(mockEditor.document, mockSuggestion, cursorPosition)
103+
assert.strictEqual(result, '')
104+
})
105+
106+
it('only removes the overlap part from suggestion', async function () {
107+
const mockSuggestion = 'print(nums)\nreturn target\n'
108+
const mockEditor = createMockTextEditor(`${doc}${rightContext}`, fileName, language)
109+
const cursorPosition = new vscode.Position(2, 0)
110+
const result = provider.truncateOverlapWithRightContext(mockEditor.document, mockSuggestion, cursorPosition)
111+
assert.strictEqual(result, 'print(nums)\n')
112+
})
113+
114+
it('only removes the last overlap pattern from suggestion', async function () {
115+
const mockSuggestion = 'return target\nprint(nums)\nreturn target\n'
116+
const mockEditor = createMockTextEditor(`${doc}${rightContext}`, fileName, language)
117+
const cursorPosition = new vscode.Position(2, 0)
118+
const result = provider.truncateOverlapWithRightContext(mockEditor.document, mockSuggestion, cursorPosition)
119+
assert.strictEqual(result, 'return target\nprint(nums)\n')
120+
})
121+
122+
it('returns empty string if the remaining suggestion only contains white space', async function () {
123+
const mockSuggestion = 'return target\n '
124+
const mockEditor = createMockTextEditor(`${doc}${rightContext}`, fileName, language)
125+
const cursorPosition = new vscode.Position(2, 0)
126+
const result = provider.truncateOverlapWithRightContext(mockEditor.document, mockSuggestion, cursorPosition)
127+
assert.strictEqual(result, '')
128+
})
129+
130+
it('returns the original suggestion if no match found', async function () {
131+
const mockSuggestion = 'import numpy\n'
132+
const mockEditor = createMockTextEditor(`${doc}${rightContext}`, fileName, language)
133+
const cursorPosition = new vscode.Position(2, 0)
134+
const result = provider.truncateOverlapWithRightContext(mockEditor.document, mockSuggestion, cursorPosition)
135+
assert.strictEqual(result, 'import numpy\n')
136+
})
137+
138+
it('ignores the space at the end of recommendation', async function () {
139+
const mockSuggestion = 'return target\n\n\n\n\n'
140+
const mockEditor = createMockTextEditor(`${doc}${rightContext}`, fileName, language)
141+
const cursorPosition = new vscode.Position(2, 0)
142+
const result = provider.truncateOverlapWithRightContext(mockEditor.document, mockSuggestion, cursorPosition)
143+
assert.strictEqual(result, '')
144+
})
145+
})
146+
})
147+
148+
describe('CWInlineCompletionProvider', function () {
149+
beforeEach(async function () {
150+
await resetCodeWhispererGlobalVariables()
151+
})
152+
153+
describe('provideInlineCompletionItems', function () {
154+
beforeEach(async function () {
155+
await resetCodeWhispererGlobalVariables()
156+
})
157+
158+
afterEach(function () {
159+
sinon.restore()
160+
})
161+
162+
it('should return undefined if position is before RecommendationHandler start pos', async function () {
163+
const position = new vscode.Position(0, 0)
164+
const document = createMockDocument()
165+
const fakeContext = { triggerKind: 0, selectedCompletionInfo: undefined }
166+
const token = new vscode.CancellationTokenSource().token
167+
const provider = new CWInlineCompletionItemProvider(0, 0, [], '', new vscode.Position(1, 1), '')
168+
const result = await provider.provideInlineCompletionItems(document, position, fakeContext, token)
169+
170+
assert.ok(result === undefined)
171+
})
172+
})
173+
})

0 commit comments

Comments
 (0)