From 1116fe6f44d4200a0fb6c1eb4ade81ad5fbc1911 Mon Sep 17 00:00:00 2001 From: Ethan Setnik Date: Fri, 1 Feb 2019 16:59:59 -0500 Subject: [PATCH 1/2] add sentence motion tests including failing test for #2689 --- test/sentenceMotion.test.ts | 84 +++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 test/sentenceMotion.test.ts diff --git a/test/sentenceMotion.test.ts b/test/sentenceMotion.test.ts new file mode 100644 index 00000000000..5f1accef431 --- /dev/null +++ b/test/sentenceMotion.test.ts @@ -0,0 +1,84 @@ +import { getTestingFunctions } from './testSimplifier'; +import { cleanUpWorkspace, setupWorkspace } from './testUtils'; + +suite('sentence motion', () => { + let { newTest } = getTestingFunctions(); + + setup(async () => { + await setupWorkspace(undefined, '.js'); + }); + + teardown(cleanUpWorkspace); + + suite('[count] sentences backward', () => { + newTest({ + title: 'move one sentence backward', + start: ['lorem ipsum. lorem ipsum|'], + keysPressed: '(', + end: ['lorem ipsum. |lorem ipsum'], + }); + + newTest({ + title: 'move one sentence backward', + start: ['lorem ipsum. lorem ipsum|'], + keysPressed: '1(', + end: ['lorem ipsum. |lorem ipsum'], + }); + + newTest({ + title: 'move [count] sentences backward', + start: ['lorem ipsum. lorem ipsum. lorem ipsum|'], + keysPressed: '2(', + end: ['lorem ipsum. |lorem ipsum. lorem ipsum'], + }); + + newTest({ + title: 'move one sentence backward single line - middle', + start: ['lorem ipsum. |lorem ipsum'], + keysPressed: '(', + end: ['|lorem ipsum. lorem ipsum'], + }); + + newTest({ + title: 'move one sentence backward no space', + start: ['lorem ipsum.lorem ipsum|'], + keysPressed: '(', + end: ['|lorem ipsum.lorem ipsum'], + }); + + newTest({ + title: 'move one sentence backward no space - middle', + start: ['lorem ipsum.|lorem ipsum'], + keysPressed: '(', + end: ['|lorem ipsum.lorem ipsum'], + }); + + newTest({ + title: 'move one sentence backward - multiline', + start: ['lorem ipsum', 'lorem ipsum|'], + keysPressed: '(', + end: ['|lorem ipsum', 'lorem ipsum'], + }); + + newTest({ + title: 'move one sentence backward - multiline - period', + start: ['lorem ipsum.', 'lorem ipsum|'], + keysPressed: '(', + end: ['lorem ipsum.', '|lorem ipsum'], + }); + + newTest({ + title: 'move one sentence backward - multiline - previous line', + start: ['lorem ipsum', '|lorem ipsum'], + keysPressed: '(', + end: ['|lorem ipsum', 'lorem ipsum'], + }); + + newTest({ + title: 'move one sentence backward - multiline - previous line - period', + start: ['lorem ipsum.', '|lorem ipsum'], + keysPressed: '(', + end: ['|lorem ipsum.', 'lorem ipsum'], + }); + }); +}); From 0dfa97a5457635711629612134eb8248564aee66 Mon Sep 17 00:00:00 2001 From: Ethan Setnik Date: Sat, 2 Feb 2019 14:06:31 -0500 Subject: [PATCH 2/2] fixes #2689 --- src/common/motion/position.ts | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/common/motion/position.ts b/src/common/motion/position.ts index 5daa158a99c..5d3594cdea3 100644 --- a/src/common/motion/position.ts +++ b/src/common/motion/position.ts @@ -639,7 +639,7 @@ export class Position extends vscode.Position { if (args.forward) { return this.getNextSentenceBeginWithRegex(this._sentenceEndRegex, false); } else { - return this.getPreviousSentenceBeginWithRegex(this._sentenceEndRegex, false); + return this.getPreviousSentenceBeginWithRegex(this._sentenceEndRegex); } } @@ -972,22 +972,20 @@ export class Position extends vscode.Position { return new Position(TextEditor.getLineCount() - 1, 0).getLineEnd(); } - private getPreviousSentenceBeginWithRegex(regex: RegExp, inclusive: boolean): Position { + private getPreviousSentenceBeginWithRegex(regex: RegExp): Position { let paragraphBegin = this.getCurrentParagraphBeginning(); for (let currentLine = this.line; currentLine >= paragraphBegin.line; currentLine--) { let endPositions = this.getAllEndPositions( TextEditor.getLineAt(new vscode.Position(currentLine, 0)).text, regex ); - let newCharacter = _.find( - endPositions.reverse(), - index => - (index < this.character && - !inclusive && - new Position(currentLine, index).getRightThroughLineBreaks().compareTo(this)) || - (index <= this.character && inclusive) || - currentLine !== this.line - ); + let newCharacter = _.find(endPositions.reverse(), index => { + const newPositionBeforeThis = new Position(currentLine, index) + .getRightThroughLineBreaks() + .compareTo(this); + + return (newPositionBeforeThis && (index < this.character || currentLine < this.line)); + }); if (newCharacter !== undefined) { return new Position(currentLine, newCharacter).getRightThroughLineBreaks();