From 0fbe990e78cdca0be402f1c40b2ef163304e60a8 Mon Sep 17 00:00:00 2001 From: Jason Poon Date: Tue, 5 Feb 2019 22:40:21 -0800 Subject: [PATCH] feat: add tests --- extension.ts | 4 +- src/configuration/configurationValidator.ts | 2 +- src/configuration/iconfiguration.ts | 7 + src/configuration/iconfigurationValidator.ts | 14 +- .../validators/remappingValidator.ts | 7 +- test/configuration/configuration.test.ts | 32 ----- .../validators/neovimValidator.test.ts | 36 +++++ .../validators/remappingValidator.test.ts | 135 ++++++++++++++++++ test/testConfiguration.ts | 6 + 9 files changed, 201 insertions(+), 42 deletions(-) create mode 100644 test/configuration/validators/neovimValidator.test.ts create mode 100644 test/configuration/validators/remappingValidator.test.ts diff --git a/extension.ts b/extension.ts index 793615e3fa5..64212b6e4ae 100644 --- a/extension.ts +++ b/extension.ts @@ -71,9 +71,9 @@ async function loadConfiguration() { const logger = Logger.get('Configuration'); const validatorResults = await configuration.load(); - logger.debug(`${validatorResults.numErrors()} errors found with vim configuration`); + logger.debug(`${validatorResults.numErrors} errors found with vim configuration`); - if (validatorResults.numErrors() > 0) { + if (validatorResults.numErrors > 0) { for (let validatorResult of validatorResults.get()) { switch (validatorResult.level) { case 'error': diff --git a/src/configuration/configurationValidator.ts b/src/configuration/configurationValidator.ts index b94a71cec7f..6d29ddc122e 100644 --- a/src/configuration/configurationValidator.ts +++ b/src/configuration/configurationValidator.ts @@ -20,7 +20,7 @@ class ConfigurationValidator { for (const validator of this._validators) { let validatorResults = await validator.validate(config); - if (validatorResults.hasError()) { + if (validatorResults.hasError) { // errors found in configuration, disable feature validator.disable(config); } diff --git a/src/configuration/iconfiguration.ts b/src/configuration/iconfiguration.ts index 7c419faeaa2..28f7495461e 100644 --- a/src/configuration/iconfiguration.ts +++ b/src/configuration/iconfiguration.ts @@ -255,6 +255,13 @@ export interface IConfiguration { visualModeKeyBindings: IKeyRemapping[]; visualModeKeyBindingsNonRecursive: IKeyRemapping[]; + insertModeKeyBindingsMap: Map; + insertModeKeyBindingsNonRecursiveMap: Map; + normalModeKeyBindingsMap: Map; + normalModeKeyBindingsNonRecursiveMap: Map; + visualModeKeyBindingsMap: Map; + visualModeKeyBindingsNonRecursiveMap: Map; + /** * Comma-separated list of motion keys that should wrap to next/previous line. */ diff --git a/src/configuration/iconfigurationValidator.ts b/src/configuration/iconfigurationValidator.ts index 8818e707661..73a004dba48 100644 --- a/src/configuration/iconfigurationValidator.ts +++ b/src/configuration/iconfigurationValidator.ts @@ -20,12 +20,20 @@ export class ValidatorResults { return this.errors; } - public numErrors(): number { + public get numErrors(): number { return this.errors.filter(e => e.level === 'error').length; } - public hasError(): boolean { - return this.numErrors() > 0; + public get hasError(): boolean { + return this.numErrors > 0; + } + + public get numWarnings(): number { + return this.errors.filter(e => e.level === 'warning').length; + } + + public get hasWarning(): boolean { + return this.numWarnings > 0; } } diff --git a/src/configuration/validators/remappingValidator.ts b/src/configuration/validators/remappingValidator.ts index 37b40711e20..8b7fe48f894 100644 --- a/src/configuration/validators/remappingValidator.ts +++ b/src/configuration/validators/remappingValidator.ts @@ -1,7 +1,6 @@ import * as vscode from 'vscode'; import { IConfiguration, IKeyRemapping } from '../iconfiguration'; import { Notation } from '../notation'; -import { configuration } from '../configuration'; import { IConfigurationValidator, ValidatorResults } from '../iconfigurationValidator'; export class RemappingValidator implements IConfigurationValidator { @@ -27,7 +26,7 @@ export class RemappingValidator implements IConfigurationValidator { // validate let remappingError = await this.isRemappingValid(remapping); result.concat(remappingError); - if (remappingError.hasError()) { + if (remappingError.hasError) { // errors with remapping, skip keybindings.splice(i, 1); continue; @@ -50,7 +49,7 @@ export class RemappingValidator implements IConfigurationValidator { const beforeKeys = remapping.before.join(''); if (modeKeyBindingsMap.has(beforeKeys)) { result.append({ - level: 'error', + level: 'warning', message: `${remapping.before}. Duplicate remapped key for ${beforeKeys}.`, }); continue; @@ -60,7 +59,7 @@ export class RemappingValidator implements IConfigurationValidator { modeKeyBindingsMap.set(beforeKeys, remapping); } - configuration[modeKeyBindingsKey + 'Map'] = modeKeyBindingsMap; + config[modeKeyBindingsKey + 'Map'] = modeKeyBindingsMap; } return result; diff --git a/test/configuration/configuration.test.ts b/test/configuration/configuration.test.ts index f91670c66dc..f64876a0a9e 100644 --- a/test/configuration/configuration.test.ts +++ b/test/configuration/configuration.test.ts @@ -19,25 +19,7 @@ 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'; - configuration.enableNeovim = true; setup(async () => { await setupWorkspace(configuration); @@ -57,16 +39,6 @@ suite('Configuration', () => { assert.deepEqual(normalizedKeybinds[0].after, ['o', '', 'k']); }); - 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 () => { let wrapKeys = srcConfiguration.configuration.wrapKeys; @@ -77,10 +49,6 @@ suite('Configuration', () => { assert.equal(wrapKeys[j], undefined); }); - test('neovim disabled on missing path', async () => { - assert.equal(false, srcConfiguration.configuration.enableNeovim); - }); - newTest({ title: 'Can handle long key chords', start: ['|'], diff --git a/test/configuration/validators/neovimValidator.test.ts b/test/configuration/validators/neovimValidator.test.ts new file mode 100644 index 00000000000..c898e10480c --- /dev/null +++ b/test/configuration/validators/neovimValidator.test.ts @@ -0,0 +1,36 @@ +import * as assert from 'assert'; +import { Configuration } from '../../testConfiguration'; +import { NeovimValidator } from '../../../src/configuration/validators/neovimValidator'; + +suite('Neovim Validator', () => { + test('neovim enabled without path', async () => { + // setup + let configuration = new Configuration(); + configuration.enableNeovim = true; + configuration.neovimPath = ''; + + // test + const validator = new NeovimValidator(); + let actual = await validator.validate(configuration); + validator.disable(configuration); + + // assert + assert.equal(actual.numErrors, 1); + assert.equal(actual.hasError, true); + assert.equal(configuration.enableNeovim, false); + }); + + test('neovim disabled', async () => { + // setup + let configuration = new Configuration(); + configuration.enableNeovim = false; + configuration.neovimPath = ''; + + // test + const validator = new NeovimValidator(); + let actual = await validator.validate(configuration); + + // assert + assert.equal(actual.numErrors, 0); + }); +}); \ No newline at end of file diff --git a/test/configuration/validators/remappingValidator.test.ts b/test/configuration/validators/remappingValidator.test.ts new file mode 100644 index 00000000000..11ac38bbcf7 --- /dev/null +++ b/test/configuration/validators/remappingValidator.test.ts @@ -0,0 +1,135 @@ +import * as assert from 'assert'; +import { Configuration } from '../../testConfiguration'; +import { RemappingValidator } from '../../../src/configuration/validators/remappingValidator'; + +suite('Remapping Validator', () => { + test('no remappings', async () => { + // setup + const configuration = new Configuration(); + configuration.insertModeKeyBindings = []; + configuration.insertModeKeyBindingsNonRecursive = []; + configuration.normalModeKeyBindings = []; + configuration.normalModeKeyBindingsNonRecursive = []; + configuration.visualModeKeyBindings = []; + configuration.visualModeKeyBindingsNonRecursive = []; + + // test + const validator = new RemappingValidator(); + let actual = await validator.validate(configuration); + + // assert + assert.equal(actual.numErrors, 0); + assert.equal(actual.hasError, false); + assert.equal(actual.numWarnings, 0); + assert.equal(actual.hasWarning, false); + + assert.equal(configuration.insertModeKeyBindingsMap.size, 0); + assert.equal(configuration.insertModeKeyBindingsNonRecursiveMap.size, 0); + assert.equal(configuration.normalModeKeyBindingsMap.size, 0); + assert.equal(configuration.normalModeKeyBindingsNonRecursiveMap.size, 0); + assert.equal(configuration.visualModeKeyBindingsMap.size, 0); + assert.equal(configuration.visualModeKeyBindingsNonRecursiveMap.size, 0); + }); + + test('jj->esc', async () => { + // setup + let configuration = new Configuration(); + configuration.insertModeKeyBindings = [ + { + before: ['j', 'j'], + after: [''], + }]; + configuration.insertModeKeyBindingsNonRecursive = []; + configuration.normalModeKeyBindings = []; + configuration.normalModeKeyBindingsNonRecursive = []; + configuration.visualModeKeyBindings = []; + configuration.visualModeKeyBindingsNonRecursive = []; + + // test + const validator = new RemappingValidator(); + let actual = await validator.validate(configuration); + + // assert + assert.equal(actual.numErrors, 0); + assert.equal(actual.hasError, false); + assert.equal(actual.numWarnings, 0); + assert.equal(actual.hasWarning, false); + + assert.equal(configuration.insertModeKeyBindingsMap.size, 1); + assert.equal(configuration.insertModeKeyBindingsNonRecursiveMap.size, 0); + assert.equal(configuration.normalModeKeyBindingsMap.size, 0); + assert.equal(configuration.normalModeKeyBindingsNonRecursiveMap.size, 0); + assert.equal(configuration.visualModeKeyBindingsMap.size, 0); + assert.equal(configuration.visualModeKeyBindingsNonRecursiveMap.size, 0); + + assert.equal(configuration.insertModeKeyBindingsMap.get("jj"), configuration.insertModeKeyBindings[0]); + }); + + test('remapping missing after and command', async () => { + // setup + let configuration = new Configuration(); + configuration.insertModeKeyBindings = [ + { + before: ['j', 'j'] + }]; + configuration.insertModeKeyBindingsNonRecursive = []; + configuration.normalModeKeyBindings = []; + configuration.normalModeKeyBindingsNonRecursive = []; + configuration.visualModeKeyBindings = []; + configuration.visualModeKeyBindingsNonRecursive = []; + + // test + const validator = new RemappingValidator(); + let actual = await validator.validate(configuration); + + // assert + assert.equal(actual.numErrors, 1); + assert.equal(actual.hasError, true); + assert.equal(actual.numWarnings, 0); + assert.equal(actual.hasWarning, false); + + assert.equal(configuration.insertModeKeyBindingsMap.size, 0); + assert.equal(configuration.insertModeKeyBindingsNonRecursiveMap.size, 0); + assert.equal(configuration.normalModeKeyBindingsMap.size, 0); + assert.equal(configuration.normalModeKeyBindingsNonRecursiveMap.size, 0); + assert.equal(configuration.visualModeKeyBindingsMap.size, 0); + assert.equal(configuration.visualModeKeyBindingsNonRecursiveMap.size, 0); + }); + + test('remappings are de-duped', async () => { + // setup + let configuration = new Configuration(); + configuration.insertModeKeyBindings = []; + configuration.insertModeKeyBindingsNonRecursive = []; + configuration.normalModeKeyBindings = [ + { + before: ['c', 'o', 'p', 'y'], + after: ['c', 'o', 'p', 'y'], + }, + { + before: ['c', 'o', 'p', 'y'], + after: ['c', 'o', 'p', 'y'], + } + ] + configuration.normalModeKeyBindingsNonRecursive = []; + configuration.visualModeKeyBindings = []; + configuration.visualModeKeyBindingsNonRecursive = []; + + // test + const validator = new RemappingValidator(); + let actual = await validator.validate(configuration); + + // assert + assert.equal(actual.numErrors, 0); + assert.equal(actual.hasError, false); + assert.equal(actual.numWarnings, 1); + assert.equal(actual.hasWarning, true); + + assert.equal(configuration.insertModeKeyBindingsMap.size, 0); + assert.equal(configuration.insertModeKeyBindingsNonRecursiveMap.size, 0); + assert.equal(configuration.normalModeKeyBindingsMap.size, 1); + assert.equal(configuration.normalModeKeyBindingsNonRecursiveMap.size, 0); + assert.equal(configuration.visualModeKeyBindingsMap.size, 0); + assert.equal(configuration.visualModeKeyBindingsNonRecursiveMap.size, 0); + }); +}); \ No newline at end of file diff --git a/test/testConfiguration.ts b/test/testConfiguration.ts index 316049a2136..4980746a844 100644 --- a/test/testConfiguration.ts +++ b/test/testConfiguration.ts @@ -85,6 +85,12 @@ export class Configuration implements IConfiguration { normalModeKeyBindingsNonRecursive: IKeyRemapping[] = []; visualModeKeyBindings: IKeyRemapping[] = []; visualModeKeyBindingsNonRecursive: IKeyRemapping[] = []; + insertModeKeyBindingsMap: Map; + insertModeKeyBindingsNonRecursiveMap: Map; + normalModeKeyBindingsMap: Map; + normalModeKeyBindingsNonRecursiveMap: Map; + visualModeKeyBindingsMap: Map; + visualModeKeyBindingsNonRecursiveMap: Map; whichwrap = ''; wrapKeys = {}; report = 2;