| #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; | 
 | } | 
 |  |