import { makeAppObjectRepo } from "@vived/core";
import { makeMockDispatchStateChange } from "../../Dispatcher/Mocks/MockDispatchStateChange";
import { makeUndoRedoEntity } from "../../UndoRedo/Entities/UndoRedoEntity";
import { makeObjectPickEntity } from "../Entities/ObjectPickEntity";
import { makeRemoveCorrectObjectIdUC, RemoveCorrectObjectIdUC, } from "./RemoveCorrectObjectIdUC";
function makeTestRig() {
    const appObjects = makeAppObjectRepo();
    const registerSpy = jest.spyOn(appObjects, "registerSingleton");
    const mockDispatchStateChange = makeMockDispatchStateChange(appObjects);
    const undo = makeUndoRedoEntity(appObjects.getOrCreate("Undo"));
    const objectPick = makeObjectPickEntity(appObjects.getOrCreate("ObjectPick"));
    const uc = makeRemoveCorrectObjectIdUC(appObjects.getOrCreate("ObjectPick"));
    const removeCorrectObjectId = uc.removeCorrectObjectId;
    objectPick.addCorrectObjectId("id1");
    return {
        objectPick,
        removeCorrectObjectId,
        mockDispatchStateChange,
        undo,
        registerSpy,
        appObjects,
        uc,
    };
}
describe("Remove correct object Id UC", () => {
    it("Gets the singleton", () => {
        const { appObjects, uc } = makeTestRig();
        expect(RemoveCorrectObjectIdUC.get(appObjects)).toEqual(uc);
    });
    it("Registers as the singleton", () => {
        const { registerSpy, uc } = makeTestRig();
        expect(registerSpy).toHaveBeenCalledWith(uc);
    });
    it("Removes correct object Id the entity", () => {
        const { objectPick, removeCorrectObjectId } = makeTestRig();
        expect(objectPick.correctObjectIds.includes("id1")).toEqual(true);
        removeCorrectObjectId("id1");
        expect(objectPick.correctObjectIds.includes("id1")).toEqual(false);
    });
    it("Dispatches a state change if authoring", () => {
        const { removeCorrectObjectId, mockDispatchStateChange } = makeTestRig();
        removeCorrectObjectId("id1");
        expect(mockDispatchStateChange.doDispatch).toHaveBeenCalled();
    });
    it("Is undoable and redoable", () => {
        const { objectPick, removeCorrectObjectId, undo } = makeTestRig();
        removeCorrectObjectId("id1");
        expect(objectPick.correctObjectIds).toEqual([]);
        undo.doUndo();
        expect(objectPick.correctObjectIds).toEqual(["id1"]);
        undo.doRedo();
        expect(objectPick.correctObjectIds).toEqual([]);
    });
    it("Undo and redo dispatch a state change", () => {
        const { removeCorrectObjectId, undo, mockDispatchStateChange } = makeTestRig();
        removeCorrectObjectId("id1");
        mockDispatchStateChange.doDispatch.mockClear();
        undo.doUndo();
        expect(mockDispatchStateChange.doDispatch).toHaveBeenCalled();
        mockDispatchStateChange.doDispatch.mockClear();
        undo.doRedo();
        expect(mockDispatchStateChange.doDispatch).toHaveBeenCalled();
    });
});
//# sourceMappingURL=RemoveCorrectObjectIdUC.test.js.map