diff --git a/src/test/terminals/codeExecution/helper.test.ts b/src/test/terminals/codeExecution/helper.test.ts index 166c4db12e7d..a43c5f8746ed 100644 --- a/src/test/terminals/codeExecution/helper.test.ts +++ b/src/test/terminals/codeExecution/helper.test.ts @@ -33,12 +33,12 @@ import { IServiceContainer } from '../../../client/ioc/types'; import { EnvironmentType, PythonEnvironment } from '../../../client/pythonEnvironments/info'; import { CodeExecutionHelper } from '../../../client/terminals/codeExecution/helper'; import { ICodeExecutionHelper } from '../../../client/terminals/types'; -import { PYTHON_PATH } from '../../common'; +import { PYTHON_PATH, getPythonSemVer } from '../../common'; import { ReplType } from '../../../client/repl/types'; const TEST_FILES_PATH = path.join(EXTENSION_ROOT_DIR, 'src', 'test', 'python_files', 'terminalExec'); -suite('Terminal - Code Execution Helper', () => { +suite('Terminal - Code Execution Helper', async () => { let activeResourceService: TypeMoq.IMock; let documentManager: TypeMoq.IMock; let applicationShell: TypeMoq.IMock; @@ -234,25 +234,28 @@ suite('Terminal - Code Execution Helper', () => { expect(normalizedCode).to.be.equal(normalizedExpected); } - ['', '1', '2', '3', '4', '5', '6', '7', '8'].forEach((fileNameSuffix) => { - test(`Ensure code is normalized (Sample${fileNameSuffix})`, async () => { - configurationService - .setup((c) => c.getSettings(TypeMoq.It.isAny())) - .returns({ - REPL: { - EnableREPLSmartSend: false, - REPLSmartSend: false, - }, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } as any); - const code = await fs.readFile(path.join(TEST_FILES_PATH, `sample${fileNameSuffix}_raw.py`), 'utf8'); - const expectedCode = await fs.readFile( - path.join(TEST_FILES_PATH, `sample${fileNameSuffix}_normalized_selection.py`), - 'utf8', - ); - await ensureCodeIsNormalized(code, expectedCode); + const pythonTestVersion = await getPythonSemVer(); + if (pythonTestVersion && pythonTestVersion.minor < 13) { + ['', '1', '2', '3', '4', '5', '6', '7', '8'].forEach((fileNameSuffix) => { + test(`Ensure code is normalized (Sample${fileNameSuffix}) - Python < 3.13`, async () => { + configurationService + .setup((c) => c.getSettings(TypeMoq.It.isAny())) + .returns({ + REPL: { + EnableREPLSmartSend: false, + REPLSmartSend: false, + }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } as any); + const code = await fs.readFile(path.join(TEST_FILES_PATH, `sample${fileNameSuffix}_raw.py`), 'utf8'); + const expectedCode = await fs.readFile( + path.join(TEST_FILES_PATH, `sample${fileNameSuffix}_normalized_selection.py`), + 'utf8', + ); + await ensureCodeIsNormalized(code, expectedCode); + }); }); - }); + } test("Display message if there's no active file", async () => { documentManager.setup((doc) => doc.activeTextEditor).returns(() => undefined); diff --git a/src/test/terminals/codeExecution/smartSend.test.ts b/src/test/terminals/codeExecution/smartSend.test.ts index b81d581033aa..99ccd5d51d80 100644 --- a/src/test/terminals/codeExecution/smartSend.test.ts +++ b/src/test/terminals/codeExecution/smartSend.test.ts @@ -21,7 +21,7 @@ import { IServiceContainer } from '../../../client/ioc/types'; import { ICodeExecutionHelper } from '../../../client/terminals/types'; import { Commands, EXTENSION_ROOT_DIR } from '../../../client/common/constants'; import { EnvironmentType, PythonEnvironment } from '../../../client/pythonEnvironments/info'; -import { PYTHON_PATH } from '../../common'; +import { PYTHON_PATH, getPythonSemVer } from '../../common'; import { Architecture } from '../../../client/common/utils/platform'; import { ProcessService } from '../../../client/common/process/proc'; import { l10n } from '../../mocks/vsc'; @@ -29,7 +29,7 @@ import { ReplType } from '../../../client/repl/types'; const TEST_FILES_PATH = path.join(EXTENSION_ROOT_DIR, 'src', 'test', 'python_files', 'terminalExec'); -suite('REPL - Smart Send', () => { +suite('REPL - Smart Send', async () => { let documentManager: TypeMoq.IMock; let applicationShell: TypeMoq.IMock; @@ -168,67 +168,71 @@ suite('REPL - Smart Send', () => { commandManager.verifyAll(); }); - test('Smart send should perform smart selection and move cursor', async () => { - configurationService - .setup((c) => c.getSettings(TypeMoq.It.isAny())) - .returns({ - REPL: { - REPLSmartSend: true, - }, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } as any); - - const activeEditor = TypeMoq.Mock.ofType(); - const firstIndexPosition = new Position(0, 0); - const selection = TypeMoq.Mock.ofType(); - const wholeFileContent = await fs.readFile(path.join(TEST_FILES_PATH, `sample_smart_selection.py`), 'utf8'); - - selection.setup((s) => s.anchor).returns(() => firstIndexPosition); - selection.setup((s) => s.active).returns(() => firstIndexPosition); - selection.setup((s) => s.isEmpty).returns(() => true); - activeEditor.setup((e) => e.selection).returns(() => selection.object); - - documentManager.setup((d) => d.activeTextEditor).returns(() => activeEditor.object); - document.setup((d) => d.getText(TypeMoq.It.isAny())).returns(() => wholeFileContent); - const actualProcessService = new ProcessService(); - - const { execObservable } = actualProcessService; - - processService - .setup((p) => p.execObservable(TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny())) - .returns((file, args, options) => execObservable.apply(actualProcessService, [file, args, options])); - - const actualSmartOutput = await codeExecutionHelper.normalizeLines( - 'my_dict = {', - ReplType.terminal, - wholeFileContent, - ); - - // my_dict = { <----- smart shift+enter here - // "key1": "value1", - // "key2": "value2" - // } <---- cursor should be here afterwards, hence offset 3 - commandManager - .setup((c) => c.executeCommand('cursorMove', TypeMoq.It.isAny())) - .callback((_, arg2) => { - assert.deepEqual(arg2, { - to: 'down', - by: 'line', - value: 3, - }); - return Promise.resolve(); - }) - .verifiable(TypeMoq.Times.once()); - - commandManager - .setup((c) => c.executeCommand('cursorEnd')) - .returns(() => Promise.resolve()) - .verifiable(TypeMoq.Times.once()); - - const expectedSmartOutput = 'my_dict = {\n "key1": "value1",\n "key2": "value2"\n}\n'; - expect(actualSmartOutput).to.be.equal(expectedSmartOutput); - commandManager.verifyAll(); - }); + const pythonTestVersion = await getPythonSemVer(); + + if (pythonTestVersion && pythonTestVersion.minor < 13) { + test('Smart send should perform smart selection and move cursor - Python < 3.13', async () => { + configurationService + .setup((c) => c.getSettings(TypeMoq.It.isAny())) + .returns({ + REPL: { + REPLSmartSend: true, + }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } as any); + + const activeEditor = TypeMoq.Mock.ofType(); + const firstIndexPosition = new Position(0, 0); + const selection = TypeMoq.Mock.ofType(); + const wholeFileContent = await fs.readFile(path.join(TEST_FILES_PATH, `sample_smart_selection.py`), 'utf8'); + + selection.setup((s) => s.anchor).returns(() => firstIndexPosition); + selection.setup((s) => s.active).returns(() => firstIndexPosition); + selection.setup((s) => s.isEmpty).returns(() => true); + activeEditor.setup((e) => e.selection).returns(() => selection.object); + + documentManager.setup((d) => d.activeTextEditor).returns(() => activeEditor.object); + document.setup((d) => d.getText(TypeMoq.It.isAny())).returns(() => wholeFileContent); + const actualProcessService = new ProcessService(); + + const { execObservable } = actualProcessService; + + processService + .setup((p) => p.execObservable(TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny())) + .returns((file, args, options) => execObservable.apply(actualProcessService, [file, args, options])); + + const actualSmartOutput = await codeExecutionHelper.normalizeLines( + 'my_dict = {', + ReplType.terminal, + wholeFileContent, + ); + + // my_dict = { <----- smart shift+enter here + // "key1": "value1", + // "key2": "value2" + // } <---- cursor should be here afterwards, hence offset 3 + commandManager + .setup((c) => c.executeCommand('cursorMove', TypeMoq.It.isAny())) + .callback((_, arg2) => { + assert.deepEqual(arg2, { + to: 'down', + by: 'line', + value: 3, + }); + return Promise.resolve(); + }) + .verifiable(TypeMoq.Times.once()); + + commandManager + .setup((c) => c.executeCommand('cursorEnd')) + .returns(() => Promise.resolve()) + .verifiable(TypeMoq.Times.once()); + + const expectedSmartOutput = 'my_dict = {\n "key1": "value1",\n "key2": "value2"\n}\n'; + expect(actualSmartOutput).to.be.equal(expectedSmartOutput); + commandManager.verifyAll(); + }); + } // Do not perform smart selection when there is explicit selection test('Smart send should not perform smart selection when there is explicit selection', async () => {