UNPKG

@jupyter-lsp/jupyterlab-lsp

Version:

Language Server Protocol integration for JupyterLab

187 lines 8.71 kB
import { isWithinRange } from '@jupyterlab/lsp'; import { mockExtractorsManager } from '../extractors/testutils'; import { foreignCodeExtractors } from '../transclusions/ipython-rpy2/extractors'; import { VirtualDocument } from './document'; let R_LINE_MAGICS = `%R df = data.frame() print("df created") %R ggplot(df) print("plotted") `; describe('isWithinRange', () => { let lineRange = { start: { line: 1, column: 0 }, end: { line: 1, column: 10 } }; let longRange = { start: { line: 0, column: 3 }, end: { line: 1, column: 0 } }; it('recognizes positions within range in a single-line case', () => { expect(isWithinRange({ line: 1, column: 0 }, lineRange)).toEqual(true); expect(isWithinRange({ line: 1, column: 5 }, lineRange)).toEqual(true); expect(isWithinRange({ line: 1, column: 10 }, lineRange)).toEqual(true); }); it('recognizes positions outside of range in a single-line case', () => { expect(isWithinRange({ line: 0, column: 0 }, lineRange)).toEqual(false); expect(isWithinRange({ line: 2, column: 0 }, lineRange)).toEqual(false); }); it('recognizes positions within range in multi-line case', () => { expect(isWithinRange({ line: 0, column: 3 }, longRange)).toEqual(true); expect(isWithinRange({ line: 0, column: 5 }, longRange)).toEqual(true); expect(isWithinRange({ line: 1, column: 0 }, longRange)).toEqual(true); }); it('recognizes positions outside of range in multi-line case', () => { expect(isWithinRange({ line: 0, column: 0 }, longRange)).toEqual(false); expect(isWithinRange({ line: 0, column: 1 }, longRange)).toEqual(false); expect(isWithinRange({ line: 0, column: 2 }, longRange)).toEqual(false); expect(isWithinRange({ line: 1, column: 1 }, longRange)).toEqual(false); }); }); describe('VirtualDocument', () => { let document; beforeEach(() => { document = new VirtualDocument({ language: 'python', path: 'test.ipynb', overridesRegistry: {}, foreignCodeExtractors: mockExtractorsManager(foreignCodeExtractors), standalone: false, fileExtension: 'py', hasLspSupportedFile: false }); }); let initDocumentWithPythonAndR = () => { let ceEditorForCell1 = {}; let ceEditorForCell2 = {}; let ceEditorForCell3 = {}; let ceEditorForCell4 = {}; // first block document.appendCodeBlock({ value: 'test line in Python 1\n%R 1st test line in R line magic 1', ceEditor: ceEditorForCell1, type: 'code' }); // second block document.appendCodeBlock({ value: 'test line in Python 2\n%R 1st test line in R line magic 2', ceEditor: ceEditorForCell2, type: 'code' }); // third block document.appendCodeBlock({ value: 'test line in Python 3\n%R -i imported_variable 1st test line in R line magic 3', ceEditor: ceEditorForCell2, type: 'code' }); // fourth block document.appendCodeBlock({ value: '%%R\n1st test line in R cell magic 1', ceEditor: ceEditorForCell3, type: 'code' }); // fifth block document.appendCodeBlock({ value: '%%R -i imported_variable\n1st test line in R cell magic 2', ceEditor: ceEditorForCell4, type: 'code' }); }; // TODO: upstream this test describe('#extractForeignCode', () => { it('joins non-standalone fragments together', () => { let { cellCodeKept, foreignDocumentsMap } = document.extractForeignCode({ value: R_LINE_MAGICS, ceEditor: null, type: 'code' }, { line: 0, column: 0 }); // note R cell lines are kept in code (keepInHost=true) expect(cellCodeKept).toEqual(R_LINE_MAGICS); expect(foreignDocumentsMap.size).toEqual(2); let { virtualDocument: rDocument } = foreignDocumentsMap.get(foreignDocumentsMap.keys().next().value); expect(rDocument.language).toEqual('r'); expect(rDocument.value).toEqual('df = data.frame()\n\n\nggplot(df)\n'); }); }); describe('#transformVirtualToEditor', () => { it('transforms positions for the top level document', () => { initDocumentWithPythonAndR(); // The first (Python) line in the first block let editorPosition = document.transformVirtualToEditor({ line: 0, ch: 0 }); expect(editorPosition.line).toEqual(0); expect(editorPosition.ch).toEqual(0); // The first (Python) line in the second block editorPosition = document.transformVirtualToEditor({ line: 4, ch: 0 }); expect(editorPosition.line).toEqual(0); expect(editorPosition.ch).toEqual(0); }); it('transforms positions for the nested foreign documents', () => { initDocumentWithPythonAndR(); let foreignDocument = document.documentAtSourcePosition({ line: 1, ch: 3 }); expect(foreignDocument).not.toBe(document); expect(foreignDocument.value).toEqual('1st test line in R line magic 1\n\n\n' + '1st test line in R line magic 2\n\n\n' + 'imported_variable <- data.frame(); 1st test line in R line magic 3\n\n\n' + // 23456789012345678901234567890123456 - 's' is 36th '1st test line in R cell magic 1\n\n\n' + 'imported_variable <- data.frame(); 1st test line in R cell magic 2\n' // 0123456789012345678901234567890123456 - 's' is 36th ); // The first R line (in source); second in the first block; // targeting "s" in "1st", "1st" in "1st test line in R line magic" (first virtual line == line 0) let virtualR1s1line = { line: 0, ch: 1 }; // For future reference, the code below would be wrong: // let source_position = foreignDocument.transform_virtual_to_source(virtualR1s1line); // expect(source_position.line).toEqual(1); // expect(source_position.ch).toEqual(4); // because it checks R source position, rather than checking root source positions. let editorPosition = foreignDocument.transformVirtualToEditor(virtualR1s1line); expect(editorPosition.line).toEqual(1); expect(editorPosition.ch).toEqual(4); // The second R line (in source), second in the second block // targeting 1 in "1st test line in R line magic 2" (4th virtual line == line 3) editorPosition = foreignDocument.transformVirtualToEditor({ line: 3, ch: 0 }); // 0th editor line is 'test line in Python 2\n' expect(editorPosition.line).toEqual(1); // 1st editor lines is '%R 1st test line in R line magic 2' // 0123 - 3rd character expect(editorPosition.ch).toEqual(3); // The third R line (in source), second in the third block; // targeting "s" in "1st" in "1st test line in R line magic 3" (7th virtual line == line 6) editorPosition = foreignDocument.transformVirtualToEditor({ line: 6, ch: 36 }); // 0th editor line is 'test line in Python 3\n' expect(editorPosition.line).toEqual(1); // 1st editor line is '%R -i imported_variable 1st test line in R line magic 3' // 01234567890123456789012345 - 25th character expect(editorPosition.ch).toEqual(25); // The fifth R line (in source), second in the fifth block; // targeting "s" in "1st" in "1st test line in R cell magic 2" (13th virtual lines == line 12) editorPosition = foreignDocument.transformVirtualToEditor({ line: 12, ch: 36 }); // 0th editor line is '%%R -i imported_variable\n' expect(editorPosition.line).toEqual(1); // 1st editor line is '1st test line in R cell magic 2' // 01 expect(editorPosition.ch).toEqual(1); }); }); }); //# sourceMappingURL=document.spec.js.map