aboutsummaryrefslogblamecommitdiff
path: root/test/content/usecases/MarkUseCase.test.ts
blob: b788c3c7757a156ecbdabccae621393ad4eef516 (plain) (tree)
1
2
3
4
5
6
7
8
9





                                                                                            
                                                    
                                           













                                            
                                        


                      
                   






                                                         
                    


                             
                               









                                                



                                  
                   
      
     
                                       
                                              
                         
 
                                                                  
       
                                        
                                              
                         
 
                                                                   

       

                                            
 
                          
 
                                                                    
       





                                                     
                                          
           
 
                                            
 
                          
 
                                       

       
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<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(
      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");
    });
  });
});