import { MasterCellAsyncRenderManager } from "../MasterCellAsyncRenderManager";

describe("MasterCellAsyncRenderManager", () => {
  it("run callback for 1 async element", () => {
    // setup
    const callback = jest.fn();
    const manager = new MasterCellAsyncRenderManager(callback);

    // run
    manager.start();

    // verify
    expect(callback).not.toBeCalled();

    manager.emitAsyncElementRegistrate();
    expect(callback).not.toBeCalled();
    manager.emitAsyncElementLayout();

    expect(callback).toBeCalled();
  });

  it("run callback for 2 async element", () => {
    // setup
    const callback = jest.fn();
    const manager = new MasterCellAsyncRenderManager(callback);

    // run
    manager.start();

    // verify
    expect(callback).not.toBeCalled();

    manager.emitAsyncElementRegistrate();
    manager.emitAsyncElementRegistrate();

    expect(callback).not.toBeCalled();

    manager.emitAsyncElementLayout();
    manager.emitAsyncElementLayout();

    expect(callback).toBeCalled();
  });

  it("run callback when cell_layout happens(zero async elements)", () => {
    // setup
    const callback = jest.fn();
    const manager = new MasterCellAsyncRenderManager(callback);

    // run
    manager.start();
    expect(callback).not.toBeCalled();

    // verify
    manager.onCellLayout();

    expect(callback).toBeCalled();
  });

  it("should return decrementAsyncElementRegistrationCount, call decrementAsyncElementRegistrationCount should decrement count", () => {
    // setup
    const callback = jest.fn();
    const manager = new MasterCellAsyncRenderManager(callback);

    // run
    manager.start();

    // verify
    expect(callback).not.toBeCalled();

    const unsubscribe = manager.emitAsyncElementRegistrate();

    expect(manager.asyncElementRegistrationCount).toBe(1);
    expect(unsubscribe).toBe(manager.decrementAsyncElementRegistrationCount);

    unsubscribe();

    expect(manager.asyncElementRegistrationCount).toBe(0);
  });
});
