#include <iostream>
#include "options.h"
const bool VERBOSE = false;
using namespace std;
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;
}