#include "../src/search.h"

std::map<int, std::string> prompt;

void test(xdb::search_t& s, const std::string& ip, const std::string& region) {
    if (s.search(ip) != region)
        xdb::log_exit("Test failed, ip " + ip + ", region " + region);
}

void test_ipv4(int policy) {
    std::cout << "Testing IPv4 " << prompt[policy];

    xdb::search_t s("../../data/ip2region_v4.xdb", xdb::ipv4, policy);
    test(s, "0.0.0.0", "Reserved|Reserved|Reserved|0|0");
    test(s, "1.2.3.4", "Australia|Queensland|Brisbane|0|AU");

    std::cout << " Succeed" << std::endl;
}

void test_ipv6(int policy) {
    std::cout << "Testing IPv6 " << prompt[policy];

    xdb::search_t s("../../data/ip2region_v6.xdb", xdb::ipv6, policy);
    test(s, "::1", "");
    test(s, "2001:200:124::", "Japan|Tokyo|Asagaya-minami|WIDE Project|JP");
    test(s, "2001:200:124::", "Japan|Tokyo|Asagaya-minami|WIDE Project|JP");
    test(s, "240e:3b7:3273:51d0:cd38:8ae1:e3c0:b708", "中国|广东省|深圳市|电信|CN");

    std::cout << " Succeed" << std::endl;
}

int main() {
    prompt[xdb::policy_file]    = "    No cache:";
    prompt[xdb::policy_vector]  = "Vector Index:";
    prompt[xdb::policy_content] = "  Full Cache:";

    test_ipv4(xdb::policy_file);
    test_ipv4(xdb::policy_vector);
    test_ipv4(xdb::policy_content);

    test_ipv6(xdb::policy_file);
    test_ipv6(xdb::policy_vector);
    test_ipv6(xdb::policy_content);
    return 0;
}