#include <iostream>
#include "options.h"

const bool VERBOSE = false;

using std::string;
using std::vector;

struct Answer {
    const char* argv[8];
    int result;
    const char* systemSearchPath[8];
    const char* localSearchPath[8];
    const char* inputFileName;
    language_t nativeLanguage;
    const char* outputH;
    const char* outputCPP;
    const char* outputJava;
};

bool
match_arrays(const char* const*expected, const vector<string> &got)
{
    int count = 0;
    while (expected[count] != NULL) {
        count++;
    }
    if (got.size() != count) {
        return false;
    }
    for (int i=0; i<count; i++) {
        if (got[i] != expected[i]) {
            return false;
        }
    }
    return true;
}

void
print_array(const char* prefix, const char* const*expected)
{
    while (*expected) {
        cout << prefix << *expected << endl;
        expected++;
    }
}

void
print_array(const char* prefix, const vector<string> &got)
{
    size_t count = got.size();
    for (size_t i=0; i<count; i++) {
        cout << prefix << got[i] << endl;
    }
}

static int
test(const Answer& answer)
{
    int argc = 0;
    while (answer.argv[argc]) {
        argc++;
    }

    int err = 0;

    Options options;
    int result = parse_options(argc, answer.argv, &options);

    // result
    if (((bool)result) != ((bool)answer.result)) {
        cout << "mismatch: result: got " << result << " expected " <<
            answer.result << endl;
        err = 1;
    }

    if (result != 0) {
        // if it failed, everything is invalid
        return err;
    }

    // systemSearchPath
    if (!match_arrays(answer.systemSearchPath, options.systemSearchPath)) {
        cout << "mismatch: systemSearchPath: got" << endl;
        print_array("        ", options.systemSearchPath);
        cout << "    expected" << endl;
        print_array("        ", answer.systemSearchPath);
        err = 1;
    }

    // localSearchPath
    if (!match_arrays(answer.localSearchPath, options.localSearchPath)) {
        cout << "mismatch: localSearchPath: got" << endl;
        print_array("        ", options.localSearchPath);
        cout << "    expected" << endl;
        print_array("        ", answer.localSearchPath);
        err = 1;
    }

    // inputFileName
    if (answer.inputFileName != options.inputFileName) {
        cout << "mismatch: inputFileName: got " << options.inputFileName
            << " expected " << answer.inputFileName << endl;
        err = 1;
    }

    // nativeLanguage
    if (answer.nativeLanguage != options.nativeLanguage) {
        cout << "mismatch: nativeLanguage: got " << options.nativeLanguage
            << " expected " << answer.nativeLanguage << endl;
        err = 1;
    }

    // outputH
    if (answer.outputH != options.outputH) {
        cout << "mismatch: outputH: got " << options.outputH
            << " expected " << answer.outputH << endl;
        err = 1;
    }

    // outputCPP
    if (answer.outputCPP != options.outputCPP) {
        cout << "mismatch: outputCPP: got " << options.outputCPP
            << " expected " << answer.outputCPP << endl;
        err = 1;
    }

    // outputJava
    if (answer.outputJava != options.outputJava) {
        cout << "mismatch: outputJava: got " << options.outputJava
            << " expected " << answer.outputJava << endl;
        err = 1;
    }

    return err;
}

