From f5855bade9b8d63ecb52aeb11c7f2c19e89b98cf Mon Sep 17 00:00:00 2001 From: Jason Poon Date: Tue, 29 Jan 2019 03:16:22 -0800 Subject: [PATCH] fix: add configuration tests --- src/configuration/remapper.ts | 8 ++--- src/mode/modeHandler.ts | 7 ++-- test/cmd_line/substitute.test.ts | 4 +-- test/configuration/configuration.test.ts | 44 ++++++++++++++++++++---- test/mode/modeVisual.test.ts | 4 +-- test/plugins/sneak.test.ts | 2 +- test/testUtils.ts | 6 ++-- 7 files changed, 52 insertions(+), 23 deletions(-) diff --git a/src/configuration/remapper.ts b/src/configuration/remapper.ts index 73c2e90e4f6..e9ef7452c86 100644 --- a/src/configuration/remapper.ts +++ b/src/configuration/remapper.ts @@ -82,9 +82,9 @@ export class Remapper implements IRemapper { const userDefinedRemappings = configuration[this._configKey] as Map; this._logger.debug( - `find matching remap. keys=${keys}. mode=${ModeName[vimState.currentMode]}. keybindings=${ - this._configKey - }.` + `trying to find matching remap. keys=${keys}. mode=${ + ModeName[vimState.currentMode] + }. keybindings=${this._configKey}.` ); let remapping: IKeyRemapping | undefined = Remapper.findMatchingRemap( userDefinedRemappings, @@ -113,7 +113,7 @@ export class Remapper implements IRemapper { } // Check to see if a remapping could potentially be applied when more keys are received - for (let remap of Object.keys(userDefinedRemappings)) { + for (let remap of userDefinedRemappings.keys()) { if (keys.join('') === remap.slice(0, keys.length)) { this._isPotentialRemap = true; break; diff --git a/src/mode/modeHandler.ts b/src/mode/modeHandler.ts index 2f19007ba9b..41935dfec76 100644 --- a/src/mode/modeHandler.ts +++ b/src/mode/modeHandler.ts @@ -313,20 +313,19 @@ export class ModeHandler implements vscode.Disposable { } private async handleKeyEventHelper(key: string, vimState: VimState): Promise { - // Just nope right out of here. if (vscode.window.activeTextEditor !== this.vimState.editor) { + this._logger.warn('Current window is not active'); return this.vimState; } // Catch any text change not triggered by us (example: tab completion). vimState.historyTracker.addChange(this.vimState.cursorPositionJustBeforeAnythingHappened); - let recordedState = vimState.recordedState; + vimState.keyHistory.push(key); + let recordedState = vimState.recordedState; recordedState.actionKeys.push(key); - vimState.keyHistory.push(key); - let result = Actions.getRelevantAction(recordedState.actionKeys, vimState); switch (result) { case KeypressState.NoPossibleMatch: diff --git a/test/cmd_line/substitute.test.ts b/test/cmd_line/substitute.test.ts index 2f9dbda91ec..97b520410d8 100644 --- a/test/cmd_line/substitute.test.ts +++ b/test/cmd_line/substitute.test.ts @@ -220,9 +220,9 @@ suite('Basic substitute', () => { }); suite('Effects of substituteGlobalFlag=true', () => { - setup(() => { + setup(async () => { Globals.mockConfiguration.substituteGlobalFlag = true; - reloadConfiguration(); + await reloadConfiguration(); }); test('Replace all matches in the line', async () => { diff --git a/test/configuration/configuration.test.ts b/test/configuration/configuration.test.ts index f64d799f3d2..4cc4fae89bf 100644 --- a/test/configuration/configuration.test.ts +++ b/test/configuration/configuration.test.ts @@ -1,5 +1,4 @@ import * as assert from 'assert'; - import * as srcConfiguration from '../../src/configuration/configuration'; import * as testConfiguration from '../testConfiguration'; import { cleanUpWorkspace, setupWorkspace } from './../testUtils'; @@ -20,6 +19,23 @@ suite('Configuration', () => { after: ['v'], }, ]; + (configuration.visualModeKeyBindingsNonRecursive = [ + // duplicate keybindings + { + before: ['c', 'o', 'p', 'y'], + after: ['c', 'o', 'p', 'y'], + }, + { + before: ['c', 'o', 'p', 'y'], + after: ['c', 'o', 'p', 'y'], + }, + ]), + (configuration.insertModeKeyBindingsNonRecursive = [ + { + // missing after and command + before: ['a'], + }, + ]); configuration.whichwrap = 'h,l'; setup(async () => { @@ -30,19 +46,24 @@ suite('Configuration', () => { test('remappings are normalized', async () => { const normalizedKeybinds = srcConfiguration.configuration.normalModeKeyBindingsNonRecursive; + const normalizedKeybindsMap = + srcConfiguration.configuration.normalModeKeyBindingsNonRecursiveMap; const testingKeybinds = configuration.normalModeKeyBindingsNonRecursive; assert.equal(normalizedKeybinds.length, testingKeybinds.length); + assert.equal(normalizedKeybinds.length, normalizedKeybindsMap.size); assert.deepEqual(normalizedKeybinds[0].before, [' ', 'o']); assert.deepEqual(normalizedKeybinds[0].after, ['o', '', 'k']); }); - newTest({ - title: 'Can handle long key chords', - start: ['|'], - keysPressed: ' fes', - end: ['|'], - endMode: ModeName.Visual, + test('remappings are de-duped', async () => { + const keybindings = srcConfiguration.configuration.visualModeKeyBindingsNonRecursiveMap; + assert.equal(keybindings.size, 1); + }); + + test('invalid remappings are ignored', async () => { + const keybindings = srcConfiguration.configuration.insertModeKeyBindingsNonRecursiveMap; + assert.equal(keybindings.size, 0); }); test('whichwrap is parsed into wrapKeys', async () => { @@ -54,4 +75,13 @@ suite('Configuration', () => { assert.equal(wrapKeys[h], true); assert.equal(wrapKeys[j], undefined); }); + + newTest({ + title: 'Can handle long key chords', + start: ['|'], + // fes + keysPressed: ' fes', + end: ['|'], + endMode: ModeName.Visual, + }); }); diff --git a/test/mode/modeVisual.test.ts b/test/mode/modeVisual.test.ts index c65a457f74b..f4c69d62c33 100644 --- a/test/mode/modeVisual.test.ts +++ b/test/mode/modeVisual.test.ts @@ -827,9 +827,9 @@ suite('Mode Visual', () => { }); suite('visualstar', () => { - setup(() => { + setup(async () => { Globals.mockConfiguration.visualstar = true; - reloadConfiguration(); + await reloadConfiguration(); }); newTest({ diff --git a/test/plugins/sneak.test.ts b/test/plugins/sneak.test.ts index bc2feeebd75..ce6a8372c90 100644 --- a/test/plugins/sneak.test.ts +++ b/test/plugins/sneak.test.ts @@ -8,7 +8,7 @@ suite('sneak plugin', () => { setup(async () => { await setupWorkspace(); Globals.mockConfiguration.sneak = true; - reloadConfiguration(); + await reloadConfiguration(); }); teardown(cleanUpWorkspace); diff --git a/test/testUtils.ts b/test/testUtils.ts index 36bb4f0aa3c..47ec84bd823 100644 --- a/test/testUtils.ts +++ b/test/testUtils.ts @@ -85,7 +85,7 @@ export async function setupWorkspace( await vscode.window.showTextDocument(doc); Globals.mockConfiguration = config; - reloadConfiguration(); + await reloadConfiguration(); let activeTextEditor = vscode.window.activeTextEditor; assert.ok(activeTextEditor); @@ -134,8 +134,8 @@ export async function cleanUpWorkspace(): Promise { }); } -export function reloadConfiguration() { - require('../src/configuration/configuration').configuration.load(); +export async function reloadConfiguration() { + await require('../src/configuration/configuration').configuration.load(); } /**