#include "logtest.h"
#include <panda/log/multi.h>

#define TEST(name) TEST_CASE("log-multi: " name, "[log-multi]")

TEST("log to multi channels") {
    Ctx c;
    int cnt = 0;
    set_formatter("%m");
    set_logger(new MultiLogger({
        {
            [&](const string& msg, const Info& info) {
                CHECK(info.level == Level::Critical);
                CHECK(info.line == 28);
                CHECK(msg == "hi");
                ++cnt;
            }
        },
        {
            [&](const string& msg, const Info& info) {
                CHECK(info.level == Level::Critical);
                CHECK(info.line == 28);
                CHECK(msg == "hi");
                ++cnt;
            }
        }
    }));
    panda_log_critical("hi");
    CHECK(cnt == 2);
}

TEST("using min_level") {
    Ctx c;
    int cnt = 0;
    set_logger(new MultiLogger({
        { [&](const string&, const Info&) { cnt += 1; }, Level::Notice },
        { [&](const string&, const Info&) { cnt += 100; }, Level::Error },
        { [&](const string&, const Info&) { cnt += 10; }, Level::Warning },
    }));
    panda_log_warning("hi");
    CHECK(cnt == 11);
}

TEST("using different formatters") {
    Ctx c;
    set_formatter("F1:%m");
    string m1,m2,m3;
    set_logger(new MultiLogger({
        { [&](const string& m, const Info&) { m1=m; }, new PatternFormatter("F2:%m"), Level::Debug },
        { [&](const string& m, const Info&) { m2=m; }, "F3:%m" },
        { [&](const string& m, const Info&) { m3=m; } },
    }));
    panda_log_error("hi");
    CHECK(m1 == "F2:hi");
    CHECK(m2 == "F3:hi");
    CHECK(m3 == "F1:hi");
}

TEST("multi into multi") {
    Ctx c;
    int cnt = 0;
    string s[10];
    set_formatter("D:%m");

    set_logger(new MultiLogger({
        { [&](auto& m, auto&) { ++cnt; s[1]=m; } },
        { [&](auto& m, auto&) { ++cnt; s[2]=m; }, "L2:%m" },
        { [&](auto& m, auto&) { ++cnt; s[3]=m; }, "L3:%m", Level::Emergency },
        {
            new MultiLogger({
                { [&](auto& m, auto&) { ++cnt; s[4]=m; } },
                { [&](auto& m, auto&) { ++cnt; s[5]=m; }, "ML2:%m" },
                { [&](auto& m, auto&) { ++cnt; s[6]=m; }, "ML3:%m", Level::Emergency },
            }),
            "M:%m"
        }
    }));

    panda_log_alert("hi");

    CHECK(cnt == 4);
    CHECK(s[1] == "D:hi");
    CHECK(s[2] == "L2:hi");
    CHECK(s[3].empty());
    CHECK(s[4] == "M:hi");
    CHECK(s[5] == "ML2:hi");
    CHECK(s[6].empty());
}