Skip to content

Commit c8ce8e2

Browse files
CopilotTyriar
andcommitted
Extract provider filtering logic into protected method and move tests to main test file
Co-authored-by: Tyriar <[email protected]>
1 parent edb9125 commit c8ce8e2

File tree

3 files changed

+110
-182
lines changed

3 files changed

+110
-182
lines changed

src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalCompletionService.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,7 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
153153
return this._collectCompletions(providers, shellType, promptValue, cursorPosition, allowFallbackCompletions, capabilities, token, explicitlyInvoked);
154154
}
155155

156-
const providerConfig: { [key: string]: boolean } = this._configurationService.getValue(TerminalSuggestSettingId.Providers);
157-
providers = providers.filter(p => {
158-
const providerId = p.id;
159-
return providerId && (!(providerId in providerConfig) || providerConfig[providerId] !== false);
160-
});
156+
providers = this._getEnabledProviders(providers);
161157

162158
if (!providers.length) {
163159
return;
@@ -166,6 +162,14 @@ export class TerminalCompletionService extends Disposable implements ITerminalCo
166162
return this._collectCompletions(providers, shellType, promptValue, cursorPosition, allowFallbackCompletions, capabilities, token, explicitlyInvoked);
167163
}
168164

165+
protected _getEnabledProviders(providers: ITerminalCompletionProvider[]): ITerminalCompletionProvider[] {
166+
const providerConfig: { [key: string]: boolean } = this._configurationService.getValue(TerminalSuggestSettingId.Providers);
167+
return providers.filter(p => {
168+
const providerId = p.id;
169+
return providerId && (!(providerId in providerConfig) || providerConfig[providerId] !== false);
170+
});
171+
}
172+
169173
private async _collectCompletions(providers: ITerminalCompletionProvider[], shellType: TerminalShellType | undefined, promptValue: string, cursorPosition: number, allowFallbackCompletions: boolean, capabilities: ITerminalCapabilityStore, token: CancellationToken, explicitlyInvoked?: boolean): Promise<ITerminalCompletion[] | undefined> {
170174
const completionPromises = providers.map(async provider => {
171175
if (provider.shellTypes && shellType && !provider.shellTypes.includes(shellType)) {

src/vs/workbench/contrib/terminalContrib/suggest/test/browser/terminalCompletionService.providers.test.ts

Lines changed: 0 additions & 177 deletions
This file was deleted.

src/vs/workbench/contrib/terminalContrib/suggest/test/browser/terminalCompletionService.test.ts

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -770,4 +770,105 @@ suite('TerminalCompletionService', () => {
770770
});
771771

772772
});
773+
774+
suite('Provider Configuration', () => {
775+
// Test class that extends TerminalCompletionService to access protected methods
776+
class TestTerminalCompletionService extends TerminalCompletionService {
777+
public _getEnabledProviders(providers: ITerminalCompletionProvider[]): ITerminalCompletionProvider[] {
778+
return super._getEnabledProviders(providers);
779+
}
780+
}
781+
782+
let testTerminalCompletionService: TestTerminalCompletionService;
783+
784+
setup(() => {
785+
testTerminalCompletionService = store.add(instantiationService.createInstance(TestTerminalCompletionService));
786+
});
787+
788+
// Mock provider for testing
789+
function createMockProvider(id: string): ITerminalCompletionProvider {
790+
return {
791+
id,
792+
provideCompletions: async () => [{
793+
label: `completion-from-${id}`,
794+
kind: TerminalCompletionItemKind.Method,
795+
replacementIndex: 0,
796+
replacementLength: 0
797+
}]
798+
};
799+
}
800+
801+
test('should enable providers by default when no configuration exists', () => {
802+
const defaultProvider = createMockProvider('terminal-suggest');
803+
const newProvider = createMockProvider('new-extension-provider');
804+
const providers = [defaultProvider, newProvider];
805+
806+
// Set empty configuration (no provider keys)
807+
configurationService.setUserConfiguration(TerminalSuggestSettingId.Providers, {});
808+
809+
const result = testTerminalCompletionService._getEnabledProviders(providers);
810+
811+
// Both providers should be enabled since they're not explicitly disabled
812+
assert.strictEqual(result.length, 2, 'Should enable both providers by default');
813+
assert.ok(result.includes(defaultProvider), 'Should include default provider');
814+
assert.ok(result.includes(newProvider), 'Should include new provider');
815+
});
816+
817+
test('should disable providers when explicitly set to false', () => {
818+
const provider1 = createMockProvider('provider1');
819+
const provider2 = createMockProvider('provider2');
820+
const providers = [provider1, provider2];
821+
822+
// Disable provider1, leave provider2 unconfigured
823+
configurationService.setUserConfiguration(TerminalSuggestSettingId.Providers, {
824+
'provider1': false
825+
});
826+
827+
const result = testTerminalCompletionService._getEnabledProviders(providers);
828+
829+
// Only provider2 should be enabled
830+
assert.strictEqual(result.length, 1, 'Should enable only one provider');
831+
assert.ok(result.includes(provider2), 'Should include unconfigured provider');
832+
assert.ok(!result.includes(provider1), 'Should not include disabled provider');
833+
});
834+
835+
test('should enable providers when explicitly set to true', () => {
836+
const provider1 = createMockProvider('provider1');
837+
const provider2 = createMockProvider('provider2');
838+
const providers = [provider1, provider2];
839+
840+
// Explicitly enable provider1, leave provider2 unconfigured
841+
configurationService.setUserConfiguration(TerminalSuggestSettingId.Providers, {
842+
'provider1': true
843+
});
844+
845+
const result = testTerminalCompletionService._getEnabledProviders(providers);
846+
847+
// Both providers should be enabled
848+
assert.strictEqual(result.length, 2, 'Should enable both providers');
849+
assert.ok(result.includes(provider1), 'Should include explicitly enabled provider');
850+
assert.ok(result.includes(provider2), 'Should include unconfigured provider');
851+
});
852+
853+
test('should handle mixed configuration correctly', () => {
854+
const provider1 = createMockProvider('provider1');
855+
const provider2 = createMockProvider('provider2');
856+
const provider3 = createMockProvider('provider3');
857+
const providers = [provider1, provider2, provider3];
858+
859+
// Mixed configuration: enable provider1, disable provider2, leave provider3 unconfigured
860+
configurationService.setUserConfiguration(TerminalSuggestSettingId.Providers, {
861+
'provider1': true,
862+
'provider2': false
863+
});
864+
865+
const result = testTerminalCompletionService._getEnabledProviders(providers);
866+
867+
// provider1 and provider3 should be enabled, provider2 should be disabled
868+
assert.strictEqual(result.length, 2, 'Should enable two providers');
869+
assert.ok(result.includes(provider1), 'Should include explicitly enabled provider');
870+
assert.ok(result.includes(provider3), 'Should include unconfigured provider');
871+
assert.ok(!result.includes(provider2), 'Should not include disabled provider');
872+
});
873+
});
773874
});

0 commit comments

Comments
 (0)