xref: /netbsd-src/external/bsd/kyua-cli/dist/utils/cmdline/ui_test.cpp (revision 6b3a42af15b5e090c339512c790dd68f3d11a9d8)
1*6b3a42afSjmmv // Copyright 2011 Google Inc.
2*6b3a42afSjmmv // All rights reserved.
3*6b3a42afSjmmv //
4*6b3a42afSjmmv // Redistribution and use in source and binary forms, with or without
5*6b3a42afSjmmv // modification, are permitted provided that the following conditions are
6*6b3a42afSjmmv // met:
7*6b3a42afSjmmv //
8*6b3a42afSjmmv // * Redistributions of source code must retain the above copyright
9*6b3a42afSjmmv //   notice, this list of conditions and the following disclaimer.
10*6b3a42afSjmmv // * Redistributions in binary form must reproduce the above copyright
11*6b3a42afSjmmv //   notice, this list of conditions and the following disclaimer in the
12*6b3a42afSjmmv //   documentation and/or other materials provided with the distribution.
13*6b3a42afSjmmv // * Neither the name of Google Inc. nor the names of its contributors
14*6b3a42afSjmmv //   may be used to endorse or promote products derived from this software
15*6b3a42afSjmmv //   without specific prior written permission.
16*6b3a42afSjmmv //
17*6b3a42afSjmmv // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*6b3a42afSjmmv // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*6b3a42afSjmmv // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*6b3a42afSjmmv // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*6b3a42afSjmmv // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*6b3a42afSjmmv // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*6b3a42afSjmmv // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*6b3a42afSjmmv // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*6b3a42afSjmmv // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*6b3a42afSjmmv // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*6b3a42afSjmmv // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*6b3a42afSjmmv 
29*6b3a42afSjmmv #include "utils/cmdline/ui.hpp"
30*6b3a42afSjmmv 
31*6b3a42afSjmmv extern "C" {
32*6b3a42afSjmmv #include <sys/ioctl.h>
33*6b3a42afSjmmv 
34*6b3a42afSjmmv #include <fcntl.h>
35*6b3a42afSjmmv #include <unistd.h>
36*6b3a42afSjmmv }
37*6b3a42afSjmmv 
38*6b3a42afSjmmv #include <cerrno>
39*6b3a42afSjmmv #include <cstring>
40*6b3a42afSjmmv 
41*6b3a42afSjmmv #include <atf-c++.hpp>
42*6b3a42afSjmmv 
43*6b3a42afSjmmv #include "utils/cmdline/globals.hpp"
44*6b3a42afSjmmv #include "utils/cmdline/ui_mock.hpp"
45*6b3a42afSjmmv #include "utils/env.hpp"
46*6b3a42afSjmmv #include "utils/format/macros.hpp"
47*6b3a42afSjmmv #include "utils/optional.ipp"
48*6b3a42afSjmmv #include "utils/text/table.hpp"
49*6b3a42afSjmmv 
50*6b3a42afSjmmv namespace cmdline = utils::cmdline;
51*6b3a42afSjmmv namespace text = utils::text;
52*6b3a42afSjmmv 
53*6b3a42afSjmmv using utils::none;
54*6b3a42afSjmmv using utils::optional;
55*6b3a42afSjmmv 
56*6b3a42afSjmmv 
57*6b3a42afSjmmv namespace {
58*6b3a42afSjmmv 
59*6b3a42afSjmmv 
60*6b3a42afSjmmv /// Reopens stdout as a tty and returns its width.
61*6b3a42afSjmmv ///
62*6b3a42afSjmmv /// \return The width of the tty in columns.  If the width is wider than 80, the
63*6b3a42afSjmmv /// result is 5 columns narrower to match the screen_width() algorithm.
64*6b3a42afSjmmv static std::size_t
reopen_stdout(void)65*6b3a42afSjmmv reopen_stdout(void)
66*6b3a42afSjmmv {
67*6b3a42afSjmmv     const int fd = ::open("/dev/tty", O_WRONLY);
68*6b3a42afSjmmv     if (fd == -1)
69*6b3a42afSjmmv         ATF_SKIP(F("Cannot open tty for test: %s") % ::strerror(errno));
70*6b3a42afSjmmv     struct ::winsize ws;
71*6b3a42afSjmmv     if (::ioctl(fd, TIOCGWINSZ, &ws) == -1)
72*6b3a42afSjmmv         ATF_SKIP(F("Cannot determine size of tty: %s") % ::strerror(errno));
73*6b3a42afSjmmv 
74*6b3a42afSjmmv     if (fd != STDOUT_FILENO) {
75*6b3a42afSjmmv         if (::dup2(fd, STDOUT_FILENO) == -1)
76*6b3a42afSjmmv             ATF_SKIP(F("Failed to redirect stdout: %s") % ::strerror(errno));
77*6b3a42afSjmmv         ::close(fd);
78*6b3a42afSjmmv     }
79*6b3a42afSjmmv 
80*6b3a42afSjmmv     return ws.ws_col >= 80 ? ws.ws_col - 5 : ws.ws_col;
81*6b3a42afSjmmv }
82*6b3a42afSjmmv 
83*6b3a42afSjmmv 
84*6b3a42afSjmmv }  // anonymous namespace
85*6b3a42afSjmmv 
86*6b3a42afSjmmv 
87*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(ui__screen_width__columns_set__no_tty);
ATF_TEST_CASE_BODY(ui__screen_width__columns_set__no_tty)88*6b3a42afSjmmv ATF_TEST_CASE_BODY(ui__screen_width__columns_set__no_tty)
89*6b3a42afSjmmv {
90*6b3a42afSjmmv     utils::setenv("COLUMNS", "4321");
91*6b3a42afSjmmv     ::close(STDOUT_FILENO);
92*6b3a42afSjmmv 
93*6b3a42afSjmmv     cmdline::ui ui;
94*6b3a42afSjmmv     ATF_REQUIRE_EQ(4321 - 5, ui.screen_width().get());
95*6b3a42afSjmmv }
96*6b3a42afSjmmv 
97*6b3a42afSjmmv 
98*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(ui__screen_width__columns_set__tty);
ATF_TEST_CASE_BODY(ui__screen_width__columns_set__tty)99*6b3a42afSjmmv ATF_TEST_CASE_BODY(ui__screen_width__columns_set__tty)
100*6b3a42afSjmmv {
101*6b3a42afSjmmv     utils::setenv("COLUMNS", "4321");
102*6b3a42afSjmmv     (void)reopen_stdout();
103*6b3a42afSjmmv 
104*6b3a42afSjmmv     cmdline::ui ui;
105*6b3a42afSjmmv     ATF_REQUIRE_EQ(4321 - 5, ui.screen_width().get());
106*6b3a42afSjmmv }
107*6b3a42afSjmmv 
108*6b3a42afSjmmv 
109*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(ui__screen_width__columns_empty__no_tty);
ATF_TEST_CASE_BODY(ui__screen_width__columns_empty__no_tty)110*6b3a42afSjmmv ATF_TEST_CASE_BODY(ui__screen_width__columns_empty__no_tty)
111*6b3a42afSjmmv {
112*6b3a42afSjmmv     utils::setenv("COLUMNS", "");
113*6b3a42afSjmmv     ::close(STDOUT_FILENO);
114*6b3a42afSjmmv 
115*6b3a42afSjmmv     cmdline::ui ui;
116*6b3a42afSjmmv     ATF_REQUIRE(!ui.screen_width());
117*6b3a42afSjmmv }
118*6b3a42afSjmmv 
119*6b3a42afSjmmv 
120*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(ui__screen_width__columns_empty__tty);
ATF_TEST_CASE_BODY(ui__screen_width__columns_empty__tty)121*6b3a42afSjmmv ATF_TEST_CASE_BODY(ui__screen_width__columns_empty__tty)
122*6b3a42afSjmmv {
123*6b3a42afSjmmv     utils::setenv("COLUMNS", "");
124*6b3a42afSjmmv     const std::size_t columns = reopen_stdout();
125*6b3a42afSjmmv 
126*6b3a42afSjmmv     cmdline::ui ui;
127*6b3a42afSjmmv     ATF_REQUIRE_EQ(columns, ui.screen_width().get());
128*6b3a42afSjmmv }
129*6b3a42afSjmmv 
130*6b3a42afSjmmv 
131*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(ui__screen_width__columns_invalid__no_tty);
ATF_TEST_CASE_BODY(ui__screen_width__columns_invalid__no_tty)132*6b3a42afSjmmv ATF_TEST_CASE_BODY(ui__screen_width__columns_invalid__no_tty)
133*6b3a42afSjmmv {
134*6b3a42afSjmmv     utils::setenv("COLUMNS", "foo bar");
135*6b3a42afSjmmv     ::close(STDOUT_FILENO);
136*6b3a42afSjmmv 
137*6b3a42afSjmmv     cmdline::ui ui;
138*6b3a42afSjmmv     ATF_REQUIRE(!ui.screen_width());
139*6b3a42afSjmmv }
140*6b3a42afSjmmv 
141*6b3a42afSjmmv 
142*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(ui__screen_width__columns_invalid__tty);
ATF_TEST_CASE_BODY(ui__screen_width__columns_invalid__tty)143*6b3a42afSjmmv ATF_TEST_CASE_BODY(ui__screen_width__columns_invalid__tty)
144*6b3a42afSjmmv {
145*6b3a42afSjmmv     utils::setenv("COLUMNS", "foo bar");
146*6b3a42afSjmmv     const std::size_t columns = reopen_stdout();
147*6b3a42afSjmmv 
148*6b3a42afSjmmv     cmdline::ui ui;
149*6b3a42afSjmmv     ATF_REQUIRE_EQ(columns, ui.screen_width().get());
150*6b3a42afSjmmv }
151*6b3a42afSjmmv 
152*6b3a42afSjmmv 
153*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(ui__screen_width__tty_is_file);
ATF_TEST_CASE_BODY(ui__screen_width__tty_is_file)154*6b3a42afSjmmv ATF_TEST_CASE_BODY(ui__screen_width__tty_is_file)
155*6b3a42afSjmmv {
156*6b3a42afSjmmv     utils::unsetenv("COLUMNS");
157*6b3a42afSjmmv     const int fd = ::open("test.txt", O_WRONLY | O_CREAT | O_TRUNC, 0755);
158*6b3a42afSjmmv     ATF_REQUIRE(fd != -1);
159*6b3a42afSjmmv     if (fd != STDOUT_FILENO) {
160*6b3a42afSjmmv         ATF_REQUIRE(::dup2(fd, STDOUT_FILENO) != -1);
161*6b3a42afSjmmv         ::close(fd);
162*6b3a42afSjmmv     }
163*6b3a42afSjmmv 
164*6b3a42afSjmmv     cmdline::ui ui;
165*6b3a42afSjmmv     ATF_REQUIRE(!ui.screen_width());
166*6b3a42afSjmmv }
167*6b3a42afSjmmv 
168*6b3a42afSjmmv 
169*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(ui__screen_width__cached);
ATF_TEST_CASE_BODY(ui__screen_width__cached)170*6b3a42afSjmmv ATF_TEST_CASE_BODY(ui__screen_width__cached)
171*6b3a42afSjmmv {
172*6b3a42afSjmmv     cmdline::ui ui;
173*6b3a42afSjmmv 
174*6b3a42afSjmmv     utils::setenv("COLUMNS", "100");
175*6b3a42afSjmmv     ATF_REQUIRE_EQ(100 - 5, ui.screen_width().get());
176*6b3a42afSjmmv 
177*6b3a42afSjmmv     utils::setenv("COLUMNS", "80");
178*6b3a42afSjmmv     ATF_REQUIRE_EQ(100 - 5, ui.screen_width().get());
179*6b3a42afSjmmv 
180*6b3a42afSjmmv     utils::unsetenv("COLUMNS");
181*6b3a42afSjmmv     ATF_REQUIRE_EQ(100 - 5, ui.screen_width().get());
182*6b3a42afSjmmv }
183*6b3a42afSjmmv 
184*6b3a42afSjmmv 
185*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(ui__err);
ATF_TEST_CASE_BODY(ui__err)186*6b3a42afSjmmv ATF_TEST_CASE_BODY(ui__err)
187*6b3a42afSjmmv {
188*6b3a42afSjmmv     cmdline::ui_mock ui(10);  // Keep shorter than message.
189*6b3a42afSjmmv     ui.err("This is a short message");
190*6b3a42afSjmmv     ATF_REQUIRE_EQ(1, ui.err_log().size());
191*6b3a42afSjmmv     ATF_REQUIRE_EQ("This is a short message", ui.err_log()[0]);
192*6b3a42afSjmmv     ATF_REQUIRE(ui.out_log().empty());
193*6b3a42afSjmmv }
194*6b3a42afSjmmv 
195*6b3a42afSjmmv 
196*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(ui__out);
ATF_TEST_CASE_BODY(ui__out)197*6b3a42afSjmmv ATF_TEST_CASE_BODY(ui__out)
198*6b3a42afSjmmv {
199*6b3a42afSjmmv     cmdline::ui_mock ui(10);  // Keep shorter than message.
200*6b3a42afSjmmv     ui.out("This is a short message");
201*6b3a42afSjmmv     ATF_REQUIRE(ui.err_log().empty());
202*6b3a42afSjmmv     ATF_REQUIRE_EQ(1, ui.out_log().size());
203*6b3a42afSjmmv     ATF_REQUIRE_EQ("This is a short message", ui.out_log()[0]);
204*6b3a42afSjmmv }
205*6b3a42afSjmmv 
206*6b3a42afSjmmv 
207*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(ui__out_wrap__no_refill);
ATF_TEST_CASE_BODY(ui__out_wrap__no_refill)208*6b3a42afSjmmv ATF_TEST_CASE_BODY(ui__out_wrap__no_refill)
209*6b3a42afSjmmv {
210*6b3a42afSjmmv     cmdline::ui_mock ui(100);
211*6b3a42afSjmmv     ui.out_wrap("This is a short message");
212*6b3a42afSjmmv     ATF_REQUIRE(ui.err_log().empty());
213*6b3a42afSjmmv     ATF_REQUIRE_EQ(1, ui.out_log().size());
214*6b3a42afSjmmv     ATF_REQUIRE_EQ("This is a short message", ui.out_log()[0]);
215*6b3a42afSjmmv }
216*6b3a42afSjmmv 
217*6b3a42afSjmmv 
218*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(ui__out_wrap__refill);
ATF_TEST_CASE_BODY(ui__out_wrap__refill)219*6b3a42afSjmmv ATF_TEST_CASE_BODY(ui__out_wrap__refill)
220*6b3a42afSjmmv {
221*6b3a42afSjmmv     cmdline::ui_mock ui(16);
222*6b3a42afSjmmv     ui.out_wrap("This is a short message");
223*6b3a42afSjmmv     ATF_REQUIRE(ui.err_log().empty());
224*6b3a42afSjmmv     ATF_REQUIRE_EQ(2, ui.out_log().size());
225*6b3a42afSjmmv     ATF_REQUIRE_EQ("This is a short", ui.out_log()[0]);
226*6b3a42afSjmmv     ATF_REQUIRE_EQ("message", ui.out_log()[1]);
227*6b3a42afSjmmv }
228*6b3a42afSjmmv 
229*6b3a42afSjmmv 
230*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(ui__out_tag_wrap__no_refill);
ATF_TEST_CASE_BODY(ui__out_tag_wrap__no_refill)231*6b3a42afSjmmv ATF_TEST_CASE_BODY(ui__out_tag_wrap__no_refill)
232*6b3a42afSjmmv {
233*6b3a42afSjmmv     cmdline::ui_mock ui(100);
234*6b3a42afSjmmv     ui.out_tag_wrap("Some long tag: ", "This is a short message");
235*6b3a42afSjmmv     ATF_REQUIRE(ui.err_log().empty());
236*6b3a42afSjmmv     ATF_REQUIRE_EQ(1, ui.out_log().size());
237*6b3a42afSjmmv     ATF_REQUIRE_EQ("Some long tag: This is a short message", ui.out_log()[0]);
238*6b3a42afSjmmv }
239*6b3a42afSjmmv 
240*6b3a42afSjmmv 
241*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(ui__out_tag_wrap__refill__repeat);
ATF_TEST_CASE_BODY(ui__out_tag_wrap__refill__repeat)242*6b3a42afSjmmv ATF_TEST_CASE_BODY(ui__out_tag_wrap__refill__repeat)
243*6b3a42afSjmmv {
244*6b3a42afSjmmv     cmdline::ui_mock ui(32);
245*6b3a42afSjmmv     ui.out_tag_wrap("Some long tag: ", "This is a short message");
246*6b3a42afSjmmv     ATF_REQUIRE(ui.err_log().empty());
247*6b3a42afSjmmv     ATF_REQUIRE_EQ(2, ui.out_log().size());
248*6b3a42afSjmmv     ATF_REQUIRE_EQ("Some long tag: This is a short", ui.out_log()[0]);
249*6b3a42afSjmmv     ATF_REQUIRE_EQ("Some long tag: message", ui.out_log()[1]);
250*6b3a42afSjmmv }
251*6b3a42afSjmmv 
252*6b3a42afSjmmv 
253*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(ui__out_tag_wrap__refill__no_repeat);
ATF_TEST_CASE_BODY(ui__out_tag_wrap__refill__no_repeat)254*6b3a42afSjmmv ATF_TEST_CASE_BODY(ui__out_tag_wrap__refill__no_repeat)
255*6b3a42afSjmmv {
256*6b3a42afSjmmv     cmdline::ui_mock ui(32);
257*6b3a42afSjmmv     ui.out_tag_wrap("Some long tag: ", "This is a short message", false);
258*6b3a42afSjmmv     ATF_REQUIRE(ui.err_log().empty());
259*6b3a42afSjmmv     ATF_REQUIRE_EQ(2, ui.out_log().size());
260*6b3a42afSjmmv     ATF_REQUIRE_EQ("Some long tag: This is a short", ui.out_log()[0]);
261*6b3a42afSjmmv     ATF_REQUIRE_EQ("               message", ui.out_log()[1]);
262*6b3a42afSjmmv }
263*6b3a42afSjmmv 
264*6b3a42afSjmmv 
265*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(ui__out_tag_wrap__tag_too_long);
ATF_TEST_CASE_BODY(ui__out_tag_wrap__tag_too_long)266*6b3a42afSjmmv ATF_TEST_CASE_BODY(ui__out_tag_wrap__tag_too_long)
267*6b3a42afSjmmv {
268*6b3a42afSjmmv     cmdline::ui_mock ui(5);
269*6b3a42afSjmmv     ui.out_tag_wrap("Some long tag: ", "This is a short message");
270*6b3a42afSjmmv     ATF_REQUIRE(ui.err_log().empty());
271*6b3a42afSjmmv     ATF_REQUIRE_EQ(1, ui.out_log().size());
272*6b3a42afSjmmv     ATF_REQUIRE_EQ("Some long tag: This is a short message", ui.out_log()[0]);
273*6b3a42afSjmmv }
274*6b3a42afSjmmv 
275*6b3a42afSjmmv 
276*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(ui__out_table__empty);
ATF_TEST_CASE_BODY(ui__out_table__empty)277*6b3a42afSjmmv ATF_TEST_CASE_BODY(ui__out_table__empty)
278*6b3a42afSjmmv {
279*6b3a42afSjmmv     const text::table table(3);
280*6b3a42afSjmmv 
281*6b3a42afSjmmv     text::table_formatter formatter;
282*6b3a42afSjmmv     formatter.set_separator(" | ");
283*6b3a42afSjmmv     formatter.set_column_width(0, 23);
284*6b3a42afSjmmv     formatter.set_column_width(1, text::table_formatter::width_refill);
285*6b3a42afSjmmv 
286*6b3a42afSjmmv     cmdline::ui_mock ui(52);
287*6b3a42afSjmmv     ui.out_table(table, formatter, "    ");
288*6b3a42afSjmmv     ATF_REQUIRE(ui.out_log().empty());
289*6b3a42afSjmmv }
290*6b3a42afSjmmv 
291*6b3a42afSjmmv 
292*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(ui__out_table__not_empty);
ATF_TEST_CASE_BODY(ui__out_table__not_empty)293*6b3a42afSjmmv ATF_TEST_CASE_BODY(ui__out_table__not_empty)
294*6b3a42afSjmmv {
295*6b3a42afSjmmv     text::table table(3);
296*6b3a42afSjmmv     {
297*6b3a42afSjmmv         text::table_row row;
298*6b3a42afSjmmv         row.push_back("First");
299*6b3a42afSjmmv         row.push_back("Second");
300*6b3a42afSjmmv         row.push_back("Third");
301*6b3a42afSjmmv         table.add_row(row);
302*6b3a42afSjmmv     }
303*6b3a42afSjmmv     {
304*6b3a42afSjmmv         text::table_row row;
305*6b3a42afSjmmv         row.push_back("Fourth with some text");
306*6b3a42afSjmmv         row.push_back("Fifth with some more text");
307*6b3a42afSjmmv         row.push_back("Sixth foo");
308*6b3a42afSjmmv         table.add_row(row);
309*6b3a42afSjmmv     }
310*6b3a42afSjmmv 
311*6b3a42afSjmmv     text::table_formatter formatter;
312*6b3a42afSjmmv     formatter.set_separator(" | ");
313*6b3a42afSjmmv     formatter.set_column_width(0, 23);
314*6b3a42afSjmmv     formatter.set_column_width(1, text::table_formatter::width_refill);
315*6b3a42afSjmmv 
316*6b3a42afSjmmv     cmdline::ui_mock ui(52);
317*6b3a42afSjmmv     ui.out_table(table, formatter, "    ");
318*6b3a42afSjmmv     ATF_REQUIRE_EQ(4, ui.out_log().size());
319*6b3a42afSjmmv     ATF_REQUIRE_EQ("    First                   | Second     | Third",
320*6b3a42afSjmmv                    ui.out_log()[0]);
321*6b3a42afSjmmv     ATF_REQUIRE_EQ("    Fourth with some text   | Fifth with | Sixth foo",
322*6b3a42afSjmmv                    ui.out_log()[1]);
323*6b3a42afSjmmv     ATF_REQUIRE_EQ("                            | some more  | ",
324*6b3a42afSjmmv                    ui.out_log()[2]);
325*6b3a42afSjmmv     ATF_REQUIRE_EQ("                            | text       | ",
326*6b3a42afSjmmv                    ui.out_log()[3]);
327*6b3a42afSjmmv }
328*6b3a42afSjmmv 
329*6b3a42afSjmmv 
330*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(print_error);
ATF_TEST_CASE_BODY(print_error)331*6b3a42afSjmmv ATF_TEST_CASE_BODY(print_error)
332*6b3a42afSjmmv {
333*6b3a42afSjmmv     cmdline::init("error-program");
334*6b3a42afSjmmv     cmdline::ui_mock ui;
335*6b3a42afSjmmv     cmdline::print_error(&ui, "The error");
336*6b3a42afSjmmv     ATF_REQUIRE(ui.out_log().empty());
337*6b3a42afSjmmv     ATF_REQUIRE_EQ(1, ui.err_log().size());
338*6b3a42afSjmmv     ATF_REQUIRE_EQ("error-program: E: The error.", ui.err_log()[0]);
339*6b3a42afSjmmv }
340*6b3a42afSjmmv 
341*6b3a42afSjmmv 
342*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(print_info);
ATF_TEST_CASE_BODY(print_info)343*6b3a42afSjmmv ATF_TEST_CASE_BODY(print_info)
344*6b3a42afSjmmv {
345*6b3a42afSjmmv     cmdline::init("info-program");
346*6b3a42afSjmmv     cmdline::ui_mock ui;
347*6b3a42afSjmmv     cmdline::print_info(&ui, "The info");
348*6b3a42afSjmmv     ATF_REQUIRE(ui.out_log().empty());
349*6b3a42afSjmmv     ATF_REQUIRE_EQ(1, ui.err_log().size());
350*6b3a42afSjmmv     ATF_REQUIRE_EQ("info-program: I: The info.", ui.err_log()[0]);
351*6b3a42afSjmmv }
352*6b3a42afSjmmv 
353*6b3a42afSjmmv 
354*6b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(print_warning);
ATF_TEST_CASE_BODY(print_warning)355*6b3a42afSjmmv ATF_TEST_CASE_BODY(print_warning)
356*6b3a42afSjmmv {
357*6b3a42afSjmmv     cmdline::init("warning-program");
358*6b3a42afSjmmv     cmdline::ui_mock ui;
359*6b3a42afSjmmv     cmdline::print_warning(&ui, "The warning");
360*6b3a42afSjmmv     ATF_REQUIRE(ui.out_log().empty());
361*6b3a42afSjmmv     ATF_REQUIRE_EQ(1, ui.err_log().size());
362*6b3a42afSjmmv     ATF_REQUIRE_EQ("warning-program: W: The warning.", ui.err_log()[0]);
363*6b3a42afSjmmv }
364*6b3a42afSjmmv 
365*6b3a42afSjmmv 
ATF_INIT_TEST_CASES(tcs)366*6b3a42afSjmmv ATF_INIT_TEST_CASES(tcs)
367*6b3a42afSjmmv {
368*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, ui__screen_width__columns_set__no_tty);
369*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, ui__screen_width__columns_set__tty);
370*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, ui__screen_width__columns_empty__no_tty);
371*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, ui__screen_width__columns_empty__tty);
372*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, ui__screen_width__columns_invalid__no_tty);
373*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, ui__screen_width__columns_invalid__tty);
374*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, ui__screen_width__tty_is_file);
375*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, ui__screen_width__cached);
376*6b3a42afSjmmv 
377*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, ui__err);
378*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, ui__out);
379*6b3a42afSjmmv 
380*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, ui__out_wrap__no_refill);
381*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, ui__out_wrap__refill);
382*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, ui__out_tag_wrap__no_refill);
383*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, ui__out_tag_wrap__refill__repeat);
384*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, ui__out_tag_wrap__refill__no_repeat);
385*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, ui__out_tag_wrap__tag_too_long);
386*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, ui__out_table__empty);
387*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, ui__out_table__not_empty);
388*6b3a42afSjmmv 
389*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, print_error);
390*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, print_info);
391*6b3a42afSjmmv     ATF_ADD_TEST_CASE(tcs, print_warning);
392*6b3a42afSjmmv }
393