import { MockActivationController } from "../mock/MockActivationController";
import { SimpleActivatable } from "../mock/SimpleActivatable";
import { test } from "./TestTraits";

test("simple activation", async t => {

    const a = new SimpleActivatable();
    t.false(a.isActive());

    await a.activate();
    t.true(a.isActive());

    await a.deactivate();
    t.false(a.isActive());
});

test("controller activation", async t => {

    const a = new SimpleActivatable();
    const c = new MockActivationController();

    t.false(a.isActive(), "the component is not active by default");
    t.assert(c.getActive() == null, "the activation controller doesn't have an active component by default");
    t.assert(a.getActivationController() == null, "the component doesn't have an activation controller by default");

    t.comment("Active the component through the controller");
    await c.activate(a);
    t.true(a.isActive(), "The component should successfully activate");
    t.equal(c.getActive(), a, "The controller should point to the activated component");
    t.equal(a.getActivationController(), c, "The component should point to the controller");

    t.comment("Deactive the component throug the controller");
    await c.deactivate();

    t.false(a.isActive(), "The component should successfully deactivate");
    t.equal(c.getActive(), null, "The controller shouldn't point to any component");
    t.equal(a.getActivationController(), c, "The componet should point to it's controller");
});

test("handle error in onActivating", async t => {
    const a = new SimpleActivatable();

    a.onActivating = async () => {
        throw new Error("Should fail");
    };

    try {
        await a.activate();
        t.fail("activation should fail");
    } catch {
    }

    t.false(a.isActive(), "the component should remain inactive");
});
