diff options
Diffstat (limited to 'test/content')
| -rw-r--r-- | test/content/InputDriver.test.ts | 22 | ||||
| -rw-r--r-- | test/content/domains/KeySequence.test.ts | 166 | ||||
| -rw-r--r-- | test/content/presenters/Hint.test.ts | 48 | ||||
| -rw-r--r-- | test/content/presenters/NavigationPresenter.test.ts | 7 | ||||
| -rw-r--r-- | test/content/repositories/AddonEnabledRepository.test.ts | 2 | ||||
| -rw-r--r-- | test/content/repositories/FindRepository.test.ts | 2 | ||||
| -rw-r--r-- | test/content/repositories/FollowMasterRepository.test.ts | 2 | ||||
| -rw-r--r-- | test/content/repositories/KeymapRepository.test.ts | 10 | ||||
| -rw-r--r-- | test/content/repositories/MarkRepository.test.ts | 2 | ||||
| -rw-r--r-- | test/content/repositories/SettingRepository.test.ts | 6 | ||||
| -rw-r--r-- | test/content/usecases/ClipboardUseCase.test.ts | 36 | ||||
| -rw-r--r-- | test/content/usecases/FindUseCase.test.ts | 2 | ||||
| -rw-r--r-- | test/content/usecases/HintKeyProducer.test.ts | 6 | ||||
| -rw-r--r-- | test/content/usecases/KeymapUseCase.test.ts | 210 | ||||
| -rw-r--r-- | test/content/usecases/SettingUseCaase.test.ts | 6 | 
15 files changed, 405 insertions, 122 deletions
| diff --git a/test/content/InputDriver.test.ts b/test/content/InputDriver.test.ts index 441d107..d3a55dd 100644 --- a/test/content/InputDriver.test.ts +++ b/test/content/InputDriver.test.ts @@ -50,7 +50,7 @@ describe('InputDriver', () => {        return true;      }); -    let events = [ +    const events = [        new KeyboardEvent('keydown', { key: 'a' }),        new KeyboardEvent('keydown', { key: 'b' }),        new KeyboardEvent('keypress', { key: 'a' }), @@ -58,7 +58,7 @@ describe('InputDriver', () => {        new KeyboardEvent('keypress', { key: 'b' }),        new KeyboardEvent('keyup', { key: 'b' }),      ]; -    for (let e of events) { +    for (const e of events) {        target.dispatchEvent(e);      } @@ -102,9 +102,9 @@ describe('InputDriver', () => {    it('ignores events from input elements', () => {      ['input', 'textarea', 'select'].forEach((name) => { -      let input = window.document.createElement(name); -      let driver = new InputDriver(input); -      driver.onKey((key: Key): boolean => { +      const input = window.document.createElement(name); +      const driver = new InputDriver(input); +      driver.onKey((_key: Key): boolean => {          expect.fail();          return false;        }); @@ -113,8 +113,8 @@ describe('InputDriver', () => {    });    it('ignores events from contenteditable elements', () => { -    let div = window.document.createElement('div'); -    let driver = new InputDriver(div); +    const div = window.document.createElement('div'); +    const driver = new InputDriver(div);      driver.onKey((_key: Key): boolean => {        expect.fail();        return false; @@ -130,7 +130,7 @@ describe('InputDriver', () => {  describe("#keyFromKeyboardEvent", () => {    it('returns from keyboard input Ctrl+X', () => { -    let k = keyFromKeyboardEvent(new KeyboardEvent('keydown', { +    const k = keyFromKeyboardEvent(new KeyboardEvent('keydown', {        key: 'x', shiftKey: false, ctrlKey: true, altKey: false, metaKey: true,      }));      expect(k.key).to.equal('x'); @@ -141,7 +141,7 @@ describe("#keyFromKeyboardEvent", () => {    });    it('returns from keyboard input Shift+Esc', () => { -    let k = keyFromKeyboardEvent(new KeyboardEvent('keydown', { +    const k = keyFromKeyboardEvent(new KeyboardEvent('keydown', {        key: 'Escape', shiftKey: true, ctrlKey: false, altKey: false, metaKey: true      }));      expect(k.key).to.equal('Esc'); @@ -153,7 +153,7 @@ describe("#keyFromKeyboardEvent", () => {    it('returns from keyboard input Ctrl+$', () => {      // $ required shift pressing on most keyboards -    let k = keyFromKeyboardEvent(new KeyboardEvent('keydown', { +    const k = keyFromKeyboardEvent(new KeyboardEvent('keydown', {        key: '$', shiftKey: true, ctrlKey: true, altKey: false, metaKey: false      }));      expect(k.key).to.equal('$'); @@ -164,7 +164,7 @@ describe("#keyFromKeyboardEvent", () => {    });    it('returns from keyboard input Crtl+Space', () => { -    let k = keyFromKeyboardEvent(new KeyboardEvent('keydown', { +    const k = keyFromKeyboardEvent(new KeyboardEvent('keydown', {        key: ' ', shiftKey: false, ctrlKey: true, altKey: false, metaKey: false      }));      expect(k.key).to.equal('Space'); diff --git a/test/content/domains/KeySequence.test.ts b/test/content/domains/KeySequence.test.ts new file mode 100644 index 0000000..5df5217 --- /dev/null +++ b/test/content/domains/KeySequence.test.ts @@ -0,0 +1,166 @@ +import KeySequence from '../../../src/content/domains/KeySequence'; +import { expect } from 'chai' +import Key from "../../../src/shared/settings/Key"; + +describe("KeySequence", () => { +  describe('#push', () => { +    it('append a key to the sequence', () => { +      const seq = new KeySequence([]); +      seq.push(Key.fromMapKey('g')); +      seq.push(Key.fromMapKey('<S-U>')); + +      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', () => { +      const seq = new KeySequence([ +        Key.fromMapKey('g'), +        Key.fromMapKey('<S-U>'), +      ]); + +      expect(seq.startsWith(new KeySequence([ +      ]))).to.be.true; +      expect(seq.startsWith(new KeySequence([ +        Key.fromMapKey('g'), +      ]))).to.be.true; +      expect(seq.startsWith(new KeySequence([ +        Key.fromMapKey('g'), Key.fromMapKey('<S-U>'), +      ]))).to.be.true; +      expect(seq.startsWith(new KeySequence([ +        Key.fromMapKey('g'), Key.fromMapKey('<S-U>'), Key.fromMapKey('x'), +      ]))).to.be.false; +      expect(seq.startsWith(new KeySequence([ +        Key.fromMapKey('h'), +      ]))).to.be.false; +    }); + +    it('returns true if the empty sequence starts with an empty sequence', () => { +      const seq = new KeySequence([]); + +      expect(seq.startsWith(new KeySequence([]))).to.be.true; +      expect(seq.startsWith(new KeySequence([ +        Key.fromMapKey('h'), +      ]))).to.be.false; +    }) +  }); + +  describe('#isDigitOnly', () => { +      it('returns true the keys are only digits', () => { +        expect(new KeySequence([ +          new Key({ key: '4' }), +          new Key({ key: '0' }), +        ]).isDigitOnly()).to.be.true; +        expect(new KeySequence([ +          new Key({ key: '4' }), +          new Key({ key: '0' }), +          new Key({ key: 'z' }), +        ]).isDigitOnly()).to.be.false; +      }) +  }); + +  describe('#repeatCount', () => { +    it('returns repeat count with a numeric prefix', () => { +      let seq = new KeySequence([ +        new Key({ key: '1' }), new Key({ key: '0' })  , +        new Key({ key: 'g' }), new Key({ key: 'g' })  , +      ]); +      expect(seq.repeatCount()).to.equal(10); + +      seq = new KeySequence([ +        new Key({ key: '0' }), new Key({ key: '5' })  , +        new Key({ key: 'g' }), new Key({ key: 'g' })  , +      ]); +      expect(seq.repeatCount()).to.equal(5); +    }); + +    it('returns 1 if no numeric prefix', () => { +      let seq = new KeySequence([ +        new Key({ key: 'g' }), new Key({ key: 'g' })  , +      ]); +      expect(seq.repeatCount()).to.equal(1); + +      seq = new KeySequence([]); +      expect(seq.repeatCount()).to.equal(1); +    }); + +    it('returns whole keys if digits only sequence', () => { +      let seq = new KeySequence([ +        new Key({ key: '1' }), new Key({ key: '0' })  , +      ]); +      expect(seq.repeatCount()).to.equal(10); + +      seq = new KeySequence([ +        new Key({ key: '0' }), new Key({ key: '5' })  , +      ]); +      expect(seq.repeatCount()).to.equal(5); +    }); +  }); + +  describe('#trimNumericPrefix', () => { +    it('removes numeric prefix', () => { +      const seq = new KeySequence([ +        new Key({ key: '1' }), new Key({ key: '0' }) , +        new Key({ key: 'g' }), new Key({ key: 'g' }) , new Key({ key: '3' })  , +      ]).trimNumericPrefix(); +      expect(seq.keys.map(key => key.key)).to.deep.equal(['g', 'g', '3']); +    }); + +    it('returns empty if keys contains only digis', () => { +      const seq = new KeySequence([ +        new Key({ key: '1' }), new Key({ key: '0' })  , +      ]).trimNumericPrefix(); +      expect(seq.trimNumericPrefix().keys).to.be.empty; +    }); + +    it('returns itself if no numeric prefix', () => { +      const seq = new KeySequence([ +        new Key({ key: 'g' }), new Key({ key: 'g' }) , new Key({ key: '3' })  , +      ]).trimNumericPrefix(); + +      expect(seq.keys.map(key => key.key)).to.deep.equal(['g', 'g', '3']); +    }); +  }); + +  describe('#splitNumericPrefix', () => { +      it('splits numeric prefix', () => { +        expect(KeySequence.fromMapKeys('10gg').splitNumericPrefix()).to.deep.equal([ +          KeySequence.fromMapKeys('10'), +          KeySequence.fromMapKeys('gg'), +        ]); +        expect(KeySequence.fromMapKeys('10').splitNumericPrefix()).to.deep.equal([ +          KeySequence.fromMapKeys('10'), +          new KeySequence([]), +        ]); +        expect(KeySequence.fromMapKeys('gg').splitNumericPrefix()).to.deep.equal([ +          new KeySequence([]), +          KeySequence.fromMapKeys('gg'), +        ]); +      }); +  }); + +  describe('#fromMapKeys', () => { +    it('returns mapped keys for Shift+Esc', () => { +      const keys = KeySequence.fromMapKeys('<S-Esc>').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 a<C-B><A-C>d<M-e>', () => { +      const keys = KeySequence.fromMapKeys('a<C-B><A-C>d<M-e>').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/presenters/Hint.test.ts b/test/content/presenters/Hint.test.ts index 7994788..7daa63d 100644 --- a/test/content/presenters/Hint.test.ts +++ b/test/content/presenters/Hint.test.ts @@ -11,43 +11,43 @@ describe('Hint', () => {    describe('#constructor', () => {      it('creates a hint element with tag name', () => { -      let link = document.getElementById('test-link'); -      let hint = new Hint(link, 'abc'); +      const link = document.getElementById('test-link'); +      new Hint(link, 'abc'); -      let elem = document.querySelector('.vimvixen-hint'); +      const elem = document.querySelector('.vimvixen-hint');        expect(elem.textContent.trim()).to.be.equal('abc');      });    });    describe('#show', () => {      it('shows an element', () => { -      let link = document.getElementById('test-link'); -      let hint = new Hint(link, 'abc'); +      const link = document.getElementById('test-link'); +      const hint = new Hint(link, 'abc');        hint.hide();        hint.show(); -      let elem = document.querySelector('.vimvixen-hint') as HTMLElement; +      const elem = document.querySelector('.vimvixen-hint') as HTMLElement;        expect(elem.style.display).to.not.equal('none');      });    });    describe('#hide', () => {      it('hides an element', () => { -      let link = document.getElementById('test-link') as HTMLElement; -      let hint = new Hint(link, 'abc'); +      const link = document.getElementById('test-link') as HTMLElement; +      const hint = new Hint(link, 'abc');        hint.hide(); -      let elem = document.querySelector('.vimvixen-hint') as HTMLElement; +      const elem = document.querySelector('.vimvixen-hint') as HTMLElement;        expect(elem.style.display).to.equal('none');      });    });    describe('#remove', () => {      it('removes an element', () => { -      let link = document.getElementById('test-link'); -      let hint = new Hint(link, 'abc'); +      const link = document.getElementById('test-link'); +      const hint = new Hint(link, 'abc'); -      let elem = document.querySelector('.vimvixen-hint'); +      const elem = document.querySelector('.vimvixen-hint');        expect(elem.parentElement).to.not.be.null;        hint.remove();        expect(elem.parentElement).to.be.null; @@ -66,8 +66,8 @@ describe('LinkHint', () => {    describe('#getLink()', () => {      it('returns value of "href" attribute', () => { -      let link = document.getElementById('test-link1') as HTMLAnchorElement; -      let hint = new LinkHint(link, 'abc'); +      const link = document.getElementById('test-link1') as HTMLAnchorElement; +      const hint = new LinkHint(link, 'abc');        expect(hint.getLink()).to.equal('https://google.com/');      }); @@ -89,8 +89,8 @@ describe('LinkHint', () => {    describe('#click()', () => {      it('clicks a element', (done) => { -      let link = document.getElementById('test-link3') as HTMLAnchorElement; -      let hint = new LinkHint(link, 'abc'); +      const link = document.getElementById('test-link3') as HTMLAnchorElement; +      const hint = new LinkHint(link, 'abc');        link.onclick = () => { done() };        hint.click(); @@ -106,8 +106,8 @@ describe('InputHint', () => {        });        it('focuses to the input', () => { -        let input = document.getElementById('test-input') as HTMLInputElement; -        let hint = new InputHint(input, 'abc'); +        const input = document.getElementById('test-input') as HTMLInputElement; +        const hint = new InputHint(input, 'abc');          hint.activate();          expect(document.activeElement).to.equal(input); @@ -120,8 +120,8 @@ describe('InputHint', () => {        });        it('checks and focuses to the input', () => { -        let input = document.getElementById('test-input') as HTMLInputElement; -        let hint = new InputHint(input, 'abc'); +        const input = document.getElementById('test-input') as HTMLInputElement; +        const hint = new InputHint(input, 'abc');          hint.activate();          expect(input.checked).to.be.true; @@ -133,8 +133,8 @@ describe('InputHint', () => {        });        it('focuses to the textarea', () => { -        let textarea = document.getElementById('test-textarea') as HTMLTextAreaElement; -        let hint = new InputHint(textarea, 'abc'); +        const textarea = document.getElementById('test-textarea') as HTMLTextAreaElement; +        const hint = new InputHint(textarea, 'abc');          hint.activate();          expect(document.activeElement).to.equal(textarea); @@ -147,10 +147,10 @@ describe('InputHint', () => {        });        it('clicks the button', (done) => { -        let button = document.getElementById('test-button') as HTMLButtonElement; +        const button = document.getElementById('test-button') as HTMLButtonElement;          button.onclick = () => { done() }; -        let hint = new InputHint(button, 'abc'); +        const hint = new InputHint(button, 'abc');          hint.activate();        });      }); diff --git a/test/content/presenters/NavigationPresenter.test.ts b/test/content/presenters/NavigationPresenter.test.ts index 5b6a8ca..6aa057b 100644 --- a/test/content/presenters/NavigationPresenter.test.ts +++ b/test/content/presenters/NavigationPresenter.test.ts @@ -1,9 +1,8 @@ -import NavigationPresenter, { NavigationPresenterImpl } -  from '../../../src/content/presenters/NavigationPresenter'; +import { NavigationPresenterImpl } from '../../../src/content/presenters/NavigationPresenter';  import { expect } from 'chai'; -describe('NavigationPresenter', () => { -  let sut; +describe('NavigationPresenterImpl', () => { +  let sut: NavigationPresenterImpl;    const testRel = (done, rel, html) => {      const method = rel === 'prev' ? sut.openLinkPrev.bind(sut) : sut.openLinkNext.bind(sut); diff --git a/test/content/repositories/AddonEnabledRepository.test.ts b/test/content/repositories/AddonEnabledRepository.test.ts index 3cea897..7edd50e 100644 --- a/test/content/repositories/AddonEnabledRepository.test.ts +++ b/test/content/repositories/AddonEnabledRepository.test.ts @@ -3,7 +3,7 @@ import { expect } from 'chai';  describe('AddonEnabledRepositoryImpl', () => {    it('updates and gets current value', () => { -    let sut = new AddonEnabledRepositoryImpl(); +    const sut = new AddonEnabledRepositoryImpl();      sut.set(true);      expect(sut.get()).to.be.true; diff --git a/test/content/repositories/FindRepository.test.ts b/test/content/repositories/FindRepository.test.ts index dcb2dff..0e50b0a 100644 --- a/test/content/repositories/FindRepository.test.ts +++ b/test/content/repositories/FindRepository.test.ts @@ -3,7 +3,7 @@ import { expect } from 'chai';  describe('FindRepositoryImpl', () => {    it('updates and gets last keyword', () => { -    let sut = new FindRepositoryImpl(); +    const sut = new FindRepositoryImpl();      expect(sut.getLastKeyword()).to.be.null; diff --git a/test/content/repositories/FollowMasterRepository.test.ts b/test/content/repositories/FollowMasterRepository.test.ts index 8c3f34e..3eb172f 100644 --- a/test/content/repositories/FollowMasterRepository.test.ts +++ b/test/content/repositories/FollowMasterRepository.test.ts @@ -25,7 +25,7 @@ describe('FollowMasterRepositoryImpl', () => {    describe('#getTagsByPrefix', () => {      it('gets tags matched by prefix', () => { -      for (let tag of ['a', 'aa', 'ab', 'b', 'ba', 'bb']) { +      for (const tag of ['a', 'aa', 'ab', 'b', 'ba', 'bb']) {          sut.addTag(tag);        }        expect(sut.getTagsByPrefix('a')).to.deep.equal(['a', 'aa', 'ab']); diff --git a/test/content/repositories/KeymapRepository.test.ts b/test/content/repositories/KeymapRepository.test.ts index df013df..68f515c 100644 --- a/test/content/repositories/KeymapRepository.test.ts +++ b/test/content/repositories/KeymapRepository.test.ts @@ -12,11 +12,11 @@ describe('KeymapRepositoryImpl', () => {    describe('#enqueueKey()', () => {      it('enqueues keys', () => { -      sut.enqueueKey(Key.fromMapKey('a'); -      sut.enqueueKey(Key.fromMapKey('b'); -      let sequence = sut.enqueueKey(Key.fromMapKey('c')); +      sut.enqueueKey(Key.fromMapKey('a')); +      sut.enqueueKey(Key.fromMapKey('b')); +      const sequence = sut.enqueueKey(Key.fromMapKey('c')); -      let keys = sequence.keys; +      const 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; @@ -30,7 +30,7 @@ describe('KeymapRepositoryImpl', () => {        sut.enqueueKey(Key.fromMapKey('c'));        sut.clear(); -      let sequence = sut.enqueueKey(Key.fromMapKey('a')); +      const sequence = sut.enqueueKey(Key.fromMapKey('a'));        expect(sequence.length()).to.equal(1);      });    }); diff --git a/test/content/repositories/MarkRepository.test.ts b/test/content/repositories/MarkRepository.test.ts index 7fced5f..6ddd38d 100644 --- a/test/content/repositories/MarkRepository.test.ts +++ b/test/content/repositories/MarkRepository.test.ts @@ -3,7 +3,7 @@ import { expect } from 'chai';  describe('MarkRepositoryImpl', () => {    it('save and load marks', () => { -    let sut = new MarkRepositoryImpl(); +    const sut = new MarkRepositoryImpl();      sut.set('a', { x: 10, y: 20 });      expect(sut.get('a')).to.deep.equal({ x: 10, y: 20 }); diff --git a/test/content/repositories/SettingRepository.test.ts b/test/content/repositories/SettingRepository.test.ts index db4c528..e45d7c4 100644 --- a/test/content/repositories/SettingRepository.test.ts +++ b/test/content/repositories/SettingRepository.test.ts @@ -4,9 +4,9 @@ import Settings from '../../../src/shared/settings/Settings';  describe('SettingRepositoryImpl', () => {    it('updates and gets current value', () => { -    let sut = new SettingRepositoryImpl(); +    const sut = new SettingRepositoryImpl(); -    let settings = Settings.fromJSON({ +    const settings = Settings.fromJSON({        keymaps: {},        search:{          default: 'google', @@ -24,7 +24,7 @@ describe('SettingRepositoryImpl', () => {      sut.set(settings); -    let actual = sut.get(); +    const actual = sut.get();      expect(actual.properties.hintchars).to.equal('abcd1234');    });  }); diff --git a/test/content/usecases/ClipboardUseCase.test.ts b/test/content/usecases/ClipboardUseCase.test.ts index a863651..3cc82fe 100644 --- a/test/content/usecases/ClipboardUseCase.test.ts +++ b/test/content/usecases/ClipboardUseCase.test.ts @@ -6,19 +6,31 @@ import ConsoleClient from '../../../src/content/client/ConsoleClient';  import * as sinon from 'sinon';  import { expect } from 'chai'; +import {Operation} from "../../../src/shared/operations";  describe('ClipboardUseCase', () => {    let clipboardRepository: ClipboardRepository; +    let operationClient: OperationClient; +    let consoleClient: ConsoleClient; +    let sut: ClipboardUseCase;    beforeEach(() => { -    var modal = <ConsoleClient>{}; +    clipboardRepository = new class implements ClipboardRepository { +      read(): string { return ""; } +      write(_text: string) {} +    }; +    operationClient = new class implements OperationClient { +      execBackgroundOp(_repeat: number, _op: Operation): Promise<void> { return Promise.resolve() } +      internalOpenUrl(_url: string, _newTab?: boolean, _background?: boolean): Promise<void> { return Promise.resolve() } +    }; +    consoleClient = new class implements ConsoleClient { +      error(_text: string): Promise<void> { return Promise.resolve() } +      info(_text: string): Promise<void> { return Promise.resolve() } +    }; -    clipboardRepository = <ClipboardRepository>{ read() {}, write(_) {} }; -    operationClient = <OperationClient>{ internalOpenUrl(_) {} }; -    consoleClient = <ConsoleClient>{ info(_) {}};      sut = new ClipboardUseCase(        clipboardRepository,        new SettingRepositoryImpl(), @@ -29,13 +41,13 @@ describe('ClipboardUseCase', () => {    describe('#yankCurrentURL', () => {      it('yanks current url', async () => { -      let href = window.location.href; -      var mockRepository = sinon.mock(clipboardRepository); +      const href = window.location.href; +      const mockRepository = sinon.mock(clipboardRepository);        mockRepository.expects('write').withArgs(href); -      var mockConsoleClient = sinon.mock(consoleClient); +      const mockConsoleClient = sinon.mock(consoleClient);        mockConsoleClient.expects('info').withArgs('Yanked ' + href); -      let yanked = await sut.yankCurrentURL(); +      const yanked = await sut.yankCurrentURL();        expect(yanked).to.equal(href);        mockRepository.verify(); @@ -45,9 +57,9 @@ describe('ClipboardUseCase', () => {    describe('#openOrSearch', () => {      it('opens url from the clipboard', async () => { -      let url = 'https://github.com/ueokande/vim-vixen' +      const url = 'https://github.com/ueokande/vim-vixen'        sinon.stub(clipboardRepository, 'read').returns(url); -      let mockOperationClient = sinon.mock(operationClient); +      const mockOperationClient = sinon.mock(operationClient);        mockOperationClient.expects('internalOpenUrl').withArgs(url, true);        await sut.openOrSearch(true); @@ -56,9 +68,9 @@ describe('ClipboardUseCase', () => {      });      it('opens search results from the clipboard', async () => { -      let url = 'https://google.com/search?q=banana'; +      const url = 'https://google.com/search?q=banana';        sinon.stub(clipboardRepository, 'read').returns('banana'); -      let mockOperationClient = sinon.mock(operationClient); +      const mockOperationClient = sinon.mock(operationClient);        mockOperationClient.expects('internalOpenUrl').withArgs(url, true);        await sut.openOrSearch(true); diff --git a/test/content/usecases/FindUseCase.test.ts b/test/content/usecases/FindUseCase.test.ts index ddd4cd4..3978dbc 100644 --- a/test/content/usecases/FindUseCase.test.ts +++ b/test/content/usecases/FindUseCase.test.ts @@ -32,7 +32,7 @@ class MockFindPresenter implements FindPresenter {    }    find(keyword: string, _backward: boolean): boolean { -    let found = this.document.includes(keyword); +    const found = this.document.includes(keyword);      this.highlighted = found;      return found;    } diff --git a/test/content/usecases/HintKeyProducer.test.ts b/test/content/usecases/HintKeyProducer.test.ts index feafffb..5841ae9 100644 --- a/test/content/usecases/HintKeyProducer.test.ts +++ b/test/content/usecases/HintKeyProducer.test.ts @@ -10,13 +10,13 @@ describe('HintKeyProducer class', () => {    describe('#produce', () => {      it('produce incremented keys', () => { -      let charset = 'abc'; -      let sequences = [ +      const charset = 'abc'; +      const sequences = [          'a', 'b', 'c',          'aa', 'ab', 'ac', 'ba', 'bb', 'bc', 'ca', 'cb', 'cc',          'aaa', 'aab', 'aac', 'aba'] -      let producer = new HintKeyProducer(charset); +      const producer = new HintKeyProducer(charset);        for (let i = 0; i < sequences.length; ++i) {          expect(producer.produce()).to.equal(sequences[i]);        } diff --git a/test/content/usecases/KeymapUseCase.test.ts b/test/content/usecases/KeymapUseCase.test.ts index 5f2feba..032d4fc 100644 --- a/test/content/usecases/KeymapUseCase.test.ts +++ b/test/content/usecases/KeymapUseCase.test.ts @@ -1,3 +1,4 @@ +import "reflect-metadata";  import KeymapUseCase from '../../../src/content/usecases/KeymapUseCase';  import {expect} from 'chai';  import SettingRepository from "../../../src/content/repositories/SettingRepository"; @@ -50,55 +51,158 @@ class MockAddressRepository implements AddressRepository {  describe('KeymapUseCase', () => { -  it('returns matched operation', () => { -    let settings = Settings.fromJSON({ +  context('with no-digis keymaps', () => { +    const settings = Settings.fromJSON({        keymaps: {          k: {type: 'scroll.vertically', count: -1},          j: {type: 'scroll.vertically', count: 1},          gg: {type: 'scroll.top'},        },      }); -    let sut = new KeymapUseCase( -      new KeymapRepositoryImpl(), -      new MockSettingRepository(settings), -      new MockAddonEnabledRepository(true), -      new MockAddressRepository(new URL('https://example.com')), -    ); - -    expect(sut.nextOp(Key.fromMapKey('k'))).to.deep.equal({type: 'scroll.vertically', count: -1}); -    expect(sut.nextOp(Key.fromMapKey('j'))).to.deep.equal({type: 'scroll.vertically', count: 1}); -    expect(sut.nextOp(Key.fromMapKey('g'))).to.be.null; -    expect(sut.nextOp(Key.fromMapKey('g'))).to.deep.equal({type: 'scroll.top'}); -    expect(sut.nextOp(Key.fromMapKey('z'))).to.be.null; + +    let sut: KeymapUseCase; + +    before(() => { +      sut = new KeymapUseCase( +          new KeymapRepositoryImpl(), +          new MockSettingRepository(settings), +          new MockAddonEnabledRepository(true), +          new MockAddressRepository(new URL('https://example.com')), +      ); +    }); + +    it('returns matched operation', () => { +      expect(sut.nextOps(Key.fromMapKey('k'))).to.deep.equal({ repeat: 1, op: {type: 'scroll.vertically', count: -1}}); +      expect(sut.nextOps(Key.fromMapKey('j'))).to.deep.equal({ repeat: 1, op: {type: 'scroll.vertically', count: 1}}); +      expect(sut.nextOps(Key.fromMapKey('g'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('g'))).to.deep.equal({ repeat: 1, op: {type: 'scroll.top'}}); +      expect(sut.nextOps(Key.fromMapKey('z'))).to.be.null; +    }); + +    it('repeats n-times by numeric prefix and multiple key operations', () => { +      expect(sut.nextOps(Key.fromMapKey('1'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('0'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('g'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('g'))).to.deep.equal({ repeat: 10, op: {type: "scroll.top"}}); +    }); +  }); + +  context('when keymaps containing numeric mappings', () => { +    const settings = Settings.fromJSON({ +      keymaps: { +        20: {type: "scroll.top"}, +        g5: {type: 'scroll.bottom'}, +      }, +    }); + +    let sut: KeymapUseCase; + +    before(() => { +      sut = new KeymapUseCase( +          new KeymapRepositoryImpl(), +          new MockSettingRepository(settings), +          new MockAddonEnabledRepository(true), +          new MockAddressRepository(new URL('https://example.com')), +      ); +    }); + +    it('returns the matched operation ends with digit', () => { +      expect(sut.nextOps(Key.fromMapKey('g'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('5'))).to.be.deep.equal({ repeat: 1, op: { type: 'scroll.bottom'}}); +    }); + +    it('returns an operation matched the operation with digit keymaps', () => { +      expect(sut.nextOps(Key.fromMapKey('2'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('0'))).to.be.deep.equal({ repeat: 1, op: { type: 'scroll.top'}}); +    }); + +    it('returns operations repeated by numeric prefix', () => { +      expect(sut.nextOps(Key.fromMapKey('2'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('g'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('5'))).to.be.deep.equal({ repeat: 2, op: { type: 'scroll.bottom'}}); +    }); + +    it('does not matches with digit operation with numeric prefix', () => { +      expect(sut.nextOps(Key.fromMapKey('3'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('2'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('0'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('g'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('5'))).to.be.deep.equal({ repeat: 320, op: { type: 'scroll.bottom'}}); +    }); +  }); + +  context('when the keys are mismatched with the operations', () => { +    const settings = Settings.fromJSON({ +      keymaps: { +        gg: {type: "scroll.top"}, +        G: {type: "scroll.bottom"}, +      }, +    }); + +    let sut: KeymapUseCase; + +    before(() => { +      sut = new KeymapUseCase( +          new KeymapRepositoryImpl(), +          new MockSettingRepository(settings), +          new MockAddonEnabledRepository(true), +          new MockAddressRepository(new URL('https://example.com')), +      ); +    }); + +    it('clears input keys with no-matched operations', () => { +      expect(sut.nextOps(Key.fromMapKey('g'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('x'))).to.be.null; // clear +      expect(sut.nextOps(Key.fromMapKey('g'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('g'))).to.deep.equal({repeat: 1, op: {type: "scroll.top"}}); +    }); + +    it('clears input keys and the prefix with no-matched operations', () => { +      expect(sut.nextOps(Key.fromMapKey('1'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('0'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('g'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('x'))).to.be.null;   // clear +      expect(sut.nextOps(Key.fromMapKey('1'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('0'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('g'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('g'))).to.deep.equal({ repeat: 10, op: {type: "scroll.top"}}); +    });    }); -  it('returns only ADDON_ENABLE and ADDON_TOGGLE_ENABLED operation', () => { -    let settings = Settings.fromJSON({ +  context('when the site matches to the blacklist', () => { +    const settings = Settings.fromJSON({        keymaps: {          k: {type: 'scroll.vertically', count: -1},          a: {type: 'addon.enable'},          b: {type: 'addon.toggle.enabled'},        },      }); -    let sut = new KeymapUseCase( -      new KeymapRepositoryImpl(), -      new MockSettingRepository(settings), -      new MockAddonEnabledRepository(false), -      new MockAddressRepository(new URL('https://example.com')), -    ); -    expect(sut.nextOp(Key.fromMapKey('k'))).to.be.null; -    expect(sut.nextOp(Key.fromMapKey('a'))).to.deep.equal({type: 'addon.enable'}); -    expect(sut.nextOp(Key.fromMapKey('b'))).to.deep.equal({type: 'addon.toggle.enabled'}); +    let sut: KeymapUseCase; + +    before(() => { +      sut = new KeymapUseCase( +          new KeymapRepositoryImpl(), +          new MockSettingRepository(settings), +          new MockAddonEnabledRepository(false), +          new MockAddressRepository(new URL('https://example.com')), +      ); +    }); + +    it('returns only ADDON_ENABLE and ADDON_TOGGLE_ENABLED operation', () => { +      expect(sut.nextOps(Key.fromMapKey('k'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('a'))).to.deep.equal({ repeat: 1, op: {type: 'addon.enable'}}); +      expect(sut.nextOps(Key.fromMapKey('b'))).to.deep.equal({ repeat: 1, op: {type: 'addon.toggle.enabled'}}); +    });    }); -  it('blocks keys in the partial blacklist', () => { -    let settings = Settings.fromJSON({ +  context('when the site matches to the partial blacklist', () => { +    const settings = Settings.fromJSON({        keymaps: {          k: {type: 'scroll.vertically', count: -1},          j: {type: 'scroll.vertically', count: 1}, -        gg: {"type": "scroll.top"}, -        G: {"type": "scroll.bottom"}, +        gg: {type: "scroll.top"}, +        G: {type: "scroll.bottom"},        },        blacklist: [          { url: "example.com", keys: ['g'] }, @@ -106,28 +210,30 @@ describe('KeymapUseCase', () => {        ],      }); -    let sut = new KeymapUseCase( -      new KeymapRepositoryImpl(), -      new MockSettingRepository(settings), -      new MockAddonEnabledRepository(true), -      new MockAddressRepository(new URL('https://example.com')), -    ); - -    expect(sut.nextOp(Key.fromMapKey('k'))).to.deep.equal({type: 'scroll.vertically', count: -1}); -    expect(sut.nextOp(Key.fromMapKey('j'))).to.deep.equal({type: 'scroll.vertically', count: 1}); -    expect(sut.nextOp(Key.fromMapKey('g'))).to.be.null; -    expect(sut.nextOp(Key.fromMapKey('g'))).to.be.null; -    expect(sut.nextOp(Key.fromMapKey('G'))).to.deep.equal({type: 'scroll.bottom'}); - -    sut = new KeymapUseCase( -      new KeymapRepositoryImpl(), -      new MockSettingRepository(settings), -      new MockAddonEnabledRepository(true), -      new MockAddressRepository(new URL('https://example.org')), -    ); - -    expect(sut.nextOp(Key.fromMapKey('g'))).to.be.null; -    expect(sut.nextOp(Key.fromMapKey('g'))).to.deep.equal({type: 'scroll.top'}); -    expect(sut.nextOp(Key.fromMapKey('G'))).to.be.null; +    it('blocks keys in the partial blacklist', () => { +      let sut = new KeymapUseCase( +          new KeymapRepositoryImpl(), +          new MockSettingRepository(settings), +          new MockAddonEnabledRepository(true), +          new MockAddressRepository(new URL('https://example.com')), +      ); + +      expect(sut.nextOps(Key.fromMapKey('k'))).to.deep.equal({ repeat: 1, op: {type: 'scroll.vertically', count: -1}}); +      expect(sut.nextOps(Key.fromMapKey('j'))).to.deep.equal({ repeat: 1, op: {type: 'scroll.vertically', count: 1}}); +      expect(sut.nextOps(Key.fromMapKey('g'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('g'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('G'))).to.deep.equal({ repeat: 1, op: {type: 'scroll.bottom'}}); + +      sut = new KeymapUseCase( +          new KeymapRepositoryImpl(), +          new MockSettingRepository(settings), +          new MockAddonEnabledRepository(true), +          new MockAddressRepository(new URL('https://example.org')), +      ); + +      expect(sut.nextOps(Key.fromMapKey('g'))).to.be.null; +      expect(sut.nextOps(Key.fromMapKey('g'))).to.deep.equal({ repeat: 1, op: {type: 'scroll.top'}}); +      expect(sut.nextOps(Key.fromMapKey('G'))).to.be.null; +    });    });  }); diff --git a/test/content/usecases/SettingUseCaase.test.ts b/test/content/usecases/SettingUseCaase.test.ts index 136c5af..cf14e6e 100644 --- a/test/content/usecases/SettingUseCaase.test.ts +++ b/test/content/usecases/SettingUseCaase.test.ts @@ -38,7 +38,7 @@ describe('AddonEnabledUseCase', () => {    let sut: SettingUseCase;    beforeEach(() => { -    let testSettings = { +    const testSettings = {        keymaps: {},        search: {          default: 'google', @@ -61,10 +61,10 @@ describe('AddonEnabledUseCase', () => {    describe('#reload', () => {      it('loads settings and store to repository', async() => { -      let settings = await sut.reload(); +      const settings = await sut.reload();        expect(settings.properties.hintchars).to.equal('abcd1234'); -      let saved = repository.get(); +      const saved = repository.get();        expect(saved.properties.hintchars).to.equal('abcd1234');      });    }); | 
