#include "tests/SplitStringTests.h"
#include "tests/Test.h"
#include "utils/SplitString.h"
#include "utils/List.h"

typedef StringBuffer<60> String;
typedef SplitString<60> Split;

typedef List<String, 10> StringList;

static void checkList(Test& test, const char* str, const StringList& list, const char* message) {
    Split split(str);
    test.checkEqual(list.getLength(), split.getLength(), String(message).append(" - split amount"));
    for(int i = 0; i < list.getLength() && i < split.getLength(); i++) {
        test.checkEqual(list[i], String(split[i]), String(message).append(" ").append(i));
    }
}

static void testOneArgument(Test& test) {
    StringList list;
    list.add("test");
    checkList(test, "test", list, "one argument");
}

static void testThreeArguments(Test& test) {
    StringList list;
    list.add("test").add("aaa").add("bbbb");
    checkList(test, "test aaa bbbb", list, "three arguments");
}

static void testFourArguments(Test& test) {
    StringList list;
    list.add("test").add("aaa").add("bbbb").add("ccccc");
    checkList(test, "test aaa bbbb ccccc", list, "four arguments");
}

static void testOneArgumentWithSpaces(Test& test) {
    StringList list;
    list.add("test");
    checkList(test, "test    ", list, "spaces");
}

static void testThreeArgumentsWithSpaces(Test& test) {
    StringList list;
    list.add("test").add("aaa").add("bbbb");
    checkList(test, "test  aaa   bbbb", list, "three arguments and spaces");
}

static void testTwoArgumentsWithQuotationMarks(Test& test) {
    StringList list;
    list.add("test").add("aaa bbbb");
    checkList(test, "test \"aaa bbbb\"", list, "two arguments and quotation marks");
}

static void testThreeArgumentsWithQuotationMarks(Test& test) {
    StringList list;
    list.add("test").add("aaa bbbb").add("ccc");
    checkList(test, "test \"aaa bbbb\" ccc", list, "three arguments and quotation marks");
}

static void testFourArgumentsWithQuotationMarks(Test& test) {
    StringList list;
    list.add("test").add("ddd").add("aaa bbbb").add("ccc");
    checkList(test, "test ddd \"aaa bbbb\" ccc", list, "four arguments and quotation marks");
}

static void testEmptyArgument(Test& test) {
    StringList list;
    list.add("test").add("");
    checkList(test, "test \"\"", list, "empty argument");
}

static void testSyntaxException(Test& test) {
    StringList list;
    checkList(test, "test \"", list, "syntax exception 1");
    checkList(test, "test aaa\"", list, "syntax exception 2");
    checkList(test, "test aaa\"bbb\"", list, "syntax exception 3");
    checkList(test, "test aaa \"bbb\"ccc", list, "syntax exception 4");
    checkList(test, "test aaa \"bbb ccc", list, "syntax exception 5");
}

void SplitStringTests::test() {
    Test test("SplitString");
    testOneArgument(test);
    testThreeArguments(test);
    testFourArguments(test);
    testOneArgumentWithSpaces(test);
    testThreeArgumentsWithSpaces(test);
    testTwoArgumentsWithQuotationMarks(test);
    testThreeArgumentsWithQuotationMarks(test);
    testFourArgumentsWithQuotationMarks(test);
    testEmptyArgument(test);
    testSyntaxException(test);
    test.finalize();
}