Skip to content

Commit 65ecc97

Browse files
Import newer version of libtap++, that supports modern C++ standarts
1 parent 07bb04b commit 65ecc97

File tree

4 files changed

+407
-66
lines changed

4 files changed

+407
-66
lines changed

libtappp/README.md

Lines changed: 323 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,323 @@
1+
# NAME
2+
3+
libtap++ - C++ unit tests for the Test Anything Protocol
4+
5+
# SYNOPSIS
6+
7+
#include <tap++/tap++.h>
8+
#include <string>
9+
10+
using namespace TAP;
11+
12+
int foo(int ronkle = 1) {
13+
return ronkle;
14+
}
15+
16+
std::string bar() {
17+
return "a string";
18+
}
19+
20+
int main() {
21+
plan(4);
22+
ok(true, "This test passes");
23+
is(foo(), 1, "foo() should be 1");
24+
is(bar(), "a string", "bar() should be \"a string\"");
25+
26+
TODO="Foo is not completely implemented";
27+
is(foo(2), 5, "foo(2) should be 5");
28+
TODO="";
29+
30+
return exit_status();
31+
}
32+
33+
# DESCRIPTION
34+
35+
`libtap++` is a TAP producer for C++ programs.
36+
37+
# HISTORY
38+
39+
libtap++ was originally developed as a part of
40+
[libperl++](https://github.com/Leont/libperl--) project by Leon Timmermans
41+
42+
Then forked into separate [libtap++](https://github.com/cbab/libtappp)
43+
project by Christian Babeux
44+
45+
Now libtap++ us supported by Nikolay Shaplov at
46+
[https://gitlab.com/dhyannataraj/libtappp](https://gitlab.com/dhyannataraj/libtappp)
47+
48+
# FUNCTIONS
49+
50+
All functions and variables are defined in the `TAP` namespace.
51+
52+
## I love it when a plan comes together
53+
54+
Before anything else, you need a testing plan. This basically declares
55+
how many tests your script is going to run to protect against premature
56+
failure.
57+
58+
- **plan()**
59+
60+
void plan(int number_of_tests);
61+
void plan(skip_all, const std::string& reason="");
62+
void plan(no_plan);
63+
64+
The function `plan` is used to indicate the plan of your test run. Usually you
65+
will just give it the number of tests as argument.
66+
67+
Alternatively, you can give it the `skip_all` or `no_plan` constants as
68+
arguments. The first means you will not run the tests at all, the second means
69+
you will run an unknown number of tests (the latter is not recommended).
70+
71+
- **done\_testing()**
72+
73+
void done_testing();
74+
void done_testing(int number_of_tests);
75+
76+
If you don't know how many tests you're going to run, you can issue the plan
77+
when you're done running tests.
78+
79+
number\_of\_tests is the same as plan(), it's the number of tests you expected to
80+
run. You can omit this, in which case the number of tests you ran doesn't
81+
matter, just the fact that your tests ran to conclusion.
82+
83+
This is safer than and replaces the "no\_plan" plan.
84+
85+
## Test names
86+
87+
By convention, each test is assigned a number in order. This is
88+
largely done automatically for you. However, it's often very useful to
89+
assign a name to each test. Which would you rather see:
90+
91+
ok 4
92+
not ok 5
93+
ok 6
94+
95+
or
96+
97+
ok 4 - basic multi-variable
98+
not ok 5 - simple exponential
99+
ok 6 - force == mass * acceleration
100+
101+
The later gives you some idea of what failed. It also makes it easier
102+
to find the test in your script, simply search for "simple
103+
exponential".
104+
105+
All test functions take a name argument. It's optional, but highly
106+
suggested that you use it.
107+
108+
## I'm ok, you're not ok.
109+
110+
The basic purpose of this module is to print out either "ok #" or "not
111+
ok #" depending on if a given test succeeded or failed. Everything
112+
else is just gravy.
113+
114+
All of the following print "ok" or "not ok" depending on if the test
115+
succeeded or failed. They all also return true or false,
116+
respectively.
117+
118+
- **ok()**
119+
120+
bool ok(bool condition, const std::string& test_name = "");
121+
122+
`ok` is the basic test expression in TAP. It simply evaluates any expression,
123+
for example, _got == expected_, taking a true value to mean that the test
124+
passed and a false value to mean that the test failed.
125+
126+
`test_name` is a very short description of the test that will be printed out.
127+
It makes it very easy to find a test in your script when it fails and gives
128+
others an idea of your intentions. `test_name` is optional, but we very
129+
strongly encourage its use.
130+
131+
- **is()**
132+
- **isnt()**
133+
134+
template<typename T, typename U> bool is(const T& got, const U& expected, std::string& test_name = "");
135+
template<typename T, typename U> bool isnt(const T& got, const U& expected, std::string& test_name = "");
136+
137+
Similar to ok(), is() and isnt() compare their two arguments
138+
with `==` and `!=` respectively and use the result of that to
139+
determine if the test succeeded or failed. So these:
140+
141+
# Is the ultimate answer 42?
142+
is( ultimate_answer(), 42, "Meaning of Life" );
143+
144+
# foo isn't empty
145+
isnt( foo, "", "Got some foo" );
146+
147+
are similar to these:
148+
149+
ok( ultimate_answer() == 42, "Meaning of Life" );
150+
ok( foo != "", "Got some foo" );
151+
152+
(Mnemonic: "This is that." "This isn't that.")
153+
154+
So why use these? They produce better diagnostics on failure. ok() cannot know
155+
what you are testing for (beyond the name), but is() and isnt() know what the
156+
test was and why it failed. For example this test:
157+
158+
std::string foo("waffle"), bar("yarblokos");
159+
is( foo, bar, 'Is foo the same as bar?' );
160+
161+
Will produce something like this:
162+
163+
not ok 17 - Is foo the same as bar?
164+
# Failed test 'Is foo the same as bar?'
165+
# got: 'waffle'
166+
# expected: 'yarblokos'
167+
168+
- **pass()**
169+
- **fail()**
170+
171+
bool pass(const std::string& test_name = "");
172+
bool fail(const std::string& test_name = "");
173+
174+
Sometimes you just want to say that the tests have passed. Usually
175+
the case is you've got some complicated condition that is difficult to
176+
wedge into an ok(). In this case, you can simply use pass() (to
177+
declare the test ok) or fail (for not ok). They are synonyms for
178+
ok(true, test\_name) and ok(false, test\_name).
179+
180+
Use these very, very, very sparingly.
181+
182+
## Conditional testing
183+
184+
- **skip()**
185+
186+
void skip(int number, const std::string& reason = "");
187+
188+
`skip` tells the TAP harness that you're skipping a _number_ of tests for the
189+
given _reason_. Note that you have to do the skipping yourself.
190+
191+
- **TODO**
192+
193+
{
194+
todo_guard why;
195+
TODO="why"
196+
my_tests_here ...
197+
}
198+
199+
`TODO` is a global string variable that tells TAP harness the reason
200+
the current test is expected to fail. You set TODO before a block of
201+
tests that you expect to fail and then unset it afterwards. When TODO
202+
is the empty string, then the harness considers that there is no
203+
reason for the test to fail. However, when TODO is non-empty, any
204+
failing test is not counted against the test suite and any succeeding
205+
test is reported as an unexpected success.
206+
207+
The nice part about todo tests, as opposed to simply commenting out a
208+
block of tests, is it's like having a programmatic todo list. You know
209+
how much work is left to be done, you're aware of what bugs there are,
210+
and you'll know immediately when they're fixed.
211+
212+
Note that TODO manipulates a global variable. Thus, you should be
213+
careful to set it to "" before going to another section of the
214+
program. An easy mistake to make is to have a failing section of code
215+
that throws an exception, taking you out of the current scope without
216+
resetting TODO. To make it easier to deal with this in a thread-safe
217+
manner, the todo\_guard class is provided. Objects of this class will
218+
reset TODO when they fall out of scope.
219+
220+
## Diagnostics
221+
222+
If you pick the right test function, you'll usually get a good idea of
223+
what went wrong when it failed. But sometimes it doesn't work out
224+
that way. So here we have ways for you to write your own diagnostic
225+
messages which are safer than just `print STDERR`.
226+
227+
- **diag**
228+
229+
diag(diagnostic_message...);
230+
231+
Prints a diagnostic message which is guaranteed not to interfere with
232+
test output. The arguments are simply concatenated together.
233+
234+
Returns false, so as to preserve failure.
235+
236+
Handy for this sort of thing:
237+
238+
ok( has_user("foo"), "There's a foo user" ) or
239+
diag("Since there's no foo, check that /etc/bar is set up right");
240+
241+
which would produce:
242+
243+
not ok 42 - There's a foo user
244+
# Failed test 'There's a foo user'
245+
# Since there's no foo, check that /etc/bar is set up right.
246+
247+
You might remember `ok() or diag()` with the mnemonic `open() or
248+
die()`.
249+
250+
**NOTE** The exact formatting of the diagnostic output is still
251+
changing, but it is guaranteed that whatever you throw at it it won't
252+
interfere with the test.
253+
254+
- **note**
255+
256+
note(diagnostic_message...);
257+
258+
Like diag(), except the message will not be seen when the test is run
259+
in a harness. It will only be visible in the verbose TAP stream.
260+
261+
Handy for putting in notes which might be useful for debugging, but
262+
don't indicate a problem.
263+
264+
note("Tempfile is ", tempfile);
265+
266+
`diag` simply catenates its arguments to the error output, while `note`
267+
prints diagnostics to the TAP stream.
268+
269+
- **set\_output()**
270+
- **set\_error()**
271+
272+
void set_output(std::ofstream& new_output);
273+
void set_error(std::ofstream& new_error);
274+
275+
These set the filehandle of the TAP stream and the error stream. They default
276+
to `std::cout` and `std::cerr`, respectively. These can only be set before any
277+
output is written to them.
278+
279+
## Ending a test run
280+
281+
- **exit\_status()**
282+
283+
If all your tests passed, Test::Builder will exit with zero (which is
284+
normal). If anything failed it will exit with how many failed. If
285+
you run less (or more) tests than you planned, the missing (or extras)
286+
will be considered failures. If the test died, even after having
287+
successfully completed all its tests, it will still be considered a failure
288+
and will exit with 255.
289+
290+
So the exit codes are...
291+
292+
0 all tests successful
293+
255 test died or all passed but wrong # of tests run
294+
any other number how many failed (including missing or extras)
295+
296+
If you fail more than 254 tests, it will be reported as 254.
297+
298+
- **bail\_out()**
299+
300+
int exit_status();
301+
void bail_out(const std::string& reason);
302+
303+
**bail\_out** terminates the current test program with exit code 255, indicating
304+
to the test harness that all subsequent testing should halt. Typically this
305+
is used to indicate that testing cannot continue at all.
306+
307+
# SEE ALSO
308+
309+
[http://www.testanything.org](http://www.testanything.org)
310+
311+
[Test::More](https://metacpan.org/pod/Test%3A%3AMore) and [prove(1)](http://man.he.net/man1/prove) are the traditional perl client library and TAP
312+
harness, respectively. This library is modeled after Test::More.
313+
314+
# AUTHORS
315+
316+
Leon Timmermans wrote `libtap++`. He stole much of this documentation from
317+
Test::More. Mike Pomraning also contributed this documentation.
318+
319+
# COPYRIGHT
320+
321+
Copyright (c) 2008, 2009, 2010 Leon Timmermans.
322+
323+
See the LICENSE file for details.

libtappp/README.pod

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,17 @@ libtap++ - C++ unit tests for the Test Anything Protocol
3636

3737
C<libtap++> is a TAP producer for C++ programs.
3838

39+
=head1 HISTORY
40+
41+
libtap++ was originally developed as a part of
42+
L<libperl++|https://github.com/Leont/libperl--> project by Leon Timmermans
43+
44+
Then forked into separate L<libtap++|https://github.com/cbab/libtappp>
45+
project by Christian Babeux
46+
47+
Now libtap++ us supported by Nikolay Shaplov at
48+
L<https://gitlab.com/dhyannataraj/libtappp>
49+
3950
=head1 FUNCTIONS
4051

4152
All functions and variables are defined in the C<TAP> namespace.

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy