#include "test.h"

#define TEST(name) TEST_CASE("header: " name, "[header]")

TEST("case insensitive") {
    Headers h;
    h.add("Aa", "value");
    CHECK(h.get("AA") == "value");
}

TEST("basic") {
    Headers h;
    CHECK(h.length() == 0);
    CHECK(h.get("Content-Length", "default") == "default");

    h.add("field1", "value1");
    CHECK(h.get("field1", "default") == "value1");


    h.set("field1", "value2");
    CHECK(h.get("field1", "default") == "value2");

    h.set("field2", "value2");
    CHECK(h.get("field2", "default") == "value2");
}

TEST("multi") {
    Headers h;

    h.add("key", "hello");
    h.add("Key", "world");

    CHECK(h.get("key") == "world");

    auto r = h.get_multi("key");
    auto it = r.begin();
    CHECK(*it++ == "hello");
    CHECK(*it++ == "world");
    CHECK(it == r.end());
}

TEST("ctor from ilist") {
    auto h = Headers({
        {"key", "val"},
        {"a", "b"},
    });

    CHECK(h.get("key") == "val");
    CHECK(h.get("a") == "b");
}

TEST("operator==") {
    Headers h1, h2;
    for (auto p : {&h1, &h2}) {
        p->add("key", "hello");
        p->add("Key", "world");
        p->add("hi",  "there");
    }

    CHECK(h1 == h2);
    CHECK(h1 == Headers{{"key", "hello"}, {"key", "world"}, {"hi", "there"}});
    CHECK(h1 != Headers{{"key1", "hello"}, {"key", "world"}, {"hi", "there"}});
}

TEST("iequals") {
    CHECK(iequals("a", "A"));
    CHECK(iequals("aa", "aA"));
    CHECK(iequals("Aaa", "aaA"));
    CHECK(iequals("AaaA", "aAAa"));
    CHECK(iequals("Aaaaa", "aaaaA"));
    CHECK(iequals("Aaaaaa", "aaaaaA"));
    CHECK(iequals("Aaaaaaa", "aaaaaaA"));
    CHECK(iequals("Aaaaaaaa", "aaaaaaaA"));
    CHECK(iequals("Aaaaaaaaa", "aaaaaaaaA"));
    CHECK_FALSE(iequals("a", "Transfer-Encoding"));
    CHECK_FALSE(iequals("a", "transfer-encoding"));
}

TEST("builder") {
    auto h = Headers().add("key", "val").add("k", "v");
    CHECK(h == Headers{{"key", "val"}, {"k", "v"}});
}