import MarkRepository from "../../../src/content/repositories/MarkRepository"; import { SettingRepositoryImpl } from "../../../src/content/repositories/SettingRepository"; 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"; 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 { this.marks[key] = mark; return Promise.resolve(); } jumpGlobalMark(key: string): Promise { 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( scrollPresenter, client, repository, new SettingRepositoryImpl(), consoleClient ); }); describe("#set", () => { it("sets local mark", async () => { scrollPresenter.scrollTo(10, 20, false); await sut.set("x"); expect(repository.get("x")).toEqual({ x: 10, y: 20 }); expect(consoleClient.text).toEqual("Set local mark to 'x'"); }); it("sets global mark", async () => { scrollPresenter.scrollTo(30, 40, false); await sut.set("Z"); expect(client.marks["Z"]).toEqual({ x: 30, y: 40 }); expect(consoleClient.text).toEqual("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()).toEqual({ 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).toBeInstanceOf(Error); }); }); it("jumps to global mark", async () => { client.marks["Z"] = { x: 20, y: 0 }; await sut.jump("Z"); expect(client.last).toEqual("Z"); }); }); });