#include "../url_lib.h"
#include "../dial_data.h"

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <ctype.h>
#include "test.h"

void test_smartstrcat() {
    char* src1 = "Hello ";
    char* src2 = "world!";
    char* src3 = " Trunc ated";
    char dest[128] = {0, };

    char* p = (char *) dest;
    p = smartstrcat(p, src1, 128);
    EXPECT_STREQ(dest, "Hello ");
    p = smartstrcat(p, src2, dest + 128 - p);

    EXPECT_STREQ(dest, "Hello world!");

    p = smartstrcat(p, src3, 6);
    EXPECT_STREQ(dest, "Hello world! Trunc");

    DONE();
}

void test_urldecode() {
    char* param = "%26bla+r";
    char dest[128] = {0, };

    EXPECT(urldecode(dest, param, 128), "Failed to decode.");
    EXPECT_STREQ(dest, "&bla r");
    DONE();
}

void test_parse_app_name() {
    char *app_name;
    EXPECT((app_name = parse_app_name(NULL)), "Failed to extract app_name");
    EXPECT_STREQ(app_name, "unknown");
    EXPECT((app_name = parse_app_name("")), "Failed to extract app_name");
    EXPECT_STREQ(app_name, "unknown");
    EXPECT((app_name = parse_app_name("/")), "Failed to extract app_name");
    EXPECT_STREQ(app_name, "unknown");
    EXPECT((app_name = parse_app_name("/apps/YouTube/DialData")),
           "Failed to extract app_name");
    EXPECT_STREQ(app_name, "YouTube");
    EXPECT((app_name = parse_app_name("//")), "Failed to extract app_name");
    EXPECT_STREQ(app_name, "");
    EXPECT((app_name = parse_app_name("/invalid")),
           "Failed to extract app_name");
    EXPECT_STREQ(app_name, "unknown");

    DONE();
}

void test_parse_params() {
    EXPECT(!parse_params(""), "Empty query string should generate no params");
    EXPECT(!parse_params(NULL), "Null query, should generate no params");

    DIALData *result = parse_params("a=b");
    EXPECT_STREQ(result->key, "a");
    EXPECT_STREQ(result->value, "b");

    result = parse_params("?a=b");
    EXPECT_STREQ(result->key, "a");
    EXPECT_STREQ(result->value, "b");

    result = parse_params("?a=b&c=d");
    EXPECT_STREQ(result->key, "c");
    EXPECT_STREQ(result->value, "d");
    EXPECT_STREQ(result->next->key, "a");
    EXPECT_STREQ(result->next->value, "b");

    char query_string[1024] = {0, };
    char *current = query_string;
    for (int i = 0; i < 25; ++i) {
        current = smartstrcat(current, "a=b&", 256);
    }
    result = parse_params(query_string);
    int length = 0;
    for (; result != NULL; result = result->next) {
        length++;
    }
    EXPECT((length == 25), "25 params should have been parsed");

    DONE();
}
