import { useStateHook } from "./useStateHook"; import { EventsManager } from "../EventsManager"; import { CallbacksManager } from "../CallbacksManager"; import { ElementState } from "../ElementState"; import { IElementParams, EventType } from "../types"; describe("useStateHook tests", () => { const elementId = 15; let eventsManager: EventsManager; let callbacksManager: CallbacksManager; let state: ElementState; const params: IElementParams = { args: ["arg1", "arg2"], func: jest.fn(), }; const callback1 = jest.fn(); const callbackId1 = 20; let createEvent: jest.Mock; let getCallback: jest.Mock; beforeEach(() => { callbacksManager = new CallbacksManager(); eventsManager = new EventsManager(callbacksManager); state = new ElementState(params); createEvent = jest.fn().mockReturnValue([callbackId1, callback1]); eventsManager.createEvent = createEvent; getCallback = jest.fn().mockImplementation((id: number) => { if (id === callbackId1) { return callback1; } throw new Error("Unknown callback id " + id); }); callbacksManager.getCallback = getCallback; }); it("when first tick, should add var to state, create setter and return state", () => { const [value, setValue] = useStateHook(eventsManager, callbacksManager, elementId, state, "DefaultValue"); expect(createEvent.mock.calls.length).toBe(1); const event = createEvent.mock.calls[0]; expect(event).toEqual([ elementId, EventType.ChangeVar, { varNumber: 0, }, ]); expect(state.vars.length).toBe(1); expect(state.vars[0]).toEqual({ value: "DefaultValue", setter: callbackId1 }); expect(value).toBe("DefaultValue"); expect(setValue).toBe(callback1); expect(state.tickState.currentVarNumber).toBe(1); }); it("when not first tick and vars not found should throw error", () => { state.isFirstTick = false; state.tickState.currentVarNumber = 1; expect(() => useStateHook(eventsManager, callbacksManager, elementId, state, "DefaultValue")).toThrowError( "Expected var with number " + state.tickState.currentVarNumber, ); }); it("when not first tick and var exists, should return state", () => { state.isFirstTick = false; const value1 = "Value1"; state.vars.push({ value: value1, setter: callbackId1, }); const result = useStateHook(eventsManager, callbacksManager, elementId, state, "DefaultValue3"); expect(result[0]).toBe(value1); expect(result[1]).toBe(callback1); expect(state.tickState.currentVarNumber).toBe(1); }); });