const Answer g_tests[] = {

    {
        /* argv */              { "test", "-i/moof", "-I/blah", "-Ibleh", "-imoo", "inputFileName.aidl_cpp", NULL, NULL },
        /* result */            0,
        /* systemSearchPath */  { "/blah", "bleh", NULL, NULL, NULL, NULL, NULL, NULL },
        /* localSearchPath */   { "/moof", "moo", NULL, NULL, NULL, NULL, NULL, NULL },
        /* inputFileName */     "inputFileName.aidl_cpp",
        /* nativeLanguage */    CPP,
        /* outputH */           "",
        /* outputCPP */         "",
        /* outputJava */        ""
    },

    {
        /* argv */              { "test", "inputFileName.aidl_cpp", "-oh", "outputH", NULL, NULL, NULL, NULL },
        /* result */            0,
        /* systemSearchPath */  { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
        /* localSearchPath */   { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
        /* inputFileName */     "inputFileName.aidl_cpp",
        /* nativeLanguage */    CPP,
        /* outputH */           "outputH",
        /* outputCPP */         "",
        /* outputJava */        ""
    },

    {
        /* argv */              { "test", "inputFileName.aidl_cpp", "-ocpp", "outputCPP", NULL, NULL, NULL, NULL },
        /* result */            0,
        /* systemSearchPath */  { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
        /* localSearchPath */   { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
        /* inputFileName */     "inputFileName.aidl_cpp",
        /* nativeLanguage */    CPP,
        /* outputH */           "",
        /* outputCPP */         "outputCPP",
        /* outputJava */        ""
    },

    {
        /* argv */              { "test", "inputFileName.aidl_cpp", "-ojava", "outputJava", NULL, NULL, NULL, NULL },
        /* result */            0,
        /* systemSearchPath */  { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
        /* localSearchPath */   { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
        /* inputFileName */     "inputFileName.aidl_cpp",
        /* nativeLanguage */    CPP,
        /* outputH */           "",
        /* outputCPP */         "",
        /* outputJava */        "outputJava"
    },

    {
        /* argv */              { "test", "inputFileName.aidl_cpp", "-oh", "outputH", "-ocpp", "outputCPP", "-ojava", "outputJava" },
        /* result */            0,
        /* systemSearchPath */  { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
        /* localSearchPath */   { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
        /* inputFileName */     "inputFileName.aidl_cpp",
        /* nativeLanguage */    CPP,
        /* outputH */           "outputH",
        /* outputCPP */         "outputCPP",
        /* outputJava */        "outputJava"
    },

    {
        /* argv */              { "test", "inputFileName.aidl_cpp", "-oh", "outputH", "-oh", "outputH1", NULL, NULL },
        /* result */            1,
        /* systemSearchPath */  { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
        /* localSearchPath */   { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
        /* inputFileName */     "",
        /* nativeLanguage */    CPP,
        /* outputH */           "",
        /* outputCPP */         "",
        /* outputJava */        ""
    },

    {
        /* argv */              { "test", "inputFileName.aidl_cpp", "-ocpp", "outputCPP", "-ocpp", "outputCPP1", NULL, NULL },
        /* result */            1,
        /* systemSearchPath */  { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
        /* localSearchPath */   { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
        /* inputFileName */     "",
        /* nativeLanguage */    CPP,
        /* outputH */           "",
        /* outputCPP */         "",
        /* outputJava */        ""
    },

    {
        /* argv */              { "test", "inputFileName.aidl_cpp", "-ojava", "outputJava", "-ojava", "outputJava1", NULL, NULL },
        /* result */            1,
        /* systemSearchPath */  { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
        /* localSearchPath */   { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
        /* inputFileName */     "",
        /* nativeLanguage */    CPP,
        /* outputH */           "",
        /* outputCPP */         "",
        /* outputJava */        ""
    },

};

int
main(int argc, const char** argv)
{
    const int count = sizeof(g_tests)/sizeof(g_tests[0]);
    int matches[count];

    int result = 0;
    for (int i=0; i<count; i++) {
        if (VERBOSE) {
            cout << endl;
            cout << "---------------------------------------------" << endl;
            const char* const* p = g_tests[i].argv;
            while (*p) {
                cout << " " << *p;
                p++;
            }
            cout << endl;
            cout << "---------------------------------------------" << endl;
        }
        matches[i] = test(g_tests[i]);
        if (VERBOSE) {
            if (0 == matches[i]) {
                cout << "passed" << endl;
            } else {
                cout << "failed" << endl;
            }
            result |= matches[i];
        }
    }

    cout << endl;
    cout << "=============================================" << endl;
    cout << "options_test summary" << endl;
    cout << "=============================================" << endl;

    if (!result) {
        cout << "passed" << endl;
    } else {
        cout << "failed the following tests:" << endl;
        for (int i=0; i<count; i++) {
            if (matches[i]) {
                cout << "   ";
                const char* const* p = g_tests[i].argv;
                while (*p) {
                    cout << " " << *p;
                    p++;
                }
                cout << endl;
            }
        }
    }

    return result;
}

