import type * as monaco from 'monaco-editor'; import { getCompletionProvider } from '../completion/getCompletionProvider'; import type { DataProvider } from '../completion/DataProvider'; jest.mock('../completion/completions', () => ({ getCompletions: jest.fn().mockResolvedValue([ { type: 'FUNCTION', label: 'sum', insertText: 'sum', }, ]), })); function createMockModel(value: string): monaco.editor.ITextModel { return { getValue: () => value, getWordAtPosition: () => ({ word: value, startColumn: 1, endColumn: value.length + 1 }), getValueInRange: () => value, getOffsetAt: (position) => position.column - 1, getPositionAt: (offset) => ({ lineNumber: 1, column: offset + 1 }), } as unknown as monaco.editor.ITextModel; } function createMockDataProvider(): DataProvider { return { monacoSettings: { setInputInRange: jest.fn(), suggestionsIncomplete: false, }, } as unknown as DataProvider; } const mockMonaco = { Range: { lift: (range: monaco.IRange) => range, fromPositions: (position: monaco.Position) => ({ startLineNumber: position.lineNumber, startColumn: position.column, endLineNumber: position.lineNumber, endColumn: position.column, }), }, languages: { CompletionItemKind: { Unit: 1, Variable: 2, Snippet: 3, Enum: 4, EnumMember: 5, Constructor: 6, }, }, } as unknown as typeof monaco; describe('getCompletionProvider', () => { it('only replaces the word prefix before the cursor', async () => { const provider = getCompletionProvider(mockMonaco, createMockDataProvider()); const result = await provider.provideCompletionItems!(createMockModel('sucpu_usage_idle'), { lineNumber: 1, column: 3 }); expect(result).toMatchObject({ suggestions: [ { label: 'sum', range: { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 3, }, command: { id: 'hideSuggestWidget' }, }, ], }); }); });