#include "lib/test.h"

TEST_PREFIX("handle: ", "[handle]");

TEST("loop") {
    LoopSP l = new Loop;
    TimerSP t = new Timer(l);
    CHECK(t->loop() == l);
    l = Loop::default_loop();
    t = new Timer;
    CHECK(t->loop()->is_default());
}

TEST("type") {
    LoopSP l = new Loop;
    TimerSP t = new Timer;
    CHECK(t->type() == Timer::TYPE);
}

TEST("active") {
    LoopSP l = new Loop;
    TimerSP t = new Timer(l);
    t->event.add([](const TimerSP& t){ t->stop(); });
    CHECK(!t->active());
    t->start(10);
    CHECK(t->active());
    l->run(); // timer stops himself on callback
    CHECK(!t->active());
}

TEST("weak") {
    LoopSP l = new Loop;
    PrepareSP h = new Prepare(l);
    int cnt = 0;
    h->event.add([&](const PrepareSP& h){
        h->loop()->stop();
        ++cnt;
    });
    CHECK(!h->weak());
    h->start();
    l->run();
    CHECK(cnt == 1); // non-weak handle doesn't allow loop to bail out

    h->weak(1);
    CHECK(h->weak());
    h->start();
    l->run();
    CHECK(cnt == 1); // loop without any non-weak handles, bails out immediately
}