#ifdef TESTS_BUILD
#include "../extern/catch.hpp"
#include "../src/Collections/Dictionary.hpp"
using namespace ArbUt;

TEST_CASE("Create Dictionary, insert values", "[Utilities]") {
    auto dic = Dictionary<int, int>(5);
    dic.Insert(10, 5);
    dic.Insert(2, 100);
    dic.Insert(9, 2000);
}

TEST_CASE("Create Dictionary with initializer list", "[Utilities]") {
    auto dic = Dictionary<int, int>({{5, 100}, {10, 200}, {50, 2}});

    CHECK(dic.Get(5) == 100);
    CHECK(dic.Get(10) == 200);
    CHECK(dic.Get(50) == 2);
}

TEST_CASE("Create Dictionary, insert values, get values", "[Utilities]") {
    auto dic = Dictionary<int, int>(5);
    dic.Insert(10, 5);
    dic.Insert(2, 100);
    dic.Insert(9, 2000);

    CHECK(dic.Get(2) == 100);
    CHECK(dic.Get(9) == 2000);
    CHECK(dic.Get(10) == 5);
}

TEST_CASE("Create Dictionary, insert values twice should throw", "[Utilities]") {
    auto dic = Dictionary<int, int>(5);
    dic.Insert(10, 5);
    CHECK_THROWS(dic.Insert(10, 100));

    CHECK(dic.Get(10) == 5);
}

TEST_CASE("Create Dictionary, insert value, then update value", "[Utilities]") {
    auto dic = Dictionary<int, int>(5);
    dic.Insert(10, 5);
    dic[10] = 200;

    CHECK(dic.Get(10) == 200);
}

TEST_CASE("Create Dictionary, insert value, try get value", "[Utilities]") {
    auto dic = Dictionary<int, int>(5);
    dic.Insert(10, 5);
    int result = 0;
    CHECK(dic.TryGet(10, result));
    CHECK(result == 5);
}

TEST_CASE("Create Dictionary, insert value, try get non existing value", "[Utilities]") {
    auto dic = Dictionary<int, int>(5);
    int result = 0;
    CHECK_FALSE(dic.TryGet(10, result));
    CHECK(result == 0);
}

TEST_CASE("Create Dictionary, insert value, Has", "[Utilities]") {
    auto dic = Dictionary<int, int>(5);
    dic.Insert(10, 5);
    CHECK(dic.Has(10));
}

TEST_CASE("Create Dictionary, set value", "[Utilities]") {
    auto dic = Dictionary<int, int>(5);
    dic.Set(5, 100);
    CHECK(dic.Has(5));
}

TEST_CASE("Create Dictionary, insert values, get count", "[Utilities]") {
    auto dic = Dictionary<int, int>(5);
    dic.Insert(10, 5);
    dic.Insert(2, 100);
    dic.Insert(9, 2000);

    CHECK(dic.Count() == 3);
}

TEST_CASE("Create Dictionary, insert values, iterate over keys", "[Utilities]") {
    auto dic = Dictionary<int, int>(5);
    dic.Insert(10, 5);
    dic.Insert(2, 100);
    dic.Insert(9, 2000);

    size_t i = 0;
    for (auto val : dic) {
        CHECK(dic.Has(val.first));
        i++;
    }
    CHECK(i == 3);
}

TEST_CASE("Create Dictionary with different types, insert values, iterate over keys", "[Utilities]") {
    auto dic = Dictionary<char, char>(5);
    dic.Insert(10, 5);
    dic.Insert(2, 100);
    dic.Insert(9, 105);

    size_t i = 0;
    for (auto val : dic) {
        CHECK(dic.Has(val.first));
        i++;
    }
    CHECK(i == 3);
}

#endif