1#include <iostream>
2#include "options.h"
3
4const bool VERBOSE = false;
5
6using namespace std;
7
8struct Answer {
9    const char* argv[8];
10    int result;
11    const char* systemSearchPath[8];
12    const char* localSearchPath[8];
13    const char* inputFileName;
14    language_t nativeLanguage;
15    const char* outputH;
16    const char* outputCPP;
17    const char* outputJava;
18};
19
20bool
21match_arrays(const char* const*expected, const vector<string> &got)
22{
23    int count = 0;
24    while (expected[count] != NULL) {
25        count++;
26    }
27    if (got.size() != count) {
28        return false;
29    }
30    for (int i=0; i<count; i++) {
31        if (got[i] != expected[i]) {
32            return false;
33        }
34    }
35    return true;
36}
37
38void
39print_array(const char* prefix, const char* const*expected)
40{
41    while (*expected) {
42        cout << prefix << *expected << endl;
43        expected++;
44    }
45}
46
47void
48print_array(const char* prefix, const vector<string> &got)
49{
50    size_t count = got.size();
51    for (size_t i=0; i<count; i++) {
52        cout << prefix << got[i] << endl;
53    }
54}
55
56static int
57test(const Answer& answer)
58{
59    int argc = 0;
60    while (answer.argv[argc]) {
61        argc++;
62    }
63
64    int err = 0;
65
66    Options options;
67    int result = parse_options(argc, answer.argv, &options);
68
69    // result
70    if (((bool)result) != ((bool)answer.result)) {
71        cout << "mismatch: result: got " << result << " expected " <<
72            answer.result << endl;
73        err = 1;
74    }
75
76    if (result != 0) {
77        // if it failed, everything is invalid
78        return err;
79    }
80
81    // systemSearchPath
82    if (!match_arrays(answer.systemSearchPath, options.systemSearchPath)) {
83        cout << "mismatch: systemSearchPath: got" << endl;
84        print_array("        ", options.systemSearchPath);
85        cout << "    expected" << endl;
86        print_array("        ", answer.systemSearchPath);
87        err = 1;
88    }
89
90    // localSearchPath
91    if (!match_arrays(answer.localSearchPath, options.localSearchPath)) {
92        cout << "mismatch: localSearchPath: got" << endl;
93        print_array("        ", options.localSearchPath);
94        cout << "    expected" << endl;
95        print_array("        ", answer.localSearchPath);
96        err = 1;
97    }
98
99    // inputFileName
100    if (answer.inputFileName != options.inputFileName) {
101        cout << "mismatch: inputFileName: got " << options.inputFileName
102            << " expected " << answer.inputFileName << endl;
103        err = 1;
104    }
105
106    // nativeLanguage
107    if (answer.nativeLanguage != options.nativeLanguage) {
108        cout << "mismatch: nativeLanguage: got " << options.nativeLanguage
109            << " expected " << answer.nativeLanguage << endl;
110        err = 1;
111    }
112
113    // outputH
114    if (answer.outputH != options.outputH) {
115        cout << "mismatch: outputH: got " << options.outputH
116            << " expected " << answer.outputH << endl;
117        err = 1;
118    }
119
120    // outputCPP
121    if (answer.outputCPP != options.outputCPP) {
122        cout << "mismatch: outputCPP: got " << options.outputCPP
123            << " expected " << answer.outputCPP << endl;
124        err = 1;
125    }
126
127    // outputJava
128    if (answer.outputJava != options.outputJava) {
129        cout << "mismatch: outputJava: got " << options.outputJava
130            << " expected " << answer.outputJava << endl;
131        err = 1;
132    }
133
134    return err;
135}
136
137const Answer g_tests[] = {
138
139    {
140        /* argv */              { "test", "-i/moof", "-I/blah", "-Ibleh", "-imoo", "inputFileName.aidl_cpp", NULL, NULL },
141        /* result */            0,
142        /* systemSearchPath */  { "/blah", "bleh", NULL, NULL, NULL, NULL, NULL, NULL },
143        /* localSearchPath */   { "/moof", "moo", NULL, NULL, NULL, NULL, NULL, NULL },
144        /* inputFileName */     "inputFileName.aidl_cpp",
145        /* nativeLanguage */    CPP,
146        /* outputH */           "",
147        /* outputCPP */         "",
148        /* outputJava */        ""
149    },
150
151    {
152        /* argv */              { "test", "inputFileName.aidl_cpp", "-oh", "outputH", NULL, NULL, NULL, NULL },
153        /* result */            0,
154        /* systemSearchPath */  { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
155        /* localSearchPath */   { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
156        /* inputFileName */     "inputFileName.aidl_cpp",
157        /* nativeLanguage */    CPP,
158        /* outputH */           "outputH",
159        /* outputCPP */         "",
160        /* outputJava */        ""
161    },
162
163    {
164        /* argv */              { "test", "inputFileName.aidl_cpp", "-ocpp", "outputCPP", NULL, NULL, NULL, NULL },
165        /* result */            0,
166        /* systemSearchPath */  { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
167        /* localSearchPath */   { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
168        /* inputFileName */     "inputFileName.aidl_cpp",
169        /* nativeLanguage */    CPP,
170        /* outputH */           "",
171        /* outputCPP */         "outputCPP",
172        /* outputJava */        ""
173    },
174
175    {
176        /* argv */              { "test", "inputFileName.aidl_cpp", "-ojava", "outputJava", NULL, NULL, NULL, NULL },
177        /* result */            0,
178        /* systemSearchPath */  { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
179        /* localSearchPath */   { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
180        /* inputFileName */     "inputFileName.aidl_cpp",
181        /* nativeLanguage */    CPP,
182        /* outputH */           "",
183        /* outputCPP */         "",
184        /* outputJava */        "outputJava"
185    },
186
187    {
188        /* argv */              { "test", "inputFileName.aidl_cpp", "-oh", "outputH", "-ocpp", "outputCPP", "-ojava", "outputJava" },
189        /* result */            0,
190        /* systemSearchPath */  { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
191        /* localSearchPath */   { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
192        /* inputFileName */     "inputFileName.aidl_cpp",
193        /* nativeLanguage */    CPP,
194        /* outputH */           "outputH",
195        /* outputCPP */         "outputCPP",
196        /* outputJava */        "outputJava"
197    },
198
199    {
200        /* argv */              { "test", "inputFileName.aidl_cpp", "-oh", "outputH", "-oh", "outputH1", NULL, NULL },
201        /* result */            1,
202        /* systemSearchPath */  { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
203        /* localSearchPath */   { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
204        /* inputFileName */     "",
205        /* nativeLanguage */    CPP,
206        /* outputH */           "",
207        /* outputCPP */         "",
208        /* outputJava */        ""
209    },
210
211    {
212        /* argv */              { "test", "inputFileName.aidl_cpp", "-ocpp", "outputCPP", "-ocpp", "outputCPP1", NULL, NULL },
213        /* result */            1,
214        /* systemSearchPath */  { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
215        /* localSearchPath */   { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
216        /* inputFileName */     "",
217        /* nativeLanguage */    CPP,
218        /* outputH */           "",
219        /* outputCPP */         "",
220        /* outputJava */        ""
221    },
222
223    {
224        /* argv */              { "test", "inputFileName.aidl_cpp", "-ojava", "outputJava", "-ojava", "outputJava1", NULL, NULL },
225        /* result */            1,
226        /* systemSearchPath */  { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
227        /* localSearchPath */   { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
228        /* inputFileName */     "",
229        /* nativeLanguage */    CPP,
230        /* outputH */           "",
231        /* outputCPP */         "",
232        /* outputJava */        ""
233    },
234
235};
236
237int
238main(int argc, const char** argv)
239{
240    const int count = sizeof(g_tests)/sizeof(g_tests[0]);
241    int matches[count];
242
243    int result = 0;
244    for (int i=0; i<count; i++) {
245        if (VERBOSE) {
246            cout << endl;
247            cout << "---------------------------------------------" << endl;
248            const char* const* p = g_tests[i].argv;
249            while (*p) {
250                cout << " " << *p;
251                p++;
252            }
253            cout << endl;
254            cout << "---------------------------------------------" << endl;
255        }
256        matches[i] = test(g_tests[i]);
257        if (VERBOSE) {
258            if (0 == matches[i]) {
259                cout << "passed" << endl;
260            } else {
261                cout << "failed" << endl;
262            }
263            result |= matches[i];
264        }
265    }
266
267    cout << endl;
268    cout << "=============================================" << endl;
269    cout << "options_test summary" << endl;
270    cout << "=============================================" << endl;
271
272    if (!result) {
273        cout << "passed" << endl;
274    } else {
275        cout << "failed the following tests:" << endl;
276        for (int i=0; i<count; i++) {
277            if (matches[i]) {
278                cout << "   ";
279                const char* const* p = g_tests[i].argv;
280                while (*p) {
281                    cout << " " << *p;
282                    p++;
283                }
284                cout << endl;
285            }
286        }
287    }
288
289    return result;
290}
291
292