From b496cea5827165bd23a503231f94f708a976cad4 Mon Sep 17 00:00:00 2001 From: Shin'ya UEOKA Date: Thu, 3 Oct 2019 12:32:32 +0000 Subject: [PATCH] Make KeySequence class --- src/content/domains/KeySequence.ts | 60 ++++++++----------- src/content/repositories/KeymapRepository.ts | 4 +- src/content/usecases/KeymapUseCase.ts | 4 +- test/content/domains/KeySequence.test.ts | 57 +++++++++--------- .../repositories/KeymapRepository.test.ts | 8 +-- 5 files changed, 61 insertions(+), 72 deletions(-) diff --git a/src/content/domains/KeySequence.ts b/src/content/domains/KeySequence.ts index 61ceab1..abae61a 100644 --- a/src/content/domains/KeySequence.ts +++ b/src/content/domains/KeySequence.ts @@ -1,14 +1,9 @@ import Key from './Key'; export default class KeySequence { - private keys: Key[]; - - private constructor(keys: Key[]) { - this.keys = keys; - } - - static from(keys: Key[]): KeySequence { - return new KeySequence(keys); + constructor( + public readonly keys: Key[], + ) { } push(key: Key): number { @@ -31,34 +26,29 @@ export default class KeySequence { return true; } - getKeyArray(): Key[] { - return this.keys; - } -} - -export const fromMapKeys = (keys: string): KeySequence => { - const fromMapKeysRecursive = ( - remainings: string, mappedKeys: Key[], - ): Key[] => { - if (remainings.length === 0) { - return mappedKeys; - } - - let nextPos = 1; - if (remainings.startsWith('<')) { - let ltPos = remainings.indexOf('>'); - if (ltPos > 0) { - nextPos = ltPos + 1; + static fromMapKeys(keys: string): KeySequence { + const fromMapKeysRecursive = ( + remaining: string, mappedKeys: Key[], + ): Key[] => { + if (remaining.length === 0) { + return mappedKeys; } - } - return fromMapKeysRecursive( - remainings.slice(nextPos), - mappedKeys.concat([Key.fromMapKey(remainings.slice(0, nextPos))]) - ); - }; + let nextPos = 1; + if (remaining.startsWith('<')) { + let ltPos = remaining.indexOf('>'); + if (ltPos > 0) { + nextPos = ltPos + 1; + } + } - let data = fromMapKeysRecursive(keys, []); - return KeySequence.from(data); -}; + return fromMapKeysRecursive( + remaining.slice(nextPos), + mappedKeys.concat([Key.fromMapKey(remaining.slice(0, nextPos))]) + ); + }; + let data = fromMapKeysRecursive(keys, []); + return new KeySequence(data); + } +} diff --git a/src/content/repositories/KeymapRepository.ts b/src/content/repositories/KeymapRepository.ts index d7b5b7d..4463678 100644 --- a/src/content/repositories/KeymapRepository.ts +++ b/src/content/repositories/KeymapRepository.ts @@ -7,7 +7,7 @@ export default interface KeymapRepository { clear(): void; } -let current: KeySequence = KeySequence.from([]); +let current: KeySequence = new KeySequence([]); export class KeymapRepositoryImpl { @@ -17,6 +17,6 @@ export class KeymapRepositoryImpl { } clear(): void { - current = KeySequence.from([]); + current = new KeySequence([]); } } diff --git a/src/content/usecases/KeymapUseCase.ts b/src/content/usecases/KeymapUseCase.ts index d0d039a..0f654c8 100644 --- a/src/content/usecases/KeymapUseCase.ts +++ b/src/content/usecases/KeymapUseCase.ts @@ -5,7 +5,7 @@ import AddonEnabledRepository from '../repositories/AddonEnabledRepository'; import * as operations from '../../shared/operations'; import { Keymaps } from '../../shared/Settings'; import Key from '../domains/Key'; -import KeySequence, * as keySequenceUtils from '../domains/KeySequence'; +import KeySequence from '../domains/KeySequence'; type KeymapEntityMap = Map; @@ -71,7 +71,7 @@ export default class KeymapUseCase { }; let entries = Object.entries(keymaps).map((entry) => { return [ - keySequenceUtils.fromMapKeys(entry[0]), + KeySequence.fromMapKeys(entry[0]), entry[1], ]; }) as [KeySequence, operations.Operation][]; diff --git a/test/content/domains/KeySequence.test.ts b/test/content/domains/KeySequence.test.ts index 9afc360..62af165 100644 --- a/test/content/domains/KeySequence.test.ts +++ b/test/content/domains/KeySequence.test.ts @@ -1,49 +1,48 @@ -import KeySequence, * as utils from '../../../src/content/domains/KeySequence'; +import KeySequence from '../../../src/content/domains/KeySequence'; import Key from '../../../src/content/domains/Key'; import { expect } from 'chai' describe("KeySequence", () => { describe('#push', () => { it('append a key to the sequence', () => { - let seq = KeySequence.from([]); + let seq = new KeySequence([]); seq.push(Key.fromMapKey('g')); seq.push(Key.fromMapKey('')); - let array = seq.getKeyArray(); - expect(array[0].key).to.equal('g'); - expect(array[1].key).to.equal('U'); - expect(array[1].shift).to.be.true; + expect(seq.keys[0].key).to.equal('g'); + expect(seq.keys[1].key).to.equal('U'); + expect(seq.keys[1].shift).to.be.true; }) }); describe('#startsWith', () => { it('returns true if the key sequence starts with param', () => { - let seq = KeySequence.from([ + let seq = new KeySequence([ Key.fromMapKey('g'), Key.fromMapKey(''), ]); - expect(seq.startsWith(KeySequence.from([ + expect(seq.startsWith(new KeySequence([ ]))).to.be.true; - expect(seq.startsWith(KeySequence.from([ + expect(seq.startsWith(new KeySequence([ Key.fromMapKey('g'), ]))).to.be.true; - expect(seq.startsWith(KeySequence.from([ + expect(seq.startsWith(new KeySequence([ Key.fromMapKey('g'), Key.fromMapKey(''), ]))).to.be.true; - expect(seq.startsWith(KeySequence.from([ + expect(seq.startsWith(new KeySequence([ Key.fromMapKey('g'), Key.fromMapKey(''), Key.fromMapKey('x'), ]))).to.be.false; - expect(seq.startsWith(KeySequence.from([ + expect(seq.startsWith(new KeySequence([ Key.fromMapKey('h'), ]))).to.be.false; }); it('returns true if the empty sequence starts with an empty sequence', () => { - let seq = KeySequence.from([]); + let seq = new KeySequence([]); - expect(seq.startsWith(KeySequence.from([]))).to.be.true; - expect(seq.startsWith(KeySequence.from([ + expect(seq.startsWith(new KeySequence([]))).to.be.true; + expect(seq.startsWith(new KeySequence([ Key.fromMapKey('h'), ]))).to.be.false; }) @@ -51,23 +50,23 @@ describe("KeySequence", () => { describe('#fromMapKeys', () => { it('returns mapped keys for Shift+Esc', () => { - let keyArray = utils.fromMapKeys('').getKeyArray(); - expect(keyArray).to.have.lengthOf(1); - expect(keyArray[0].key).to.equal('Esc'); - expect(keyArray[0].shift).to.be.true; + let keys = KeySequence.fromMapKeys('').keys; + expect(keys).to.have.lengthOf(1); + expect(keys[0].key).to.equal('Esc'); + expect(keys[0].shift).to.be.true; }); it('returns mapped keys for ad', () => { - let keyArray = utils.fromMapKeys('ad').getKeyArray(); - expect(keyArray).to.have.lengthOf(5); - expect(keyArray[0].key).to.equal('a'); - expect(keyArray[1].ctrl).to.be.true; - expect(keyArray[1].key).to.equal('b'); - expect(keyArray[2].alt).to.be.true; - expect(keyArray[2].key).to.equal('c'); - expect(keyArray[3].key).to.equal('d'); - expect(keyArray[4].meta).to.be.true; - expect(keyArray[4].key).to.equal('e'); + let keys = KeySequence.fromMapKeys('ad').keys; + expect(keys).to.have.lengthOf(5); + expect(keys[0].key).to.equal('a'); + expect(keys[1].ctrl).to.be.true; + expect(keys[1].key).to.equal('b'); + expect(keys[2].alt).to.be.true; + expect(keys[2].key).to.equal('c'); + expect(keys[3].key).to.equal('d'); + expect(keys[4].meta).to.be.true; + expect(keys[4].key).to.equal('e'); }); }) }); diff --git a/test/content/repositories/KeymapRepository.test.ts b/test/content/repositories/KeymapRepository.test.ts index 8f0be67..da5624e 100644 --- a/test/content/repositories/KeymapRepository.test.ts +++ b/test/content/repositories/KeymapRepository.test.ts @@ -16,7 +16,7 @@ describe('KeymapRepositoryImpl', () => { sut.enqueueKey(Key.fromMapKey('b'); let sequence = sut.enqueueKey(Key.fromMapKey('c')); - let keys = sequence.getKeyArray(); + let keys = sequence.keys; expect(keys[0].equals(Key.fromMapKey('a'))).to.be.true; expect(keys[1].equals(Key.fromMapKey('b'))).to.be.true; expect(keys[2].equals(Key.fromMapKey('c'))).to.be.true; @@ -25,9 +25,9 @@ describe('KeymapRepositoryImpl', () => { describe('#clear()', () => { it('clears keys', () => { - sut.enqueueKey(Key.fromMapKey('a'); - sut.enqueueKey(Key.fromMapKey('b'); - sut.enqueueKey(Key.fromMapKey('c'); + sut.enqueueKey(Key.fromMapKey('a')); + sut.enqueueKey(Key.fromMapKey('b')); + sut.enqueueKey(Key.fromMapKey('c')); sut.clear(); let sequence = sut.enqueueKey(Key.fromMapKey('a'));