Path: blob/main/extensions/copilot/src/extension/prompts/node/test/projectedText.spec.ts
13405 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { describe, expect, it } from 'vitest';6import { StringEdit } from '../../../../util/vs/editor/common/core/edits/stringEdit';7import { ProjectedText } from '../inline/summarizedDocument/projectedText';89describe('projectedText', () => {1011it('tryRebase should rebase', async () => {12const originalText = 'abc012def3456gh789ijkl';13const text0 = new ProjectedText(originalText, StringEdit.fromJson([14{ pos: 0, len: 3, txt: '' },15{ pos: 6, len: 3, txt: '' },16{ pos: 13, len: 2, txt: '' },17{ pos: 18, len: 4, txt: '' },18]));19expect(text0.text).toBe('0123456789');2021const res1 = text0.tryRebase(StringEdit.fromJson([{ pos: 4, len: 1, txt: 'ABC' }]));22expect(res1).toBeDefined();23const { edit: edit1, text: text1 } = res1!;24expect(edit1.replacements.length).toBe(1);25expect(edit1.replacements[0].replaceRange.start).toBe(1);26expect(edit1.replacements[0].replaceRange.endExclusive).toBe(2);27expect(edit1.replacements[0].newText).toBe('ABC');28expect(text1.originalText).toBe('abc0ABC2def3456gh789ijkl');29expect(text1.text).toBe('0ABC23456789');3031const res2 = text1.tryRebase(StringEdit.fromJson([{ pos: 12, len: 2, txt: 'D' }]));32expect(res2).toBeDefined();33const { edit: edit2, text: text2 } = res2!;34expect(edit2.replacements.length).toBe(1);35expect(edit2.replacements[0].replaceRange.start).toBe(6);36expect(edit2.replacements[0].replaceRange.endExclusive).toBe(8);37expect(edit2.replacements[0].newText).toBe('D');38expect(text2.originalText).toBe('abc0ABC2def3D6gh789ijkl');39expect(text2.text).toBe('0ABC23D6789');4041const res3 = text2.tryRebase(StringEdit.fromJson([{ pos: 17, len: 0, txt: 'EFGH' }]));42expect(res3).toBeDefined();43const { edit: edit3, text: text3 } = res3!;44expect(edit3.replacements.length).toBe(1);45expect(edit3.replacements[0].replaceRange.start).toBe(9);46expect(edit3.replacements[0].replaceRange.endExclusive).toBe(9);47expect(edit3.replacements[0].newText).toBe('EFGH');48expect(text3.originalText).toBe('abc0ABC2def3D6gh7EFGH89ijkl');49expect(text3.text).toBe('0ABC23D67EFGH89');50});5152it('tryRebase should rebase (mixed order edits)', async () => {53const originalText = 'abc012def3456gh789ijkl';54const text0 = new ProjectedText(originalText, StringEdit.fromJson([55{ pos: 0, len: 3, txt: '' },56{ pos: 6, len: 3, txt: '' },57{ pos: 13, len: 2, txt: '' },58{ pos: 18, len: 4, txt: '' },59]));60expect(text0.text).toBe('0123456789');6162const res2 = text0.tryRebase(StringEdit.fromJson([{ pos: 10, len: 2, txt: 'D' }]));63expect(res2).toBeDefined();64const { edit: edit2, text: text2 } = res2!;65expect(edit2.replacements.length).toBe(1);66expect(edit2.replacements[0].replaceRange.start).toBe(4);67expect(edit2.replacements[0].replaceRange.endExclusive).toBe(6);68expect(edit2.replacements[0].newText).toBe('D');69expect(text2.originalText).toBe('abc012def3D6gh789ijkl');70expect(text2.text).toBe('0123D6789');7172const res1 = text2.tryRebase(StringEdit.fromJson([{ pos: 4, len: 1, txt: 'ABC' }]));73expect(res1).toBeDefined();74const { edit: edit1, text: text1 } = res1!;75expect(edit1.replacements.length).toBe(1);76expect(edit1.replacements[0].replaceRange.start).toBe(1);77expect(edit1.replacements[0].replaceRange.endExclusive).toBe(2);78expect(edit1.replacements[0].newText).toBe('ABC');79expect(text1.originalText).toBe('abc0ABC2def3D6gh789ijkl');80expect(text1.text).toBe('0ABC23D6789');8182const res3 = text1.tryRebase(StringEdit.fromJson([{ pos: 17, len: 0, txt: 'EFGH' }]));83expect(res3).toBeDefined();84const { edit: edit3, text: text3 } = res3!;85expect(edit3.replacements.length).toBe(1);86expect(edit3.replacements[0].replaceRange.start).toBe(9);87expect(edit3.replacements[0].replaceRange.endExclusive).toBe(9);88expect(edit3.replacements[0].newText).toBe('EFGH');89expect(text3.originalText).toBe('abc0ABC2def3D6gh7EFGH89ijkl');90expect(text3.text).toBe('0ABC23D67EFGH89');91});9293it('tryRebase should detect conflicts', async () => {94const originalText = 'abc012def3456gh789ijkl';95const text0 = new ProjectedText(originalText, StringEdit.fromJson([96{ pos: 0, len: 3, txt: '' },97{ pos: 6, len: 3, txt: '' },98{ pos: 13, len: 2, txt: '' },99{ pos: 18, len: 4, txt: '' },100]));101expect(text0.text).toBe('0123456789');102103const res1 = text0.tryRebase(StringEdit.fromJson([{ pos: 4, len: 1, txt: 'ABC' }]));104expect(res1).toBeDefined();105const { edit: edit1, text: text1 } = res1!;106expect(edit1.replacements.length).toBe(1);107expect(edit1.replacements[0].replaceRange.start).toBe(1);108expect(edit1.replacements[0].replaceRange.endExclusive).toBe(2);109expect(edit1.replacements[0].newText).toBe('ABC');110expect(text1.originalText).toBe('abc0ABC2def3456gh789ijkl');111expect(text1.text).toBe('0ABC23456789');112113const res2 = text1.tryRebase(StringEdit.fromJson([{ pos: 21, len: 2, txt: 'D' }]));114expect(res2).toBeUndefined();115});116});117118119