aboutsummaryrefslogtreecommitdiff
path: root/test/content/usecases/MarkUseCase.test.ts
diff options
context:
space:
mode:
authorShin'ya Ueoka <ueokande@i-beam.org>2019-05-11 16:38:08 +0900
committerShin'ya Ueoka <ueokande@i-beam.org>2019-05-11 16:38:08 +0900
commitc6288f19d93a05f96274dd172450b8350389c39f (patch)
tree75b5a168af535aa640bc21e70281497915dade63 /test/content/usecases/MarkUseCase.test.ts
parentebfb172520f7077a15cd5d4e865e5d86593c55ac (diff)
Mark set/jump as a clean architecture
Diffstat (limited to 'test/content/usecases/MarkUseCase.test.ts')
-rw-r--r--test/content/usecases/MarkUseCase.test.ts107
1 files changed, 107 insertions, 0 deletions
diff --git a/test/content/usecases/MarkUseCase.test.ts b/test/content/usecases/MarkUseCase.test.ts
new file mode 100644
index 0000000..4f2dee4
--- /dev/null
+++ b/test/content/usecases/MarkUseCase.test.ts
@@ -0,0 +1,107 @@
+import MarkRepository from '../../../src/content/repositories/MarkRepository';
+import MarkUseCase from '../../../src/content/usecases/MarkUseCase';
+import MarkClient from '../../../src/content/client/MarkClient';
+import MockConsoleClient from '../mock/MockConsoleClient';
+import MockScrollPresenter from '../mock/MockScrollPresenter';
+import Mark from '../../../src/content/domains/Mark';
+import { expect } from 'chai';
+
+class MockMarkRepository implements MarkRepository {
+ private current: {[key: string]: Mark};
+
+ constructor() {
+ this.current = {};
+ }
+
+ set(key: string, mark: Mark): void {
+ this.current[key] = mark;
+ }
+
+ get(key: string): Mark | null {
+ return this.current[key];
+ }
+}
+
+class MockMarkClient implements MarkClient {
+ public marks: {[key: string]: Mark};
+ public last: string;
+
+ constructor() {
+ this.marks = {};
+ this.last = '';
+ }
+
+ setGloablMark(key: string, mark: Mark): Promise<void> {
+ this.marks[key] = mark;
+ return Promise.resolve();
+ }
+
+ jumpGlobalMark(key: string): Promise<void> {
+ this.last = key
+ return Promise.resolve();
+ }
+}
+
+describe('MarkUseCase', () => {
+ let repository: MockMarkRepository;
+ let client: MockMarkClient;
+ let consoleClient: MockConsoleClient;
+ let scrollPresenter: MockScrollPresenter;
+ let sut: MarkUseCase;
+
+ beforeEach(() => {
+ repository = new MockMarkRepository();
+ client = new MockMarkClient();
+ consoleClient = new MockConsoleClient();
+ scrollPresenter = new MockScrollPresenter();
+ sut = new MarkUseCase({
+ repository, client, consoleClient, scrollPresenter,
+ });
+ });
+
+ describe('#set', () => {
+ it('sets local mark', async() => {
+ scrollPresenter.scrollTo(10, 20, false);
+
+ await sut.set('x');
+
+ expect(repository.get('x')).to.deep.equals({ x: 10, y: 20 });
+ expect(consoleClient.text).to.equal("Set local mark to 'x'");
+ });
+
+ it('sets global mark', async() => {
+ scrollPresenter.scrollTo(30, 40, false);
+
+ await sut.set('Z');
+
+ expect(client.marks['Z']).to.deep.equals({ x: 30, y: 40 });
+ expect(consoleClient.text).to.equal("Set global mark to 'Z'");
+ });
+ });
+
+ describe('#jump', () => {
+ it('jumps to local mark', async() => {
+ repository.set('x', { x: 20, y: 40 });
+
+ await sut.jump('x');
+
+ expect(scrollPresenter.getScroll()).to.deep.equals({ x: 20, y: 40 });
+ });
+
+ it('throws an error when no local marks', () => {
+ return sut.jump('a').then(() => {
+ throw new Error('error');
+ }).catch((e) => {
+ expect(e).to.be.instanceof(Error);
+ })
+ })
+
+ it('jumps to global mark', async() => {
+ client.marks['Z'] = { x: 20, y: 0 };
+
+ await sut.jump('Z');
+
+ expect(client.last).to.equal('Z')
+ });
+ });
+});