Add HintKeyProducer

jh-changes
Shin'ya Ueoka 6 years ago
parent 6d9aaef18c
commit c4dcdff984
  1. 2
      src/content/usecases/FollowMasterUseCase.ts
  2. 38
      src/content/usecases/HintKeyProducer.ts
  3. 5
      test/content/usecases/HintKeyProducer.test.ts

@ -4,7 +4,7 @@ import FollowMasterRepository, { FollowMasterRepositoryImpl }
from '../repositories/FollowMasterRepository';
import FollowSlaveClient, { FollowSlaveClientImpl }
from '../client/FollowSlaveClient';
import HintKeyProducer from '../hint-key-producer';
import HintKeyProducer from './HintKeyProducer';
import SettingRepository, { SettingRepositoryImpl }
from '../repositories/SettingRepository';

@ -0,0 +1,38 @@
export default class HintKeyProducer {
private charset: string;
private counter: number[];
constructor(charset: string) {
if (charset.length === 0) {
throw new TypeError('charset is empty');
}
this.charset = charset;
this.counter = [];
}
produce(): string {
this.increment();
return this.counter.map(x => this.charset[x]).join('');
}
private increment(): void {
let max = this.charset.length - 1;
if (this.counter.every(x => x === max)) {
this.counter = new Array(this.counter.length + 1).fill(0);
return;
}
this.counter.reverse();
let len = this.charset.length;
let num = this.counter.reduce((x, y, index) => x + y * len ** index) + 1;
for (let i = 0; i < this.counter.length; ++i) {
this.counter[i] = num % len;
num = ~~(num / len);
}
this.counter.reverse();
}
}

@ -1,9 +1,10 @@
import HintKeyProducer from 'content/hint-key-producer';
import HintKeyProducer from '../../../src/content/usecases/HintKeyProducer';
import { expect } from 'chai';
describe('HintKeyProducer class', () => {
describe('#constructor', () => {
it('throws an exception on empty charset', () => {
expect(() => new HintKeyProducer([])).to.throw(TypeError);
expect(() => new HintKeyProducer('')).to.throw(TypeError);
});
});