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