xref: /netbsd-src/external/bsd/atf/dist/tools/ui_test.cpp (revision d780102efefa02003390cc43ea410dbd0ebb4a85)
1*d780102eSjmmv //
2*d780102eSjmmv // Automated Testing Framework (atf)
3*d780102eSjmmv //
4*d780102eSjmmv // Copyright (c) 2009 The NetBSD Foundation, Inc.
5*d780102eSjmmv // All rights reserved.
6*d780102eSjmmv //
7*d780102eSjmmv // Redistribution and use in source and binary forms, with or without
8*d780102eSjmmv // modification, are permitted provided that the following conditions
9*d780102eSjmmv // are met:
10*d780102eSjmmv // 1. Redistributions of source code must retain the above copyright
11*d780102eSjmmv //    notice, this list of conditions and the following disclaimer.
12*d780102eSjmmv // 2. Redistributions in binary form must reproduce the above copyright
13*d780102eSjmmv //    notice, this list of conditions and the following disclaimer in the
14*d780102eSjmmv //    documentation and/or other materials provided with the distribution.
15*d780102eSjmmv //
16*d780102eSjmmv // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17*d780102eSjmmv // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18*d780102eSjmmv // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19*d780102eSjmmv // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20*d780102eSjmmv // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21*d780102eSjmmv // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*d780102eSjmmv // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23*d780102eSjmmv // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*d780102eSjmmv // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25*d780102eSjmmv // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26*d780102eSjmmv // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27*d780102eSjmmv // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*d780102eSjmmv //
29*d780102eSjmmv 
30*d780102eSjmmv #include <cstring>
31*d780102eSjmmv #include <iostream>
32*d780102eSjmmv 
33*d780102eSjmmv #include <atf-c++.hpp>
34*d780102eSjmmv 
35*d780102eSjmmv #include "env.hpp"
36*d780102eSjmmv #include "ui.hpp"
37*d780102eSjmmv 
38*d780102eSjmmv // ------------------------------------------------------------------------
39*d780102eSjmmv // Test cases for the free functions.
40*d780102eSjmmv // ------------------------------------------------------------------------
41*d780102eSjmmv 
42*d780102eSjmmv struct test {
43*d780102eSjmmv     const char *tc;
44*d780102eSjmmv     const char *tag;
45*d780102eSjmmv     bool repeat;
46*d780102eSjmmv     size_t col;
47*d780102eSjmmv     const char *fmt;
48*d780102eSjmmv     const char *result;
49*d780102eSjmmv } tests[] = {
50*d780102eSjmmv     //
51*d780102eSjmmv     // wo_tag
52*d780102eSjmmv     //
53*d780102eSjmmv 
54*d780102eSjmmv     {
55*d780102eSjmmv         "wo_tag",
56*d780102eSjmmv         "",
57*d780102eSjmmv         false,
58*d780102eSjmmv         0,
59*d780102eSjmmv         "12345",
60*d780102eSjmmv         "12345",
61*d780102eSjmmv     },
62*d780102eSjmmv 
63*d780102eSjmmv     {
64*d780102eSjmmv         "wo_tag",
65*d780102eSjmmv         "",
66*d780102eSjmmv         false,
67*d780102eSjmmv         0,
68*d780102eSjmmv         "12345  ",
69*d780102eSjmmv         "12345",
70*d780102eSjmmv     },
71*d780102eSjmmv 
72*d780102eSjmmv     {
73*d780102eSjmmv         "wo_tag",
74*d780102eSjmmv         "",
75*d780102eSjmmv         false,
76*d780102eSjmmv         0,
77*d780102eSjmmv         "12345 7890",
78*d780102eSjmmv         "12345 7890",
79*d780102eSjmmv     },
80*d780102eSjmmv 
81*d780102eSjmmv     {
82*d780102eSjmmv         "wo_tag",
83*d780102eSjmmv         "",
84*d780102eSjmmv         false,
85*d780102eSjmmv         0,
86*d780102eSjmmv         "12345 789012 45",
87*d780102eSjmmv         "12345 789012 45",
88*d780102eSjmmv     },
89*d780102eSjmmv 
90*d780102eSjmmv     {
91*d780102eSjmmv         "wo_tag",
92*d780102eSjmmv         "",
93*d780102eSjmmv         false,
94*d780102eSjmmv         0,
95*d780102eSjmmv         "12345 789012 456",
96*d780102eSjmmv         "12345 789012\n456",
97*d780102eSjmmv     },
98*d780102eSjmmv 
99*d780102eSjmmv     {
100*d780102eSjmmv         "wo_tag",
101*d780102eSjmmv         "",
102*d780102eSjmmv         false,
103*d780102eSjmmv         0,
104*d780102eSjmmv         "1234567890123456",
105*d780102eSjmmv         "1234567890123456",
106*d780102eSjmmv     },
107*d780102eSjmmv 
108*d780102eSjmmv     // TODO(jmmv): Fix the code to pass this test...
109*d780102eSjmmv //    {
110*d780102eSjmmv //        "wo_tag",
111*d780102eSjmmv //        "",
112*d780102eSjmmv //        false,
113*d780102eSjmmv //        0,
114*d780102eSjmmv //        " 2345678901234567",
115*d780102eSjmmv //        "\n2345678901234567",
116*d780102eSjmmv //    },
117*d780102eSjmmv 
118*d780102eSjmmv     {
119*d780102eSjmmv         "wo_tag",
120*d780102eSjmmv         "",
121*d780102eSjmmv         false,
122*d780102eSjmmv         0,
123*d780102eSjmmv         "12345 789012345 78",
124*d780102eSjmmv         "12345 789012345\n78",
125*d780102eSjmmv     },
126*d780102eSjmmv 
127*d780102eSjmmv     //
128*d780102eSjmmv     // wo_tag_col
129*d780102eSjmmv     //
130*d780102eSjmmv 
131*d780102eSjmmv     {
132*d780102eSjmmv         "wo_tag_col",
133*d780102eSjmmv         "",
134*d780102eSjmmv         false,
135*d780102eSjmmv         10,
136*d780102eSjmmv         "12345",
137*d780102eSjmmv         "          12345",
138*d780102eSjmmv     },
139*d780102eSjmmv 
140*d780102eSjmmv     {
141*d780102eSjmmv         "wo_tag_col",
142*d780102eSjmmv         "",
143*d780102eSjmmv         false,
144*d780102eSjmmv         10,
145*d780102eSjmmv         "12345 7890",
146*d780102eSjmmv         "          12345\n"
147*d780102eSjmmv         "          7890",
148*d780102eSjmmv     },
149*d780102eSjmmv 
150*d780102eSjmmv     {
151*d780102eSjmmv         "wo_tag_col",
152*d780102eSjmmv         "",
153*d780102eSjmmv         false,
154*d780102eSjmmv         10,
155*d780102eSjmmv         "1 3 5 7 9",
156*d780102eSjmmv         "          1 3 5\n"
157*d780102eSjmmv         "          7 9",
158*d780102eSjmmv     },
159*d780102eSjmmv 
160*d780102eSjmmv     //
161*d780102eSjmmv     // w_tag_no_repeat
162*d780102eSjmmv     //
163*d780102eSjmmv 
164*d780102eSjmmv     {
165*d780102eSjmmv         "w_tag_no_repeat",
166*d780102eSjmmv         "1234: ",
167*d780102eSjmmv         false,
168*d780102eSjmmv         0,
169*d780102eSjmmv         "789012345",
170*d780102eSjmmv         "1234: 789012345",
171*d780102eSjmmv     },
172*d780102eSjmmv 
173*d780102eSjmmv     {
174*d780102eSjmmv         "w_tag_no_repeat",
175*d780102eSjmmv         "1234: ",
176*d780102eSjmmv         false,
177*d780102eSjmmv         0,
178*d780102eSjmmv         "789 1234 56789",
179*d780102eSjmmv         "1234: 789 1234\n"
180*d780102eSjmmv         "      56789",
181*d780102eSjmmv     },
182*d780102eSjmmv 
183*d780102eSjmmv     {
184*d780102eSjmmv         "w_tag_no_repeat",
185*d780102eSjmmv         "1234: ",
186*d780102eSjmmv         false,
187*d780102eSjmmv         0,
188*d780102eSjmmv         "789012345",
189*d780102eSjmmv         "1234: 789012345",
190*d780102eSjmmv     },
191*d780102eSjmmv 
192*d780102eSjmmv     {
193*d780102eSjmmv         "w_tag_no_repeat",
194*d780102eSjmmv         "1234: ",
195*d780102eSjmmv         false,
196*d780102eSjmmv         0,
197*d780102eSjmmv         "789012345 7890",
198*d780102eSjmmv         "1234: 789012345\n"
199*d780102eSjmmv         "      7890",
200*d780102eSjmmv     },
201*d780102eSjmmv 
202*d780102eSjmmv     //
203*d780102eSjmmv     // w_tag_repeat
204*d780102eSjmmv     //
205*d780102eSjmmv 
206*d780102eSjmmv     {
207*d780102eSjmmv         "w_tag_repeat",
208*d780102eSjmmv         "1234: ",
209*d780102eSjmmv         true,
210*d780102eSjmmv         0,
211*d780102eSjmmv         "789012345",
212*d780102eSjmmv         "1234: 789012345",
213*d780102eSjmmv     },
214*d780102eSjmmv 
215*d780102eSjmmv     {
216*d780102eSjmmv         "w_tag_repeat",
217*d780102eSjmmv         "1234: ",
218*d780102eSjmmv         true,
219*d780102eSjmmv         0,
220*d780102eSjmmv         "789 1234 56789",
221*d780102eSjmmv         "1234: 789 1234\n"
222*d780102eSjmmv         "1234: 56789",
223*d780102eSjmmv     },
224*d780102eSjmmv 
225*d780102eSjmmv     {
226*d780102eSjmmv         "w_tag_repeat",
227*d780102eSjmmv         "1234: ",
228*d780102eSjmmv         true,
229*d780102eSjmmv         0,
230*d780102eSjmmv         "789012345",
231*d780102eSjmmv         "1234: 789012345",
232*d780102eSjmmv     },
233*d780102eSjmmv 
234*d780102eSjmmv     {
235*d780102eSjmmv         "w_tag_no_repeat",
236*d780102eSjmmv         "1234: ",
237*d780102eSjmmv         true,
238*d780102eSjmmv         0,
239*d780102eSjmmv         "789012345 7890",
240*d780102eSjmmv         "1234: 789012345\n"
241*d780102eSjmmv         "1234: 7890",
242*d780102eSjmmv     },
243*d780102eSjmmv 
244*d780102eSjmmv     //
245*d780102eSjmmv     // w_tag_col
246*d780102eSjmmv     //
247*d780102eSjmmv 
248*d780102eSjmmv     {
249*d780102eSjmmv         "w_tag_col",
250*d780102eSjmmv         "1234:",
251*d780102eSjmmv         false,
252*d780102eSjmmv         10,
253*d780102eSjmmv         "1 3 5",
254*d780102eSjmmv         "1234:     1 3 5",
255*d780102eSjmmv     },
256*d780102eSjmmv 
257*d780102eSjmmv     {
258*d780102eSjmmv         "w_tag_col",
259*d780102eSjmmv         "1234:",
260*d780102eSjmmv         false,
261*d780102eSjmmv         10,
262*d780102eSjmmv         "1 3 5 7 9",
263*d780102eSjmmv         "1234:     1 3 5\n"
264*d780102eSjmmv         "          7 9",
265*d780102eSjmmv     },
266*d780102eSjmmv 
267*d780102eSjmmv     {
268*d780102eSjmmv         "w_tag_col",
269*d780102eSjmmv         "1234:",
270*d780102eSjmmv         true,
271*d780102eSjmmv         10,
272*d780102eSjmmv         "1 3 5 7 9",
273*d780102eSjmmv         "1234:     1 3 5\n"
274*d780102eSjmmv         "1234:     7 9",
275*d780102eSjmmv     },
276*d780102eSjmmv 
277*d780102eSjmmv     //
278*d780102eSjmmv     // paragraphs
279*d780102eSjmmv     //
280*d780102eSjmmv 
281*d780102eSjmmv     {
282*d780102eSjmmv         "paragraphs",
283*d780102eSjmmv         "",
284*d780102eSjmmv         false,
285*d780102eSjmmv         0,
286*d780102eSjmmv         "1 3 5\n\n",
287*d780102eSjmmv         "1 3 5"
288*d780102eSjmmv     },
289*d780102eSjmmv 
290*d780102eSjmmv     {
291*d780102eSjmmv         "paragraphs",
292*d780102eSjmmv         "",
293*d780102eSjmmv         false,
294*d780102eSjmmv         0,
295*d780102eSjmmv         "1 3 5\n2 4 6",
296*d780102eSjmmv         "1 3 5\n\n2 4 6"
297*d780102eSjmmv     },
298*d780102eSjmmv 
299*d780102eSjmmv     {
300*d780102eSjmmv         "paragraphs",
301*d780102eSjmmv         "",
302*d780102eSjmmv         false,
303*d780102eSjmmv         0,
304*d780102eSjmmv         "1234 6789 123456\n2 4 6",
305*d780102eSjmmv         "1234 6789\n123456\n\n2 4 6"
306*d780102eSjmmv     },
307*d780102eSjmmv 
308*d780102eSjmmv     {
309*d780102eSjmmv         "paragraphs",
310*d780102eSjmmv         "12: ",
311*d780102eSjmmv         false,
312*d780102eSjmmv         0,
313*d780102eSjmmv         "56789 123456\n2 4 6",
314*d780102eSjmmv         "12: 56789\n    123456\n\n    2 4 6"
315*d780102eSjmmv     },
316*d780102eSjmmv 
317*d780102eSjmmv     {
318*d780102eSjmmv         "paragraphs",
319*d780102eSjmmv         "12: ",
320*d780102eSjmmv         true,
321*d780102eSjmmv         0,
322*d780102eSjmmv         "56789 123456\n2 4 6",
323*d780102eSjmmv         "12: 56789\n12: 123456\n12: \n12: 2 4 6"
324*d780102eSjmmv     },
325*d780102eSjmmv 
326*d780102eSjmmv     {
327*d780102eSjmmv         "paragraphs",
328*d780102eSjmmv         "12:",
329*d780102eSjmmv         false,
330*d780102eSjmmv         4,
331*d780102eSjmmv         "56789 123456\n2 4 6",
332*d780102eSjmmv         "12: 56789\n    123456\n\n    2 4 6"
333*d780102eSjmmv     },
334*d780102eSjmmv 
335*d780102eSjmmv     {
336*d780102eSjmmv         "paragraphs",
337*d780102eSjmmv         "12:",
338*d780102eSjmmv         true,
339*d780102eSjmmv         4,
340*d780102eSjmmv         "56789 123456\n2 4 6",
341*d780102eSjmmv         "12: 56789\n12: 123456\n12:\n12: 2 4 6"
342*d780102eSjmmv     },
343*d780102eSjmmv 
344*d780102eSjmmv     //
345*d780102eSjmmv     // end
346*d780102eSjmmv     //
347*d780102eSjmmv 
348*d780102eSjmmv     {
349*d780102eSjmmv         NULL,
350*d780102eSjmmv         NULL,
351*d780102eSjmmv         false,
352*d780102eSjmmv         0,
353*d780102eSjmmv         NULL,
354*d780102eSjmmv         NULL,
355*d780102eSjmmv     },
356*d780102eSjmmv };
357*d780102eSjmmv 
358*d780102eSjmmv static
359*d780102eSjmmv void
run_tests(const char * tc)360*d780102eSjmmv run_tests(const char *tc)
361*d780102eSjmmv {
362*d780102eSjmmv     struct test *t;
363*d780102eSjmmv 
364*d780102eSjmmv     std::cout << "Running tests for " << tc << "\n";
365*d780102eSjmmv 
366*d780102eSjmmv     tools::env::set("COLUMNS", "15");
367*d780102eSjmmv 
368*d780102eSjmmv     for (t = &tests[0]; t->tc != NULL; t++) {
369*d780102eSjmmv         if (std::strcmp(t->tc, tc) == 0) {
370*d780102eSjmmv             std::cout << "\n";
371*d780102eSjmmv             std::cout << "Testing with tag '" << t->tag << "', '"
372*d780102eSjmmv                 << (t->repeat ? "repeat" : "no repeat") << "', col "
373*d780102eSjmmv                 << t->col << "\n";
374*d780102eSjmmv             std::cout << "Input: >>>" << t->fmt << "<<<\n";
375*d780102eSjmmv             std::cout << "Expected output: >>>" << t->result << "<<<\n";
376*d780102eSjmmv 
377*d780102eSjmmv             std::string result = tools::ui::format_text_with_tag(t->fmt, t->tag,
378*d780102eSjmmv                 t->repeat, t->col);
379*d780102eSjmmv             std::cout << "Output         : >>>" << result << "<<<\n";
380*d780102eSjmmv             ATF_REQUIRE_EQ(t->result, result);
381*d780102eSjmmv         }
382*d780102eSjmmv     }
383*d780102eSjmmv }
384*d780102eSjmmv 
385*d780102eSjmmv ATF_TEST_CASE(wo_tag);
ATF_TEST_CASE_HEAD(wo_tag)386*d780102eSjmmv ATF_TEST_CASE_HEAD(wo_tag)
387*d780102eSjmmv {
388*d780102eSjmmv     set_md_var("descr", "Checks formatting without tags");
389*d780102eSjmmv }
ATF_TEST_CASE_BODY(wo_tag)390*d780102eSjmmv ATF_TEST_CASE_BODY(wo_tag)
391*d780102eSjmmv {
392*d780102eSjmmv     run_tests("wo_tag");
393*d780102eSjmmv }
394*d780102eSjmmv 
395*d780102eSjmmv ATF_TEST_CASE(wo_tag_col);
ATF_TEST_CASE_HEAD(wo_tag_col)396*d780102eSjmmv ATF_TEST_CASE_HEAD(wo_tag_col)
397*d780102eSjmmv {
398*d780102eSjmmv     set_md_var("descr", "Checks formatting without tags and with a non-zero "
399*d780102eSjmmv         "starting column");
400*d780102eSjmmv }
ATF_TEST_CASE_BODY(wo_tag_col)401*d780102eSjmmv ATF_TEST_CASE_BODY(wo_tag_col)
402*d780102eSjmmv {
403*d780102eSjmmv     run_tests("wo_tag_col");
404*d780102eSjmmv }
405*d780102eSjmmv 
406*d780102eSjmmv ATF_TEST_CASE(w_tag_no_repeat);
ATF_TEST_CASE_HEAD(w_tag_no_repeat)407*d780102eSjmmv ATF_TEST_CASE_HEAD(w_tag_no_repeat)
408*d780102eSjmmv {
409*d780102eSjmmv     set_md_var("descr", "Checks formatting with a tag");
410*d780102eSjmmv }
ATF_TEST_CASE_BODY(w_tag_no_repeat)411*d780102eSjmmv ATF_TEST_CASE_BODY(w_tag_no_repeat)
412*d780102eSjmmv {
413*d780102eSjmmv     run_tests("w_tag_no_repeat");
414*d780102eSjmmv }
415*d780102eSjmmv 
416*d780102eSjmmv ATF_TEST_CASE(w_tag_repeat);
ATF_TEST_CASE_HEAD(w_tag_repeat)417*d780102eSjmmv ATF_TEST_CASE_HEAD(w_tag_repeat)
418*d780102eSjmmv {
419*d780102eSjmmv     set_md_var("descr", "Checks formatting with a tag and repeating it on "
420*d780102eSjmmv         "each line");
421*d780102eSjmmv }
ATF_TEST_CASE_BODY(w_tag_repeat)422*d780102eSjmmv ATF_TEST_CASE_BODY(w_tag_repeat)
423*d780102eSjmmv {
424*d780102eSjmmv     run_tests("w_tag_repeat");
425*d780102eSjmmv }
426*d780102eSjmmv 
427*d780102eSjmmv ATF_TEST_CASE(w_tag_col);
ATF_TEST_CASE_HEAD(w_tag_col)428*d780102eSjmmv ATF_TEST_CASE_HEAD(w_tag_col)
429*d780102eSjmmv {
430*d780102eSjmmv     set_md_var("descr", "Checks formatting with a tag and starting at a "
431*d780102eSjmmv         "column greater than its length");
432*d780102eSjmmv }
ATF_TEST_CASE_BODY(w_tag_col)433*d780102eSjmmv ATF_TEST_CASE_BODY(w_tag_col)
434*d780102eSjmmv {
435*d780102eSjmmv     run_tests("w_tag_col");
436*d780102eSjmmv }
437*d780102eSjmmv 
438*d780102eSjmmv ATF_TEST_CASE(paragraphs);
ATF_TEST_CASE_HEAD(paragraphs)439*d780102eSjmmv ATF_TEST_CASE_HEAD(paragraphs)
440*d780102eSjmmv {
441*d780102eSjmmv     set_md_var("descr", "Checks formatting a string that contains multiple "
442*d780102eSjmmv         "paragraphs");
443*d780102eSjmmv }
ATF_TEST_CASE_BODY(paragraphs)444*d780102eSjmmv ATF_TEST_CASE_BODY(paragraphs)
445*d780102eSjmmv {
446*d780102eSjmmv     run_tests("paragraphs");
447*d780102eSjmmv }
448*d780102eSjmmv 
449*d780102eSjmmv // ------------------------------------------------------------------------
450*d780102eSjmmv // Main.
451*d780102eSjmmv // ------------------------------------------------------------------------
452*d780102eSjmmv 
ATF_INIT_TEST_CASES(tcs)453*d780102eSjmmv ATF_INIT_TEST_CASES(tcs)
454*d780102eSjmmv {
455*d780102eSjmmv     // Add the test cases for the free functions.
456*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, wo_tag);
457*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, wo_tag_col);
458*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, w_tag_no_repeat);
459*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, w_tag_repeat);
460*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, w_tag_col);
461*d780102eSjmmv     ATF_ADD_TEST_CASE(tcs, paragraphs);
462*d780102eSjmmv }
463