mirror of https://github.com/catchorg/Catch2.git
commit
235204393a
|
@ -15,7 +15,10 @@ projects/VS2010/TestCatch/_UpgradeReport_Files/
|
||||||
projects/VS2010/TestCatch/TestCatch/TestCatch.vcxproj.filters
|
projects/VS2010/TestCatch/TestCatch/TestCatch.vcxproj.filters
|
||||||
projects/VisualStudio/TestCatch/UpgradeLog.XML
|
projects/VisualStudio/TestCatch/UpgradeLog.XML
|
||||||
UpgradeLog.XML
|
UpgradeLog.XML
|
||||||
|
projects/XCode4/iOSTest/Build/Intermediates/PrecompiledHeaders
|
||||||
|
projects/XCode4/iOSTest/Build/Products/Debug-iphonesimulator/iOSTest.app.dSYM/Contents/Resources/DWARF
|
||||||
|
projects/XCode4/iOSTest/Build
|
||||||
projects/XCode4/CatchSelfTest/DerivedData
|
projects/XCode4/CatchSelfTest/DerivedData
|
||||||
projects/XCode4/OCTest/DerivedData
|
projects/XCode4/OCTest/DerivedData
|
||||||
projects/XCode4/iOSTest/Build
|
*.pyc
|
||||||
projects/XCode4/iOSTest/DerivedData
|
projects/XCode4/iOSTest/DerivedData
|
||||||
|
|
7
README
7
README
|
@ -1,7 +0,0 @@
|
||||||
CATCH is an automated test framework for C, C++ and Objective-C.
|
|
||||||
|
|
||||||
The latest stable version can be found here: https://raw.github.com/philsquared/Catch/master/single_include/catch.hpp
|
|
||||||
|
|
||||||
For documentation see the wiki at: https://github.com/philsquared/Catch/wiki
|
|
||||||
|
|
||||||
Maintainers: Please now work off the Integration branch and target any pull requests there.
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
![catch logo](catch-logo-small.png)
|
||||||
|
|
||||||
|
*v1.0 build 1 (master branch)*
|
||||||
|
|
||||||
|
# New release with significant changes
|
||||||
|
|
||||||
|
[Please see this page for details - including some breaking changes](docs/whats-changed.md)
|
||||||
|
|
||||||
|
## What's the Catch?
|
||||||
|
|
||||||
|
Catch stands for C++ Automated Test Cases in Headers and is a multi-paradigm automated test framework for C++ and Objective-C (and, maybe, C). It is implemented entirely in a set of header files, but is packaged up as a single header for extra convenience.
|
||||||
|
|
||||||
|
## How to use it
|
||||||
|
This documentation comprises these three parts:
|
||||||
|
|
||||||
|
* [Why do we need yet another C++ Test Framework?](docs/why-catch.md)
|
||||||
|
* [Tutorial](docs/tutorial.md) - getting started
|
||||||
|
* [Reference section](docs/reference-index.md) - all the details
|
||||||
|
|
||||||
|
The documentation will continue until morale improves
|
||||||
|
|
||||||
|
## More
|
||||||
|
* Issues and bugs can be raised on the [Issue tracker on GitHub](https://github.com/philsquared/Catch/issues)
|
||||||
|
* For discussion or questions please use [the dedicated Google Groups forum](https://groups.google.com/forum/?fromgroups#!forum/catch-forum)
|
Binary file not shown.
After Width: | Height: | Size: 50 KiB |
|
@ -0,0 +1,59 @@
|
||||||
|
# Assertion Macros
|
||||||
|
|
||||||
|
Most test frameworks have a large collection of assertion macros to capture all possible conditional forms (_EQUALS, _NOTEQUALS, _GREATER_THAN etc).
|
||||||
|
|
||||||
|
Catch is different. Because it decomposes natural C-style conditional expressions most of these forms are reduced to one or two that you will use all the time. That said there are a rich set of auxilliary macros as well. We'll describe all of these here.
|
||||||
|
|
||||||
|
Most of these macros come in two forms:
|
||||||
|
|
||||||
|
## Natural Expressions
|
||||||
|
|
||||||
|
The REQUIRE family of macros tests an expression and aborts the test case if it fails.
|
||||||
|
The CHECK family are equivalent but execution continues in the same test case even if the assertion fails. This is useful if you have a series of essentially orthoginal assertions and it is useful to see all the results rather than stopping at the first failure.
|
||||||
|
|
||||||
|
**REQUIRE(** _expression_ **)** and
|
||||||
|
**CHECK(** _expression_ **)**
|
||||||
|
Evaluates the expression and records the result. If an exception is thrown it is caught, reported, and counted as a failure. These are the macros you will use most of the time
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
CHECK( str == "string value" );
|
||||||
|
CHECK( thisReturnsTrue() );
|
||||||
|
REQUIRE( i == 42 );
|
||||||
|
```
|
||||||
|
**REQUIRE_FALSE(** _expression_ **)** and
|
||||||
|
**CHECK_FALSE(** _expression_ **)**
|
||||||
|
Evaluates the expression and records the _logical NOT_ of the result. If an exception is thrown it is caught, reported, and counted as a failure.
|
||||||
|
(these forms exist as a workaround for the fact that ! prefixed expressions cannot be decomposed).
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```c++
|
||||||
|
REQUIRE_FALSE( thisReturnsFalse() );
|
||||||
|
```
|
||||||
|
|
||||||
|
## Exceptions
|
||||||
|
|
||||||
|
**REQUIRE_THROWS(** _expression_ **)** and
|
||||||
|
**CHECK_THROWS(** _expression_ **)**
|
||||||
|
Expects that an exception (of any type) is be thrown during evaluation of the expression.
|
||||||
|
|
||||||
|
**REQUIRE_THROWS_AS(** _expression_ and _exception type_ **)** and
|
||||||
|
**CHECK_THROWS_AS(** _expression_, _exception type_ **)**
|
||||||
|
Expects that an exception of the _specified type_ is thrown during evaluation of the expression.
|
||||||
|
|
||||||
|
**REQUIRE_NOTHROW(** _expression_ **)** and
|
||||||
|
**CHECK_NOTHROW(** _expression_ **)**
|
||||||
|
Expects that no exception is thrown during evaluation of the expression.
|
||||||
|
|
||||||
|
## Matcher expressions
|
||||||
|
|
||||||
|
To support Matchers a slightly different form is used. Matchers will be more fully documented elsewhere. *Note that Matchers are still at early stage development and are subject to change.*
|
||||||
|
|
||||||
|
**REQUIRE_THAT(** _lhs_, __matcher call__ **)** and
|
||||||
|
**CHECK_THAT(** _lhs_, __matcher call__ **)**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[Home](../README.md)
|
|
@ -0,0 +1,137 @@
|
||||||
|
CATCH works quite nicely without any command line options at all - but for those times when you want greater control the following options are available.
|
||||||
|
Note that options are described according to the following pattern:
|
||||||
|
|
||||||
|
<a href="#test"> ` <test-spec> ...`</a><br />
|
||||||
|
<a href="#reporter"> ` -r, --reporter`</a><br />
|
||||||
|
<a href="#break"> ` -b, --break`</a><br />
|
||||||
|
<a href="#success"> ` -s, --success`</a><br />
|
||||||
|
<a href="#abort"> ` -a, --abort`</a><br />
|
||||||
|
<a href="#list"> ` -l, --list`</a><br />
|
||||||
|
<a href="#output"> ` -o, --out`</a><br />
|
||||||
|
<a href="#name"> ` -n, --name`</a><br />
|
||||||
|
<a href="#nothrow"> ` -e, --nothrow`</a><br />
|
||||||
|
<a href="#usage"> ` -h, -?, --help`</a><br />
|
||||||
|
|
||||||
|
<a name="test" />
|
||||||
|
## Specifying which tests to run
|
||||||
|
|
||||||
|
<pre><test-spec> ...</pre>
|
||||||
|
|
||||||
|
Test cases, wildcarded test cases, tags and tag expressions are all passed directly as arguments. Tags are distinguished by being enclosed in square brackets.
|
||||||
|
|
||||||
|
If no test specs are supplied then all test cases, except "hidden" tests (tagged ```[hide]``` or, in the legacy case, prefixed by `'./'`) are run
|
||||||
|
|
||||||
|
Specs must be enclosed in quotes if they contain spaces. If they do not contain spaces the quotes are optional.
|
||||||
|
|
||||||
|
Wildcards consist of the `*` character at the beginning and/or end of test case names and can substitute for any number of any characters (including none).
|
||||||
|
|
||||||
|
Test specs are case insensitive.
|
||||||
|
|
||||||
|
If a spec is prefixed with `exclude:` or the `~` character then the pattern matches an exclusion. This means that tests matching the pattern are excluded from the set - even if a prior inclusion spec included them. Subsequent inclusion specs will take precendence, however.
|
||||||
|
Inclusions and exclusions are evaluated in left-to-right order.
|
||||||
|
|
||||||
|
Test case examples:
|
||||||
|
|
||||||
|
<pre>thisTestOnly Matches the test case called, 'thisTestOnly'
|
||||||
|
"this test only" Matches the test case called, 'this test only'
|
||||||
|
these* Matches all cases starting with 'these'
|
||||||
|
exclude:notThis Matches all tests except, 'notThis'
|
||||||
|
~notThis Matches all tests except, 'notThis'
|
||||||
|
~*private* Matches all tests except those that contain 'private'
|
||||||
|
a* ~ab* abc Matches all tests that start with 'a', except those that
|
||||||
|
start with 'ab', except 'abc', which is included
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Names within square brackets are interpreted as tags.
|
||||||
|
A series of tags form an AND expression wheras a comma seperated sequence forms an OR expression. e.g.:
|
||||||
|
|
||||||
|
<pre>[one][two],[three]</pre>
|
||||||
|
This matches all tests tagged `[one]` and `[two]`, as well as all tests tagged `[three]`
|
||||||
|
|
||||||
|
|
||||||
|
<a name="reporter" />
|
||||||
|
## Choosing a reporter to use
|
||||||
|
|
||||||
|
<pre>-r, --reporter <reporter></pre>
|
||||||
|
|
||||||
|
A reporter is an object that formats and structures the output of running tests, and potentially summarises the results. By default a console reporter is used that writes, IDE friendly, textual output. Catch comes bundled with some alternative reporters, but more can be added in client code.<br />
|
||||||
|
The bundled reporters are:
|
||||||
|
|
||||||
|
<pre>-r console
|
||||||
|
-r xml
|
||||||
|
-r junit
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
The JUnit reporter is an xml format that follows the structure of the JUnit XML Report ANT task, as consumed by a number of third-party tools, including Continuous Integration servers such as Hudson. If not otherwise needed, the standard XML reporter is preferred as this is a streaming reporter, whereas the Junit reporter needs to hold all its results until the end so it can write the overall results into attributes of the root node.
|
||||||
|
|
||||||
|
<a name="break" />
|
||||||
|
## Breaking into the debugger
|
||||||
|
<pre>-b, --break</pre>
|
||||||
|
|
||||||
|
In some IDEs (currently XCode and Visual Studio) it is possible for Catch to break into the debugger on a test failure. This can be very helpful during debug sessions - especially when there is more than one path through a particular test.
|
||||||
|
In addition to the command line option, ensure you have built your code with the DEBUG preprocessor symbol
|
||||||
|
|
||||||
|
<a name="success" />
|
||||||
|
## Showing results for successful tests
|
||||||
|
<pre>-s, --success</pre>
|
||||||
|
|
||||||
|
Usually you only want to see reporting for failed tests. Sometimes it's useful to see *all* the output (especially when you don't trust that that test you just added worked first time!).
|
||||||
|
To see successul, as well as failing, test results just pass this option. Note that each reporter may treat this option differently. The Junit reporter, for example, logs all results regardless.
|
||||||
|
|
||||||
|
<a name="abort" />
|
||||||
|
## Aborting after a certain number of failures
|
||||||
|
<pre>-a, --abort
|
||||||
|
-x, --abortx [<failure threshold>]
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
If a ```REQUIRE``` assertion fails the test case aborts, but subsequent test cases are still run.
|
||||||
|
If a ```CHECK``` assertion fails even the current test case is not aborted.
|
||||||
|
|
||||||
|
Sometimes this results in a flood of failure messages and you'd rather just see the first few. Specifying ```-a``` or ```--abort``` on its own will abort the whole test run on the first failed assertion of any kind. Use ```-x``` or ```--abortx``` followed by a number to abort after that number of assertion failures.
|
||||||
|
|
||||||
|
<a name="list" />
|
||||||
|
## Listing available tests, tags or reporters
|
||||||
|
<pre>-l, --list-tests
|
||||||
|
-t, --list-tags
|
||||||
|
--list-reporters
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
```-l``` or ```--list-tests`` will list all registered tests, along with any tags.
|
||||||
|
If one or more test-specs have been supplied too then only the matching tests will be listed.
|
||||||
|
|
||||||
|
```-t``` or ```--list-tags``` lists all available tags, along with the number of test cases they match. Again, supplying test specs limits the tags that match.
|
||||||
|
|
||||||
|
```--list-reporters``` lists the available reporters.
|
||||||
|
|
||||||
|
<a name="output" />
|
||||||
|
## Sending output to a file
|
||||||
|
<pre>-o, --out <filename>
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Use this option to send all output to a file. By default output is sent to stdout (note that uses of stdout and stderr *from within test cases* are redirected and included in the report - so even stderr will effectively end up on stdout).
|
||||||
|
|
||||||
|
<a name="name" />
|
||||||
|
## Naming a test run
|
||||||
|
<pre>-n, --name <name for test run></pre>
|
||||||
|
|
||||||
|
If a name is supplied it will be used by the reporter to provide an overall name for the test run. This can be useful if you are sending to a file, for example, and need to distinguish different test runs - either from different Catch executables or runs of the same executable with different options. If not supplied the name is defaulted to the name of the executable.
|
||||||
|
|
||||||
|
<a name="nothrow" />
|
||||||
|
## Eliding assertions expected to throw
|
||||||
|
<pre>-e, --nothrow</pre>
|
||||||
|
|
||||||
|
Skips all assertions that test that an exception is thrown, e.g. ```REQUIRE_THROWS```.
|
||||||
|
|
||||||
|
These can be a nuisance in certain debugging environments that may break when exceptions are thrown (while this is usually optional for handled exceptions, it can be useful to have enabled if you are trying to track down something unexpected).
|
||||||
|
|
||||||
|
When running with this option any throw checking assertions are skipped so as not to contribute additional noise. Be careful if this affects the behaviour of subsequent tests.
|
||||||
|
|
||||||
|
<a name="usage" />
|
||||||
|
## Usage
|
||||||
|
<pre>-h, -?, --help</pre>
|
||||||
|
|
||||||
|
Prints the command line arguments to stdout
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[Home](../README.md)
|
|
@ -0,0 +1,50 @@
|
||||||
|
# Logging macros
|
||||||
|
|
||||||
|
Additional messages can be logged during a test case.
|
||||||
|
|
||||||
|
## Streaming macros
|
||||||
|
|
||||||
|
All these macros allow heterogenous sequences of values to be streaming using the insertion operator (```<<```) in the same way that std::ostream, std::cout, etc support it.
|
||||||
|
|
||||||
|
E.g.:
|
||||||
|
```c++
|
||||||
|
INFO( "The number is " << i );
|
||||||
|
```
|
||||||
|
|
||||||
|
(Note that there is no initial ```<<``` - instead the insertion sequence is placed in parentheses.)
|
||||||
|
These macros come in three forms:
|
||||||
|
|
||||||
|
**INFO(** _message expression_ **)**
|
||||||
|
|
||||||
|
The message is logged to a buffer, but only reported if a subsequent failure occurs within the same test case. This allows you to log contextual information in case of failures which is not shown during a successful test run. The buffer is cleared on the next successful assertion.
|
||||||
|
|
||||||
|
**SCOPED_INFO(** _message expression_ **)**
|
||||||
|
|
||||||
|
As INFO, but is only in effect during the current scope. If a failure occurs beyond the end of the scope the message is not logged. In a looped block the message is reset on each iteration.
|
||||||
|
|
||||||
|
**WARN(** _message expression_ **)**
|
||||||
|
|
||||||
|
The message is always reported.
|
||||||
|
|
||||||
|
**FAIL(** _message expression_ **)**
|
||||||
|
|
||||||
|
The message is reported and the test case fails.
|
||||||
|
|
||||||
|
## Quickly capture a variable value
|
||||||
|
|
||||||
|
**CAPTURE(** _expression_ **)**
|
||||||
|
|
||||||
|
Sometimes you just want to log the name and value of a variable. While you can easily do this with the INFO macro, above, as a convenience the CAPTURE macro handles the stringising of the variable name for you (actually it works with any expression, not just variables).
|
||||||
|
|
||||||
|
E.g.
|
||||||
|
```c++
|
||||||
|
CAPTURE( theAnswer );
|
||||||
|
```
|
||||||
|
|
||||||
|
This would log something like:
|
||||||
|
|
||||||
|
<pre>"theAnswer := 42"</pre>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[Home](../README.md)
|
|
@ -0,0 +1,66 @@
|
||||||
|
# Supplying main() yourself
|
||||||
|
|
||||||
|
The easiest way to use Catch is to let it supply ```main()``` for you and handle configuring itself from the command line.
|
||||||
|
|
||||||
|
This is achieved by writing ```#define CATCH_CONFIG_MAIN``` before the ```#include "catch.hpp"``` in *exactly one* source file.
|
||||||
|
|
||||||
|
Sometimes, though, you need to write your own version of main(). You can do this by writing ```#define CATCH_CONFIG_RUNNER``` instead. Now you are free to write ```main()``` as normal and call into Catch yourself manually.
|
||||||
|
|
||||||
|
You now have a lot of flexibility - but here are three recipes to get your started:
|
||||||
|
|
||||||
|
## Let Catch take full control of args and config
|
||||||
|
|
||||||
|
If you just need to have code that executes before and/ or after Catch this is the simplest option.
|
||||||
|
|
||||||
|
```c++
|
||||||
|
#define CATCH_CONFIG_RUNNER
|
||||||
|
#include "catch.hpp"
|
||||||
|
|
||||||
|
int main( int argc, char* const argv[] )
|
||||||
|
{
|
||||||
|
// global setup...
|
||||||
|
|
||||||
|
int result = Catch::Session().run( argc, argv );
|
||||||
|
|
||||||
|
// global clean-up...
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Amending the config
|
||||||
|
|
||||||
|
If you still want Catch to process the command line, but you want to programatically tweak the config, you can do so in one of two ways:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
#define CATCH_CONFIG_RUNNER
|
||||||
|
#include "catch.hpp"
|
||||||
|
|
||||||
|
int main( int argc, char* const argv[] )
|
||||||
|
{
|
||||||
|
Catch::Session session; // There must be exactly once instance
|
||||||
|
|
||||||
|
// writing to session.configData() here sets defaults
|
||||||
|
|
||||||
|
int returnCode = session.applyCommandLine( argc, argv );
|
||||||
|
if( returnCode != 0 ) // Indicates a command line error
|
||||||
|
return returnCode;
|
||||||
|
|
||||||
|
// writing to session.configData() or session.Config() here
|
||||||
|
// overrides command line args
|
||||||
|
|
||||||
|
return session.run();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Take a look at the definitions of Config and ConfigData to see what you can do with them.
|
||||||
|
|
||||||
|
To take full control of the config simply omit the call to ```applyCommandLine()```.
|
||||||
|
|
||||||
|
## Adding your own command line options
|
||||||
|
|
||||||
|
Catch embeds a powerful command line parser which you can also use to parse your own options out. This capability is still in active development but will be documented here when it is ready.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[Home](../README.md)
|
|
@ -0,0 +1,12 @@
|
||||||
|
These are the currently documented areas of the framework. There is more to come.
|
||||||
|
|
||||||
|
Before looking at this material be sure to read the [tutorial](tutorial.md)
|
||||||
|
|
||||||
|
* [Command Line](command-line.md)
|
||||||
|
* [Assertion Macros](assertions.md)
|
||||||
|
* [Logging Macros](logging.md)
|
||||||
|
* [Supplying your own main()](own-main.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[Home](../README.md)
|
|
@ -0,0 +1,100 @@
|
||||||
|
# Getting Catch
|
||||||
|
|
||||||
|
The simplest way to get Catch is to download the single header version from [http://builds.catch-lib.net](builds.catch-lib.net). Don't be put off by the word "builds" there. The single header is generated by merging a set of individual headers but it is still just normal source code in a header file.
|
||||||
|
|
||||||
|
The full source for Catch, including test projects, documentation, and other things, is hosted on GitHub. [http://catch-lib.net](catch-lib.net) will redirect you there.
|
||||||
|
|
||||||
|
|
||||||
|
## Where to put it?
|
||||||
|
|
||||||
|
Catch is header only. All you need to do is drop the file(s) somewhere reachable from your project - either in some central location you can set your header search path to find, or directly into your project tree itself! This is a particularly good option for other Open-Source projects that want to use Catch for their test suite. See [this blog entry for more on that](http://www.levelofindirection.com/journal/2011/5/27/unit-testing-in-c-and-objective-c-just-got-ridiculously-easi-1.html).
|
||||||
|
|
||||||
|
The rest of this tutorial will assume that the Catch single-include header (or the include folder) is available unqualified - but you may need to prefix it with a folder name if necessary.
|
||||||
|
|
||||||
|
# Writing tests
|
||||||
|
|
||||||
|
Let's start with a really simple example. Say you have written a function to calculate factorials and now you want to test it (let's leave aside TDD for now).
|
||||||
|
|
||||||
|
```c++
|
||||||
|
unsigned int Factorial( unsigned int number ) {
|
||||||
|
return number <= 1 ? number : Factorial(number-1)*number;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
To keep things simple we'll put everything in a single file.
|
||||||
|
|
||||||
|
```c++
|
||||||
|
#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file
|
||||||
|
#include "catch.hpp"
|
||||||
|
|
||||||
|
unsigned int Factorial( unsigned int number ) {
|
||||||
|
return number <= 1 ? number : Factorial(number-1)*number;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE( "Factorials are computed", "[factorial]" ) {
|
||||||
|
REQUIRE( Factorial(1) == 1 );
|
||||||
|
REQUIRE( Factorial(2) == 2 );
|
||||||
|
REQUIRE( Factorial(3) == 6 );
|
||||||
|
REQUIRE( Factorial(10) == 3628800 );
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This will compile to a complete executable which responds to [command line arguments](command-line.md). If you just run it with no arguments it will execute all test cases (in this case there is just one), report any failures, report a summary of how many tests passed and failed and return the number of failed tests (useful for if you just want a yes/ no answer to: "did it work").
|
||||||
|
|
||||||
|
If you run this as written it will pass. Everything is good. Right?
|
||||||
|
Well, there is still a bug here. In fact the first version of this tutorial I posted here genuinely had the bug in! So it's not completely contrived (thanks to Daryle Walker (```@CTMacUser```) for pointing this out).
|
||||||
|
|
||||||
|
What is the bug? Well what is the factorial of zero?
|
||||||
|
[The factorial of zero is one](http://mathforum.org/library/drmath/view/57128.html) - which is just one of those things you have to know (and remember!).
|
||||||
|
|
||||||
|
Let's add that to the test case:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
TEST_CASE( "Factorials are computed", "[factorial]" ) {
|
||||||
|
REQUIRE( Factorial(0) == 1 );
|
||||||
|
REQUIRE( Factorial(1) == 1 );
|
||||||
|
REQUIRE( Factorial(2) == 2 );
|
||||||
|
REQUIRE( Factorial(3) == 6 );
|
||||||
|
REQUIRE( Factorial(10) == 3628800 );
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Now we get a failure - something like:
|
||||||
|
|
||||||
|
```
|
||||||
|
Example.cpp:9: FAILED:
|
||||||
|
REQUIRE( Factorial(0) == 1 )
|
||||||
|
with expansion:
|
||||||
|
0 == 1
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that we get the actual return value of Factorial(0) printed for us (0) - even though we used a natural expression with the == operator. That let's us immediately see what the problem is.
|
||||||
|
|
||||||
|
Let's change the factorial function to:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
unsigned int Factorial( unsigned int number ) {
|
||||||
|
return number > 1 ? Factorial(number-1)*number : 1;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Now all the tests pass.
|
||||||
|
|
||||||
|
Of course there are still more issues to do deal with. For example we'll hit problems when the return value starts to exceed the range of an unsigned int. With factorials that can happen quite quickly. You might want to add tests for such cases and decide how to handle them. We'll stop short of doing that here.
|
||||||
|
|
||||||
|
## What did we do here?
|
||||||
|
|
||||||
|
Although this was a simple test it's been enough to demonstrate a few things about how Catch is used. Let's take moment to consider those before we move on.
|
||||||
|
|
||||||
|
1. All we did was ```#define``` one identifier and ```#include``` one header and we got everything - even an implementation of ```main()``` that will [respond to command line arguments](command-line.md). You can only use that ```#define``` in one implementation file, for (hopefully) obvious reasons. Once you have more than one file with unit tests in you'll just ```#include "catch.hpp"``` and go. Usually it's a good idea to have a dedicated implementation file that just has ```#define CATCH_CONFIG_MAIN``` and ```#include "catch.hpp"```. You can also provide your own implementation of main and drive Catch yourself (see [Supplying-your-own-main()](own-main.md).
|
||||||
|
2. We introduce test cases with the TEST_CASE macro. This macro takes two arguments - a hierarchical test name (forward slash separated, by convention) and a free-form description. The test name should be unique - and ideally will logically group related tests together like folders in a file system. You can run sets of tests by specifying a wildcarded test name.
|
||||||
|
3. The name and description arguments are just strings. We haven't had to declare a function or method - or explicitly register the test case anywhere. Behind the scenes a function with a generated name is defined for you, and automatically registered using static registry classes. By abstracting the function name away we can name our tests without the constraints of identifier names.
|
||||||
|
4. We write our individual test assertions using the REQUIRE macro. Rather than a separate macro for each type of condition we express the condition naturally using C/C++ syntax. Behind the scenes a simple set of expression templates captures the left-hand-side and right-hand-side of the expression so we can display the values in our test report. As we'll see later there _are_ other assertion macros - but because of this technique the number of them is drastically reduced.
|
||||||
|
|
||||||
|
## Next steps
|
||||||
|
For more specific information see the [Reference pages](reference-index.md)
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[Home](../README.md)
|
|
@ -0,0 +1,22 @@
|
||||||
|
## What's new in Catch
|
||||||
|
|
||||||
|
This page has been added following quite a large (hopefully the last such) merge from the integration branch. Please read this summary through so you know what to expect (and whether any changes - breaking in some cases - will affect you).
|
||||||
|
|
||||||
|
* Calling Catch from your own ```main()``` has changed - please review [the updated docs](own-main.md)
|
||||||
|
* The command line has changed. The biggest change is that test case names and tags should now only be supplied as primary arguments - in fact the ```-t``` option has been repurposed to mean "list tags". There are [updated docs for this too](command-line.md)
|
||||||
|
* There is a new reporter interface. If you have written a custom reporter you can use the ```LegacyReporterAdapter``` to minimise any differences. Ideally you should update to the new interface - especially as it has been designed to be more robust in the face of future changes (which should be minimal).
|
||||||
|
* The docs have moved from the wiki to the repository itself. They consist of a set of markdown files in the docs folder and are referenced directly from the README in the root. You can still read them online from GitHub.
|
||||||
|
* Lots of new goodness - more documentation for which is coming. The existing docs have been updated to account for some of the changes already (e.g. variadic macros). A quick rundown:
|
||||||
|
* Variadic macros are used, where possible, so that, e.g. you can write a ```TEST_CASE``` with just a name - or even no name at all (making it an anonymous test case).
|
||||||
|
* The hierarchical naming convention is deprecated in favour of using tags (see next)
|
||||||
|
* ```TEST_CASE```s (but not ```SECTION```s) can now be tagged by placing keywords in square brackets in the second argument - e.g.: ```TEST_CASE( "A nice name", "[tag1][tag2]")```. The old style is still supported but please consider using this new style.
|
||||||
|
* Tests can still be "hidden" using the ```./``` prefix as before, but the preferred way now is to give it the ```[hide]``` tag (hidden tests are skipped if you run the test process without specifying any test specs).
|
||||||
|
* As well as ```TEST_CASE```s and ```SECTION```s you can now also use BDD-style ```SCENARIO``` (in place of ```TEST_CASE```) and ```GIVEN```, ```WHEN``` and ```THEN``` macros (in place of ```SECTION```s).
|
||||||
|
* New command line parser. Under the hood it is a complete rewrite - now powered by a command line library that will soon be spun out as a separate project: Clara. The options themselves are largely the same but there are some notable differences (as already discussed).
|
||||||
|
* Completely overhauled output from the textual reporter (now the Console reporter). This now features a much clearer, cleaner format, including good use of indentation.
|
||||||
|
|
||||||
|
If you find any issues please raise issue tickets on the [issue tracker on GitHub](https://github.com/philsquared/Catch/issues) as before. For general questions, comments and suggestions, though, please use the [new forums on Google Groups](https://groups.google.com/forum/?fromgroups#!forum/catch-forum).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[Home](../README.md)
|
|
@ -0,0 +1,42 @@
|
||||||
|
# Why do we need yet another C++ test framework?
|
||||||
|
|
||||||
|
Good question. For C++ there are quite a number of established frameworks, including (but not limited to), [CppUnit](http://sourceforge.net/apps/mediawiki/cppunit/index.php?title=Main_Page), [Google Test](http://code.google.com/p/googletest/), [Boost.Test](http://www.boost.org/doc/libs/1_49_0/libs/test/doc/html/index.html), [Aeryn](https://launchpad.net/aeryn), [Cute](http://r2.ifs.hsr.ch/cute), [Fructose](http://fructose.sourceforge.net/) and [many, many more](http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C.2B.2B). Even for Objective-C there are a few, including OCUnit - which now comes bundled with XCode.
|
||||||
|
|
||||||
|
So what does Catch bring to the party that differentiates it from these? Apart from a Catchy name, of course.
|
||||||
|
|
||||||
|
## Key Features
|
||||||
|
|
||||||
|
* Really easy to get started. Just download catch.hpp, #include it and you're away.
|
||||||
|
* No external dependencies. As long as you can compile C++98 and have a C++ standard library available.
|
||||||
|
* Write test cases as, self-registering, functions or methods.
|
||||||
|
* Divide test cases into sections, each of which is run in isolation (eliminates the need for fixtures!)
|
||||||
|
* Use BDD-style GIVEN-WHEN-THEN in place of test cases and sections.
|
||||||
|
* Only one core assertion macro for comparisons. Standard C/C++ operators are used for the comparison - yet the full expression is decomposed and lhs and rhs values are logged.
|
||||||
|
|
||||||
|
## Other core features
|
||||||
|
|
||||||
|
* Tests are named using free-form strings - no more couching names in legal identifiers.
|
||||||
|
* Tests can be tagged for easily running ad-hoc groups of tests.
|
||||||
|
* Failures can (optionally) break into the debugger on Windows and Mac.
|
||||||
|
* Output is through modular reporter objects. Basic textual and XML reporters are included. Custom reporters can easily be added.
|
||||||
|
* JUnit xml output is supported for integration with third-party tools, such as CI servers.
|
||||||
|
* A default main() function is provided (in a header), but you can supply your own for complete control (e.g. integration into your own test runner GUI).
|
||||||
|
* A command line parser is provided and can still be used if you choose to provided your own main() function.
|
||||||
|
* Catch can test itself.
|
||||||
|
* Alternative assertion macro(s) report failures but don't abort the test case
|
||||||
|
* Floating point tolerance comparisons are built in using an expressive Approx() syntax.
|
||||||
|
* Internal and friendly macros are isolated so name clashes can be managed
|
||||||
|
* Support for Matchers (early stages)
|
||||||
|
|
||||||
|
## Objective-C-specific features
|
||||||
|
|
||||||
|
* Automatically detects if you are using it from an Objective-C project
|
||||||
|
* Works with and without ARC with no additional configuration
|
||||||
|
* Implement test fixtures using Obj-C classes too (like OCUnit)
|
||||||
|
* Additional built in matchers that work with Obj-C types (e.g. string matchers)
|
||||||
|
|
||||||
|
See the [tutorial](tutorial.md) to get more of a taste of using CATCH in practice
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[Home](../README.md)
|
|
@ -1,54 +0,0 @@
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import re
|
|
||||||
import datetime
|
|
||||||
|
|
||||||
includesParser = re.compile( r'\s*#include\s*"(.*)"' )
|
|
||||||
guardParser = re.compile( r'\s*#.*_INCLUDED')
|
|
||||||
defineParser = re.compile( r'\s*#define')
|
|
||||||
commentParser1 = re.compile( r'^\s*/\*')
|
|
||||||
commentParser2 = re.compile( r'^\s*\*')
|
|
||||||
blankParser = re.compile( r'^\s*$')
|
|
||||||
seenHeaders = set([])
|
|
||||||
rootPath = os.path.join( os.path.realpath(os.path.dirname(sys.argv[0])), 'include/' )
|
|
||||||
|
|
||||||
def parseFile( path, filename ):
|
|
||||||
f = open( path + filename, 'r' )
|
|
||||||
blanks = 0
|
|
||||||
for line in f:
|
|
||||||
m = includesParser.match( line )
|
|
||||||
if m:
|
|
||||||
header = m.group(1)
|
|
||||||
headerPath, sep, headerFile = header.rpartition( "/" )
|
|
||||||
if not headerFile in seenHeaders:
|
|
||||||
seenHeaders.add( headerFile )
|
|
||||||
print "// #included from: " + header
|
|
||||||
if( headerPath == "internal" and path.endswith( "internal/" ) ):
|
|
||||||
headerPath = ""
|
|
||||||
sep = ""
|
|
||||||
if os.path.exists( path + headerPath + sep + headerFile ):
|
|
||||||
parseFile( path + headerPath + sep, headerFile )
|
|
||||||
else:
|
|
||||||
parseFile( rootPath + headerPath + sep, headerFile )
|
|
||||||
elif (not guardParser.match( line ) or defineParser.match( line ) ) and not commentParser1.match( line )and not commentParser2.match( line ):
|
|
||||||
if blankParser.match( line ):
|
|
||||||
blanks = blanks + 1
|
|
||||||
else:
|
|
||||||
blanks = 0
|
|
||||||
if blanks < 2:
|
|
||||||
print line.rstrip()
|
|
||||||
|
|
||||||
print "/*"
|
|
||||||
print " * Generated: " + str( datetime.datetime.now() )
|
|
||||||
print " * ----------------------------------------------------------"
|
|
||||||
print " * This file has been merged from multiple headers. Please don't edit it directly"
|
|
||||||
print " * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved."
|
|
||||||
print " *"
|
|
||||||
print " * Distributed under the Boost Software License, Version 1.0. (See accompanying"
|
|
||||||
print " * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)"
|
|
||||||
print " */"
|
|
||||||
print '#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED'
|
|
||||||
print '#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED'
|
|
||||||
parseFile( rootPath, 'catch.hpp' )
|
|
||||||
print '#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED'
|
|
||||||
print
|
|
|
@ -11,6 +11,7 @@
|
||||||
|
|
||||||
#ifdef __clang__
|
#ifdef __clang__
|
||||||
#pragma clang diagnostic ignored "-Wglobal-constructors"
|
#pragma clang diagnostic ignored "-Wglobal-constructors"
|
||||||
|
#pragma clang diagnostic ignored "-Wvariadic-macros"
|
||||||
|
|
||||||
#pragma clang diagnostic push
|
#pragma clang diagnostic push
|
||||||
#pragma clang diagnostic ignored "-Wpadded"
|
#pragma clang diagnostic ignored "-Wpadded"
|
||||||
|
@ -25,6 +26,7 @@
|
||||||
#include "internal/catch_interfaces_exception.h"
|
#include "internal/catch_interfaces_exception.h"
|
||||||
#include "internal/catch_approx.hpp"
|
#include "internal/catch_approx.hpp"
|
||||||
#include "internal/catch_matchers.hpp"
|
#include "internal/catch_matchers.hpp"
|
||||||
|
#include "internal/catch_compiler_capabilities.h"
|
||||||
|
|
||||||
// These files are included here so the single_include script doesn't put them
|
// These files are included here so the single_include script doesn't put them
|
||||||
// in the conditionally compiled sections
|
// in the conditionally compiled sections
|
||||||
|
@ -68,25 +70,44 @@
|
||||||
#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THAT" )
|
#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THAT" )
|
||||||
#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THAT" )
|
#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THAT" )
|
||||||
|
|
||||||
#define CATCH_INFO( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Info, Catch::ResultDisposition::ContinueOnFailure, "CATCH_INFO" )
|
#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" )
|
||||||
#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "CATCH_WARN" )
|
#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "CATCH_WARN" )
|
||||||
#define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL" )
|
#define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL" )
|
||||||
#define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED" )
|
#define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED" )
|
||||||
#define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_SCOPED_INFO( msg, "CATCH_SCOPED_INFO" )
|
#define CATCH_SCOPED_INFO( msg ) INTERNAL_CATCH_SCOPED_INFO( msg, "CATCH_SCOPED_INFO" )
|
||||||
#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_MSG( #msg " := " << msg, Catch::ResultWas::Info, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CAPTURE" )
|
#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CATCH_CAPTURE" )
|
||||||
#define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_SCOPED_INFO( #msg " := " << msg, "CATCH_SCOPED_CAPTURE" )
|
#define CATCH_SCOPED_CAPTURE( msg ) INTERNAL_CATCH_SCOPED_INFO( #msg " := " << msg, "CATCH_SCOPED_CAPTURE" )
|
||||||
|
|
||||||
#define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description )
|
#ifdef CATCH_CONFIG_VARIADIC_MACROS
|
||||||
|
#define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )
|
||||||
#define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description )
|
#define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )
|
||||||
#define CATCH_TEST_CASE_NORETURN( name, description ) INTERNAL_CATCH_TESTCASE_NORETURN( name, description )
|
#define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ )
|
||||||
#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "Anonymous test case" )
|
#define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )
|
||||||
#define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description )
|
#else
|
||||||
|
#define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description )
|
||||||
|
#define CATCH_TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description )
|
||||||
|
#define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description )
|
||||||
|
#define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description )
|
||||||
|
#endif
|
||||||
|
#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" )
|
||||||
|
|
||||||
#define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType )
|
#define CATCH_REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType )
|
||||||
|
#define CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType )
|
||||||
|
|
||||||
#define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr )
|
#define CATCH_GENERATE( expr) INTERNAL_CATCH_GENERATE( expr )
|
||||||
|
|
||||||
|
// "BDD-style" convenience wrappers
|
||||||
|
#ifdef CATCH_CONFIG_VARIADIC_MACROS
|
||||||
|
#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ )
|
||||||
|
#else
|
||||||
|
#define CATCH_SCENARIO( name, tags ) CATCH_TEST_CASE( "Scenario: " name, tags )
|
||||||
|
#endif
|
||||||
|
#define CATCH_GIVEN( desc ) CATCH_SECTION( "Given: " desc, "" )
|
||||||
|
#define CATCH_WHEN( desc ) CATCH_SECTION( " When: " desc, "" )
|
||||||
|
#define CATCH_AND_WHEN( desc ) CATCH_SECTION( " And: " desc, "" )
|
||||||
|
#define CATCH_THEN( desc ) CATCH_SECTION( " Then: " desc, "" )
|
||||||
|
#define CATCH_AND_THEN( desc ) CATCH_SECTION( " And: " desc, "" )
|
||||||
|
|
||||||
// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required
|
// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
@ -110,22 +131,29 @@
|
||||||
#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THAT" )
|
#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THAT" )
|
||||||
#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "REQUIRE_THAT" )
|
#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "REQUIRE_THAT" )
|
||||||
|
|
||||||
#define INFO( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Info, Catch::ResultDisposition::ContinueOnFailure, "INFO" )
|
#define INFO( msg ) INTERNAL_CATCH_INFO( msg, "INFO" )
|
||||||
#define WARN( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "WARN" )
|
#define WARN( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "WARN" )
|
||||||
#define FAIL( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL" )
|
#define FAIL( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL" )
|
||||||
#define SUCCEED( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED" )
|
#define SUCCEED( msg ) INTERNAL_CATCH_MSG( msg, Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED" )
|
||||||
#define SCOPED_INFO( msg ) INTERNAL_CATCH_SCOPED_INFO( msg, "SCOPED_INFO" )
|
#define SCOPED_INFO( msg ) INTERNAL_CATCH_SCOPED_INFO( msg, "SCOPED_INFO" )
|
||||||
#define CAPTURE( msg ) INTERNAL_CATCH_MSG( #msg " := " << msg, Catch::ResultWas::Info, Catch::ResultDisposition::ContinueOnFailure, "CAPTURE" )
|
#define CAPTURE( msg ) INTERNAL_CATCH_INFO( #msg " := " << msg, "CAPTURE" )
|
||||||
#define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_SCOPED_INFO( #msg " := " << msg, "SCOPED_CAPTURE" )
|
#define SCOPED_CAPTURE( msg ) INTERNAL_CATCH_SCOPED_INFO( #msg " := " << msg, "SCOPED_CAPTURE" )
|
||||||
|
|
||||||
#define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description )
|
#ifdef CATCH_CONFIG_VARIADIC_MACROS
|
||||||
|
#define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )
|
||||||
#define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description )
|
#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )
|
||||||
#define TEST_CASE_NORETURN( name, description ) INTERNAL_CATCH_TESTCASE_NORETURN( name, description )
|
#define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ )
|
||||||
#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "Anonymous test case" )
|
#define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )
|
||||||
#define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description )
|
#else
|
||||||
|
#define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description )
|
||||||
|
#define TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description )
|
||||||
|
#define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description )
|
||||||
|
#define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description )
|
||||||
|
#endif
|
||||||
|
#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE( "", "" )
|
||||||
|
|
||||||
#define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType )
|
#define REGISTER_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType )
|
||||||
|
#define REGISTER_LEGACY_REPORTER( name, reporterType ) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType )
|
||||||
|
|
||||||
#define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr )
|
#define GENERATE( expr) INTERNAL_CATCH_GENERATE( expr )
|
||||||
|
|
||||||
|
@ -133,6 +161,18 @@
|
||||||
|
|
||||||
#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature )
|
#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature )
|
||||||
|
|
||||||
|
// "BDD-style" convenience wrappers
|
||||||
|
#ifdef CATCH_CONFIG_VARIADIC_MACROS
|
||||||
|
#define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ )
|
||||||
|
#else
|
||||||
|
#define SCENARIO( name, tags ) TEST_CASE( "Scenario: " name, tags )
|
||||||
|
#endif
|
||||||
|
#define GIVEN( desc ) SECTION( " Given: " desc, "" )
|
||||||
|
#define WHEN( desc ) SECTION( " When: " desc, "" )
|
||||||
|
#define AND_WHEN( desc ) SECTION( "And when: " desc, "" )
|
||||||
|
#define THEN( desc ) SECTION( " Then: " desc, "" )
|
||||||
|
#define AND_THEN( desc ) SECTION( " And: " desc, "" )
|
||||||
|
|
||||||
using Catch::Detail::Approx;
|
using Catch::Detail::Approx;
|
||||||
|
|
||||||
#ifdef __clang__
|
#ifdef __clang__
|
||||||
|
|
|
@ -12,6 +12,8 @@
|
||||||
#include "internal/catch_list.hpp"
|
#include "internal/catch_list.hpp"
|
||||||
#include "internal/catch_runner_impl.hpp"
|
#include "internal/catch_runner_impl.hpp"
|
||||||
#include "internal/catch_test_spec.h"
|
#include "internal/catch_test_spec.h"
|
||||||
|
#include "internal/catch_version.h"
|
||||||
|
#include "internal/catch_text.h"
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -19,12 +21,11 @@
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
class Runner2 { // This will become Runner when Runner becomes Context
|
class Runner {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Runner2( Config& configWrapper )
|
Runner( Ptr<Config> const& config )
|
||||||
: m_configWrapper( configWrapper ),
|
: m_config( config )
|
||||||
m_config( configWrapper.data() )
|
|
||||||
{
|
{
|
||||||
openStream();
|
openStream();
|
||||||
makeReporter();
|
makeReporter();
|
||||||
|
@ -32,31 +33,28 @@ namespace Catch {
|
||||||
|
|
||||||
Totals runTests() {
|
Totals runTests() {
|
||||||
|
|
||||||
std::vector<TestCaseFilters> filterGroups = m_config.filters;
|
std::vector<TestCaseFilters> filterGroups = m_config->filters();
|
||||||
if( filterGroups.empty() ) {
|
if( filterGroups.empty() ) {
|
||||||
TestCaseFilters filterGroup( "" );
|
TestCaseFilters filterGroup( "" );
|
||||||
filterGroups.push_back( filterGroup );
|
filterGroups.push_back( filterGroup );
|
||||||
}
|
}
|
||||||
|
|
||||||
Runner context( m_configWrapper, m_reporter ); // This Runner will be renamed Context
|
RunContext context( m_config.get(), m_reporter );
|
||||||
|
|
||||||
Totals totals;
|
Totals totals;
|
||||||
|
|
||||||
std::vector<TestCaseFilters>::const_iterator it = filterGroups.begin();
|
for( std::size_t i=0; i < filterGroups.size() && !context.aborting(); ++i ) {
|
||||||
std::vector<TestCaseFilters>::const_iterator itEnd = filterGroups.end();
|
context.testGroupStarting( filterGroups[i].getName(), i, filterGroups.size() );
|
||||||
for(; it != itEnd && !context.aborting(); ++it ) {
|
totals += runTestsForGroup( context, filterGroups[i] );
|
||||||
m_reporter->StartGroup( it->getName() );
|
context.testGroupEnded( filterGroups[i].getName(), totals, i, filterGroups.size() );
|
||||||
totals += runTestsForGroup( context, *it );
|
|
||||||
if( context.aborting() )
|
|
||||||
m_reporter->Aborted();
|
|
||||||
m_reporter->EndGroup( it->getName(), totals );
|
|
||||||
}
|
}
|
||||||
return totals;
|
return totals;
|
||||||
}
|
}
|
||||||
|
|
||||||
Totals runTestsForGroup( Runner& context, const TestCaseFilters& filterGroup ) {
|
Totals runTestsForGroup( RunContext& context, const TestCaseFilters& filterGroup ) {
|
||||||
Totals totals;
|
Totals totals;
|
||||||
std::vector<TestCaseInfo>::const_iterator it = getRegistryHub().getTestCaseRegistry().getAllTests().begin();
|
std::vector<TestCase>::const_iterator it = getRegistryHub().getTestCaseRegistry().getAllTests().begin();
|
||||||
std::vector<TestCaseInfo>::const_iterator itEnd = getRegistryHub().getTestCaseRegistry().getAllTests().end();
|
std::vector<TestCase>::const_iterator itEnd = getRegistryHub().getTestCaseRegistry().getAllTests().end();
|
||||||
int testsRunForGroup = 0;
|
int testsRunForGroup = 0;
|
||||||
for(; it != itEnd; ++it ) {
|
for(; it != itEnd; ++it ) {
|
||||||
if( filterGroup.shouldInclude( *it ) ) {
|
if( filterGroup.shouldInclude( *it ) ) {
|
||||||
|
@ -71,36 +69,31 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( testsRunForGroup == 0 )
|
if( testsRunForGroup == 0 && !filterGroup.getName().empty() )
|
||||||
std::cerr << "\n[No test cases matched with: " << filterGroup.getName() << "]" << std::endl;
|
m_reporter->noMatchingTestCases( filterGroup.getName() );
|
||||||
return totals;
|
return totals;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void openStream() {
|
void openStream() {
|
||||||
if( !m_config.stream.empty() )
|
|
||||||
m_configWrapper.useStream( m_config.stream );
|
|
||||||
|
|
||||||
// Open output file, if specified
|
// Open output file, if specified
|
||||||
if( !m_config.outputFilename.empty() ) {
|
if( !m_config->getFilename().empty() ) {
|
||||||
m_ofs.open( m_config.outputFilename.c_str() );
|
m_ofs.open( m_config->getFilename().c_str() );
|
||||||
if( m_ofs.fail() ) {
|
if( m_ofs.fail() ) {
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << "Unable to open file: '" << m_config.outputFilename << "'";
|
oss << "Unable to open file: '" << m_config->getFilename() << "'";
|
||||||
throw std::domain_error( oss.str() );
|
throw std::domain_error( oss.str() );
|
||||||
}
|
}
|
||||||
m_configWrapper.setStreamBuf( m_ofs.rdbuf() );
|
m_config->setStreamBuf( m_ofs.rdbuf() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void makeReporter() {
|
void makeReporter() {
|
||||||
std::string reporterName = m_config.reporter.empty()
|
std::string reporterName = m_config->getReporterName().empty()
|
||||||
? "basic"
|
? "console"
|
||||||
: m_config.reporter;
|
: m_config->getReporterName();
|
||||||
|
|
||||||
ReporterConfig reporterConfig( m_config.name, m_configWrapper.stream(), m_config.includeWhichResults == Include::SuccessfulResults, m_config );
|
m_reporter = getRegistryHub().getReporterRegistry().create( reporterName, m_config.get() );
|
||||||
|
|
||||||
m_reporter = getRegistryHub().getReporterRegistry().create( reporterName, reporterConfig );
|
|
||||||
if( !m_reporter ) {
|
if( !m_reporter ) {
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << "No reporter registered with name: '" << reporterName << "'";
|
oss << "No reporter registered with name: '" << reporterName << "'";
|
||||||
|
@ -109,156 +102,134 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Config& m_configWrapper;
|
Ptr<Config> m_config;
|
||||||
const ConfigData& m_config;
|
|
||||||
std::ofstream m_ofs;
|
std::ofstream m_ofs;
|
||||||
Ptr<IReporter> m_reporter;
|
Ptr<IStreamingReporter> m_reporter;
|
||||||
std::set<TestCaseInfo> m_testsAlreadyRun;
|
std::set<TestCase> m_testsAlreadyRun;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline int Main( Config& configWrapper ) {
|
class Session {
|
||||||
int result = 0;
|
static bool alreadyInstantiated;
|
||||||
try
|
|
||||||
{
|
|
||||||
Runner2 runner( configWrapper );
|
|
||||||
|
|
||||||
const ConfigData& config = configWrapper.data();
|
public:
|
||||||
|
|
||||||
// Handle list request
|
struct OnUnusedOptions { enum DoWhat { Ignore, Fail }; };
|
||||||
if( config.listSpec != List::None ) {
|
|
||||||
List( config );
|
Session()
|
||||||
|
: m_cli( makeCommandLineParser() ) {
|
||||||
|
if( alreadyInstantiated ) {
|
||||||
|
std::string msg = "Only one instance of Catch::Session can ever be used";
|
||||||
|
std::cerr << msg << std::endl;
|
||||||
|
throw std::logic_error( msg );
|
||||||
|
}
|
||||||
|
alreadyInstantiated = true;
|
||||||
|
}
|
||||||
|
~Session() {
|
||||||
Catch::cleanUp();
|
Catch::cleanUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
void showHelp( std::string const& processName ) {
|
||||||
|
std::cout << "\nCatch v" << libraryVersion.majorVersion << "."
|
||||||
|
<< libraryVersion.minorVersion << " build "
|
||||||
|
<< libraryVersion.buildNumber;
|
||||||
|
if( libraryVersion.branchName != "master" )
|
||||||
|
std::cout << " (" << libraryVersion.branchName << " branch)";
|
||||||
|
std::cout << "\n";
|
||||||
|
|
||||||
|
m_cli.usage( std::cout, processName );
|
||||||
|
std::cout << "For more detail usage please see the project docs\n" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
int applyCommandLine( int argc, char* const argv[], OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) {
|
||||||
|
try {
|
||||||
|
m_unusedTokens = m_cli.parseInto( argc, argv, m_configData );
|
||||||
|
if( unusedOptionBehaviour == OnUnusedOptions::Fail )
|
||||||
|
enforceNoUsedTokens();
|
||||||
|
if( m_configData.showHelp )
|
||||||
|
showHelp( m_configData.processName );
|
||||||
|
m_config.reset();
|
||||||
|
}
|
||||||
|
catch( std::exception& ex ) {
|
||||||
|
std::cerr << "\nError in input:\n"
|
||||||
|
<< Text( ex.what(), TextAttributes()
|
||||||
|
.setInitialIndent(2)
|
||||||
|
.setIndent(4) )
|
||||||
|
<< "\n\n";
|
||||||
|
m_cli.usage( std::cout, m_configData.processName );
|
||||||
|
return (std::numeric_limits<int>::max)();
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = static_cast<int>( runner.runTests().assertions.failed );
|
void useConfigData( ConfigData const& _configData ) {
|
||||||
|
m_configData = _configData;
|
||||||
|
m_config.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void enforceNoUsedTokens() const {
|
||||||
|
if( !m_unusedTokens.empty() ) {
|
||||||
|
std::vector<Clara::Parser::Token>::const_iterator
|
||||||
|
it = m_unusedTokens.begin(),
|
||||||
|
itEnd = m_unusedTokens.end();
|
||||||
|
std::string msg;
|
||||||
|
for(; it != itEnd; ++it )
|
||||||
|
msg += " unrecognised option: " + it->data + "\n";
|
||||||
|
throw std::runtime_error( msg.substr( 0, msg.size()-1 ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int run( int argc, char* const argv[] ) {
|
||||||
|
|
||||||
|
int returnCode = applyCommandLine( argc, argv );
|
||||||
|
if( returnCode == 0 )
|
||||||
|
returnCode = run();
|
||||||
|
return returnCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
int run() {
|
||||||
|
if( m_configData.showHelp )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
config(); // Force config to be constructed
|
||||||
|
Runner runner( m_config );
|
||||||
|
|
||||||
|
// Handle list request
|
||||||
|
if( Option<std::size_t> listed = list( config() ) )
|
||||||
|
return static_cast<int>( *listed );
|
||||||
|
|
||||||
|
return static_cast<int>( runner.runTests().assertions.failed );
|
||||||
}
|
}
|
||||||
catch( std::exception& ex ) {
|
catch( std::exception& ex ) {
|
||||||
std::cerr << ex.what() << std::endl;
|
std::cerr << ex.what() << std::endl;
|
||||||
result = (std::numeric_limits<int>::max)();
|
|
||||||
}
|
|
||||||
|
|
||||||
Catch::cleanUp();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void showUsage( std::ostream& os ) {
|
|
||||||
AllOptions options;
|
|
||||||
|
|
||||||
for( AllOptions::const_iterator it = options.begin(); it != options.end(); ++it ) {
|
|
||||||
OptionParser& opt = **it;
|
|
||||||
os << " " << opt.optionNames() << " " << opt.argsSynopsis() << "\n";
|
|
||||||
}
|
|
||||||
os << "\nFor more detail usage please see: https://github.com/philsquared/Catch/wiki/Command-line\n" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void addIndent( std::ostream& os, std::size_t indent ) {
|
|
||||||
while( indent-- > 0 )
|
|
||||||
os << ' ';
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void recursivelyWrapLine( std::ostream& os, std::string paragraph, std::size_t columns, std::size_t indent ) {
|
|
||||||
std::size_t width = columns-indent;
|
|
||||||
std::size_t tab = 0;
|
|
||||||
std::size_t wrapPoint = width;
|
|
||||||
for( std::size_t pos = 0; pos < paragraph.size(); ++pos ) {
|
|
||||||
if( pos == width ) {
|
|
||||||
addIndent( os, indent );
|
|
||||||
os << paragraph.substr( 0, wrapPoint ) << "\n";
|
|
||||||
return recursivelyWrapLine( os, paragraph.substr( wrapPoint+1 ), columns, indent+tab );
|
|
||||||
}
|
|
||||||
if( paragraph[pos] == '\t' ) {
|
|
||||||
tab = pos;
|
|
||||||
paragraph = paragraph.substr( 0, tab ) + paragraph.substr( tab+1 );
|
|
||||||
pos--;
|
|
||||||
}
|
|
||||||
else if( paragraph[pos] == ' ' ) {
|
|
||||||
wrapPoint = pos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
addIndent( os, indent );
|
|
||||||
os << paragraph << "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string addLineBreaks( const std::string& str, std::size_t columns, std::size_t indent = 0 ) {
|
|
||||||
std::ostringstream oss;
|
|
||||||
std::string::size_type pos = 0;
|
|
||||||
std::string::size_type newline = str.find_first_of( '\n' );
|
|
||||||
while( newline != std::string::npos ) {
|
|
||||||
std::string paragraph = str.substr( pos, newline-pos );
|
|
||||||
recursivelyWrapLine( oss, paragraph, columns, indent );
|
|
||||||
pos = newline+1;
|
|
||||||
newline = str.find_first_of( '\n', pos );
|
|
||||||
}
|
|
||||||
if( pos != str.size() )
|
|
||||||
recursivelyWrapLine( oss, str.substr( pos, str.size()-pos ), columns, indent );
|
|
||||||
|
|
||||||
return oss.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void showHelp( const CommandParser& parser ) {
|
|
||||||
std::string exeName = parser.exeName();
|
|
||||||
std::string::size_type pos = exeName.find_last_of( "/\\" );
|
|
||||||
if( pos != std::string::npos ) {
|
|
||||||
exeName = exeName.substr( pos+1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
AllOptions options;
|
|
||||||
Options::HelpOptionParser helpOpt;
|
|
||||||
bool displayedSpecificOption = false;
|
|
||||||
for( AllOptions::const_iterator it = options.begin(); it != options.end(); ++it ) {
|
|
||||||
OptionParser& opt = **it;
|
|
||||||
if( opt.find( parser ) && opt.optionNames() != helpOpt.optionNames() ) {
|
|
||||||
displayedSpecificOption = true;
|
|
||||||
std::cout << "\n" << opt.optionNames() << " " << opt.argsSynopsis() << "\n\n"
|
|
||||||
<< opt.optionSummary() << "\n\n"
|
|
||||||
|
|
||||||
<< addLineBreaks( opt.optionDescription(), 80, 2 ) << "\n" << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !displayedSpecificOption ) {
|
|
||||||
std::cout << exeName << " is a CATCH host application. Options are as follows:\n\n";
|
|
||||||
showUsage( std::cout );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline int Main( int argc, char* const argv[], Config& config ) {
|
|
||||||
|
|
||||||
try {
|
|
||||||
CommandParser parser( argc, argv );
|
|
||||||
|
|
||||||
if( Command cmd = Options::HelpOptionParser().find( parser ) ) {
|
|
||||||
if( cmd.argsCount() != 0 )
|
|
||||||
cmd.raiseError( "Does not accept arguments" );
|
|
||||||
|
|
||||||
showHelp( parser );
|
|
||||||
Catch::cleanUp();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
AllOptions options;
|
|
||||||
|
|
||||||
options.parseIntoConfig( parser, config.data() );
|
|
||||||
}
|
|
||||||
catch( std::exception& ex ) {
|
|
||||||
std::cerr << ex.what() << "\n\nUsage: ...\n\n";
|
|
||||||
showUsage( std::cerr );
|
|
||||||
Catch::cleanUp();
|
|
||||||
return (std::numeric_limits<int>::max)();
|
return (std::numeric_limits<int>::max)();
|
||||||
}
|
}
|
||||||
|
|
||||||
return Main( config );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int Main( int argc, char* const argv[] ) {
|
Clara::CommandLine<ConfigData> const& cli() const {
|
||||||
Config config;
|
return m_cli;
|
||||||
// !TBD: This doesn't always work, for some reason
|
|
||||||
// if( isDebuggerActive() )
|
|
||||||
// config.useStream( "debug" );
|
|
||||||
return Main( argc, argv, config );
|
|
||||||
}
|
}
|
||||||
|
std::vector<Clara::Parser::Token> const& unusedTokens() const {
|
||||||
|
return m_unusedTokens;
|
||||||
|
}
|
||||||
|
ConfigData& configData() {
|
||||||
|
return m_configData;
|
||||||
|
}
|
||||||
|
Config& config() {
|
||||||
|
if( !m_config )
|
||||||
|
m_config = new Config( m_configData );
|
||||||
|
return *m_config;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Clara::CommandLine<ConfigData> m_cli;
|
||||||
|
std::vector<Clara::Parser::Token> m_unusedTokens;
|
||||||
|
ConfigData m_configData;
|
||||||
|
Ptr<Config> m_config;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool Session::alreadyInstantiated = false;
|
||||||
|
|
||||||
} // end namespace Catch
|
} // end namespace Catch
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ namespace Detail {
|
||||||
m_value( value )
|
m_value( value )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
Approx( const Approx& other )
|
Approx( Approx const& other )
|
||||||
: m_epsilon( other.m_epsilon ),
|
: m_epsilon( other.m_epsilon ),
|
||||||
m_scale( other.m_scale ),
|
m_scale( other.m_scale ),
|
||||||
m_value( other.m_value )
|
m_value( other.m_value )
|
||||||
|
@ -41,20 +41,20 @@ namespace Detail {
|
||||||
return approx;
|
return approx;
|
||||||
}
|
}
|
||||||
|
|
||||||
friend bool operator == ( double lhs, const Approx& rhs ) {
|
friend bool operator == ( double lhs, Approx const& rhs ) {
|
||||||
// Thanks to Richard Harris for his help refining this formula
|
// Thanks to Richard Harris for his help refining this formula
|
||||||
return fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( fabs(lhs), fabs(rhs.m_value) ) );
|
return fabs( lhs - rhs.m_value ) < rhs.m_epsilon * (rhs.m_scale + (std::max)( fabs(lhs), fabs(rhs.m_value) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
friend bool operator == ( const Approx& lhs, double rhs ) {
|
friend bool operator == ( Approx const& lhs, double rhs ) {
|
||||||
return operator==( rhs, lhs );
|
return operator==( rhs, lhs );
|
||||||
}
|
}
|
||||||
|
|
||||||
friend bool operator != ( double lhs, const Approx& rhs ) {
|
friend bool operator != ( double lhs, Approx const& rhs ) {
|
||||||
return !operator==( lhs, rhs );
|
return !operator==( lhs, rhs );
|
||||||
}
|
}
|
||||||
|
|
||||||
friend bool operator != ( const Approx& lhs, double rhs ) {
|
friend bool operator != ( Approx const& lhs, double rhs ) {
|
||||||
return !operator==( rhs, lhs );
|
return !operator==( rhs, lhs );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ namespace Detail {
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline std::string toString<Detail::Approx>( const Detail::Approx& value ) {
|
inline std::string toString<Detail::Approx>( Detail::Approx const& value ) {
|
||||||
return value.toString();
|
return value.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,9 +16,9 @@ namespace Catch {
|
||||||
struct AssertionInfo
|
struct AssertionInfo
|
||||||
{
|
{
|
||||||
AssertionInfo() {}
|
AssertionInfo() {}
|
||||||
AssertionInfo( const std::string& _macroName,
|
AssertionInfo( std::string const& _macroName,
|
||||||
const SourceLineInfo& _lineInfo,
|
SourceLineInfo const& _lineInfo,
|
||||||
const std::string& _capturedExpression,
|
std::string const& _capturedExpression,
|
||||||
ResultDisposition::Flags _resultDisposition );
|
ResultDisposition::Flags _resultDisposition );
|
||||||
|
|
||||||
std::string macroName;
|
std::string macroName;
|
||||||
|
@ -39,7 +39,7 @@ namespace Catch {
|
||||||
class AssertionResult {
|
class AssertionResult {
|
||||||
public:
|
public:
|
||||||
AssertionResult();
|
AssertionResult();
|
||||||
AssertionResult( const AssertionInfo& info, const AssertionResultData& data );
|
AssertionResult( AssertionInfo const& info, AssertionResultData const& data );
|
||||||
~AssertionResult();
|
~AssertionResult();
|
||||||
|
|
||||||
bool isOk() const;
|
bool isOk() const;
|
||||||
|
@ -48,6 +48,7 @@ namespace Catch {
|
||||||
bool hasExpression() const;
|
bool hasExpression() const;
|
||||||
bool hasMessage() const;
|
bool hasMessage() const;
|
||||||
std::string getExpression() const;
|
std::string getExpression() const;
|
||||||
|
std::string getExpressionInMacro() const;
|
||||||
bool hasExpandedExpression() const;
|
bool hasExpandedExpression() const;
|
||||||
std::string getExpandedExpression() const;
|
std::string getExpandedExpression() const;
|
||||||
std::string getMessage() const;
|
std::string getMessage() const;
|
||||||
|
|
|
@ -13,22 +13,19 @@
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
|
|
||||||
AssertionInfo::AssertionInfo( const std::string& _macroName,
|
AssertionInfo::AssertionInfo( std::string const& _macroName,
|
||||||
const SourceLineInfo& _lineInfo,
|
SourceLineInfo const& _lineInfo,
|
||||||
const std::string& _capturedExpression,
|
std::string const& _capturedExpression,
|
||||||
ResultDisposition::Flags _resultDisposition )
|
ResultDisposition::Flags _resultDisposition )
|
||||||
: macroName( _macroName ),
|
: macroName( _macroName ),
|
||||||
lineInfo( _lineInfo ),
|
lineInfo( _lineInfo ),
|
||||||
capturedExpression( _capturedExpression ),
|
capturedExpression( _capturedExpression ),
|
||||||
resultDisposition( _resultDisposition )
|
resultDisposition( _resultDisposition )
|
||||||
{
|
{}
|
||||||
if( shouldNegate( resultDisposition ) )
|
|
||||||
capturedExpression = "!" + _capturedExpression;
|
|
||||||
}
|
|
||||||
|
|
||||||
AssertionResult::AssertionResult() {}
|
AssertionResult::AssertionResult() {}
|
||||||
|
|
||||||
AssertionResult::AssertionResult( const AssertionInfo& info, const AssertionResultData& data )
|
AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data )
|
||||||
: m_info( info ),
|
: m_info( info ),
|
||||||
m_resultData( data )
|
m_resultData( data )
|
||||||
{}
|
{}
|
||||||
|
@ -58,8 +55,17 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string AssertionResult::getExpression() const {
|
std::string AssertionResult::getExpression() const {
|
||||||
|
if( shouldNegate( m_info.resultDisposition ) )
|
||||||
|
return "!" + m_info.capturedExpression;
|
||||||
|
else
|
||||||
return m_info.capturedExpression;
|
return m_info.capturedExpression;
|
||||||
}
|
}
|
||||||
|
std::string AssertionResult::getExpressionInMacro() const {
|
||||||
|
if( m_info.macroName.empty() )
|
||||||
|
return m_info.capturedExpression;
|
||||||
|
else
|
||||||
|
return m_info.macroName + "( " + m_info.capturedExpression + " )";
|
||||||
|
}
|
||||||
|
|
||||||
bool AssertionResult::hasExpandedExpression() const {
|
bool AssertionResult::hasExpandedExpression() const {
|
||||||
return hasExpression() && getExpandedExpression() != getExpression();
|
return hasExpression() && getExpandedExpression() != getExpression();
|
||||||
|
|
|
@ -10,11 +10,14 @@
|
||||||
|
|
||||||
#include "catch_expression_decomposer.hpp"
|
#include "catch_expression_decomposer.hpp"
|
||||||
#include "catch_expressionresult_builder.h"
|
#include "catch_expressionresult_builder.h"
|
||||||
|
#include "catch_message.h"
|
||||||
#include "catch_interfaces_capture.h"
|
#include "catch_interfaces_capture.h"
|
||||||
#include "catch_debugger.hpp"
|
#include "catch_debugger.hpp"
|
||||||
#include "catch_context.h"
|
#include "catch_context.h"
|
||||||
#include "catch_common.h"
|
#include "catch_common.h"
|
||||||
#include "catch_interfaces_registry_hub.h"
|
#include "catch_interfaces_registry_hub.h"
|
||||||
|
#include "internal/catch_compiler_capabilities.h"
|
||||||
|
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
@ -24,8 +27,8 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename MatcherT>
|
template<typename MatcherT>
|
||||||
ExpressionResultBuilder expressionResultBuilderFromMatcher( const MatcherT& matcher,
|
ExpressionResultBuilder expressionResultBuilderFromMatcher( MatcherT const& matcher,
|
||||||
const std::string& matcherCallAsString ) {
|
std::string const& matcherCallAsString ) {
|
||||||
std::string matcherAsString = matcher.toString();
|
std::string matcherAsString = matcher.toString();
|
||||||
if( matcherAsString == "{?}" )
|
if( matcherAsString == "{?}" )
|
||||||
matcherAsString = matcherCallAsString;
|
matcherAsString = matcherCallAsString;
|
||||||
|
@ -35,18 +38,18 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename MatcherT, typename ArgT>
|
template<typename MatcherT, typename ArgT>
|
||||||
ExpressionResultBuilder expressionResultBuilderFromMatcher( const MatcherT& matcher,
|
ExpressionResultBuilder expressionResultBuilderFromMatcher( MatcherT const& matcher,
|
||||||
const ArgT& arg,
|
ArgT const& arg,
|
||||||
const std::string& matcherCallAsString ) {
|
std::string const& matcherCallAsString ) {
|
||||||
return expressionResultBuilderFromMatcher( matcher, matcherCallAsString )
|
return expressionResultBuilderFromMatcher( matcher, matcherCallAsString )
|
||||||
.setLhs( Catch::toString( arg ) )
|
.setLhs( Catch::toString( arg ) )
|
||||||
.setResultType( matcher.match( arg ) );
|
.setResultType( matcher.match( arg ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename MatcherT, typename ArgT>
|
template<typename MatcherT, typename ArgT>
|
||||||
ExpressionResultBuilder expressionResultBuilderFromMatcher( const MatcherT& matcher,
|
ExpressionResultBuilder expressionResultBuilderFromMatcher( MatcherT const& matcher,
|
||||||
ArgT* arg,
|
ArgT* arg,
|
||||||
const std::string& matcherCallAsString ) {
|
std::string const& matcherCallAsString ) {
|
||||||
return expressionResultBuilderFromMatcher( matcher, matcherCallAsString )
|
return expressionResultBuilderFromMatcher( matcher, matcherCallAsString )
|
||||||
.setLhs( Catch::toString( arg ) )
|
.setLhs( Catch::toString( arg ) )
|
||||||
.setResultType( matcher.match( arg ) );
|
.setResultType( matcher.match( arg ) );
|
||||||
|
@ -54,30 +57,6 @@ namespace Catch {
|
||||||
|
|
||||||
struct TestFailureException{};
|
struct TestFailureException{};
|
||||||
|
|
||||||
class ScopedInfo {
|
|
||||||
public:
|
|
||||||
ScopedInfo() : m_resultBuilder( ResultWas::Info ) {
|
|
||||||
getResultCapture().pushScopedInfo( this );
|
|
||||||
}
|
|
||||||
~ScopedInfo() {
|
|
||||||
getResultCapture().popScopedInfo( this );
|
|
||||||
}
|
|
||||||
template<typename T>
|
|
||||||
ScopedInfo& operator << ( const T& value ) {
|
|
||||||
m_resultBuilder << value;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
AssertionResult buildResult( const AssertionInfo& assertionInfo ) const {
|
|
||||||
return m_resultBuilder.buildResult( assertionInfo );
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
ExpressionResultBuilder m_resultBuilder;
|
|
||||||
};
|
|
||||||
|
|
||||||
// This is just here to avoid compiler warnings with macro constants and boolean literals
|
|
||||||
inline bool isTrue( bool value ){ return value; }
|
|
||||||
|
|
||||||
} // end namespace Catch
|
} // end namespace Catch
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -89,7 +68,7 @@ inline bool isTrue( bool value ){ return value; }
|
||||||
if( internal_catch_action & Catch::ResultAction::Debug ) BreakIntoDebugger(); \
|
if( internal_catch_action & Catch::ResultAction::Debug ) BreakIntoDebugger(); \
|
||||||
if( internal_catch_action & Catch::ResultAction::Abort ) throw Catch::TestFailureException(); \
|
if( internal_catch_action & Catch::ResultAction::Abort ) throw Catch::TestFailureException(); \
|
||||||
if( !Catch::shouldContinueOnFailure( resultDisposition ) ) throw Catch::TestFailureException(); \
|
if( !Catch::shouldContinueOnFailure( resultDisposition ) ) throw Catch::TestFailureException(); \
|
||||||
if( Catch::isTrue( false ) ){ bool this_is_here_to_invoke_warnings = ( originalExpr ); Catch::isTrue( this_is_here_to_invoke_warnings ); } \
|
Catch::isTrue( false && originalExpr ); \
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -107,7 +86,6 @@ inline bool isTrue( bool value ){ return value; }
|
||||||
} catch( ... ) { \
|
} catch( ... ) { \
|
||||||
INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::ThrewException ) << Catch::translateActiveException(), \
|
INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( Catch::ResultWas::ThrewException ) << Catch::translateActiveException(), \
|
||||||
resultDisposition | Catch::ResultDisposition::ContinueOnFailure, expr ); \
|
resultDisposition | Catch::ResultDisposition::ContinueOnFailure, expr ); \
|
||||||
throw; \
|
|
||||||
} \
|
} \
|
||||||
} while( Catch::isTrue( false ) )
|
} while( Catch::isTrue( false ) )
|
||||||
|
|
||||||
|
@ -168,17 +146,24 @@ inline bool isTrue( bool value ){ return value; }
|
||||||
} while( Catch::isTrue( false ) )
|
} while( Catch::isTrue( false ) )
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_MSG( reason, resultType, resultDisposition, macroName ) \
|
#define INTERNAL_CATCH_INFO( log, macroName ) \
|
||||||
|
do { \
|
||||||
|
Catch::getResultCapture().acceptMessage( Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log ); \
|
||||||
|
} while( Catch::isTrue( false ) )
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
#define INTERNAL_CATCH_MSG( log, messageType, resultDisposition, macroName ) \
|
||||||
do { \
|
do { \
|
||||||
INTERNAL_CATCH_ACCEPT_INFO( "", macroName, resultDisposition ); \
|
INTERNAL_CATCH_ACCEPT_INFO( "", macroName, resultDisposition ); \
|
||||||
INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( resultType ) << reason, resultDisposition, true ) \
|
INTERNAL_CATCH_ACCEPT_EXPR( Catch::ExpressionResultBuilder( messageType ) << log, resultDisposition, true ) \
|
||||||
} while( Catch::isTrue( false ) )
|
} while( Catch::isTrue( false ) )
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_SCOPED_INFO( log, macroName ) \
|
#define INTERNAL_CATCH_SCOPED_INFO( log, macroName ) \
|
||||||
INTERNAL_CATCH_ACCEPT_INFO( "", macroName, Catch::ResultDisposition::Normal ); \
|
Catch::ScopedMessageBuilder INTERNAL_CATCH_UNIQUE_NAME( scopedMessage )( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ); \
|
||||||
Catch::ScopedInfo INTERNAL_CATCH_UNIQUE_NAME( info ); \
|
INTERNAL_CATCH_UNIQUE_NAME( scopedMessage ) << log; \
|
||||||
INTERNAL_CATCH_UNIQUE_NAME( info ) << log
|
Catch::getResultCapture().pushScopedMessage( INTERNAL_CATCH_UNIQUE_NAME( scopedMessage ) )
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CHECK_THAT( arg, matcher, resultDisposition, macroName ) \
|
#define INTERNAL_CHECK_THAT( arg, matcher, resultDisposition, macroName ) \
|
||||||
|
@ -191,7 +176,6 @@ inline bool isTrue( bool value ){ return value; }
|
||||||
} catch( ... ) { \
|
} catch( ... ) { \
|
||||||
INTERNAL_CATCH_ACCEPT_EXPR( ( Catch::ExpressionResultBuilder( Catch::ResultWas::ThrewException ) << Catch::translateActiveException() ), \
|
INTERNAL_CATCH_ACCEPT_EXPR( ( Catch::ExpressionResultBuilder( Catch::ResultWas::ThrewException ) << Catch::translateActiveException() ), \
|
||||||
resultDisposition | Catch::ResultDisposition::ContinueOnFailure, false ); \
|
resultDisposition | Catch::ResultDisposition::ContinueOnFailure, false ); \
|
||||||
throw; \
|
|
||||||
} \
|
} \
|
||||||
} while( Catch::isTrue( false ) )
|
} while( Catch::isTrue( false ) )
|
||||||
|
|
||||||
|
|
|
@ -10,660 +10,120 @@
|
||||||
|
|
||||||
#include "catch_config.hpp"
|
#include "catch_config.hpp"
|
||||||
#include "catch_common.h"
|
#include "catch_common.h"
|
||||||
|
#include "clara.h"
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
class Command {
|
inline void abortAfterFirst( ConfigData& config ) { config.abortAfter = 1; }
|
||||||
public:
|
inline void abortAfterX( ConfigData& config, int x ) {
|
||||||
Command(){}
|
if( x < 1 )
|
||||||
|
throw std::runtime_error( "Value after -x or --abortAfter must be greater than zero" );
|
||||||
|
config.abortAfter = x;
|
||||||
|
}
|
||||||
|
inline void addTestOrTags( ConfigData& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); }
|
||||||
|
|
||||||
explicit Command( const std::string& name ) : m_name( name ) {
|
inline void addWarning( ConfigData& config, std::string const& _warning ) {
|
||||||
}
|
if( _warning == "NoAssertions" )
|
||||||
|
|
||||||
Command& operator += ( const std::string& arg ) {
|
|
||||||
m_args.push_back( arg );
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
Command& operator += ( const Command& other ) {
|
|
||||||
std::copy( other.m_args.begin(), other.m_args.end(), std::back_inserter( m_args ) );
|
|
||||||
if( m_name.empty() )
|
|
||||||
m_name = other.m_name;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
Command operator + ( const Command& other ) {
|
|
||||||
Command newCommand( *this );
|
|
||||||
newCommand += other;
|
|
||||||
return newCommand;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator SafeBool::type() const {
|
|
||||||
return SafeBool::makeSafe( !m_name.empty() || !m_args.empty() );
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string name() const { return m_name; }
|
|
||||||
std::string operator[]( std::size_t i ) const { return m_args[i]; }
|
|
||||||
std::size_t argsCount() const { return m_args.size(); }
|
|
||||||
|
|
||||||
CATCH_ATTRIBUTE_NORETURN
|
|
||||||
void raiseError( const std::string& message ) const {
|
|
||||||
std::ostringstream oss;
|
|
||||||
if( m_name.empty() )
|
|
||||||
oss << "Error while parsing " << m_name << ". " << message << ".";
|
|
||||||
else
|
|
||||||
oss << "Error while parsing arguments. " << message << ".";
|
|
||||||
|
|
||||||
if( m_args.size() > 0 )
|
|
||||||
oss << " Arguments were:";
|
|
||||||
for( std::size_t i = 0; i < m_args.size(); ++i )
|
|
||||||
oss << " " << m_args[i];
|
|
||||||
throw std::domain_error( oss.str() );
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
std::string m_name;
|
|
||||||
std::vector<std::string> m_args;
|
|
||||||
};
|
|
||||||
|
|
||||||
class CommandParser {
|
|
||||||
public:
|
|
||||||
CommandParser( int argc, char const * const * argv ) : m_argc( static_cast<std::size_t>( argc ) ), m_argv( argv ) {}
|
|
||||||
|
|
||||||
std::string exeName() const {
|
|
||||||
return m_argv[0];
|
|
||||||
}
|
|
||||||
Command find( const std::string& arg1, const std::string& arg2, const std::string& arg3 ) const {
|
|
||||||
return find( arg1 ) + find( arg2 ) + find( arg3 );
|
|
||||||
}
|
|
||||||
|
|
||||||
Command find( const std::string& shortArg, const std::string& longArg ) const {
|
|
||||||
return find( shortArg ) + find( longArg );
|
|
||||||
}
|
|
||||||
Command find( const std::string& arg ) const {
|
|
||||||
if( arg.empty() )
|
|
||||||
return getArgs( "", 1 );
|
|
||||||
else
|
|
||||||
for( std::size_t i = 1; i < m_argc; ++i )
|
|
||||||
if( m_argv[i] == arg )
|
|
||||||
return getArgs( m_argv[i], i+1 );
|
|
||||||
return Command();
|
|
||||||
}
|
|
||||||
Command getDefaultArgs() const {
|
|
||||||
return getArgs( "", 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
Command getArgs( const std::string& cmdName, std::size_t from ) const {
|
|
||||||
Command command( cmdName );
|
|
||||||
for( std::size_t i = from; i < m_argc && m_argv[i][0] != '-'; ++i )
|
|
||||||
command += m_argv[i];
|
|
||||||
return command;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t m_argc;
|
|
||||||
char const * const * m_argv;
|
|
||||||
};
|
|
||||||
|
|
||||||
class OptionParser : public SharedImpl<IShared> {
|
|
||||||
public:
|
|
||||||
OptionParser( int minArgs = 0, int maxArgs = 0 )
|
|
||||||
: m_minArgs( minArgs ), m_maxArgs( maxArgs )
|
|
||||||
{}
|
|
||||||
|
|
||||||
virtual ~OptionParser() {}
|
|
||||||
|
|
||||||
Command find( const CommandParser& parser ) const {
|
|
||||||
Command cmd;
|
|
||||||
for( std::vector<std::string>::const_iterator it = m_optionNames.begin();
|
|
||||||
it != m_optionNames.end();
|
|
||||||
++it )
|
|
||||||
cmd += parser.find( *it );
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
void validateArgs( const Command& args ) const {
|
|
||||||
if( tooFewArgs( args ) || tooManyArgs( args ) ) {
|
|
||||||
std::ostringstream oss;
|
|
||||||
if( m_maxArgs == -1 )
|
|
||||||
oss <<"Expected at least " << pluralise( static_cast<std::size_t>( m_minArgs ), "argument" );
|
|
||||||
else if( m_minArgs == m_maxArgs )
|
|
||||||
oss <<"Expected " << pluralise( static_cast<std::size_t>( m_minArgs ), "argument" );
|
|
||||||
else
|
|
||||||
oss <<"Expected between " << m_minArgs << " and " << m_maxArgs << " argument";
|
|
||||||
args.raiseError( oss.str() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void parseIntoConfig( const CommandParser& parser, ConfigData& config ) {
|
|
||||||
if( Command cmd = find( parser ) ) {
|
|
||||||
validateArgs( cmd );
|
|
||||||
parseIntoConfig( cmd, config );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void parseIntoConfig( const Command& cmd, ConfigData& config ) = 0;
|
|
||||||
virtual std::string argsSynopsis() const = 0;
|
|
||||||
virtual std::string optionSummary() const = 0;
|
|
||||||
virtual std::string optionDescription() const { return ""; }
|
|
||||||
|
|
||||||
std::string optionNames() const {
|
|
||||||
std::string names;
|
|
||||||
for( std::vector<std::string>::const_iterator it = m_optionNames.begin();
|
|
||||||
it != m_optionNames.end();
|
|
||||||
++it ) {
|
|
||||||
if( !it->empty() ) {
|
|
||||||
if( !names.empty() )
|
|
||||||
names += ", ";
|
|
||||||
names += *it;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
names = "[" + names;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if( names[0] == '[' )
|
|
||||||
names += "]";
|
|
||||||
return names;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
bool tooFewArgs( const Command& args ) const {
|
|
||||||
return args.argsCount() < static_cast<std::size_t>( m_minArgs );
|
|
||||||
}
|
|
||||||
bool tooManyArgs( const Command& args ) const {
|
|
||||||
return m_maxArgs >= 0 && args.argsCount() > static_cast<std::size_t>( m_maxArgs );
|
|
||||||
}
|
|
||||||
std::vector<std::string> m_optionNames;
|
|
||||||
int m_minArgs;
|
|
||||||
int m_maxArgs;
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace Options {
|
|
||||||
|
|
||||||
class HelpOptionParser : public OptionParser {
|
|
||||||
public:
|
|
||||||
HelpOptionParser() {
|
|
||||||
m_optionNames.push_back( "-?" );
|
|
||||||
m_optionNames.push_back( "-h" );
|
|
||||||
m_optionNames.push_back( "--help" );
|
|
||||||
}
|
|
||||||
virtual std::string argsSynopsis() const {
|
|
||||||
return "[<option for help on> ...]";
|
|
||||||
}
|
|
||||||
virtual std::string optionSummary() const {
|
|
||||||
return "Shows this usage summary, or help on a specific option, or options, if supplied";
|
|
||||||
}
|
|
||||||
virtual std::string optionDescription() const {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void parseIntoConfig( const Command&, ConfigData& ) {
|
|
||||||
// Does not affect config
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class TestCaseOptionParser : public OptionParser {
|
|
||||||
public:
|
|
||||||
TestCaseOptionParser() : OptionParser( 1, -1 ) {
|
|
||||||
m_optionNames.push_back( "-t" );
|
|
||||||
m_optionNames.push_back( "--test" );
|
|
||||||
m_optionNames.push_back( "" ); // default option
|
|
||||||
}
|
|
||||||
virtual std::string argsSynopsis() const {
|
|
||||||
return "<testspec> [<testspec>...]";
|
|
||||||
}
|
|
||||||
virtual std::string optionSummary() const {
|
|
||||||
return "Specifies which test case or cases to run";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lines are split at the nearest prior space char to the 80 char column.
|
|
||||||
// Tab chars are removed from the output but their positions are used to align
|
|
||||||
// subsequently wrapped lines
|
|
||||||
virtual std::string optionDescription() const {
|
|
||||||
return
|
|
||||||
"This option allows one ore more test specs to be supplied. Each spec either fully "
|
|
||||||
"specifies a test case or is a pattern containing wildcards to match a set of test "
|
|
||||||
"cases. If this option is not provided then all test cases, except those prefixed "
|
|
||||||
"by './' are run\n"
|
|
||||||
"\n"
|
|
||||||
"Specs must be enclosed in \"quotes\" if they contain spaces. If they do not "
|
|
||||||
"contain spaces the quotes are optional.\n"
|
|
||||||
"\n"
|
|
||||||
"Wildcards consist of the * character at the beginning, end, or both and can substitute for "
|
|
||||||
"any number of any characters (including none)\n"
|
|
||||||
"\n"
|
|
||||||
"If spec is prefixed with exclude: or the ~ character then the pattern matches an exclusion. "
|
|
||||||
"This means that tests matching the pattern are excluded from the set - even if a prior "
|
|
||||||
"inclusion spec included them. Subsequent inclusion specs will take precedence, however. "
|
|
||||||
"Inclusions and exclusions are evaluated in left-to-right order.\n"
|
|
||||||
"\n"
|
|
||||||
"Examples:\n"
|
|
||||||
"\n"
|
|
||||||
" -t thisTestOnly \tMatches the test case called, 'thisTestOnly'\n"
|
|
||||||
" -t \"this test only\" \tMatches the test case called, 'this test only'\n"
|
|
||||||
" -t these/* \tMatches all cases starting with 'these/'\n"
|
|
||||||
" -t exclude:notThis \tMatches all tests except, 'notThis'\n"
|
|
||||||
" -t ~notThis \tMatches all tests except, 'notThis'\n"
|
|
||||||
" -t ~*private* \tMatches all tests except those that contain 'private'\n"
|
|
||||||
" -t a/* ~a/b/* a/b/c \tMatches all tests that start with 'a/', except those "
|
|
||||||
"that start with 'a/b/', except 'a/b/c', which is included";
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void parseIntoConfig( const Command& cmd, ConfigData& config ) {
|
|
||||||
std::string groupName;
|
|
||||||
for( std::size_t i = 0; i < cmd.argsCount(); ++i ) {
|
|
||||||
if( i != 0 )
|
|
||||||
groupName += " ";
|
|
||||||
groupName += cmd[i];
|
|
||||||
}
|
|
||||||
TestCaseFilters filters( groupName );
|
|
||||||
for( std::size_t i = 0; i < cmd.argsCount(); ++i )
|
|
||||||
filters.addFilter( TestCaseFilter( cmd[i] ) );
|
|
||||||
config.filters.push_back( filters );
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class TagOptionParser : public OptionParser {
|
|
||||||
public:
|
|
||||||
TagOptionParser() : OptionParser( 1, -1 ) {
|
|
||||||
m_optionNames.push_back( "-g" );
|
|
||||||
m_optionNames.push_back( "--tag" );
|
|
||||||
}
|
|
||||||
virtual std::string argsSynopsis() const {
|
|
||||||
return "<tagspec> [,<tagspec>...]";
|
|
||||||
}
|
|
||||||
virtual std::string optionSummary() const {
|
|
||||||
return "Matches test cases against tags or tag patterns";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lines are split at the nearest prior space char to the 80 char column.
|
|
||||||
// Tab chars are removed from the output but their positions are used to align
|
|
||||||
// subsequently wrapped lines
|
|
||||||
virtual std::string optionDescription() const {
|
|
||||||
return
|
|
||||||
"This option allows one or more tags or tag patterns to be specified.\n"
|
|
||||||
"Each tag is enclosed in square brackets. A series of tags form an AND expression "
|
|
||||||
"wheras a comma seperated sequence forms an OR expression. e.g.:\n\n"
|
|
||||||
" -g [one][two],[three]\n\n"
|
|
||||||
"This matches all tests tagged [one] and [two], as well as all tests tagged [three].\n\n"
|
|
||||||
"Tags can be negated with the ~ character. This removes matching tests from the set. e.g.:\n\n"
|
|
||||||
" -g [one]~[two]\n\n"
|
|
||||||
"matches all tests tagged [one], except those also tagged [two]";
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void parseIntoConfig( const Command& cmd, ConfigData& config ) {
|
|
||||||
std::string groupName;
|
|
||||||
for( std::size_t i = 0; i < cmd.argsCount(); ++i ) {
|
|
||||||
if( i != 0 )
|
|
||||||
groupName += " ";
|
|
||||||
groupName += cmd[i];
|
|
||||||
}
|
|
||||||
TestCaseFilters filters( groupName );
|
|
||||||
for( std::size_t i = 0; i < cmd.argsCount(); ++i )
|
|
||||||
filters.addTags( cmd[i] );
|
|
||||||
config.filters.push_back( filters );
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class ListOptionParser : public OptionParser {
|
|
||||||
public:
|
|
||||||
ListOptionParser() : OptionParser( 0, 2 ) {
|
|
||||||
m_optionNames.push_back( "-l" );
|
|
||||||
m_optionNames.push_back( "--list" );
|
|
||||||
}
|
|
||||||
virtual std::string argsSynopsis() const {
|
|
||||||
return "[all | tests | reporters [xml]]";
|
|
||||||
}
|
|
||||||
virtual std::string optionSummary() const {
|
|
||||||
return "Lists available tests or reporters";
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual std::string optionDescription() const {
|
|
||||||
return
|
|
||||||
"With no arguments this option will list all registered tests - one per line.\n"
|
|
||||||
"Supplying the xml argument formats the list as an xml document (which may be useful for "
|
|
||||||
"consumption by other tools).\n"
|
|
||||||
"Supplying the tests or reporters lists tests or reporters respectively - with descriptions.\n"
|
|
||||||
"\n"
|
|
||||||
"Examples:\n"
|
|
||||||
"\n"
|
|
||||||
" -l\n"
|
|
||||||
" -l tests\n"
|
|
||||||
" -l reporters xml\n"
|
|
||||||
" -l xml";
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void parseIntoConfig( const Command& cmd, ConfigData& config ) {
|
|
||||||
config.listSpec = List::TestNames;
|
|
||||||
if( cmd.argsCount() >= 1 ) {
|
|
||||||
if( cmd[0] == "all" )
|
|
||||||
config.listSpec = List::All;
|
|
||||||
else if( cmd[0] == "tests" )
|
|
||||||
config.listSpec = List::Tests;
|
|
||||||
else if( cmd[0] == "reporters" )
|
|
||||||
config.listSpec = List::Reports;
|
|
||||||
else
|
|
||||||
cmd.raiseError( "Expected [tests] or [reporters]" );
|
|
||||||
}
|
|
||||||
if( cmd.argsCount() >= 2 ) {
|
|
||||||
if( cmd[1] == "xml" )
|
|
||||||
config.listSpec = static_cast<List::What>( config.listSpec | List::AsXml );
|
|
||||||
else if( cmd[1] == "text" )
|
|
||||||
config.listSpec = static_cast<List::What>( config.listSpec | List::AsText );
|
|
||||||
else
|
|
||||||
cmd.raiseError( "Expected [xml] or [text]" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class ReporterOptionParser : public OptionParser {
|
|
||||||
public:
|
|
||||||
ReporterOptionParser() : OptionParser( 1, 1 ) {
|
|
||||||
m_optionNames.push_back( "-r" );
|
|
||||||
m_optionNames.push_back( "--reporter" );
|
|
||||||
}
|
|
||||||
virtual std::string argsSynopsis() const {
|
|
||||||
return "<reporter name>";
|
|
||||||
}
|
|
||||||
virtual std::string optionSummary() const {
|
|
||||||
return "Specifies type of reporter";
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual std::string optionDescription() const {
|
|
||||||
return
|
|
||||||
"A reporter is an object that formats and structures the output of running "
|
|
||||||
"tests, and potentially summarises the results. By default a basic reporter "
|
|
||||||
"is used that writes IDE friendly results. CATCH comes bundled with some "
|
|
||||||
"alternative reporters, but more can be added in client code.\n"
|
|
||||||
"\n"
|
|
||||||
"The bundled reporters are:\n"
|
|
||||||
" -r basic\n"
|
|
||||||
" -r xml\n"
|
|
||||||
" -r junit\n"
|
|
||||||
"\n"
|
|
||||||
"The JUnit reporter is an xml format that follows the structure of the JUnit "
|
|
||||||
"XML Report ANT task, as consumed by a number of third-party tools, "
|
|
||||||
"including Continuous Integration servers such as Jenkins.\n"
|
|
||||||
"If not otherwise needed, the standard XML reporter is preferred as this is "
|
|
||||||
"a streaming reporter, whereas the Junit reporter needs to hold all its "
|
|
||||||
"results until the end so it can write the overall results into attributes "
|
|
||||||
"of the root node.";
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void parseIntoConfig( const Command& cmd, ConfigData& config ) {
|
|
||||||
config.reporter = cmd[0];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class OutputOptionParser : public OptionParser {
|
|
||||||
public:
|
|
||||||
OutputOptionParser() : OptionParser( 1, 1 ) {
|
|
||||||
m_optionNames.push_back( "-o" );
|
|
||||||
m_optionNames.push_back( "--out" );
|
|
||||||
}
|
|
||||||
virtual std::string argsSynopsis() const {
|
|
||||||
return "<file name>|<%stream name>";
|
|
||||||
}
|
|
||||||
virtual std::string optionSummary() const {
|
|
||||||
return "Sends output to a file or stream";
|
|
||||||
}
|
|
||||||
virtual std::string optionDescription() const {
|
|
||||||
return
|
|
||||||
"Use this option to send all output to a file or a stream. By default output is "
|
|
||||||
"sent to stdout (note that uses of stdout and stderr from within test cases are "
|
|
||||||
"redirected and included in the report - so even stderr will effectively end up "
|
|
||||||
"on stdout). If the name begins with % it is interpreted as a stream. "
|
|
||||||
"Otherwise it is treated as a filename.\n"
|
|
||||||
"\n"
|
|
||||||
"Examples are:\n"
|
|
||||||
"\n"
|
|
||||||
" -o filename.txt\n"
|
|
||||||
" -o \"long filename.txt\"\n"
|
|
||||||
" -o %stdout\n"
|
|
||||||
" -o %stderr\n"
|
|
||||||
" -o %debug \t(The IDE's debug output window - currently only Windows' "
|
|
||||||
"OutputDebugString is supported).";
|
|
||||||
}
|
|
||||||
virtual void parseIntoConfig( const Command& cmd, ConfigData& config ) {
|
|
||||||
if( cmd[0][0] == '%' )
|
|
||||||
config.stream = cmd[0].substr( 1 );
|
|
||||||
else
|
|
||||||
config.outputFilename = cmd[0];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class SuccessOptionParser : public OptionParser {
|
|
||||||
public:
|
|
||||||
SuccessOptionParser() {
|
|
||||||
m_optionNames.push_back( "-s" );
|
|
||||||
m_optionNames.push_back( "--success" );
|
|
||||||
}
|
|
||||||
virtual std::string argsSynopsis() const {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
virtual std::string optionSummary() const {
|
|
||||||
return "Shows results for successful tests";
|
|
||||||
}
|
|
||||||
virtual std::string optionDescription() const {
|
|
||||||
return
|
|
||||||
"Usually you only want to see reporting for failed tests. Sometimes it's useful "
|
|
||||||
"to see all the output (especially when you don't trust that that test you just "
|
|
||||||
"added worked first time!). To see successful, as well as failing, test results "
|
|
||||||
"just pass this option.";
|
|
||||||
}
|
|
||||||
virtual void parseIntoConfig( const Command&, ConfigData& config ) {
|
|
||||||
config.includeWhichResults = Include::SuccessfulResults;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class DebugBreakOptionParser : public OptionParser {
|
|
||||||
public:
|
|
||||||
DebugBreakOptionParser() {
|
|
||||||
m_optionNames.push_back( "-b" );
|
|
||||||
m_optionNames.push_back( "--break" );
|
|
||||||
}
|
|
||||||
virtual std::string argsSynopsis() const {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
virtual std::string optionSummary() const {
|
|
||||||
return "Breaks into the debugger on failure";
|
|
||||||
}
|
|
||||||
virtual std::string optionDescription() const {
|
|
||||||
return
|
|
||||||
"In some IDEs (currently XCode and Visual Studio) it is possible for CATCH to "
|
|
||||||
"break into the debugger on a test failure. This can be very helpful during "
|
|
||||||
"debug sessions - especially when there is more than one path through a "
|
|
||||||
"particular test. In addition to the command line option, ensure you have "
|
|
||||||
"built your code with the DEBUG preprocessor symbol";
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void parseIntoConfig( const Command&, ConfigData& config ) {
|
|
||||||
config.shouldDebugBreak = true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class NameOptionParser : public OptionParser {
|
|
||||||
public:
|
|
||||||
NameOptionParser() : OptionParser( 1, 1 ) {
|
|
||||||
m_optionNames.push_back( "-n" );
|
|
||||||
m_optionNames.push_back( "--name" );
|
|
||||||
}
|
|
||||||
virtual std::string argsSynopsis() const {
|
|
||||||
return "<name>";
|
|
||||||
}
|
|
||||||
virtual std::string optionSummary() const {
|
|
||||||
return "Names a test run";
|
|
||||||
}
|
|
||||||
virtual std::string optionDescription() const {
|
|
||||||
return
|
|
||||||
"If a name is supplied it will be used by the reporter to provide an overall "
|
|
||||||
"name for the test run. This can be useful if you are sending to a file, for "
|
|
||||||
"example, and need to distinguish different test runs - either from different "
|
|
||||||
"Catch executables or runs of the same executable with different options.\n"
|
|
||||||
"\n"
|
|
||||||
"Examples:\n"
|
|
||||||
"\n"
|
|
||||||
" -n testRun\n"
|
|
||||||
" -n \"tests of the widget component\"";
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void parseIntoConfig( const Command& cmd, ConfigData& config ) {
|
|
||||||
config.name = cmd[0];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class AbortOptionParser : public OptionParser {
|
|
||||||
public:
|
|
||||||
AbortOptionParser() : OptionParser( 0, 1 ) {
|
|
||||||
m_optionNames.push_back( "-a" );
|
|
||||||
m_optionNames.push_back( "--abort" );
|
|
||||||
}
|
|
||||||
virtual std::string argsSynopsis() const {
|
|
||||||
return "[#]";
|
|
||||||
}
|
|
||||||
virtual std::string optionSummary() const {
|
|
||||||
return "Aborts after a certain number of failures";
|
|
||||||
}
|
|
||||||
virtual std::string optionDescription() const {
|
|
||||||
return
|
|
||||||
"If a REQUIRE assertion fails the test case aborts, but subsequent test cases "
|
|
||||||
"are still run. If a CHECK assertion fails even the current test case is not "
|
|
||||||
"aborted.\n"
|
|
||||||
"\n"
|
|
||||||
"Sometimes this results in a flood of failure messages and you'd rather just "
|
|
||||||
"see the first few. Specifying -a or --abort on its own will abort the whole "
|
|
||||||
"test run on the first failed assertion of any kind. Following it with a "
|
|
||||||
"number causes it to abort after that number of assertion failures.";
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void parseIntoConfig( const Command& cmd, ConfigData& config ) {
|
|
||||||
int threshold = 1;
|
|
||||||
if( cmd.argsCount() == 1 ) {
|
|
||||||
std::stringstream ss;
|
|
||||||
ss << cmd[0];
|
|
||||||
ss >> threshold;
|
|
||||||
if( ss.fail() || threshold <= 0 )
|
|
||||||
cmd.raiseError( "threshold must be a number greater than zero" );
|
|
||||||
}
|
|
||||||
config.cutoff = threshold;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class NoThrowOptionParser : public OptionParser {
|
|
||||||
public:
|
|
||||||
NoThrowOptionParser() {
|
|
||||||
m_optionNames.push_back( "-nt" );
|
|
||||||
m_optionNames.push_back( "--nothrow" );
|
|
||||||
}
|
|
||||||
virtual std::string argsSynopsis() const {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
virtual std::string optionSummary() const {
|
|
||||||
return "Elides assertions expected to throw";
|
|
||||||
}
|
|
||||||
virtual std::string optionDescription() const {
|
|
||||||
return
|
|
||||||
"Skips all assertions that test that an exception is thrown, "
|
|
||||||
"e.g. REQUIRE_THROWS.\n"
|
|
||||||
"\n"
|
|
||||||
"These can be a nuisance in certain debugging environments that may break when "
|
|
||||||
"exceptions are thrown (while this is usually optional for handled exceptions, "
|
|
||||||
"it can be useful to have enabled if you are trying to track down something "
|
|
||||||
"unexpected).\n"
|
|
||||||
"\n"
|
|
||||||
"When running with this option the throw checking assertions are skipped so "
|
|
||||||
"as not to contribute additional noise.";
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void parseIntoConfig( const Command&, ConfigData& config ) {
|
|
||||||
config.allowThrows = false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class WarningsOptionParser : public OptionParser {
|
|
||||||
public:
|
|
||||||
WarningsOptionParser() : OptionParser( 1, -1 ) {
|
|
||||||
m_optionNames.push_back( "-w" );
|
|
||||||
m_optionNames.push_back( "--warnings" );
|
|
||||||
}
|
|
||||||
virtual std::string argsSynopsis() const {
|
|
||||||
return "<warning>";
|
|
||||||
}
|
|
||||||
virtual std::string optionSummary() const {
|
|
||||||
return "Enable warnings";
|
|
||||||
}
|
|
||||||
virtual std::string optionDescription() const {
|
|
||||||
return
|
|
||||||
"Enables the named warnings. If the warnings are violated the test case is "
|
|
||||||
"failed.\n"
|
|
||||||
"\n"
|
|
||||||
"At present only one warning has been provided: NoAssertions. If this warning "
|
|
||||||
"is enabled then any test case that completes without an assertions (CHECK, "
|
|
||||||
"REQUIRE etc) being encountered violates the warning.\n"
|
|
||||||
"\n"
|
|
||||||
"e.g.:\n"
|
|
||||||
"\n"
|
|
||||||
" -w NoAssertions";
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void parseIntoConfig( const Command& cmd, ConfigData& config ) {
|
|
||||||
for( std::size_t i = 0; i < cmd.argsCount(); ++i ) {
|
|
||||||
if( cmd[i] == "NoAssertions" )
|
|
||||||
config.warnings = (ConfigData::WarnAbout::What)( config.warnings | ConfigData::WarnAbout::NoAssertions );
|
config.warnings = (ConfigData::WarnAbout::What)( config.warnings | ConfigData::WarnAbout::NoAssertions );
|
||||||
else
|
else
|
||||||
cmd.raiseError( "Unrecognised warning: " + cmd[i] );
|
throw std::runtime_error( "Unrecognised warning: '" + _warning + "'" );
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
inline void setVerbosity( ConfigData& config, int level ) {
|
||||||
};
|
// !TBD: accept strings?
|
||||||
|
config.verbosity = (ConfigData::Verbosity::Level)level;
|
||||||
}
|
}
|
||||||
|
|
||||||
class AllOptions
|
inline Clara::CommandLine<ConfigData> makeCommandLineParser() {
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef std::vector<Ptr<OptionParser> > Parsers;
|
|
||||||
typedef Parsers::const_iterator const_iterator;
|
|
||||||
typedef Parsers::const_iterator iterator;
|
|
||||||
|
|
||||||
AllOptions() {
|
Clara::CommandLine<ConfigData> cli;
|
||||||
add<Options::TestCaseOptionParser>(); // Keep this one first
|
|
||||||
|
|
||||||
add<Options::TagOptionParser>();
|
cli.bindProcessName( &ConfigData::processName );
|
||||||
add<Options::ListOptionParser>();
|
|
||||||
add<Options::ReporterOptionParser>();
|
|
||||||
add<Options::OutputOptionParser>();
|
|
||||||
add<Options::SuccessOptionParser>();
|
|
||||||
add<Options::DebugBreakOptionParser>();
|
|
||||||
add<Options::NameOptionParser>();
|
|
||||||
add<Options::AbortOptionParser>();
|
|
||||||
add<Options::NoThrowOptionParser>();
|
|
||||||
add<Options::WarningsOptionParser>();
|
|
||||||
|
|
||||||
add<Options::HelpOptionParser>(); // Keep this one last
|
cli.bind( &ConfigData::showHelp )
|
||||||
|
.describe( "display usage information" )
|
||||||
|
.shortOpt( "?")
|
||||||
|
.shortOpt( "h")
|
||||||
|
.longOpt( "help" );
|
||||||
|
|
||||||
|
cli.bind( &ConfigData::listTests )
|
||||||
|
.describe( "list all (or matching) test cases" )
|
||||||
|
.shortOpt( "l")
|
||||||
|
.longOpt( "list-tests" );
|
||||||
|
|
||||||
|
cli.bind( &ConfigData::listTags )
|
||||||
|
.describe( "list all (or matching) tags" )
|
||||||
|
.shortOpt( "t")
|
||||||
|
.longOpt( "list-tags" );
|
||||||
|
|
||||||
|
cli.bind( &ConfigData::listReporters )
|
||||||
|
.describe( "list all reporters" )
|
||||||
|
.longOpt( "list-reporters" );
|
||||||
|
|
||||||
|
cli.bind( &ConfigData::showSuccessfulTests )
|
||||||
|
.describe( "include successful tests in output" )
|
||||||
|
.shortOpt( "s")
|
||||||
|
.longOpt( "success" );
|
||||||
|
|
||||||
|
cli.bind( &ConfigData::shouldDebugBreak )
|
||||||
|
.describe( "break into debugger on failure" )
|
||||||
|
.shortOpt( "b")
|
||||||
|
.longOpt( "break" );
|
||||||
|
|
||||||
|
cli.bind( &ConfigData::noThrow )
|
||||||
|
.describe( "skip exception tests" )
|
||||||
|
.shortOpt( "e")
|
||||||
|
.longOpt( "nothrow" );
|
||||||
|
|
||||||
|
cli.bind( &ConfigData::outputFilename )
|
||||||
|
.describe( "output filename" )
|
||||||
|
.shortOpt( "o")
|
||||||
|
.longOpt( "out" )
|
||||||
|
.argName( "filename" );
|
||||||
|
|
||||||
|
cli.bind( &ConfigData::reporterName )
|
||||||
|
.describe( "reporter to use - defaults to console" )
|
||||||
|
.shortOpt( "r")
|
||||||
|
.longOpt( "reporter" )
|
||||||
|
// .argName( "name[:filename]" );
|
||||||
|
.argName( "name" );
|
||||||
|
|
||||||
|
cli.bind( &ConfigData::name )
|
||||||
|
.describe( "suite name" )
|
||||||
|
.shortOpt( "n")
|
||||||
|
.longOpt( "name" )
|
||||||
|
.argName( "name" );
|
||||||
|
|
||||||
|
cli.bind( &abortAfterFirst )
|
||||||
|
.describe( "abort at first failure" )
|
||||||
|
.shortOpt( "a")
|
||||||
|
.longOpt( "abort" );
|
||||||
|
|
||||||
|
cli.bind( &abortAfterX )
|
||||||
|
.describe( "abort after x failures" )
|
||||||
|
.shortOpt( "x")
|
||||||
|
.longOpt( "abortx" )
|
||||||
|
.argName( "number of failures" );
|
||||||
|
|
||||||
|
cli.bind( &addWarning )
|
||||||
|
.describe( "enable warnings" )
|
||||||
|
.shortOpt( "w")
|
||||||
|
.longOpt( "warn" )
|
||||||
|
.argName( "warning name" );
|
||||||
|
|
||||||
|
// cli.bind( &setVerbosity )
|
||||||
|
// .describe( "level of verbosity (0=no output)" )
|
||||||
|
// .shortOpt( "v")
|
||||||
|
// .longOpt( "verbosity" )
|
||||||
|
// .argName( "level" );
|
||||||
|
|
||||||
|
cli.bind( &addTestOrTags )
|
||||||
|
.describe( "which test or tests to use" )
|
||||||
|
.argName( "test name, pattern or tags" );
|
||||||
|
|
||||||
|
return cli;
|
||||||
}
|
}
|
||||||
|
|
||||||
void parseIntoConfig( const CommandParser& parser, ConfigData& config ) {
|
|
||||||
for( const_iterator it = m_parsers.begin(); it != m_parsers.end(); ++it )
|
|
||||||
(*it)->parseIntoConfig( parser, config );
|
|
||||||
}
|
|
||||||
|
|
||||||
const_iterator begin() const {
|
|
||||||
return m_parsers.begin();
|
|
||||||
}
|
|
||||||
const_iterator end() const {
|
|
||||||
return m_parsers.end();
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
void add() {
|
|
||||||
m_parsers.push_back( new T() );
|
|
||||||
}
|
|
||||||
Parsers m_parsers;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
} // end namespace Catch
|
} // end namespace Catch
|
||||||
|
|
||||||
#endif // TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED
|
#endif // TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED
|
||||||
|
|
|
@ -15,21 +15,17 @@
|
||||||
#define INTERNAL_CATCH_STRINGIFY2( expr ) #expr
|
#define INTERNAL_CATCH_STRINGIFY2( expr ) #expr
|
||||||
#define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr )
|
#define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr )
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#define CATCH_ATTRIBUTE_NORETURN __attribute__ ((noreturn))
|
|
||||||
#else
|
|
||||||
#define CATCH_ATTRIBUTE_NORETURN
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
#include "catch_compiler_capabilities.h"
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
class NonCopyable {
|
class NonCopyable {
|
||||||
NonCopyable( const NonCopyable& );
|
NonCopyable( NonCopyable const& );
|
||||||
void operator = ( const NonCopyable& );
|
void operator = ( NonCopyable const& );
|
||||||
protected:
|
protected:
|
||||||
NonCopyable() {}
|
NonCopyable() {}
|
||||||
virtual ~NonCopyable();
|
virtual ~NonCopyable();
|
||||||
|
@ -51,19 +47,15 @@ namespace Catch {
|
||||||
typename ContainerT::const_iterator it = container.begin();
|
typename ContainerT::const_iterator it = container.begin();
|
||||||
typename ContainerT::const_iterator itEnd = container.end();
|
typename ContainerT::const_iterator itEnd = container.end();
|
||||||
for(; it != itEnd; ++it )
|
for(; it != itEnd; ++it )
|
||||||
{
|
|
||||||
delete *it;
|
delete *it;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
template<typename AssociativeContainerT>
|
template<typename AssociativeContainerT>
|
||||||
inline void deleteAllValues( AssociativeContainerT& container ) {
|
inline void deleteAllValues( AssociativeContainerT& container ) {
|
||||||
typename AssociativeContainerT::const_iterator it = container.begin();
|
typename AssociativeContainerT::const_iterator it = container.begin();
|
||||||
typename AssociativeContainerT::const_iterator itEnd = container.end();
|
typename AssociativeContainerT::const_iterator itEnd = container.end();
|
||||||
for(; it != itEnd; ++it )
|
for(; it != itEnd; ++it )
|
||||||
{
|
|
||||||
delete it->second;
|
delete it->second;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
template<typename ContainerT, typename Function>
|
template<typename ContainerT, typename Function>
|
||||||
inline void forEach( ContainerT& container, Function function ) {
|
inline void forEach( ContainerT& container, Function function ) {
|
||||||
|
@ -71,27 +63,35 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ContainerT, typename Function>
|
template<typename ContainerT, typename Function>
|
||||||
inline void forEach( const ContainerT& container, Function function ) {
|
inline void forEach( ContainerT const& container, Function function ) {
|
||||||
std::for_each( container.begin(), container.end(), function );
|
std::for_each( container.begin(), container.end(), function );
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool startsWith( const std::string& s, const std::string& prefix ) {
|
inline bool startsWith( std::string const& s, std::string const& prefix ) {
|
||||||
return s.size() >= prefix.size() && s.substr( 0, prefix.size() ) == prefix;
|
return s.size() >= prefix.size() && s.substr( 0, prefix.size() ) == prefix;
|
||||||
}
|
}
|
||||||
inline bool endsWith( const std::string& s, const std::string& suffix ) {
|
inline bool endsWith( std::string const& s, std::string const& suffix ) {
|
||||||
return s.size() >= suffix.size() && s.substr( s.size()-suffix.size(), suffix.size() ) == suffix;
|
return s.size() >= suffix.size() && s.substr( s.size()-suffix.size(), suffix.size() ) == suffix;
|
||||||
}
|
}
|
||||||
inline bool contains( const std::string& s, const std::string& infix ) {
|
inline bool contains( std::string const& s, std::string const& infix ) {
|
||||||
return s.find( infix ) != std::string::npos;
|
return s.find( infix ) != std::string::npos;
|
||||||
}
|
}
|
||||||
|
inline void toLowerInPlace( std::string& s ) {
|
||||||
|
std::transform( s.begin(), s.end(), s.begin(), ::tolower );
|
||||||
|
}
|
||||||
|
inline std::string toLower( std::string const& s ) {
|
||||||
|
std::string lc = s;
|
||||||
|
toLowerInPlace( lc );
|
||||||
|
return lc;
|
||||||
|
}
|
||||||
|
|
||||||
struct pluralise {
|
struct pluralise {
|
||||||
pluralise( std::size_t count, const std::string& label )
|
pluralise( std::size_t count, std::string const& label )
|
||||||
: m_count( count ),
|
: m_count( count ),
|
||||||
m_label( label )
|
m_label( label )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
friend std::ostream& operator << ( std::ostream& os, const pluralise& pluraliser ) {
|
friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) {
|
||||||
os << pluraliser.m_count << " " << pluraliser.m_label;
|
os << pluraliser.m_count << " " << pluraliser.m_label;
|
||||||
if( pluraliser.m_count != 1 )
|
if( pluraliser.m_count != 1 )
|
||||||
os << "s";
|
os << "s";
|
||||||
|
@ -105,11 +105,11 @@ namespace Catch {
|
||||||
struct SourceLineInfo {
|
struct SourceLineInfo {
|
||||||
|
|
||||||
SourceLineInfo() : line( 0 ){}
|
SourceLineInfo() : line( 0 ){}
|
||||||
SourceLineInfo( const std::string& _file, std::size_t _line )
|
SourceLineInfo( std::string const& _file, std::size_t _line )
|
||||||
: file( _file ),
|
: file( _file ),
|
||||||
line( _line )
|
line( _line )
|
||||||
{}
|
{}
|
||||||
SourceLineInfo( const SourceLineInfo& other )
|
SourceLineInfo( SourceLineInfo const& other )
|
||||||
: file( other.file ),
|
: file( other.file ),
|
||||||
line( other.line )
|
line( other.line )
|
||||||
{}
|
{}
|
||||||
|
@ -121,19 +121,22 @@ namespace Catch {
|
||||||
std::size_t line;
|
std::size_t line;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline std::ostream& operator << ( std::ostream& os, const SourceLineInfo& info ) {
|
inline std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) {
|
||||||
#ifndef __GNUG__
|
#ifndef __GNUG__
|
||||||
os << info.file << "(" << info.line << "): ";
|
os << info.file << "(" << info.line << ")";
|
||||||
#else
|
#else
|
||||||
os << info.file << ":" << info.line << ": ";
|
os << info.file << ":" << info.line;
|
||||||
#endif
|
#endif
|
||||||
return os;
|
return os;
|
||||||
}
|
}
|
||||||
|
|
||||||
CATCH_ATTRIBUTE_NORETURN
|
// This is just here to avoid compiler warnings with macro constants and boolean literals
|
||||||
inline void throwLogicError( const std::string& message, const SourceLineInfo& locationInfo ) {
|
inline bool isTrue( bool value ){ return value; }
|
||||||
|
|
||||||
|
inline void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo ) {
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << "Internal Catch error: '" << message << "' at: " << locationInfo;
|
oss << locationInfo << ": Internal Catch error: '" << message << "'";
|
||||||
|
if( isTrue( true ))
|
||||||
throw std::logic_error( oss.str() );
|
throw std::logic_error( oss.str() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
* Created by Phil on 15/04/2013.
|
||||||
|
* Copyright 2013 Two Blue Cubes Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED
|
||||||
|
#define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED
|
||||||
|
|
||||||
|
// Much of the following code is based on Boost (1.53)
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Borland
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
|
||||||
|
#if (__BORLANDC__ > 0x582 )
|
||||||
|
//#define CATCH_CONFIG_SFINAE // Not confirmed
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // __BORLANDC__
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// EDG
|
||||||
|
#ifdef __EDG_VERSION__
|
||||||
|
|
||||||
|
#if (__EDG_VERSION__ > 238 )
|
||||||
|
//#define CATCH_CONFIG_SFINAE // Not confirmed
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // __EDG_VERSION__
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Digital Mars
|
||||||
|
#ifdef __DMC__
|
||||||
|
|
||||||
|
#if (__DMC__ > 0x840 )
|
||||||
|
//#define CATCH_CONFIG_SFINAE // Not confirmed
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // __DMC__
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// GCC
|
||||||
|
#ifdef __GNUC__
|
||||||
|
|
||||||
|
#if __GNUC__ < 3
|
||||||
|
|
||||||
|
#if (__GNUC_MINOR__ >= 96 )
|
||||||
|
//#define CATCH_CONFIG_SFINAE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif __GNUC__ >= 3
|
||||||
|
|
||||||
|
// #define CATCH_CONFIG_SFINAE // Taking this out completely for now
|
||||||
|
|
||||||
|
#endif // __GNUC__ < 3
|
||||||
|
|
||||||
|
|
||||||
|
#endif // __GNUC__
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Visual C++
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
|
||||||
|
#if (_MSC_VER >= 1310 ) // (VC++ 7.0+)
|
||||||
|
//#define CATCH_CONFIG_SFINAE // Not confirmed
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // _MSC_VER
|
||||||
|
|
||||||
|
// Use variadic macros if the compiler supports them
|
||||||
|
#if ( defined _MSC_VER && _MSC_VER > 1400 && !defined __EDGE__) || \
|
||||||
|
( defined __WAVE__ && __WAVE_HAS_VARIADICS ) || \
|
||||||
|
( defined __GNUC__ && __GNUC__ >= 3 ) || \
|
||||||
|
( !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L )
|
||||||
|
|
||||||
|
#ifndef CATCH_CONFIG_NO_VARIADIC_MACROS
|
||||||
|
#define CATCH_CONFIG_VARIADIC_MACROS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED
|
||||||
|
|
|
@ -18,64 +18,65 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
#ifndef CATCH_CONFIG_CONSOLE_WIDTH
|
||||||
|
#define CATCH_CONFIG_CONSOLE_WIDTH 80
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
struct Include { enum WhichResults {
|
|
||||||
FailedOnly,
|
|
||||||
SuccessfulResults
|
|
||||||
}; };
|
|
||||||
|
|
||||||
struct List{ enum What {
|
|
||||||
None = 0,
|
|
||||||
|
|
||||||
Reports = 1,
|
|
||||||
Tests = 2,
|
|
||||||
All = 3,
|
|
||||||
|
|
||||||
TestNames = 6,
|
|
||||||
|
|
||||||
WhatMask = 0xf,
|
|
||||||
|
|
||||||
AsText = 0x10,
|
|
||||||
AsXml = 0x20,
|
|
||||||
|
|
||||||
AsMask = 0xf0
|
|
||||||
}; };
|
|
||||||
|
|
||||||
struct ConfigData {
|
struct ConfigData {
|
||||||
|
|
||||||
|
struct Verbosity { enum Level {
|
||||||
|
NoOutput = 0,
|
||||||
|
Quiet,
|
||||||
|
Normal
|
||||||
|
}; };
|
||||||
|
|
||||||
struct WarnAbout { enum What {
|
struct WarnAbout { enum What {
|
||||||
Nothing = 0x00,
|
Nothing = 0x00,
|
||||||
NoAssertions = 0x01
|
NoAssertions = 0x01
|
||||||
}; };
|
}; };
|
||||||
|
|
||||||
ConfigData()
|
ConfigData()
|
||||||
: listSpec( List::None ),
|
: listTests( false ),
|
||||||
|
listTags( false ),
|
||||||
|
listReporters( false ),
|
||||||
|
showSuccessfulTests( false ),
|
||||||
shouldDebugBreak( false ),
|
shouldDebugBreak( false ),
|
||||||
includeWhichResults( Include::FailedOnly ),
|
noThrow( false ),
|
||||||
cutoff( -1 ),
|
showHelp( false ),
|
||||||
allowThrows( true ),
|
abortAfter( -1 ),
|
||||||
|
verbosity( Verbosity::Normal ),
|
||||||
warnings( WarnAbout::Nothing )
|
warnings( WarnAbout::Nothing )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
std::string reporter;
|
bool listTests;
|
||||||
std::string outputFilename;
|
bool listTags;
|
||||||
List::What listSpec;
|
bool listReporters;
|
||||||
std::vector<TestCaseFilters> filters;
|
|
||||||
|
bool showSuccessfulTests;
|
||||||
bool shouldDebugBreak;
|
bool shouldDebugBreak;
|
||||||
std::string stream;
|
bool noThrow;
|
||||||
Include::WhichResults includeWhichResults;
|
bool showHelp;
|
||||||
std::string name;
|
|
||||||
int cutoff;
|
int abortAfter;
|
||||||
bool allowThrows;
|
|
||||||
|
Verbosity::Level verbosity;
|
||||||
WarnAbout::What warnings;
|
WarnAbout::What warnings;
|
||||||
|
|
||||||
|
std::string reporterName;
|
||||||
|
std::string outputFilename;
|
||||||
|
std::string name;
|
||||||
|
std::string processName;
|
||||||
|
|
||||||
|
std::vector<std::string> testsOrTags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Config : public IConfig {
|
class Config : public SharedImpl<IConfig> {
|
||||||
private:
|
private:
|
||||||
Config( const Config& other );
|
Config( Config const& other );
|
||||||
Config& operator = ( const Config& other );
|
Config& operator = ( Config const& other );
|
||||||
virtual void dummy();
|
virtual void dummy();
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -83,90 +84,96 @@ namespace Catch {
|
||||||
: m_os( std::cout.rdbuf() )
|
: m_os( std::cout.rdbuf() )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
Config( const ConfigData& data )
|
Config( ConfigData const& data )
|
||||||
: m_data( data ),
|
: m_data( data ),
|
||||||
m_os( std::cout.rdbuf() )
|
m_os( std::cout.rdbuf() )
|
||||||
{}
|
{
|
||||||
|
if( !data.testsOrTags.empty() ) {
|
||||||
|
std::string groupName;
|
||||||
|
for( std::size_t i = 0; i < data.testsOrTags.size(); ++i ) {
|
||||||
|
if( i != 0 )
|
||||||
|
groupName += " ";
|
||||||
|
groupName += data.testsOrTags[i];
|
||||||
|
}
|
||||||
|
TestCaseFilters filters( groupName );
|
||||||
|
for( std::size_t i = 0; i < data.testsOrTags.size(); ++i ) {
|
||||||
|
std::string filter = data.testsOrTags[i];
|
||||||
|
if( startsWith( filter, "[" ) || startsWith( filter, "~[" ) )
|
||||||
|
filters.addTags( filter );
|
||||||
|
else
|
||||||
|
filters.addFilter( TestCaseFilter( filter ) );
|
||||||
|
}
|
||||||
|
m_filterSets.push_back( filters );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
virtual ~Config() {
|
virtual ~Config() {
|
||||||
m_os.rdbuf( std::cout.rdbuf() );
|
m_os.rdbuf( std::cout.rdbuf() );
|
||||||
m_stream.release();
|
m_stream.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
void setFilename( const std::string& filename ) {
|
void setFilename( std::string const& filename ) {
|
||||||
m_data.outputFilename = filename;
|
m_data.outputFilename = filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
List::What getListSpec( void ) const {
|
std::string const& getFilename() const {
|
||||||
return m_data.listSpec;
|
|
||||||
}
|
|
||||||
|
|
||||||
const std::string& getFilename() const {
|
|
||||||
return m_data.outputFilename ;
|
return m_data.outputFilename ;
|
||||||
}
|
}
|
||||||
|
|
||||||
List::What listWhat() const {
|
bool listTests() const { return m_data.listTests; }
|
||||||
return static_cast<List::What>( m_data.listSpec & List::WhatMask );
|
bool listTags() const { return m_data.listTags; }
|
||||||
}
|
bool listReporters() const { return m_data.listReporters; }
|
||||||
|
|
||||||
List::What listAs() const {
|
std::string getProcessName() const {
|
||||||
return static_cast<List::What>( m_data.listSpec & List::AsMask );
|
return m_data.processName;
|
||||||
}
|
|
||||||
|
|
||||||
std::string getName() const {
|
|
||||||
return m_data.name;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool shouldDebugBreak() const {
|
bool shouldDebugBreak() const {
|
||||||
return m_data.shouldDebugBreak;
|
return m_data.shouldDebugBreak;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual std::ostream& stream() const {
|
|
||||||
return m_os;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setStreamBuf( std::streambuf* buf ) {
|
void setStreamBuf( std::streambuf* buf ) {
|
||||||
m_os.rdbuf( buf ? buf : std::cout.rdbuf() );
|
m_os.rdbuf( buf ? buf : std::cout.rdbuf() );
|
||||||
}
|
}
|
||||||
|
|
||||||
void useStream( const std::string& streamName ) {
|
void useStream( std::string const& streamName ) {
|
||||||
Stream stream = createStream( streamName );
|
Stream stream = createStream( streamName );
|
||||||
setStreamBuf( stream.streamBuf );
|
setStreamBuf( stream.streamBuf );
|
||||||
m_stream.release();
|
m_stream.release();
|
||||||
m_stream = stream;
|
m_stream = stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
void addTestSpec( const std::string& testSpec ) {
|
std::string getReporterName() const { return m_data.reporterName; }
|
||||||
|
|
||||||
|
void addTestSpec( std::string const& testSpec ) {
|
||||||
TestCaseFilters filters( testSpec );
|
TestCaseFilters filters( testSpec );
|
||||||
filters.addFilter( TestCaseFilter( testSpec ) );
|
filters.addFilter( TestCaseFilter( testSpec ) );
|
||||||
m_data.filters.push_back( filters );
|
m_filterSets.push_back( filters );
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool includeSuccessfulResults() const {
|
int abortAfter() const {
|
||||||
return m_data.includeWhichResults == Include::SuccessfulResults;
|
return m_data.abortAfter;
|
||||||
}
|
}
|
||||||
|
|
||||||
int getCutoff() const {
|
std::vector<TestCaseFilters> const& filters() const {
|
||||||
return m_data.cutoff;
|
return m_filterSets;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool allowThrows() const {
|
bool showHelp() const { return m_data.showHelp; }
|
||||||
return m_data.allowThrows;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ConfigData& data() const {
|
// IConfig interface
|
||||||
return m_data;
|
virtual bool allowThrows() const { return !m_data.noThrow; }
|
||||||
}
|
virtual std::ostream& stream() const { return m_os; }
|
||||||
ConfigData& data() {
|
virtual std::string name() const { return m_data.name.empty() ? m_data.processName : m_data.name; }
|
||||||
return m_data;
|
virtual bool includeSuccessfulResults() const { return m_data.showSuccessfulTests; }
|
||||||
}
|
virtual bool warnAboutMissingAssertions() const { return m_data.warnings & ConfigData::WarnAbout::NoAssertions; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ConfigData m_data;
|
ConfigData m_data;
|
||||||
|
|
||||||
// !TBD Move these out of here
|
|
||||||
Stream m_stream;
|
Stream m_stream;
|
||||||
mutable std::ostream m_os;
|
mutable std::ostream m_os;
|
||||||
|
std::vector<TestCaseFilters> m_filterSets;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -12,31 +12,53 @@
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
struct ConsoleColourImpl;
|
namespace Detail {
|
||||||
|
struct IColourImpl;
|
||||||
|
}
|
||||||
|
|
||||||
class TextColour : NonCopyable {
|
struct Colour {
|
||||||
public:
|
enum Code {
|
||||||
|
None = 0,
|
||||||
|
|
||||||
enum Colours {
|
White,
|
||||||
None,
|
Red,
|
||||||
|
Green,
|
||||||
|
Blue,
|
||||||
|
Cyan,
|
||||||
|
Yellow,
|
||||||
|
Grey,
|
||||||
|
|
||||||
FileName,
|
Bright = 0x10,
|
||||||
ResultError,
|
|
||||||
ResultSuccess,
|
|
||||||
|
|
||||||
Error,
|
BrightRed = Bright | Red,
|
||||||
Success,
|
BrightGreen = Bright | Green,
|
||||||
|
LightGrey = Bright | Grey,
|
||||||
|
BrightWhite = Bright | White,
|
||||||
|
|
||||||
OriginalExpression,
|
// By intention
|
||||||
ReconstructedExpression
|
FileName = LightGrey,
|
||||||
|
ResultError = BrightRed,
|
||||||
|
ResultSuccess = BrightGreen,
|
||||||
|
|
||||||
|
Error = BrightRed,
|
||||||
|
Success = Green,
|
||||||
|
|
||||||
|
OriginalExpression = Cyan,
|
||||||
|
ReconstructedExpression = Yellow,
|
||||||
|
|
||||||
|
SecondaryText = LightGrey,
|
||||||
|
Headers = White
|
||||||
};
|
};
|
||||||
|
|
||||||
TextColour( Colours colour = None );
|
// Use constructed object for RAII guard
|
||||||
void set( Colours colour );
|
Colour( Code _colourCode );
|
||||||
~TextColour();
|
~Colour();
|
||||||
|
|
||||||
|
// Use static method for one-shot changes
|
||||||
|
static void use( Code _colourCode );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ConsoleColourImpl* m_impl;
|
static Detail::IColourImpl* impl;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace Catch
|
} // end namespace Catch
|
||||||
|
|
|
@ -10,140 +10,137 @@
|
||||||
|
|
||||||
#include "catch_console_colour.hpp"
|
#include "catch_console_colour.hpp"
|
||||||
|
|
||||||
#if defined( CATCH_CONFIG_USE_ANSI_COLOUR_CODES )
|
namespace Catch { namespace Detail {
|
||||||
|
struct IColourImpl {
|
||||||
|
virtual ~IColourImpl() {}
|
||||||
|
virtual void use( Colour::Code _colourCode ) = 0;
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
|
||||||
|
#if defined ( CATCH_PLATFORM_WINDOWS ) /////////////////////////////////////////
|
||||||
|
|
||||||
|
#define NOMINMAX
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
namespace Catch {
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
class Win32ColourImpl : public Detail::IColourImpl {
|
||||||
|
public:
|
||||||
|
Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) )
|
||||||
|
{
|
||||||
|
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
|
||||||
|
GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo );
|
||||||
|
originalAttributes = csbiInfo.wAttributes;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void use( Colour::Code _colourCode ) {
|
||||||
|
switch( _colourCode ) {
|
||||||
|
case Colour::None: return setTextAttribute( originalAttributes );
|
||||||
|
case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE );
|
||||||
|
case Colour::Red: return setTextAttribute( FOREGROUND_RED );
|
||||||
|
case Colour::Green: return setTextAttribute( FOREGROUND_GREEN );
|
||||||
|
case Colour::Blue: return setTextAttribute( FOREGROUND_BLUE );
|
||||||
|
case Colour::Cyan: return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN );
|
||||||
|
case Colour::Yellow: return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN );
|
||||||
|
case Colour::Grey: return setTextAttribute( 0 );
|
||||||
|
|
||||||
|
case Colour::LightGrey: return setTextAttribute( FOREGROUND_INTENSITY );
|
||||||
|
case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED );
|
||||||
|
case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN );
|
||||||
|
case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE );
|
||||||
|
|
||||||
|
case Colour::Bright: throw std::logic_error( "not a colour" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void setTextAttribute( WORD _textAttribute ) {
|
||||||
|
SetConsoleTextAttribute( stdoutHandle, _textAttribute );
|
||||||
|
}
|
||||||
|
HANDLE stdoutHandle;
|
||||||
|
WORD originalAttributes;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline bool shouldUseColourForPlatform() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Win32ColourImpl platformColourImpl;
|
||||||
|
|
||||||
|
} // end anon namespace
|
||||||
|
} // end namespace Catch
|
||||||
|
|
||||||
|
#else // Not Windows - assumed to be POSIX compatible //////////////////////////
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
namespace {
|
||||||
|
|
||||||
// use POSIX/ ANSI console terminal codes
|
// use POSIX/ ANSI console terminal codes
|
||||||
// Implementation contributed by Adam Strzelecki (http://github.com/nanoant)
|
// Thanks to Adam Strzelecki for original contribution
|
||||||
|
// (http://github.com/nanoant)
|
||||||
// https://github.com/philsquared/Catch/pull/131
|
// https://github.com/philsquared/Catch/pull/131
|
||||||
|
class PosixColourImpl : public Detail::IColourImpl {
|
||||||
|
public:
|
||||||
|
virtual void use( Colour::Code _colourCode ) {
|
||||||
|
switch( _colourCode ) {
|
||||||
|
case Colour::None:
|
||||||
|
case Colour::White: return setColour( "[0m" );
|
||||||
|
case Colour::Red: return setColour( "[0;31m" );
|
||||||
|
case Colour::Green: return setColour( "[0;32m" );
|
||||||
|
case Colour::Blue: return setColour( "[0:34m" );
|
||||||
|
case Colour::Cyan: return setColour( "[0;36m" );
|
||||||
|
case Colour::Yellow: return setColour( "[0;33m" );
|
||||||
|
case Colour::Grey: return setColour( "[1;30m" );
|
||||||
|
|
||||||
TextColour::TextColour( Colours colour ) {
|
case Colour::LightGrey: return setColour( "[0;37m" );
|
||||||
if( colour )
|
case Colour::BrightRed: return setColour( "[1;31m" );
|
||||||
set( colour );
|
case Colour::BrightGreen: return setColour( "[1;32m" );
|
||||||
}
|
case Colour::BrightWhite: return setColour( "[1;37m" );
|
||||||
|
|
||||||
TextColour::~TextColour() {
|
case Colour::Bright: throw std::logic_error( "not a colour" );
|
||||||
set( TextColour::None );
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace { const char colourEscape = '\033'; }
|
|
||||||
|
|
||||||
void TextColour::set( Colours colour ) {
|
|
||||||
if( isatty( fileno(stdout) ) ) {
|
|
||||||
switch( colour ) {
|
|
||||||
case TextColour::FileName:
|
|
||||||
std::cout << colourEscape << "[0m"; // white/ normal
|
|
||||||
break;
|
|
||||||
case TextColour::ResultError:
|
|
||||||
std::cout << colourEscape << "[1;31m"; // bold red
|
|
||||||
break;
|
|
||||||
case TextColour::ResultSuccess:
|
|
||||||
std::cout << colourEscape << "[1;32m"; // bold green
|
|
||||||
break;
|
|
||||||
case TextColour::Error:
|
|
||||||
std::cout << colourEscape << "[0;31m"; // red
|
|
||||||
break;
|
|
||||||
case TextColour::Success:
|
|
||||||
std::cout << colourEscape << "[0;32m"; // green
|
|
||||||
break;
|
|
||||||
case TextColour::OriginalExpression:
|
|
||||||
std::cout << colourEscape << "[0;36m"; // cyan
|
|
||||||
break;
|
|
||||||
case TextColour::ReconstructedExpression:
|
|
||||||
std::cout << colourEscape << "[0;33m"; // yellow
|
|
||||||
break;
|
|
||||||
case TextColour::None:
|
|
||||||
std::cout << colourEscape << "[0m"; // reset
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private:
|
||||||
|
void setColour( const char* _escapeCode ) {
|
||||||
|
std::cout << '\033' << _escapeCode;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
inline bool shouldUseColourForPlatform() {
|
||||||
|
return isatty( fileno(stdout) );
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Catch
|
PosixColourImpl platformColourImpl;
|
||||||
|
|
||||||
#elif defined ( CATCH_PLATFORM_WINDOWS )
|
} // end anon namespace
|
||||||
|
} // end namespace Catch
|
||||||
|
|
||||||
#include <windows.h>
|
#endif // not Windows
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
struct NoColourImpl : Detail::IColourImpl {
|
||||||
WORD mapConsoleColour( TextColour::Colours colour ) {
|
void use( Colour::Code ) {}
|
||||||
switch( colour ) {
|
|
||||||
case TextColour::FileName:
|
|
||||||
return FOREGROUND_INTENSITY; // greyed out
|
|
||||||
case TextColour::ResultError:
|
|
||||||
return FOREGROUND_RED | FOREGROUND_INTENSITY; // bright red
|
|
||||||
case TextColour::ResultSuccess:
|
|
||||||
return FOREGROUND_GREEN | FOREGROUND_INTENSITY; // bright green
|
|
||||||
case TextColour::Error:
|
|
||||||
return FOREGROUND_RED; // dark red
|
|
||||||
case TextColour::Success:
|
|
||||||
return FOREGROUND_GREEN; // dark green
|
|
||||||
case TextColour::OriginalExpression:
|
|
||||||
return FOREGROUND_BLUE | FOREGROUND_GREEN; // turquoise
|
|
||||||
case TextColour::ReconstructedExpression:
|
|
||||||
return FOREGROUND_RED | FOREGROUND_GREEN; // greeny-yellow
|
|
||||||
default: return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ConsoleColourImpl {
|
|
||||||
|
|
||||||
ConsoleColourImpl()
|
|
||||||
: hStdout( GetStdHandle(STD_OUTPUT_HANDLE) ),
|
|
||||||
wOldColorAttrs( 0 )
|
|
||||||
{
|
|
||||||
GetConsoleScreenBufferInfo( hStdout, &csbiInfo );
|
|
||||||
wOldColorAttrs = csbiInfo.wAttributes;
|
|
||||||
}
|
|
||||||
|
|
||||||
~ConsoleColourImpl() {
|
|
||||||
SetConsoleTextAttribute( hStdout, wOldColorAttrs );
|
|
||||||
}
|
|
||||||
|
|
||||||
void set( TextColour::Colours colour ) {
|
|
||||||
WORD consoleColour = mapConsoleColour( colour );
|
|
||||||
if( consoleColour > 0 )
|
|
||||||
SetConsoleTextAttribute( hStdout, consoleColour );
|
|
||||||
}
|
|
||||||
|
|
||||||
HANDLE hStdout;
|
|
||||||
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
|
|
||||||
WORD wOldColorAttrs;
|
|
||||||
};
|
};
|
||||||
|
NoColourImpl noColourImpl;
|
||||||
TextColour::TextColour( Colours colour )
|
static const bool shouldUseColour = shouldUseColourForPlatform() &&
|
||||||
: m_impl( new ConsoleColourImpl() )
|
!isDebuggerActive();
|
||||||
{
|
|
||||||
if( colour )
|
|
||||||
m_impl->set( colour );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TextColour::~TextColour() {
|
Colour::Colour( Code _colourCode ){ use( _colourCode ); }
|
||||||
delete m_impl;
|
Colour::~Colour(){ use( None ); }
|
||||||
|
void Colour::use( Code _colourCode ) {
|
||||||
|
impl->use( _colourCode );
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextColour::set( Colours colour ) {
|
Detail::IColourImpl* Colour::impl = shouldUseColour
|
||||||
m_impl->set( colour );
|
? static_cast<Detail::IColourImpl*>( &platformColourImpl )
|
||||||
}
|
: static_cast<Detail::IColourImpl*>( &noColourImpl );
|
||||||
|
|
||||||
} // end namespace Catch
|
} // end namespace Catch
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
namespace Catch {
|
|
||||||
|
|
||||||
TextColour::TextColour( Colours ){}
|
|
||||||
TextColour::~TextColour(){}
|
|
||||||
void TextColour::set( Colours ){}
|
|
||||||
|
|
||||||
} // end namespace Catch
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED
|
#endif // TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED
|
#define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED
|
||||||
|
|
||||||
#include "catch_interfaces_generators.h"
|
#include "catch_interfaces_generators.h"
|
||||||
|
#include "catch_ptr.hpp"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
@ -16,7 +17,7 @@
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
class TestCaseInfo;
|
class TestCase;
|
||||||
class Stream;
|
class Stream;
|
||||||
struct IResultCapture;
|
struct IResultCapture;
|
||||||
struct IRunner;
|
struct IRunner;
|
||||||
|
@ -29,9 +30,9 @@ namespace Catch {
|
||||||
|
|
||||||
virtual IResultCapture& getResultCapture() = 0;
|
virtual IResultCapture& getResultCapture() = 0;
|
||||||
virtual IRunner& getRunner() = 0;
|
virtual IRunner& getRunner() = 0;
|
||||||
virtual size_t getGeneratorIndex( const std::string& fileInfo, size_t totalSize ) = 0;
|
virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) = 0;
|
||||||
virtual bool advanceGeneratorsForCurrentTest() = 0;
|
virtual bool advanceGeneratorsForCurrentTest() = 0;
|
||||||
virtual const IConfig* getConfig() const = 0;
|
virtual Ptr<IConfig const> getConfig() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct IMutableContext : IContext
|
struct IMutableContext : IContext
|
||||||
|
@ -39,13 +40,13 @@ namespace Catch {
|
||||||
virtual ~IMutableContext();
|
virtual ~IMutableContext();
|
||||||
virtual void setResultCapture( IResultCapture* resultCapture ) = 0;
|
virtual void setResultCapture( IResultCapture* resultCapture ) = 0;
|
||||||
virtual void setRunner( IRunner* runner ) = 0;
|
virtual void setRunner( IRunner* runner ) = 0;
|
||||||
virtual void setConfig( const IConfig* config ) = 0;
|
virtual void setConfig( Ptr<IConfig const> const& config ) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
IContext& getCurrentContext();
|
IContext& getCurrentContext();
|
||||||
IMutableContext& getCurrentMutableContext();
|
IMutableContext& getCurrentMutableContext();
|
||||||
void cleanUpContext();
|
void cleanUpContext();
|
||||||
Stream createStream( const std::string& streamName );
|
Stream createStream( std::string const& streamName );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,8 +18,8 @@ namespace Catch {
|
||||||
class Context : public IMutableContext {
|
class Context : public IMutableContext {
|
||||||
|
|
||||||
Context() : m_config( NULL ) {}
|
Context() : m_config( NULL ) {}
|
||||||
Context( const Context& );
|
Context( Context const& );
|
||||||
void operator=( const Context& );
|
void operator=( Context const& );
|
||||||
|
|
||||||
public: // IContext
|
public: // IContext
|
||||||
virtual IResultCapture& getResultCapture() {
|
virtual IResultCapture& getResultCapture() {
|
||||||
|
@ -28,7 +28,7 @@ namespace Catch {
|
||||||
virtual IRunner& getRunner() {
|
virtual IRunner& getRunner() {
|
||||||
return *m_runner;
|
return *m_runner;
|
||||||
}
|
}
|
||||||
virtual size_t getGeneratorIndex( const std::string& fileInfo, size_t totalSize ) {
|
virtual size_t getGeneratorIndex( std::string const& fileInfo, size_t totalSize ) {
|
||||||
return getGeneratorsForCurrentTest()
|
return getGeneratorsForCurrentTest()
|
||||||
.getGeneratorInfo( fileInfo, totalSize )
|
.getGeneratorInfo( fileInfo, totalSize )
|
||||||
.getCurrentIndex();
|
.getCurrentIndex();
|
||||||
|
@ -38,7 +38,7 @@ namespace Catch {
|
||||||
return generators && generators->moveNext();
|
return generators && generators->moveNext();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual const IConfig* getConfig() const {
|
virtual Ptr<IConfig const> getConfig() const {
|
||||||
return m_config;
|
return m_config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ namespace Catch {
|
||||||
virtual void setRunner( IRunner* runner ) {
|
virtual void setRunner( IRunner* runner ) {
|
||||||
m_runner = runner;
|
m_runner = runner;
|
||||||
}
|
}
|
||||||
virtual void setConfig( const IConfig* config ) {
|
virtual void setConfig( Ptr<IConfig const> const& config ) {
|
||||||
m_config = config;
|
m_config = config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ namespace Catch {
|
||||||
private:
|
private:
|
||||||
IRunner* m_runner;
|
IRunner* m_runner;
|
||||||
IResultCapture* m_resultCapture;
|
IResultCapture* m_resultCapture;
|
||||||
const IConfig* m_config;
|
Ptr<IConfig const> m_config;
|
||||||
std::map<std::string, IGeneratorsForTest*> m_generatorsByTestName;
|
std::map<std::string, IGeneratorsForTest*> m_generatorsByTestName;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -95,7 +95,7 @@ namespace Catch {
|
||||||
return getCurrentMutableContext();
|
return getCurrentMutableContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream createStream( const std::string& streamName ) {
|
Stream createStream( std::string const& streamName ) {
|
||||||
if( streamName == "stdout" ) return Stream( std::cout.rdbuf(), false );
|
if( streamName == "stdout" ) return Stream( std::cout.rdbuf(), false );
|
||||||
if( streamName == "stderr" ) return Stream( std::cerr.rdbuf(), false );
|
if( streamName == "stderr" ) return Stream( std::cerr.rdbuf(), false );
|
||||||
if( streamName == "debug" ) return Stream( new StreamBufImpl<OutputDebugWriter>, true );
|
if( streamName == "debug" ) return Stream( new StreamBufImpl<OutputDebugWriter>, true );
|
||||||
|
|
|
@ -103,11 +103,11 @@
|
||||||
|
|
||||||
#ifdef CATCH_PLATFORM_WINDOWS
|
#ifdef CATCH_PLATFORM_WINDOWS
|
||||||
extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA( const char* );
|
extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA( const char* );
|
||||||
inline void writeToDebugConsole( const std::string& text ) {
|
inline void writeToDebugConsole( std::string const& text ) {
|
||||||
::OutputDebugStringA( text.c_str() );
|
::OutputDebugStringA( text.c_str() );
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
inline void writeToDebugConsole( const std::string& text ) {
|
inline void writeToDebugConsole( std::string const& text ) {
|
||||||
// !TBD: Need a version for Mac/ XCode and other IDEs
|
// !TBD: Need a version for Mac/ XCode and other IDEs
|
||||||
std::cout << text;
|
std::cout << text;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
// Standard C/C++ main entry point
|
// Standard C/C++ main entry point
|
||||||
int main (int argc, char * const argv[]) {
|
int main (int argc, char * const argv[]) {
|
||||||
return Catch::Main( argc, argv );
|
return Catch::Session().run( argc, argv );
|
||||||
}
|
}
|
||||||
|
|
||||||
#else // __OBJC__
|
#else // __OBJC__
|
||||||
|
@ -24,7 +24,7 @@ int main (int argc, char * const argv[]) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Catch::registerTestMethods();
|
Catch::registerTestMethods();
|
||||||
int result = Catch::Main( argc, (char* const*)argv );
|
int result = Catch::Session().run( argc, (char* const*)argv );
|
||||||
|
|
||||||
#if !CATCH_ARC_ENABLED
|
#if !CATCH_ARC_ENABLED
|
||||||
[pool drain];
|
[pool drain];
|
||||||
|
|
|
@ -8,6 +8,11 @@
|
||||||
#ifndef TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED
|
#ifndef TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED
|
||||||
#define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED
|
#define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable:4389) // '==' : signed/unsigned mismatch
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
|
@ -28,6 +33,15 @@ namespace Internal {
|
||||||
template<> struct OperatorTraits<IsLessThanOrEqualTo> { static const char* getName(){ return "<="; } };
|
template<> struct OperatorTraits<IsLessThanOrEqualTo> { static const char* getName(){ return "<="; } };
|
||||||
template<> struct OperatorTraits<IsGreaterThanOrEqualTo>{ static const char* getName(){ return ">="; } };
|
template<> struct OperatorTraits<IsGreaterThanOrEqualTo>{ static const char* getName(){ return ">="; } };
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline T& opCast(T const& t) { return const_cast<T&>(t); }
|
||||||
|
|
||||||
|
// nullptr_t support based on pull request #154 from Konstantin Baumann
|
||||||
|
#ifdef CATCH_CONFIG_CPP11_NULLPTR
|
||||||
|
inline std::nullptr_t opCast(std::nullptr_t) { return nullptr; }
|
||||||
|
#endif // CATCH_CONFIG_CPP11_NULLPTR
|
||||||
|
|
||||||
|
|
||||||
// So the compare overloads can be operator agnostic we convey the operator as a template
|
// So the compare overloads can be operator agnostic we convey the operator as a template
|
||||||
// enum, which is used to specialise an Evaluator for doing the comparison.
|
// enum, which is used to specialise an Evaluator for doing the comparison.
|
||||||
template<typename T1, typename T2, Operator Op>
|
template<typename T1, typename T2, Operator Op>
|
||||||
|
@ -35,43 +49,43 @@ namespace Internal {
|
||||||
|
|
||||||
template<typename T1, typename T2>
|
template<typename T1, typename T2>
|
||||||
struct Evaluator<T1, T2, IsEqualTo> {
|
struct Evaluator<T1, T2, IsEqualTo> {
|
||||||
static bool evaluate( const T1& lhs, const T2& rhs) {
|
static bool evaluate( T1 const& lhs, T2 const& rhs) {
|
||||||
return const_cast<T1&>( lhs ) == const_cast<T2&>( rhs );
|
return opCast( lhs ) == opCast( rhs );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
template<typename T1, typename T2>
|
template<typename T1, typename T2>
|
||||||
struct Evaluator<T1, T2, IsNotEqualTo> {
|
struct Evaluator<T1, T2, IsNotEqualTo> {
|
||||||
static bool evaluate( const T1& lhs, const T2& rhs ) {
|
static bool evaluate( T1 const& lhs, T2 const& rhs ) {
|
||||||
return const_cast<T1&>( lhs ) != const_cast<T2&>( rhs );
|
return opCast( lhs ) != opCast( rhs );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
template<typename T1, typename T2>
|
template<typename T1, typename T2>
|
||||||
struct Evaluator<T1, T2, IsLessThan> {
|
struct Evaluator<T1, T2, IsLessThan> {
|
||||||
static bool evaluate( const T1& lhs, const T2& rhs ) {
|
static bool evaluate( T1 const& lhs, T2 const& rhs ) {
|
||||||
return const_cast<T1&>( lhs ) < const_cast<T2&>( rhs );
|
return opCast( lhs ) < opCast( rhs );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
template<typename T1, typename T2>
|
template<typename T1, typename T2>
|
||||||
struct Evaluator<T1, T2, IsGreaterThan> {
|
struct Evaluator<T1, T2, IsGreaterThan> {
|
||||||
static bool evaluate( const T1& lhs, const T2& rhs ) {
|
static bool evaluate( T1 const& lhs, T2 const& rhs ) {
|
||||||
return const_cast<T1&>( lhs ) > const_cast<T2&>( rhs );
|
return opCast( lhs ) > opCast( rhs );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
template<typename T1, typename T2>
|
template<typename T1, typename T2>
|
||||||
struct Evaluator<T1, T2, IsGreaterThanOrEqualTo> {
|
struct Evaluator<T1, T2, IsGreaterThanOrEqualTo> {
|
||||||
static bool evaluate( const T1& lhs, const T2& rhs ) {
|
static bool evaluate( T1 const& lhs, T2 const& rhs ) {
|
||||||
return const_cast<T1&>( lhs ) >= const_cast<T2&>( rhs );
|
return opCast( lhs ) >= opCast( rhs );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
template<typename T1, typename T2>
|
template<typename T1, typename T2>
|
||||||
struct Evaluator<T1, T2, IsLessThanOrEqualTo> {
|
struct Evaluator<T1, T2, IsLessThanOrEqualTo> {
|
||||||
static bool evaluate( const T1& lhs, const T2& rhs ) {
|
static bool evaluate( T1 const& lhs, T2 const& rhs ) {
|
||||||
return const_cast<T1&>( lhs ) <= const_cast<T2&>( rhs );
|
return opCast( lhs ) <= opCast( rhs );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<Operator Op, typename T1, typename T2>
|
template<Operator Op, typename T1, typename T2>
|
||||||
bool applyEvaluator( const T1& lhs, const T2& rhs ) {
|
bool applyEvaluator( T1 const& lhs, T2 const& rhs ) {
|
||||||
return Evaluator<T1, T2, Op>::evaluate( lhs, rhs );
|
return Evaluator<T1, T2, Op>::evaluate( lhs, rhs );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,7 +94,7 @@ namespace Internal {
|
||||||
|
|
||||||
// "base" overload
|
// "base" overload
|
||||||
template<Operator Op, typename T1, typename T2>
|
template<Operator Op, typename T1, typename T2>
|
||||||
bool compare( const T1& lhs, const T2& rhs ) {
|
bool compare( T1 const& lhs, T2 const& rhs ) {
|
||||||
return Evaluator<T1, T2, Op>::evaluate( lhs, rhs );
|
return Evaluator<T1, T2, Op>::evaluate( lhs, rhs );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,7 +158,21 @@ namespace Internal {
|
||||||
return Evaluator<T*, T*, Op>::evaluate( lhs, reinterpret_cast<T*>( rhs ) );
|
return Evaluator<T*, T*, Op>::evaluate( lhs, reinterpret_cast<T*>( rhs ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CATCH_CONFIG_CPP11_NULLPTR
|
||||||
|
// pointer to nullptr_t (when comparing against nullptr)
|
||||||
|
template<Operator Op, typename T> bool compare( std::nullptr_t, T* rhs ) {
|
||||||
|
return Evaluator<T*, T*, Op>::evaluate( NULL, rhs );
|
||||||
|
}
|
||||||
|
template<Operator Op, typename T> bool compare( T* lhs, std::nullptr_t ) {
|
||||||
|
return Evaluator<T*, T*, Op>::evaluate( lhs, NULL );
|
||||||
|
}
|
||||||
|
#endif // CATCH_CONFIG_CPP11_NULLPTR
|
||||||
|
|
||||||
} // end of namespace Internal
|
} // end of namespace Internal
|
||||||
} // end of namespace Catch
|
} // end of namespace Catch
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED
|
#endif // TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED
|
||||||
|
|
|
@ -17,8 +17,8 @@ class ExpressionDecomposer {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
ExpressionLhs<const T&> operator->* ( const T & operand ) {
|
ExpressionLhs<T const&> operator->* ( T const& operand ) {
|
||||||
return ExpressionLhs<const T&>( operand );
|
return ExpressionLhs<T const&>( operand );
|
||||||
}
|
}
|
||||||
|
|
||||||
ExpressionLhs<bool> operator->* ( bool value ) {
|
ExpressionLhs<bool> operator->* ( bool value ) {
|
||||||
|
|
|
@ -19,38 +19,38 @@ struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison;
|
||||||
// in an ExpressionResultBuilder object
|
// in an ExpressionResultBuilder object
|
||||||
template<typename T>
|
template<typename T>
|
||||||
class ExpressionLhs {
|
class ExpressionLhs {
|
||||||
void operator = ( const ExpressionLhs& );
|
void operator = ( ExpressionLhs const& );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ExpressionLhs( T lhs ) : m_lhs( lhs ) {}
|
ExpressionLhs( T lhs ) : m_lhs( lhs ) {}
|
||||||
|
|
||||||
template<typename RhsT>
|
template<typename RhsT>
|
||||||
ExpressionResultBuilder& operator == ( const RhsT& rhs ) {
|
ExpressionResultBuilder& operator == ( RhsT const& rhs ) {
|
||||||
return captureExpression<Internal::IsEqualTo>( rhs );
|
return captureExpression<Internal::IsEqualTo>( rhs );
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename RhsT>
|
template<typename RhsT>
|
||||||
ExpressionResultBuilder& operator != ( const RhsT& rhs ) {
|
ExpressionResultBuilder& operator != ( RhsT const& rhs ) {
|
||||||
return captureExpression<Internal::IsNotEqualTo>( rhs );
|
return captureExpression<Internal::IsNotEqualTo>( rhs );
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename RhsT>
|
template<typename RhsT>
|
||||||
ExpressionResultBuilder& operator < ( const RhsT& rhs ) {
|
ExpressionResultBuilder& operator < ( RhsT const& rhs ) {
|
||||||
return captureExpression<Internal::IsLessThan>( rhs );
|
return captureExpression<Internal::IsLessThan>( rhs );
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename RhsT>
|
template<typename RhsT>
|
||||||
ExpressionResultBuilder& operator > ( const RhsT& rhs ) {
|
ExpressionResultBuilder& operator > ( RhsT const& rhs ) {
|
||||||
return captureExpression<Internal::IsGreaterThan>( rhs );
|
return captureExpression<Internal::IsGreaterThan>( rhs );
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename RhsT>
|
template<typename RhsT>
|
||||||
ExpressionResultBuilder& operator <= ( const RhsT& rhs ) {
|
ExpressionResultBuilder& operator <= ( RhsT const& rhs ) {
|
||||||
return captureExpression<Internal::IsLessThanOrEqualTo>( rhs );
|
return captureExpression<Internal::IsLessThanOrEqualTo>( rhs );
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename RhsT>
|
template<typename RhsT>
|
||||||
ExpressionResultBuilder& operator >= ( const RhsT& rhs ) {
|
ExpressionResultBuilder& operator >= ( RhsT const& rhs ) {
|
||||||
return captureExpression<Internal::IsGreaterThanOrEqualTo>( rhs );
|
return captureExpression<Internal::IsGreaterThanOrEqualTo>( rhs );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,14 +72,14 @@ public:
|
||||||
|
|
||||||
// Only simple binary expressions are allowed on the LHS.
|
// Only simple binary expressions are allowed on the LHS.
|
||||||
// If more complex compositions are required then place the sub expression in parentheses
|
// If more complex compositions are required then place the sub expression in parentheses
|
||||||
template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( const RhsT& );
|
template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator + ( RhsT const& );
|
||||||
template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( const RhsT& );
|
template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator - ( RhsT const& );
|
||||||
template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( const RhsT& );
|
template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator / ( RhsT const& );
|
||||||
template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( const RhsT& );
|
template<typename RhsT> STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator * ( RhsT const& );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template<Internal::Operator Op, typename RhsT>
|
template<Internal::Operator Op, typename RhsT>
|
||||||
ExpressionResultBuilder& captureExpression( const RhsT& rhs ) {
|
ExpressionResultBuilder& captureExpression( RhsT const& rhs ) {
|
||||||
return m_result
|
return m_result
|
||||||
.setResultType( Internal::compare<Op>( m_lhs, rhs ) )
|
.setResultType( Internal::compare<Op>( m_lhs, rhs ) )
|
||||||
.setLhs( Catch::toString( m_lhs ) )
|
.setLhs( Catch::toString( m_lhs ) )
|
||||||
|
|
|
@ -22,26 +22,26 @@ class ExpressionResultBuilder {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ExpressionResultBuilder( ResultWas::OfType resultType = ResultWas::Unknown );
|
ExpressionResultBuilder( ResultWas::OfType resultType = ResultWas::Unknown );
|
||||||
ExpressionResultBuilder( const ExpressionResultBuilder& other );
|
ExpressionResultBuilder( ExpressionResultBuilder const& other );
|
||||||
ExpressionResultBuilder& operator=(const ExpressionResultBuilder& other );
|
ExpressionResultBuilder& operator=(ExpressionResultBuilder const& other );
|
||||||
|
|
||||||
ExpressionResultBuilder& setResultType( ResultWas::OfType result );
|
ExpressionResultBuilder& setResultType( ResultWas::OfType result );
|
||||||
ExpressionResultBuilder& setResultType( bool result );
|
ExpressionResultBuilder& setResultType( bool result );
|
||||||
ExpressionResultBuilder& setLhs( const std::string& lhs );
|
ExpressionResultBuilder& setLhs( std::string const& lhs );
|
||||||
ExpressionResultBuilder& setRhs( const std::string& rhs );
|
ExpressionResultBuilder& setRhs( std::string const& rhs );
|
||||||
ExpressionResultBuilder& setOp( const std::string& op );
|
ExpressionResultBuilder& setOp( std::string const& op );
|
||||||
|
|
||||||
ExpressionResultBuilder& endExpression( ResultDisposition::Flags resultDisposition );
|
ExpressionResultBuilder& endExpression( ResultDisposition::Flags resultDisposition );
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
ExpressionResultBuilder& operator << ( const T& value ) {
|
ExpressionResultBuilder& operator << ( T const& value ) {
|
||||||
m_stream << value;
|
m_stream << value;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string reconstructExpression( const AssertionInfo& info ) const;
|
std::string reconstructExpression( AssertionInfo const& info ) const;
|
||||||
|
|
||||||
AssertionResult buildResult( const AssertionInfo& info ) const;
|
AssertionResult buildResult( AssertionInfo const& info ) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
AssertionResultData m_data;
|
AssertionResultData m_data;
|
||||||
|
|
|
@ -17,13 +17,13 @@ namespace Catch {
|
||||||
ExpressionResultBuilder::ExpressionResultBuilder( ResultWas::OfType resultType ) {
|
ExpressionResultBuilder::ExpressionResultBuilder( ResultWas::OfType resultType ) {
|
||||||
m_data.resultType = resultType;
|
m_data.resultType = resultType;
|
||||||
}
|
}
|
||||||
ExpressionResultBuilder::ExpressionResultBuilder( const ExpressionResultBuilder& other )
|
ExpressionResultBuilder::ExpressionResultBuilder( ExpressionResultBuilder const& other )
|
||||||
: m_data( other.m_data ),
|
: m_data( other.m_data ),
|
||||||
m_exprComponents( other.m_exprComponents )
|
m_exprComponents( other.m_exprComponents )
|
||||||
{
|
{
|
||||||
m_stream << other.m_stream.str();
|
m_stream << other.m_stream.str();
|
||||||
}
|
}
|
||||||
ExpressionResultBuilder& ExpressionResultBuilder::operator=(const ExpressionResultBuilder& other ) {
|
ExpressionResultBuilder& ExpressionResultBuilder::operator=(ExpressionResultBuilder const& other ) {
|
||||||
m_data = other.m_data;
|
m_data = other.m_data;
|
||||||
m_exprComponents = other.m_exprComponents;
|
m_exprComponents = other.m_exprComponents;
|
||||||
m_stream.str("");
|
m_stream.str("");
|
||||||
|
@ -42,19 +42,19 @@ namespace Catch {
|
||||||
m_exprComponents.shouldNegate = shouldNegate( resultDisposition );
|
m_exprComponents.shouldNegate = shouldNegate( resultDisposition );
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
ExpressionResultBuilder& ExpressionResultBuilder::setLhs( const std::string& lhs ) {
|
ExpressionResultBuilder& ExpressionResultBuilder::setLhs( std::string const& lhs ) {
|
||||||
m_exprComponents.lhs = lhs;
|
m_exprComponents.lhs = lhs;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
ExpressionResultBuilder& ExpressionResultBuilder::setRhs( const std::string& rhs ) {
|
ExpressionResultBuilder& ExpressionResultBuilder::setRhs( std::string const& rhs ) {
|
||||||
m_exprComponents.rhs = rhs;
|
m_exprComponents.rhs = rhs;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
ExpressionResultBuilder& ExpressionResultBuilder::setOp( const std::string& op ) {
|
ExpressionResultBuilder& ExpressionResultBuilder::setOp( std::string const& op ) {
|
||||||
m_exprComponents.op = op;
|
m_exprComponents.op = op;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
AssertionResult ExpressionResultBuilder::buildResult( const AssertionInfo& info ) const
|
AssertionResult ExpressionResultBuilder::buildResult( AssertionInfo const& info ) const
|
||||||
{
|
{
|
||||||
assert( m_data.resultType != ResultWas::Unknown );
|
assert( m_data.resultType != ResultWas::Unknown );
|
||||||
|
|
||||||
|
@ -76,18 +76,18 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
return AssertionResult( info, data );
|
return AssertionResult( info, data );
|
||||||
}
|
}
|
||||||
std::string ExpressionResultBuilder::reconstructExpression( const AssertionInfo& info ) const {
|
std::string ExpressionResultBuilder::reconstructExpression( AssertionInfo const& info ) const {
|
||||||
if( m_exprComponents.op == "" )
|
if( m_exprComponents.op == "" )
|
||||||
return m_exprComponents.lhs.empty() ? info.capturedExpression : m_exprComponents.op + m_exprComponents.lhs;
|
return m_exprComponents.lhs.empty() ? info.capturedExpression : m_exprComponents.op + m_exprComponents.lhs;
|
||||||
else if( m_exprComponents.op == "matches" )
|
else if( m_exprComponents.op == "matches" )
|
||||||
return m_exprComponents.lhs + " " + m_exprComponents.rhs;
|
return m_exprComponents.lhs + " " + m_exprComponents.rhs;
|
||||||
else if( m_exprComponents.op != "!" ) {
|
else if( m_exprComponents.op != "!" ) {
|
||||||
if( m_exprComponents.lhs.size() + m_exprComponents.rhs.size() < 30 )
|
if( m_exprComponents.lhs.size() + m_exprComponents.rhs.size() < 40 &&
|
||||||
|
m_exprComponents.lhs.find("\n") == std::string::npos &&
|
||||||
|
m_exprComponents.rhs.find("\n") == std::string::npos )
|
||||||
return m_exprComponents.lhs + " " + m_exprComponents.op + " " + m_exprComponents.rhs;
|
return m_exprComponents.lhs + " " + m_exprComponents.op + " " + m_exprComponents.rhs;
|
||||||
else if( m_exprComponents.lhs.size() < 70 && m_exprComponents.rhs.size() < 70 )
|
|
||||||
return "\n\t" + m_exprComponents.lhs + "\n\t" + m_exprComponents.op + "\n\t" + m_exprComponents.rhs;
|
|
||||||
else
|
else
|
||||||
return "\n" + m_exprComponents.lhs + "\n" + m_exprComponents.op + "\n" + m_exprComponents.rhs + "\n\n";
|
return m_exprComponents.lhs + "\n" + m_exprComponents.op + "\n" + m_exprComponents.rhs;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return "{can't expand - use " + info.macroName + "_FALSE( " + info.capturedExpression.substr(1) + " ) instead of " + info.macroName + "( " + info.capturedExpression + " ) for better diagnostics}";
|
return "{can't expand - use " + info.macroName + "_FALSE( " + info.capturedExpression.substr(1) + " ) instead of " + info.macroName + "( " + info.capturedExpression + " ) for better diagnostics}";
|
||||||
|
|
|
@ -30,7 +30,7 @@ public:
|
||||||
BetweenGenerator( T from, T to ) : m_from( from ), m_to( to ){}
|
BetweenGenerator( T from, T to ) : m_from( from ), m_to( to ){}
|
||||||
|
|
||||||
virtual T getValue( std::size_t index ) const {
|
virtual T getValue( std::size_t index ) const {
|
||||||
return m_from+static_cast<T>( index );
|
return m_from+static_cast<int>( index );
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual std::size_t size() const {
|
virtual std::size_t size() const {
|
||||||
|
|
|
@ -50,7 +50,7 @@ namespace Catch {
|
||||||
deleteAll( m_generatorsInOrder );
|
deleteAll( m_generatorsInOrder );
|
||||||
}
|
}
|
||||||
|
|
||||||
IGeneratorInfo& getGeneratorInfo( const std::string& fileInfo, std::size_t size ) {
|
IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) {
|
||||||
std::map<std::string, IGeneratorInfo*>::const_iterator it = m_generatorsByName.find( fileInfo );
|
std::map<std::string, IGeneratorInfo*>::const_iterator it = m_generatorsByName.find( fileInfo );
|
||||||
if( it == m_generatorsByName.end() ) {
|
if( it == m_generatorsByName.end() ) {
|
||||||
IGeneratorInfo* info = new GeneratorInfo( size );
|
IGeneratorInfo* info = new GeneratorInfo( size );
|
||||||
|
|
|
@ -26,10 +26,15 @@
|
||||||
#include "catch_expressionresult_builder.hpp"
|
#include "catch_expressionresult_builder.hpp"
|
||||||
#include "catch_test_case_info.hpp"
|
#include "catch_test_case_info.hpp"
|
||||||
#include "catch_tags.hpp"
|
#include "catch_tags.hpp"
|
||||||
|
#include "catch_version.hpp"
|
||||||
|
#include "catch_text.hpp"
|
||||||
|
#include "catch_message.hpp"
|
||||||
|
#include "catch_legacy_reporter_adapter.hpp"
|
||||||
|
|
||||||
#include "../reporters/catch_reporter_basic.hpp"
|
#include "../reporters/catch_reporter_basic.hpp"
|
||||||
#include "../reporters/catch_reporter_xml.hpp"
|
#include "../reporters/catch_reporter_xml.hpp"
|
||||||
#include "../reporters/catch_reporter_junit.hpp"
|
#include "../reporters/catch_reporter_junit.hpp"
|
||||||
|
#include "../reporters/catch_reporter_console.hpp"
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
NonCopyable::~NonCopyable() {}
|
NonCopyable::~NonCopyable() {}
|
||||||
|
@ -46,7 +51,19 @@ namespace Catch {
|
||||||
IReporter::~IReporter() {}
|
IReporter::~IReporter() {}
|
||||||
IReporterFactory::~IReporterFactory() {}
|
IReporterFactory::~IReporterFactory() {}
|
||||||
IReporterRegistry::~IReporterRegistry() {}
|
IReporterRegistry::~IReporterRegistry() {}
|
||||||
|
IStreamingReporter::~IStreamingReporter() {}
|
||||||
|
AssertionStats::~AssertionStats() {}
|
||||||
|
SectionStats::~SectionStats() {}
|
||||||
|
TestCaseStats::~TestCaseStats() {}
|
||||||
|
TestGroupStats::~TestGroupStats() {}
|
||||||
|
TestRunStats::~TestRunStats() {}
|
||||||
|
ThreadedSectionInfo::~ThreadedSectionInfo() {}
|
||||||
|
TestGroupNode::~TestGroupNode() {}
|
||||||
|
TestRunNode::~TestRunNode() {}
|
||||||
|
|
||||||
BasicReporter::~BasicReporter() {}
|
BasicReporter::~BasicReporter() {}
|
||||||
|
StreamingReporterBase::~StreamingReporterBase() {}
|
||||||
|
ConsoleReporter::~ConsoleReporter() {}
|
||||||
IRunner::~IRunner() {}
|
IRunner::~IRunner() {}
|
||||||
IMutableContext::~IMutableContext() {}
|
IMutableContext::~IMutableContext() {}
|
||||||
IConfig::~IConfig() {}
|
IConfig::~IConfig() {}
|
||||||
|
@ -67,9 +84,9 @@ namespace Catch {
|
||||||
|
|
||||||
void Config::dummy() {}
|
void Config::dummy() {}
|
||||||
|
|
||||||
INTERNAL_CATCH_REGISTER_REPORTER( "basic", BasicReporter )
|
INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( "basic", BasicReporter )
|
||||||
INTERNAL_CATCH_REGISTER_REPORTER( "xml", XmlReporter )
|
INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( "xml", XmlReporter )
|
||||||
INTERNAL_CATCH_REGISTER_REPORTER( "junit", JunitReporter )
|
INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( "junit", JunitReporter )
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,27 +15,29 @@
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
class TestCaseInfo;
|
class TestCase;
|
||||||
class ScopedInfo;
|
|
||||||
class ExpressionResultBuilder;
|
class ExpressionResultBuilder;
|
||||||
class AssertionResult;
|
class AssertionResult;
|
||||||
struct AssertionInfo;
|
struct AssertionInfo;
|
||||||
|
struct SectionInfo;
|
||||||
|
class MessageBuilder;
|
||||||
|
class ScopedMessageBuilder;
|
||||||
|
|
||||||
struct IResultCapture {
|
struct IResultCapture {
|
||||||
|
|
||||||
virtual ~IResultCapture();
|
virtual ~IResultCapture();
|
||||||
|
|
||||||
virtual void testEnded( const AssertionResult& result ) = 0;
|
virtual void assertionEnded( AssertionResult const& result ) = 0;
|
||||||
virtual bool sectionStarted( const std::string& name,
|
virtual bool sectionStarted( SectionInfo const& sectionInfo,
|
||||||
const std::string& description,
|
|
||||||
const SourceLineInfo& lineInfo,
|
|
||||||
Counts& assertions ) = 0;
|
Counts& assertions ) = 0;
|
||||||
virtual void sectionEnded( const std::string& name, const Counts& assertions ) = 0;
|
virtual void sectionEnded( SectionInfo const& name, Counts const& assertions ) = 0;
|
||||||
virtual void pushScopedInfo( ScopedInfo* scopedInfo ) = 0;
|
virtual void pushScopedMessage( ScopedMessageBuilder const& _builder ) = 0;
|
||||||
virtual void popScopedInfo( ScopedInfo* scopedInfo ) = 0;
|
virtual void popScopedMessage( ScopedMessageBuilder const& _builder ) = 0;
|
||||||
|
|
||||||
virtual bool shouldDebugBreak() const = 0;
|
virtual bool shouldDebugBreak() const = 0;
|
||||||
|
|
||||||
virtual ResultAction::Value acceptExpression( const ExpressionResultBuilder& assertionResult, const AssertionInfo& assertionInfo ) = 0;
|
virtual void acceptMessage( MessageBuilder const& messageBuilder ) = 0;
|
||||||
|
virtual ResultAction::Value acceptExpression( ExpressionResultBuilder const& assertionResult, AssertionInfo const& assertionInfo ) = 0;
|
||||||
|
|
||||||
virtual std::string getCurrentTestName() const = 0;
|
virtual std::string getCurrentTestName() const = 0;
|
||||||
virtual const AssertionResult* getLastResult() const = 0;
|
virtual const AssertionResult* getLastResult() const = 0;
|
||||||
|
|
|
@ -8,13 +8,24 @@
|
||||||
#ifndef TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED
|
#ifndef TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED
|
||||||
#define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED
|
#define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "catch_ptr.hpp"
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
struct IConfig {
|
struct IConfig : IShared {
|
||||||
|
|
||||||
virtual ~IConfig();
|
virtual ~IConfig();
|
||||||
|
|
||||||
virtual bool allowThrows() const = 0;
|
virtual bool allowThrows() const = 0;
|
||||||
|
virtual std::ostream& stream() const = 0;
|
||||||
|
virtual std::string name() const = 0;
|
||||||
|
virtual bool includeSuccessfulResults() const = 0;
|
||||||
|
virtual bool shouldDebugBreak() const = 0;
|
||||||
|
virtual bool warnAboutMissingAssertions() const = 0;
|
||||||
|
virtual int abortAfter() const = 0;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ namespace Catch {
|
||||||
struct IGeneratorsForTest {
|
struct IGeneratorsForTest {
|
||||||
virtual ~IGeneratorsForTest();
|
virtual ~IGeneratorsForTest();
|
||||||
|
|
||||||
virtual IGeneratorInfo& getGeneratorInfo( const std::string& fileInfo, std::size_t size ) = 0;
|
virtual IGeneratorInfo& getGeneratorInfo( std::string const& fileInfo, std::size_t size ) = 0;
|
||||||
virtual bool moveNext() = 0;
|
virtual bool moveNext() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
class TestCaseInfo;
|
class TestCase;
|
||||||
struct ITestCaseRegistry;
|
struct ITestCaseRegistry;
|
||||||
struct IExceptionTranslatorRegistry;
|
struct IExceptionTranslatorRegistry;
|
||||||
struct IExceptionTranslator;
|
struct IExceptionTranslator;
|
||||||
|
@ -23,15 +23,15 @@ namespace Catch {
|
||||||
struct IRegistryHub {
|
struct IRegistryHub {
|
||||||
virtual ~IRegistryHub();
|
virtual ~IRegistryHub();
|
||||||
|
|
||||||
virtual const IReporterRegistry& getReporterRegistry() const = 0;
|
virtual IReporterRegistry const& getReporterRegistry() const = 0;
|
||||||
virtual const ITestCaseRegistry& getTestCaseRegistry() const = 0;
|
virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0;
|
||||||
virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0;
|
virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct IMutableRegistryHub {
|
struct IMutableRegistryHub {
|
||||||
virtual ~IMutableRegistryHub();
|
virtual ~IMutableRegistryHub();
|
||||||
virtual void registerReporter( const std::string& name, IReporterFactory* factory ) = 0;
|
virtual void registerReporter( std::string const& name, IReporterFactory* factory ) = 0;
|
||||||
virtual void registerTest( const TestCaseInfo& testInfo ) = 0;
|
virtual void registerTest( TestCase const& testInfo ) = 0;
|
||||||
virtual void registerTranslator( const IExceptionTranslator* translator ) = 0;
|
virtual void registerTranslator( const IExceptionTranslator* translator ) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,10 @@
|
||||||
#include "catch_totals.hpp"
|
#include "catch_totals.hpp"
|
||||||
#include "catch_ptr.hpp"
|
#include "catch_ptr.hpp"
|
||||||
#include "catch_config.hpp"
|
#include "catch_config.hpp"
|
||||||
|
#include "catch_test_case_info.h"
|
||||||
|
#include "catch_assertionresult.h"
|
||||||
|
#include "catch_message.h"
|
||||||
|
#include "catch_option.hpp"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
|
@ -19,72 +23,298 @@
|
||||||
|
|
||||||
namespace Catch
|
namespace Catch
|
||||||
{
|
{
|
||||||
struct ReporterConfig
|
struct ReporterConfig {
|
||||||
{
|
explicit ReporterConfig( Ptr<IConfig> const& _fullConfig )
|
||||||
ReporterConfig( const std::string& _name,
|
: m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {}
|
||||||
std::ostream& _stream,
|
|
||||||
bool _includeSuccessfulResults,
|
|
||||||
const ConfigData& _fullConfig )
|
|
||||||
: name( _name ),
|
|
||||||
stream( _stream ),
|
|
||||||
includeSuccessfulResults( _includeSuccessfulResults ),
|
|
||||||
fullConfig( _fullConfig )
|
|
||||||
{}
|
|
||||||
|
|
||||||
ReporterConfig( const ReporterConfig& other )
|
ReporterConfig( Ptr<IConfig> const& _fullConfig, std::ostream& _stream )
|
||||||
: name( other.name ),
|
: m_stream( &_stream ), m_fullConfig( _fullConfig ) {}
|
||||||
stream( other.stream ),
|
|
||||||
includeSuccessfulResults( other.includeSuccessfulResults ),
|
|
||||||
fullConfig( other.fullConfig )
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
std::ostream& stream() const { return *m_stream; }
|
||||||
std::string name;
|
Ptr<IConfig> fullConfig() const { return m_fullConfig; }
|
||||||
std::ostream& stream;
|
|
||||||
bool includeSuccessfulResults;
|
|
||||||
ConfigData fullConfig;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void operator=(const ReporterConfig&);
|
std::ostream* m_stream;
|
||||||
|
Ptr<IConfig> m_fullConfig;
|
||||||
};
|
};
|
||||||
|
|
||||||
class TestCaseInfo;
|
struct ReporterPreferences {
|
||||||
class AssertionResult;
|
ReporterPreferences()
|
||||||
|
: shouldRedirectStdOut( false )
|
||||||
|
{}
|
||||||
|
|
||||||
|
bool shouldRedirectStdOut;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TestRunInfo {
|
||||||
|
TestRunInfo( std::string const& _name ) : name( _name ) {}
|
||||||
|
std::string name;
|
||||||
|
};
|
||||||
|
struct GroupInfo {
|
||||||
|
GroupInfo( std::string const& _name,
|
||||||
|
std::size_t _groupIndex,
|
||||||
|
std::size_t _groupsCount )
|
||||||
|
: name( _name ),
|
||||||
|
groupIndex( _groupIndex ),
|
||||||
|
groupsCounts( _groupsCount )
|
||||||
|
{}
|
||||||
|
|
||||||
|
std::string name;
|
||||||
|
std::size_t groupIndex;
|
||||||
|
std::size_t groupsCounts;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SectionInfo {
|
||||||
|
SectionInfo( std::string const& _name,
|
||||||
|
std::string const& _description,
|
||||||
|
SourceLineInfo const& _lineInfo )
|
||||||
|
: name( _name ),
|
||||||
|
description( _description ),
|
||||||
|
lineInfo( _lineInfo )
|
||||||
|
{}
|
||||||
|
|
||||||
|
std::string name;
|
||||||
|
std::string description;
|
||||||
|
SourceLineInfo lineInfo;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ThreadedSectionInfo : SectionInfo, SharedImpl<> {
|
||||||
|
ThreadedSectionInfo( SectionInfo const& _sectionInfo, ThreadedSectionInfo* _parent = NULL )
|
||||||
|
: SectionInfo( _sectionInfo ),
|
||||||
|
parent( _parent )
|
||||||
|
{}
|
||||||
|
virtual ~ThreadedSectionInfo();
|
||||||
|
|
||||||
|
std::vector<Ptr<ThreadedSectionInfo> > children;
|
||||||
|
ThreadedSectionInfo* parent;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct AssertionStats {
|
||||||
|
AssertionStats( AssertionResult const& _assertionResult,
|
||||||
|
std::vector<MessageInfo> const& _infoMessages,
|
||||||
|
Totals const& _totals )
|
||||||
|
: assertionResult( _assertionResult ),
|
||||||
|
infoMessages( _infoMessages ),
|
||||||
|
totals( _totals )
|
||||||
|
{
|
||||||
|
if( assertionResult.hasMessage() ) {
|
||||||
|
// Copy message into messages list.
|
||||||
|
// !TBD This should have been done earlier, somewhere
|
||||||
|
MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() );
|
||||||
|
builder << assertionResult.getMessage();
|
||||||
|
infoMessages.push_back( builder.build() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
virtual ~AssertionStats();
|
||||||
|
|
||||||
|
AssertionResult assertionResult;
|
||||||
|
std::vector<MessageInfo> infoMessages;
|
||||||
|
Totals totals;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SectionStats {
|
||||||
|
SectionStats( SectionInfo const& _sectionInfo,
|
||||||
|
Counts const& _assertions,
|
||||||
|
bool _missingAssertions )
|
||||||
|
: sectionInfo( _sectionInfo ),
|
||||||
|
assertions( _assertions ),
|
||||||
|
missingAssertions( _missingAssertions )
|
||||||
|
{}
|
||||||
|
virtual ~SectionStats();
|
||||||
|
|
||||||
|
SectionInfo sectionInfo;
|
||||||
|
Counts assertions;
|
||||||
|
bool missingAssertions;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TestCaseStats {
|
||||||
|
TestCaseStats( TestCaseInfo const& _testInfo,
|
||||||
|
Totals const& _totals,
|
||||||
|
std::string const& _stdOut,
|
||||||
|
std::string const& _stdErr,
|
||||||
|
bool _missingAssertions,
|
||||||
|
bool _aborting )
|
||||||
|
: testInfo( _testInfo ),
|
||||||
|
totals( _totals ),
|
||||||
|
stdOut( _stdOut ),
|
||||||
|
stdErr( _stdErr ),
|
||||||
|
missingAssertions( _missingAssertions ),
|
||||||
|
aborting( _aborting )
|
||||||
|
{}
|
||||||
|
virtual ~TestCaseStats();
|
||||||
|
|
||||||
|
TestCaseInfo testInfo;
|
||||||
|
Totals totals;
|
||||||
|
std::string stdOut;
|
||||||
|
std::string stdErr;
|
||||||
|
bool missingAssertions;
|
||||||
|
bool aborting;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TestGroupStats {
|
||||||
|
TestGroupStats( GroupInfo const& _groupInfo,
|
||||||
|
Totals const& _totals,
|
||||||
|
bool _aborting )
|
||||||
|
: groupInfo( _groupInfo ),
|
||||||
|
totals( _totals ),
|
||||||
|
aborting( _aborting )
|
||||||
|
{}
|
||||||
|
TestGroupStats( GroupInfo const& _groupInfo )
|
||||||
|
: groupInfo( _groupInfo ),
|
||||||
|
aborting( false )
|
||||||
|
{}
|
||||||
|
virtual ~TestGroupStats();
|
||||||
|
|
||||||
|
GroupInfo groupInfo;
|
||||||
|
Totals totals;
|
||||||
|
bool aborting;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TestRunStats {
|
||||||
|
TestRunStats( TestRunInfo const& _runInfo,
|
||||||
|
Totals const& _totals,
|
||||||
|
bool _aborting )
|
||||||
|
: runInfo( _runInfo ),
|
||||||
|
totals( _totals ),
|
||||||
|
aborting( _aborting )
|
||||||
|
{}
|
||||||
|
TestRunStats( TestRunStats const& _other )
|
||||||
|
: runInfo( _other.runInfo ),
|
||||||
|
totals( _other.totals ),
|
||||||
|
aborting( _other.aborting )
|
||||||
|
{}
|
||||||
|
virtual ~TestRunStats();
|
||||||
|
|
||||||
|
TestRunInfo runInfo;
|
||||||
|
Totals totals;
|
||||||
|
bool aborting;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct IStreamingReporter : IShared {
|
||||||
|
virtual ~IStreamingReporter();
|
||||||
|
|
||||||
|
// Implementing class must also provide the following static method:
|
||||||
|
// static std::string getDescription();
|
||||||
|
|
||||||
|
virtual ReporterPreferences getPreferences() const = 0;
|
||||||
|
|
||||||
|
virtual void noMatchingTestCases( std::string const& spec ) = 0;
|
||||||
|
|
||||||
|
virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0;
|
||||||
|
virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0;
|
||||||
|
|
||||||
|
virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0;
|
||||||
|
virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0;
|
||||||
|
|
||||||
|
virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0;
|
||||||
|
|
||||||
|
virtual void assertionEnded( AssertionStats const& assertionStats ) = 0;
|
||||||
|
virtual void sectionEnded( SectionStats const& sectionStats ) = 0;
|
||||||
|
virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0;
|
||||||
|
virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0;
|
||||||
|
virtual void testRunEnded( TestRunStats const& testRunStats ) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct StreamingReporterBase : SharedImpl<IStreamingReporter> {
|
||||||
|
|
||||||
|
StreamingReporterBase( ReporterConfig const& _config )
|
||||||
|
: m_config( _config.fullConfig() ),
|
||||||
|
stream( _config.stream() )
|
||||||
|
{}
|
||||||
|
|
||||||
|
virtual ~StreamingReporterBase();
|
||||||
|
|
||||||
|
virtual void noMatchingTestCases( std::string const& ) {}
|
||||||
|
|
||||||
|
virtual void testRunStarting( TestRunInfo const& _testRunInfo ) {
|
||||||
|
testRunInfo = _testRunInfo;
|
||||||
|
}
|
||||||
|
virtual void testGroupStarting( GroupInfo const& _groupInfo ) {
|
||||||
|
unusedGroupInfo = _groupInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void testCaseStarting( TestCaseInfo const& _testInfo ) {
|
||||||
|
unusedTestCaseInfo = _testInfo;
|
||||||
|
}
|
||||||
|
virtual void sectionStarting( SectionInfo const& _sectionInfo ) {
|
||||||
|
Ptr<ThreadedSectionInfo> sectionInfo = new ThreadedSectionInfo( _sectionInfo );
|
||||||
|
if( !currentSectionInfo ) {
|
||||||
|
currentSectionInfo = sectionInfo;
|
||||||
|
m_rootSections.push_back( currentSectionInfo );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
currentSectionInfo->children.push_back( sectionInfo );
|
||||||
|
sectionInfo->parent = currentSectionInfo.get();
|
||||||
|
currentSectionInfo = sectionInfo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) {
|
||||||
|
currentSectionInfo = currentSectionInfo->parent;
|
||||||
|
}
|
||||||
|
virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) {
|
||||||
|
unusedTestCaseInfo.reset();
|
||||||
|
}
|
||||||
|
virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) {
|
||||||
|
unusedGroupInfo.reset();
|
||||||
|
}
|
||||||
|
virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) {
|
||||||
|
currentSectionInfo.reset();
|
||||||
|
unusedTestCaseInfo.reset();
|
||||||
|
unusedGroupInfo.reset();
|
||||||
|
testRunInfo.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
Ptr<IConfig> m_config;
|
||||||
|
Option<TestRunInfo> testRunInfo;
|
||||||
|
Option<GroupInfo> unusedGroupInfo;
|
||||||
|
Option<TestCaseInfo> unusedTestCaseInfo;
|
||||||
|
Ptr<ThreadedSectionInfo> currentSectionInfo;
|
||||||
|
std::ostream& stream;
|
||||||
|
|
||||||
|
// !TBD: This should really go in the TestCaseStats class
|
||||||
|
std::vector<Ptr<ThreadedSectionInfo> > m_rootSections;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TestGroupNode : TestGroupStats {
|
||||||
|
TestGroupNode( TestGroupStats const& _stats ) : TestGroupStats( _stats ) {}
|
||||||
|
// TestGroupNode( GroupInfo const& _info ) : TestGroupStats( _stats ) {}
|
||||||
|
~TestGroupNode();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TestRunNode : TestRunStats {
|
||||||
|
|
||||||
|
TestRunNode( TestRunStats const& _stats ) : TestRunStats( _stats ) {}
|
||||||
|
~TestRunNode();
|
||||||
|
|
||||||
|
std::vector<TestGroupNode> groups;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Deprecated
|
||||||
struct IReporter : IShared {
|
struct IReporter : IShared {
|
||||||
virtual ~IReporter();
|
virtual ~IReporter();
|
||||||
|
|
||||||
virtual bool shouldRedirectStdout() const = 0;
|
virtual bool shouldRedirectStdout() const = 0;
|
||||||
|
|
||||||
virtual void StartTesting() = 0;
|
virtual void StartTesting() = 0;
|
||||||
virtual void EndTesting( const Totals& totals ) = 0;
|
virtual void EndTesting( Totals const& totals ) = 0;
|
||||||
|
virtual void StartGroup( std::string const& groupName ) = 0;
|
||||||
virtual void StartGroup( const std::string& groupName ) = 0;
|
virtual void EndGroup( std::string const& groupName, Totals const& totals ) = 0;
|
||||||
virtual void EndGroup( const std::string& groupName, const Totals& totals ) = 0;
|
virtual void StartTestCase( TestCaseInfo const& testInfo ) = 0;
|
||||||
|
virtual void EndTestCase( TestCaseInfo const& testInfo, Totals const& totals, std::string const& stdOut, std::string const& stdErr ) = 0;
|
||||||
virtual void StartTestCase( const TestCaseInfo& testInfo ) = 0;
|
virtual void StartSection( std::string const& sectionName, std::string const& description ) = 0;
|
||||||
// TestCaseResult
|
virtual void EndSection( std::string const& sectionName, Counts const& assertions ) = 0;
|
||||||
virtual void EndTestCase( const TestCaseInfo& testInfo, const Totals& totals, const std::string& stdOut, const std::string& stdErr ) = 0;
|
virtual void NoAssertionsInSection( std::string const& sectionName ) = 0;
|
||||||
|
virtual void NoAssertionsInTestCase( std::string const& testName ) = 0;
|
||||||
// SectionInfo
|
|
||||||
virtual void StartSection( const std::string& sectionName, const std::string& description ) = 0;
|
|
||||||
// Section Result
|
|
||||||
virtual void EndSection( const std::string& sectionName, const Counts& assertions ) = 0;
|
|
||||||
|
|
||||||
// - merge into SectionResult ?
|
|
||||||
virtual void NoAssertionsInSection( const std::string& sectionName ) = 0;
|
|
||||||
virtual void NoAssertionsInTestCase( const std::string& testName ) = 0;
|
|
||||||
|
|
||||||
// - merge into SectionResult, TestCaseResult, GroupResult & TestRunResult
|
|
||||||
virtual void Aborted() = 0;
|
virtual void Aborted() = 0;
|
||||||
|
virtual void Result( AssertionResult const& result ) = 0;
|
||||||
// AssertionReslt
|
|
||||||
virtual void Result( const AssertionResult& result ) = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct IReporterFactory {
|
struct IReporterFactory {
|
||||||
virtual ~IReporterFactory();
|
virtual ~IReporterFactory();
|
||||||
virtual IReporter* create( const ReporterConfig& config ) const = 0;
|
virtual IStreamingReporter* create( ReporterConfig const& config ) const = 0;
|
||||||
virtual std::string getDescription() const = 0;
|
virtual std::string getDescription() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -92,11 +322,11 @@ namespace Catch
|
||||||
typedef std::map<std::string, IReporterFactory*> FactoryMap;
|
typedef std::map<std::string, IReporterFactory*> FactoryMap;
|
||||||
|
|
||||||
virtual ~IReporterRegistry();
|
virtual ~IReporterRegistry();
|
||||||
virtual IReporter* create( const std::string& name, const ReporterConfig& config ) const = 0;
|
virtual IStreamingReporter* create( std::string const& name, Ptr<IConfig> const& config ) const = 0;
|
||||||
virtual const FactoryMap& getFactories() const = 0;
|
virtual FactoryMap const& getFactories() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline std::string trim( const std::string& str ) {
|
inline std::string trim( std::string const& str ) {
|
||||||
std::string::size_type start = str.find_first_not_of( "\n\r\t " );
|
std::string::size_type start = str.find_first_not_of( "\n\r\t " );
|
||||||
std::string::size_type end = str.find_last_not_of( "\n\r\t " );
|
std::string::size_type end = str.find_last_not_of( "\n\r\t " );
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
class TestCaseInfo;
|
class TestCase;
|
||||||
|
|
||||||
struct IRunner {
|
struct IRunner {
|
||||||
virtual ~IRunner();
|
virtual ~IRunner();
|
||||||
|
|
|
@ -22,12 +22,12 @@ namespace Catch {
|
||||||
virtual ~ITestCase();
|
virtual ~ITestCase();
|
||||||
};
|
};
|
||||||
|
|
||||||
class TestCaseInfo;
|
class TestCase;
|
||||||
|
|
||||||
struct ITestCaseRegistry {
|
struct ITestCaseRegistry {
|
||||||
virtual ~ITestCaseRegistry();
|
virtual ~ITestCaseRegistry();
|
||||||
virtual const std::vector<TestCaseInfo>& getAllTests() const = 0;
|
virtual std::vector<TestCase> const& getAllTests() const = 0;
|
||||||
virtual std::vector<TestCaseInfo> getMatchingTestCases( const std::string& rawTestSpec ) const = 0;
|
virtual std::vector<TestCase> getMatchingTestCases( std::string const& rawTestSpec ) const = 0;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* Created by Phil on 6th April 2013.
|
||||||
|
* Copyright 2013 Two Blue Cubes Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED
|
||||||
|
#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED
|
||||||
|
|
||||||
|
#include "catch_interfaces_reporter.h"
|
||||||
|
|
||||||
|
namespace Catch
|
||||||
|
{
|
||||||
|
class LegacyReporterAdapter : public SharedImpl<IStreamingReporter>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
LegacyReporterAdapter( Ptr<IReporter> const& legacyReporter );
|
||||||
|
virtual ~LegacyReporterAdapter();
|
||||||
|
|
||||||
|
virtual ReporterPreferences getPreferences() const;
|
||||||
|
virtual void noMatchingTestCases( std::string const& );
|
||||||
|
virtual void testRunStarting( TestRunInfo const& );
|
||||||
|
virtual void testGroupStarting( GroupInfo const& groupInfo );
|
||||||
|
virtual void testCaseStarting( TestCaseInfo const& testInfo );
|
||||||
|
virtual void sectionStarting( SectionInfo const& sectionInfo );
|
||||||
|
virtual void assertionStarting( AssertionInfo const& );
|
||||||
|
virtual void assertionEnded( AssertionStats const& assertionStats );
|
||||||
|
virtual void sectionEnded( SectionStats const& sectionStats );
|
||||||
|
virtual void testCaseEnded( TestCaseStats const& testCaseStats );
|
||||||
|
virtual void testGroupEnded( TestGroupStats const& testGroupStats );
|
||||||
|
virtual void testRunEnded( TestRunStats const& testRunStats );
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ptr<IReporter> m_legacyReporter;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED
|
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
* Created by Phil on 6th April 2013.
|
||||||
|
* Copyright 2013 Two Blue Cubes Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED
|
||||||
|
#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include "catch_legacy_reporter_adapter.h"
|
||||||
|
|
||||||
|
namespace Catch
|
||||||
|
{
|
||||||
|
LegacyReporterAdapter::LegacyReporterAdapter( Ptr<IReporter> const& legacyReporter )
|
||||||
|
: m_legacyReporter( legacyReporter )
|
||||||
|
{}
|
||||||
|
LegacyReporterAdapter::~LegacyReporterAdapter() {}
|
||||||
|
|
||||||
|
ReporterPreferences LegacyReporterAdapter::getPreferences() const {
|
||||||
|
ReporterPreferences prefs;
|
||||||
|
prefs.shouldRedirectStdOut = m_legacyReporter->shouldRedirectStdout();
|
||||||
|
return prefs;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LegacyReporterAdapter::noMatchingTestCases( std::string const& ) {}
|
||||||
|
void LegacyReporterAdapter::testRunStarting( TestRunInfo const& ) {
|
||||||
|
m_legacyReporter->StartTesting();
|
||||||
|
}
|
||||||
|
void LegacyReporterAdapter::testGroupStarting( GroupInfo const& groupInfo ) {
|
||||||
|
m_legacyReporter->StartGroup( groupInfo.name );
|
||||||
|
}
|
||||||
|
void LegacyReporterAdapter::testCaseStarting( TestCaseInfo const& testInfo ) {
|
||||||
|
m_legacyReporter->StartTestCase( testInfo );
|
||||||
|
}
|
||||||
|
void LegacyReporterAdapter::sectionStarting( SectionInfo const& sectionInfo ) {
|
||||||
|
m_legacyReporter->StartSection( sectionInfo.name, sectionInfo.description );
|
||||||
|
}
|
||||||
|
void LegacyReporterAdapter::assertionStarting( AssertionInfo const& ) {
|
||||||
|
// Not on legacy interface
|
||||||
|
}
|
||||||
|
|
||||||
|
void LegacyReporterAdapter::assertionEnded( AssertionStats const& assertionStats ) {
|
||||||
|
if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) {
|
||||||
|
for( std::vector<MessageInfo>::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end();
|
||||||
|
it != itEnd;
|
||||||
|
++it ) {
|
||||||
|
if( it->type == ResultWas::Info ) {
|
||||||
|
ExpressionResultBuilder expressionBuilder( it->type );
|
||||||
|
expressionBuilder << it->message;
|
||||||
|
AssertionInfo info( it->macroName, it->lineInfo, "", ResultDisposition::Normal );
|
||||||
|
AssertionResult result = expressionBuilder.buildResult( info );
|
||||||
|
m_legacyReporter->Result( result );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_legacyReporter->Result( assertionStats.assertionResult );
|
||||||
|
}
|
||||||
|
void LegacyReporterAdapter::sectionEnded( SectionStats const& sectionStats ) {
|
||||||
|
if( sectionStats.missingAssertions )
|
||||||
|
m_legacyReporter->NoAssertionsInSection( sectionStats.sectionInfo.name );
|
||||||
|
m_legacyReporter->EndSection( sectionStats.sectionInfo.name, sectionStats.assertions );
|
||||||
|
}
|
||||||
|
void LegacyReporterAdapter::testCaseEnded( TestCaseStats const& testCaseStats ) {
|
||||||
|
if( testCaseStats.missingAssertions )
|
||||||
|
m_legacyReporter->NoAssertionsInTestCase( testCaseStats.testInfo.name );
|
||||||
|
m_legacyReporter->EndTestCase
|
||||||
|
( testCaseStats.testInfo,
|
||||||
|
testCaseStats.totals,
|
||||||
|
testCaseStats.stdOut,
|
||||||
|
testCaseStats.stdErr );
|
||||||
|
}
|
||||||
|
void LegacyReporterAdapter::testGroupEnded( TestGroupStats const& testGroupStats ) {
|
||||||
|
if( testGroupStats.aborting )
|
||||||
|
m_legacyReporter->Aborted();
|
||||||
|
m_legacyReporter->EndGroup( testGroupStats.groupInfo.name, testGroupStats.totals );
|
||||||
|
}
|
||||||
|
void LegacyReporterAdapter::testRunEnded( TestRunStats const& testRunStats ) {
|
||||||
|
m_legacyReporter->EndTesting( testRunStats.totals );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED
|
|
@ -9,10 +9,14 @@
|
||||||
#define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED
|
#define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED
|
||||||
|
|
||||||
#include "catch_commandline.hpp"
|
#include "catch_commandline.hpp"
|
||||||
|
#include "catch_text.h"
|
||||||
|
#include "catch_console_colour.hpp"
|
||||||
|
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
inline bool matchesFilters( const std::vector<TestCaseFilters>& filters, const TestCaseInfo& testCase ) {
|
inline bool matchesFilters( std::vector<TestCaseFilters> const& filters, TestCase const& testCase ) {
|
||||||
std::vector<TestCaseFilters>::const_iterator it = filters.begin();
|
std::vector<TestCaseFilters>::const_iterator it = filters.begin();
|
||||||
std::vector<TestCaseFilters>::const_iterator itEnd = filters.end();
|
std::vector<TestCaseFilters>::const_iterator itEnd = filters.end();
|
||||||
for(; it != itEnd; ++it )
|
for(; it != itEnd; ++it )
|
||||||
|
@ -20,47 +24,173 @@ namespace Catch {
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
inline void List( const ConfigData& config ) {
|
|
||||||
|
|
||||||
if( config.listSpec & List::Reports ) {
|
inline std::size_t listTests( Config const& config ) {
|
||||||
std::cout << "Available reports:\n";
|
if( config.filters().empty() )
|
||||||
IReporterRegistry::FactoryMap::const_iterator it = getRegistryHub().getReporterRegistry().getFactories().begin();
|
|
||||||
IReporterRegistry::FactoryMap::const_iterator itEnd = getRegistryHub().getReporterRegistry().getFactories().end();
|
|
||||||
for(; it != itEnd; ++it ) {
|
|
||||||
// !TBD: consider listAs()
|
|
||||||
std::cout << "\t" << it->first << "\n\t\t'" << it->second->getDescription() << "'\n";
|
|
||||||
}
|
|
||||||
std::cout << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( config.listSpec & List::Tests ) {
|
|
||||||
if( config.filters.empty() )
|
|
||||||
std::cout << "All available test cases:\n";
|
std::cout << "All available test cases:\n";
|
||||||
else
|
else
|
||||||
std::cout << "Matching test cases:\n";
|
std::cout << "Matching test cases:\n";
|
||||||
std::vector<TestCaseInfo>::const_iterator it = getRegistryHub().getTestCaseRegistry().getAllTests().begin();
|
std::vector<TestCase> const& allTests = getRegistryHub().getTestCaseRegistry().getAllTests();
|
||||||
std::vector<TestCaseInfo>::const_iterator itEnd = getRegistryHub().getTestCaseRegistry().getAllTests().end();
|
std::vector<TestCase>::const_iterator it = allTests.begin(), itEnd = allTests.end();
|
||||||
std::size_t matchedTests = 0;
|
|
||||||
|
// First pass - get max tags
|
||||||
|
std::size_t maxTagLen = 0;
|
||||||
|
std::size_t maxNameLen = 0;
|
||||||
for(; it != itEnd; ++it ) {
|
for(; it != itEnd; ++it ) {
|
||||||
if( matchesFilters( config.filters, *it ) ) {
|
if( matchesFilters( config.filters(), *it ) ) {
|
||||||
matchedTests++;
|
maxTagLen = (std::max)( it->getTestCaseInfo().tagsAsString.size(), maxTagLen );
|
||||||
// !TBD: consider listAs()
|
maxNameLen = (std::max)( it->getTestCaseInfo().name.size(), maxNameLen );
|
||||||
std::cout << "\t" << it->getName() << "\n";
|
|
||||||
if( ( config.listSpec & List::TestNames ) != List::TestNames )
|
|
||||||
std::cout << "\t\t '" << it->getDescription() << "'\n";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( config.filters.empty() )
|
|
||||||
std::cout << pluralise( matchedTests, "test case" ) << std::endl;
|
|
||||||
else
|
|
||||||
std::cout << pluralise( matchedTests, "matching test case" ) << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( ( config.listSpec & List::All ) == 0 ) {
|
// Try to fit everything in. If not shrink tag column first, down to 30
|
||||||
std::ostringstream oss;
|
// then shrink name column until it all fits (strings will be wrapped within column)
|
||||||
oss << "Unknown list type";
|
while( maxTagLen + maxNameLen > CATCH_CONFIG_CONSOLE_WIDTH-5 ) {
|
||||||
throw std::domain_error( oss.str() );
|
if( maxTagLen > 30 )
|
||||||
|
--maxTagLen;
|
||||||
|
else
|
||||||
|
--maxNameLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::size_t matchedTests = 0;
|
||||||
|
for( it = allTests.begin(); it != itEnd; ++it ) {
|
||||||
|
if( matchesFilters( config.filters(), *it ) ) {
|
||||||
|
matchedTests++;
|
||||||
|
Text nameWrapper( it->getTestCaseInfo().name,
|
||||||
|
TextAttributes()
|
||||||
|
.setWidth( maxNameLen )
|
||||||
|
.setInitialIndent(2)
|
||||||
|
.setIndent(4) );
|
||||||
|
|
||||||
|
Text tagsWrapper( it->getTestCaseInfo().tagsAsString,
|
||||||
|
TextAttributes()
|
||||||
|
.setWidth( maxTagLen )
|
||||||
|
.setInitialIndent(0)
|
||||||
|
.setIndent( 2 ) );
|
||||||
|
|
||||||
|
for( std::size_t i = 0; i < std::max( nameWrapper.size(), tagsWrapper.size() ); ++i ) {
|
||||||
|
Colour::Code colour = Colour::None;
|
||||||
|
if( it->getTestCaseInfo().isHidden )
|
||||||
|
colour = Colour::SecondaryText;
|
||||||
|
std::string nameCol;
|
||||||
|
if( i < nameWrapper.size() ) {
|
||||||
|
nameCol = nameWrapper[i];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nameCol = " ...";
|
||||||
|
colour = Colour::SecondaryText;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
Colour colourGuard( colour );
|
||||||
|
std::cout << nameCol;
|
||||||
|
}
|
||||||
|
if( i < tagsWrapper.size() && !tagsWrapper[i].empty() ) {
|
||||||
|
if( i == 0 ) {
|
||||||
|
Colour colourGuard( Colour::SecondaryText );
|
||||||
|
std::cout << " " << std::string( maxNameLen - nameCol.size(), '.' ) << " ";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
std::cout << std::string( maxNameLen - nameCol.size(), ' ' ) << " ";
|
||||||
|
}
|
||||||
|
std::cout << tagsWrapper[i];
|
||||||
|
}
|
||||||
|
std::cout << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( config.filters().empty() )
|
||||||
|
std::cout << pluralise( matchedTests, "test case" ) << "\n" << std::endl;
|
||||||
|
else
|
||||||
|
std::cout << pluralise( matchedTests, "matching test case" ) << "\n" << std::endl;
|
||||||
|
return matchedTests;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::size_t listTags( Config const& config ) {
|
||||||
|
if( config.filters().empty() )
|
||||||
|
std::cout << "All available tags:\n";
|
||||||
|
else
|
||||||
|
std::cout << "Matching tags:\n";
|
||||||
|
std::vector<TestCase> const& allTests = getRegistryHub().getTestCaseRegistry().getAllTests();
|
||||||
|
std::vector<TestCase>::const_iterator it = allTests.begin(), itEnd = allTests.end();
|
||||||
|
|
||||||
|
std::map<std::string, int> tagCounts;
|
||||||
|
|
||||||
|
std::size_t maxTagLen = 0;
|
||||||
|
|
||||||
|
for(; it != itEnd; ++it ) {
|
||||||
|
if( matchesFilters( config.filters(), *it ) ) {
|
||||||
|
for( std::set<std::string>::const_iterator tagIt = it->getTestCaseInfo().tags.begin(),
|
||||||
|
tagItEnd = it->getTestCaseInfo().tags.end();
|
||||||
|
tagIt != tagItEnd;
|
||||||
|
++tagIt ) {
|
||||||
|
std::string tagName = *tagIt;
|
||||||
|
maxTagLen = (std::max)( maxTagLen, tagName.size() );
|
||||||
|
std::map<std::string, int>::iterator countIt = tagCounts.find( tagName );
|
||||||
|
if( countIt == tagCounts.end() )
|
||||||
|
tagCounts.insert( std::make_pair( tagName, 1 ) );
|
||||||
|
else
|
||||||
|
countIt->second++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
maxTagLen +=4;
|
||||||
|
if( maxTagLen > CATCH_CONFIG_CONSOLE_WIDTH-10 )
|
||||||
|
maxTagLen = CATCH_CONFIG_CONSOLE_WIDTH-10;
|
||||||
|
|
||||||
|
for( std::map<std::string, int>::const_iterator countIt = tagCounts.begin(), countItEnd = tagCounts.end();
|
||||||
|
countIt != countItEnd;
|
||||||
|
++countIt ) {
|
||||||
|
Text wrapper( "[" + countIt->first + "]", TextAttributes()
|
||||||
|
.setIndent(2)
|
||||||
|
.setWidth( maxTagLen ) );
|
||||||
|
std::cout << wrapper;
|
||||||
|
std::size_t dots = 2;
|
||||||
|
if( maxTagLen > wrapper.last().size() )
|
||||||
|
dots += maxTagLen - wrapper.last().size();
|
||||||
|
{
|
||||||
|
Colour colourGuard( Colour::SecondaryText );
|
||||||
|
std::cout << std::string( dots, '.' );
|
||||||
|
}
|
||||||
|
std::cout << countIt->second
|
||||||
|
<< "\n";
|
||||||
|
}
|
||||||
|
std::cout << pluralise( tagCounts.size(), "tag" ) << "\n" << std::endl;
|
||||||
|
return tagCounts.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline std::size_t listReporters( Config const& /*config*/ ) {
|
||||||
|
std::cout << "Available reports:\n";
|
||||||
|
IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories();
|
||||||
|
IReporterRegistry::FactoryMap::const_iterator itBegin = factories.begin(), itEnd = factories.end(), it;
|
||||||
|
std::size_t maxNameLen = 0;
|
||||||
|
for(it = itBegin; it != itEnd; ++it )
|
||||||
|
maxNameLen = (std::max)( maxNameLen, it->first.size() );
|
||||||
|
|
||||||
|
for(it = itBegin; it != itEnd; ++it ) {
|
||||||
|
Text wrapper( it->second->getDescription(), TextAttributes()
|
||||||
|
.setInitialIndent( 0 )
|
||||||
|
.setIndent( 7+maxNameLen )
|
||||||
|
.setWidth( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) );
|
||||||
|
std::cout << " "
|
||||||
|
<< it->first
|
||||||
|
<< ":"
|
||||||
|
<< std::string( maxNameLen - it->first.size() + 2, ' ' )
|
||||||
|
<< wrapper << "\n";
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
return factories.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Option<std::size_t> list( Config const& config ) {
|
||||||
|
Option<std::size_t> listedCount;
|
||||||
|
if( config.listTests() )
|
||||||
|
listedCount = listedCount.valueOr(0) + listTests( config );
|
||||||
|
if( config.listTags() )
|
||||||
|
listedCount = listedCount.valueOr(0) + listTags( config );
|
||||||
|
if( config.listReporters() )
|
||||||
|
listedCount = listedCount.valueOr(0) + listReporters( config );
|
||||||
|
return listedCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // end namespace Catch
|
} // end namespace Catch
|
||||||
|
|
|
@ -19,7 +19,7 @@ namespace Matchers {
|
||||||
|
|
||||||
virtual ~Matcher() {}
|
virtual ~Matcher() {}
|
||||||
virtual Ptr<Matcher> clone() const = 0;
|
virtual Ptr<Matcher> clone() const = 0;
|
||||||
virtual bool match( const ExpressionT& expr ) const = 0;
|
virtual bool match( ExpressionT const& expr ) const = 0;
|
||||||
virtual std::string toString() const = 0;
|
virtual std::string toString() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ namespace Matchers {
|
||||||
struct MatcherImpl : Matcher<ExpressionT> {
|
struct MatcherImpl : Matcher<ExpressionT> {
|
||||||
|
|
||||||
virtual Ptr<Matcher<ExpressionT> > clone() const {
|
virtual Ptr<Matcher<ExpressionT> > clone() const {
|
||||||
return Ptr<Matcher<ExpressionT> >( new DerivedT( static_cast<const DerivedT&>( *this ) ) );
|
return Ptr<Matcher<ExpressionT> >( new DerivedT( static_cast<DerivedT const&>( *this ) ) );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -38,13 +38,13 @@ namespace Matchers {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
AllOf() {}
|
AllOf() {}
|
||||||
AllOf( const AllOf& other ) : m_matchers( other.m_matchers ) {}
|
AllOf( AllOf const& other ) : m_matchers( other.m_matchers ) {}
|
||||||
|
|
||||||
AllOf& add( const Matcher<ExpressionT>& matcher ) {
|
AllOf& add( Matcher<ExpressionT> const& matcher ) {
|
||||||
m_matchers.push_back( matcher.clone() );
|
m_matchers.push_back( matcher.clone() );
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
virtual bool match( const ExpressionT& expr ) const
|
virtual bool match( ExpressionT const& expr ) const
|
||||||
{
|
{
|
||||||
for( std::size_t i = 0; i < m_matchers.size(); ++i )
|
for( std::size_t i = 0; i < m_matchers.size(); ++i )
|
||||||
if( !m_matchers[i]->match( expr ) )
|
if( !m_matchers[i]->match( expr ) )
|
||||||
|
@ -72,13 +72,13 @@ namespace Matchers {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
AnyOf() {}
|
AnyOf() {}
|
||||||
AnyOf( const AnyOf& other ) : m_matchers( other.m_matchers ) {}
|
AnyOf( AnyOf const& other ) : m_matchers( other.m_matchers ) {}
|
||||||
|
|
||||||
AnyOf& add( const Matcher<ExpressionT>& matcher ) {
|
AnyOf& add( Matcher<ExpressionT> const& matcher ) {
|
||||||
m_matchers.push_back( matcher.clone() );
|
m_matchers.push_back( matcher.clone() );
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
virtual bool match( const ExpressionT& expr ) const
|
virtual bool match( ExpressionT const& expr ) const
|
||||||
{
|
{
|
||||||
for( std::size_t i = 0; i < m_matchers.size(); ++i )
|
for( std::size_t i = 0; i < m_matchers.size(); ++i )
|
||||||
if( m_matchers[i]->match( expr ) )
|
if( m_matchers[i]->match( expr ) )
|
||||||
|
@ -105,13 +105,16 @@ namespace Matchers {
|
||||||
|
|
||||||
namespace StdString {
|
namespace StdString {
|
||||||
|
|
||||||
|
inline std::string makeString( std::string const& str ) { return str; }
|
||||||
|
inline std::string makeString( const char* str ) { return str ? std::string( str ) : std::string(); }
|
||||||
|
|
||||||
struct Equals : MatcherImpl<Equals, std::string> {
|
struct Equals : MatcherImpl<Equals, std::string> {
|
||||||
Equals( const std::string& str ) : m_str( str ){}
|
Equals( std::string const& str ) : m_str( str ){}
|
||||||
Equals( const Equals& other ) : m_str( other.m_str ){}
|
Equals( Equals const& other ) : m_str( other.m_str ){}
|
||||||
|
|
||||||
virtual ~Equals();
|
virtual ~Equals();
|
||||||
|
|
||||||
virtual bool match( const std::string& expr ) const {
|
virtual bool match( std::string const& expr ) const {
|
||||||
return m_str == expr;
|
return m_str == expr;
|
||||||
}
|
}
|
||||||
virtual std::string toString() const {
|
virtual std::string toString() const {
|
||||||
|
@ -122,12 +125,12 @@ namespace Matchers {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Contains : MatcherImpl<Contains, std::string> {
|
struct Contains : MatcherImpl<Contains, std::string> {
|
||||||
Contains( const std::string& substr ) : m_substr( substr ){}
|
Contains( std::string const& substr ) : m_substr( substr ){}
|
||||||
Contains( const Contains& other ) : m_substr( other.m_substr ){}
|
Contains( Contains const& other ) : m_substr( other.m_substr ){}
|
||||||
|
|
||||||
virtual ~Contains();
|
virtual ~Contains();
|
||||||
|
|
||||||
virtual bool match( const std::string& expr ) const {
|
virtual bool match( std::string const& expr ) const {
|
||||||
return expr.find( m_substr ) != std::string::npos;
|
return expr.find( m_substr ) != std::string::npos;
|
||||||
}
|
}
|
||||||
virtual std::string toString() const {
|
virtual std::string toString() const {
|
||||||
|
@ -138,12 +141,12 @@ namespace Matchers {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct StartsWith : MatcherImpl<StartsWith, std::string> {
|
struct StartsWith : MatcherImpl<StartsWith, std::string> {
|
||||||
StartsWith( const std::string& substr ) : m_substr( substr ){}
|
StartsWith( std::string const& substr ) : m_substr( substr ){}
|
||||||
StartsWith( const StartsWith& other ) : m_substr( other.m_substr ){}
|
StartsWith( StartsWith const& other ) : m_substr( other.m_substr ){}
|
||||||
|
|
||||||
virtual ~StartsWith();
|
virtual ~StartsWith();
|
||||||
|
|
||||||
virtual bool match( const std::string& expr ) const {
|
virtual bool match( std::string const& expr ) const {
|
||||||
return expr.find( m_substr ) == 0;
|
return expr.find( m_substr ) == 0;
|
||||||
}
|
}
|
||||||
virtual std::string toString() const {
|
virtual std::string toString() const {
|
||||||
|
@ -154,12 +157,12 @@ namespace Matchers {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct EndsWith : MatcherImpl<EndsWith, std::string> {
|
struct EndsWith : MatcherImpl<EndsWith, std::string> {
|
||||||
EndsWith( const std::string& substr ) : m_substr( substr ){}
|
EndsWith( std::string const& substr ) : m_substr( substr ){}
|
||||||
EndsWith( const EndsWith& other ) : m_substr( other.m_substr ){}
|
EndsWith( EndsWith const& other ) : m_substr( other.m_substr ){}
|
||||||
|
|
||||||
virtual ~EndsWith();
|
virtual ~EndsWith();
|
||||||
|
|
||||||
virtual bool match( const std::string& expr ) const {
|
virtual bool match( std::string const& expr ) const {
|
||||||
return expr.find( m_substr ) == expr.size() - m_substr.size();
|
return expr.find( m_substr ) == expr.size() - m_substr.size();
|
||||||
}
|
}
|
||||||
virtual std::string toString() const {
|
virtual std::string toString() const {
|
||||||
|
@ -174,32 +177,52 @@ namespace Matchers {
|
||||||
// The following functions create the actual matcher objects.
|
// The following functions create the actual matcher objects.
|
||||||
// This allows the types to be inferred
|
// This allows the types to be inferred
|
||||||
template<typename ExpressionT>
|
template<typename ExpressionT>
|
||||||
inline Impl::Generic::AllOf<ExpressionT> AllOf( const Impl::Matcher<ExpressionT>& m1,
|
inline Impl::Generic::AllOf<ExpressionT> AllOf( Impl::Matcher<ExpressionT> const& m1,
|
||||||
const Impl::Matcher<ExpressionT>& m2 ) {
|
Impl::Matcher<ExpressionT> const& m2 ) {
|
||||||
return Impl::Generic::AllOf<ExpressionT>().add( m1 ).add( m2 );
|
return Impl::Generic::AllOf<ExpressionT>().add( m1 ).add( m2 );
|
||||||
}
|
}
|
||||||
template<typename ExpressionT>
|
template<typename ExpressionT>
|
||||||
inline Impl::Generic::AllOf<ExpressionT> AllOf( const Impl::Matcher<ExpressionT>& m1,
|
inline Impl::Generic::AllOf<ExpressionT> AllOf( Impl::Matcher<ExpressionT> const& m1,
|
||||||
const Impl::Matcher<ExpressionT>& m2,
|
Impl::Matcher<ExpressionT> const& m2,
|
||||||
const Impl::Matcher<ExpressionT>& m3 ) {
|
Impl::Matcher<ExpressionT> const& m3 ) {
|
||||||
return Impl::Generic::AllOf<ExpressionT>().add( m1 ).add( m2 ).add( m3 );
|
return Impl::Generic::AllOf<ExpressionT>().add( m1 ).add( m2 ).add( m3 );
|
||||||
}
|
}
|
||||||
template<typename ExpressionT>
|
template<typename ExpressionT>
|
||||||
inline Impl::Generic::AnyOf<ExpressionT> AnyOf( const Impl::Matcher<ExpressionT>& m1,
|
inline Impl::Generic::AnyOf<ExpressionT> AnyOf( Impl::Matcher<ExpressionT> const& m1,
|
||||||
const Impl::Matcher<ExpressionT>& m2 ) {
|
Impl::Matcher<ExpressionT> const& m2 ) {
|
||||||
return Impl::Generic::AnyOf<ExpressionT>().add( m1 ).add( m2 );
|
return Impl::Generic::AnyOf<ExpressionT>().add( m1 ).add( m2 );
|
||||||
}
|
}
|
||||||
template<typename ExpressionT>
|
template<typename ExpressionT>
|
||||||
inline Impl::Generic::AnyOf<ExpressionT> AnyOf( const Impl::Matcher<ExpressionT>& m1,
|
inline Impl::Generic::AnyOf<ExpressionT> AnyOf( Impl::Matcher<ExpressionT> const& m1,
|
||||||
const Impl::Matcher<ExpressionT>& m2,
|
Impl::Matcher<ExpressionT> const& m2,
|
||||||
const Impl::Matcher<ExpressionT>& m3 ) {
|
Impl::Matcher<ExpressionT> const& m3 ) {
|
||||||
return Impl::Generic::AnyOf<ExpressionT>().add( m1 ).add( m2 ).add( m3 );
|
return Impl::Generic::AnyOf<ExpressionT>().add( m1 ).add( m2 ).add( m3 );
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Impl::StdString::Equals Equals( const std::string& str ){ return Impl::StdString::Equals( str ); }
|
inline Impl::StdString::Equals Equals( std::string const& str ) {
|
||||||
inline Impl::StdString::Contains Contains( const std::string& substr ){ return Impl::StdString::Contains( substr ); }
|
return Impl::StdString::Equals( str );
|
||||||
inline Impl::StdString::StartsWith StartsWith( const std::string& substr ){ return Impl::StdString::StartsWith( substr ); }
|
}
|
||||||
inline Impl::StdString::EndsWith EndsWith( const std::string& substr ){ return Impl::StdString::EndsWith( substr ); }
|
inline Impl::StdString::Equals Equals( const char* str ) {
|
||||||
|
return Impl::StdString::Equals( Impl::StdString::makeString( str ) );
|
||||||
|
}
|
||||||
|
inline Impl::StdString::Contains Contains( std::string const& substr ) {
|
||||||
|
return Impl::StdString::Contains( substr );
|
||||||
|
}
|
||||||
|
inline Impl::StdString::Contains Contains( const char* substr ) {
|
||||||
|
return Impl::StdString::Contains( Impl::StdString::makeString( substr ) );
|
||||||
|
}
|
||||||
|
inline Impl::StdString::StartsWith StartsWith( std::string const& substr ) {
|
||||||
|
return Impl::StdString::StartsWith( substr );
|
||||||
|
}
|
||||||
|
inline Impl::StdString::StartsWith StartsWith( const char* substr ) {
|
||||||
|
return Impl::StdString::StartsWith( Impl::StdString::makeString( substr ) );
|
||||||
|
}
|
||||||
|
inline Impl::StdString::EndsWith EndsWith( std::string const& substr ) {
|
||||||
|
return Impl::StdString::EndsWith( substr );
|
||||||
|
}
|
||||||
|
inline Impl::StdString::EndsWith EndsWith( const char* substr ) {
|
||||||
|
return Impl::StdString::EndsWith( Impl::StdString::makeString( substr ) );
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Matchers
|
} // namespace Matchers
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
* Created by Phil Nash on 1/2/2013.
|
||||||
|
* Copyright 2013 Two Blue Cubes Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED
|
||||||
|
#define TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include "catch_result_type.h"
|
||||||
|
#include "catch_common.h"
|
||||||
|
|
||||||
|
namespace Catch {
|
||||||
|
|
||||||
|
struct MessageInfo {
|
||||||
|
MessageInfo( std::string const& _macroName,
|
||||||
|
SourceLineInfo const& _lineInfo,
|
||||||
|
ResultWas::OfType _type );
|
||||||
|
|
||||||
|
std::string macroName;
|
||||||
|
SourceLineInfo lineInfo;
|
||||||
|
ResultWas::OfType type;
|
||||||
|
std::string message;
|
||||||
|
unsigned int sequence;
|
||||||
|
|
||||||
|
bool operator == ( MessageInfo const& other ) const {
|
||||||
|
return sequence == other.sequence;
|
||||||
|
}
|
||||||
|
bool operator < ( MessageInfo const& other ) const {
|
||||||
|
return sequence < other.sequence;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
static unsigned int globalCount;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class MessageBuilder : public MessageInfo {
|
||||||
|
public:
|
||||||
|
MessageBuilder( std::string const& _macroName,
|
||||||
|
SourceLineInfo const& _lineInfo,
|
||||||
|
ResultWas::OfType _type );
|
||||||
|
|
||||||
|
MessageInfo build() const;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
MessageBuilder& operator << ( T const& _value ) {
|
||||||
|
stream << _value;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
std::ostringstream stream;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ScopedMessageBuilder : public MessageBuilder {
|
||||||
|
public:
|
||||||
|
ScopedMessageBuilder( std::string const& _macroName,
|
||||||
|
SourceLineInfo const& _lineInfo,
|
||||||
|
ResultWas::OfType _type );
|
||||||
|
~ScopedMessageBuilder();
|
||||||
|
};
|
||||||
|
|
||||||
|
} // end namespace Catch
|
||||||
|
|
||||||
|
#endif // TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED
|
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
* Created by Phil Nash on 1/2/2013.
|
||||||
|
* Copyright 2013 Two Blue Cubes Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED
|
||||||
|
#define TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include "catch_message.h"
|
||||||
|
|
||||||
|
namespace Catch {
|
||||||
|
|
||||||
|
MessageInfo::MessageInfo( std::string const& _macroName,
|
||||||
|
SourceLineInfo const& _lineInfo,
|
||||||
|
ResultWas::OfType _type )
|
||||||
|
: macroName( _macroName ),
|
||||||
|
lineInfo( _lineInfo ),
|
||||||
|
type( _type ),
|
||||||
|
sequence( ++globalCount )
|
||||||
|
{}
|
||||||
|
|
||||||
|
// This may need protecting if threading support is added
|
||||||
|
unsigned int MessageInfo::globalCount = 0;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
MessageBuilder::MessageBuilder( std::string const& _macroName,
|
||||||
|
SourceLineInfo const& _lineInfo,
|
||||||
|
ResultWas::OfType _type )
|
||||||
|
: MessageInfo( _macroName, _lineInfo, _type )
|
||||||
|
{}
|
||||||
|
|
||||||
|
MessageInfo MessageBuilder::build() const {
|
||||||
|
MessageInfo message = *this;
|
||||||
|
message.message = stream.str();
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
ScopedMessageBuilder::ScopedMessageBuilder
|
||||||
|
( std::string const& _macroName,
|
||||||
|
SourceLineInfo const& _lineInfo,
|
||||||
|
ResultWas::OfType _type )
|
||||||
|
: MessageBuilder( _macroName, _lineInfo, _type )
|
||||||
|
{}
|
||||||
|
|
||||||
|
ScopedMessageBuilder::~ScopedMessageBuilder() {
|
||||||
|
getResultCapture().popScopedMessage( *this );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // end namespace Catch
|
||||||
|
|
||||||
|
#endif // TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED
|
|
@ -16,7 +16,7 @@ namespace Catch {
|
||||||
class NotImplementedException : public std::exception
|
class NotImplementedException : public std::exception
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
NotImplementedException( const SourceLineInfo& lineInfo );
|
NotImplementedException( SourceLineInfo const& lineInfo );
|
||||||
|
|
||||||
virtual ~NotImplementedException() throw() {}
|
virtual ~NotImplementedException() throw() {}
|
||||||
|
|
||||||
|
|
|
@ -13,10 +13,10 @@
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
NotImplementedException::NotImplementedException( const SourceLineInfo& lineInfo )
|
NotImplementedException::NotImplementedException( SourceLineInfo const& lineInfo )
|
||||||
: m_lineInfo( lineInfo ) {
|
: m_lineInfo( lineInfo ) {
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << lineInfo << "function ";
|
oss << lineInfo << ": function ";
|
||||||
oss << "not implemented";
|
oss << "not implemented";
|
||||||
m_what = oss.str();
|
m_what = oss.str();
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,13 +56,13 @@ namespace Catch {
|
||||||
|
|
||||||
namespace Detail{
|
namespace Detail{
|
||||||
|
|
||||||
inline bool startsWith( const std::string& str, const std::string& sub ) {
|
inline bool startsWith( std::string const& str, std::string const& sub ) {
|
||||||
return str.length() > sub.length() && str.substr( 0, sub.length() ) == sub;
|
return str.length() > sub.length() && str.substr( 0, sub.length() ) == sub;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::string getAnnotation( Class cls,
|
inline std::string getAnnotation( Class cls,
|
||||||
const std::string& annotationName,
|
std::string const& annotationName,
|
||||||
const std::string& testCaseName ) {
|
std::string const& testCaseName ) {
|
||||||
NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()];
|
NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()];
|
||||||
SEL sel = NSSelectorFromString( selStr );
|
SEL sel = NSSelectorFromString( selStr );
|
||||||
arcSafeRelease( selStr );
|
arcSafeRelease( selStr );
|
||||||
|
@ -94,7 +94,7 @@ namespace Catch {
|
||||||
std::string desc = Detail::getAnnotation( cls, "Description", testCaseName );
|
std::string desc = Detail::getAnnotation( cls, "Description", testCaseName );
|
||||||
const char* className = class_getName( cls );
|
const char* className = class_getName( cls );
|
||||||
|
|
||||||
getMutableRegistryHub().registerTest( TestCaseInfo( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo() ) );
|
getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo() ) );
|
||||||
noTestMethods++;
|
noTestMethods++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* Created by Phil on 02/12/2012.
|
||||||
|
* Copyright 2012 Two Blue Cubes Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED
|
||||||
|
#define TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include "catch_common.h"
|
||||||
|
|
||||||
|
namespace Catch {
|
||||||
|
|
||||||
|
// An optional type
|
||||||
|
template<typename T>
|
||||||
|
class Option {
|
||||||
|
public:
|
||||||
|
Option() : nullableValue( NULL ) {}
|
||||||
|
Option( T const& _value )
|
||||||
|
: nullableValue( new( storage ) T( _value ) )
|
||||||
|
{}
|
||||||
|
Option( Option const& _other )
|
||||||
|
: nullableValue( _other ? new( storage ) T( *_other ) : NULL )
|
||||||
|
{}
|
||||||
|
|
||||||
|
~Option() {
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
Option& operator= ( Option const& _other ) {
|
||||||
|
reset();
|
||||||
|
if( _other )
|
||||||
|
nullableValue = new( storage ) T( *_other );
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void reset() {
|
||||||
|
if( nullableValue )
|
||||||
|
nullableValue->~T();
|
||||||
|
nullableValue = NULL;
|
||||||
|
}
|
||||||
|
T& operator*() { return *nullableValue; }
|
||||||
|
T const& operator*() const { return *nullableValue; }
|
||||||
|
T* operator->() { return nullableValue; }
|
||||||
|
const T* operator->() const { return nullableValue; }
|
||||||
|
|
||||||
|
T valueOr( T const& defaultValue ) const {
|
||||||
|
return nullableValue ? *nullableValue : defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool some() const { return nullableValue != NULL; }
|
||||||
|
bool none() const { return nullableValue == NULL; }
|
||||||
|
|
||||||
|
bool operator !() const { return nullableValue == NULL; }
|
||||||
|
operator SafeBool::type() const {
|
||||||
|
return SafeBool::makeSafe( some() );
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
T* nullableValue;
|
||||||
|
char storage[sizeof(T)];
|
||||||
|
};
|
||||||
|
|
||||||
|
} // end namespace Catch
|
||||||
|
|
||||||
|
#endif // TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED
|
|
@ -10,6 +10,11 @@
|
||||||
|
|
||||||
#include "catch_common.h"
|
#include "catch_common.h"
|
||||||
|
|
||||||
|
#ifdef __clang__
|
||||||
|
#pragma clang diagnostic push
|
||||||
|
#pragma clang diagnostic ignored "-Wpadded"
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
// An intrusive reference counting smart pointer.
|
// An intrusive reference counting smart pointer.
|
||||||
|
@ -23,7 +28,7 @@ namespace Catch {
|
||||||
if( m_p )
|
if( m_p )
|
||||||
m_p->addRef();
|
m_p->addRef();
|
||||||
}
|
}
|
||||||
Ptr( const Ptr& other ) : m_p( other.m_p ){
|
Ptr( Ptr const& other ) : m_p( other.m_p ){
|
||||||
if( m_p )
|
if( m_p )
|
||||||
m_p->addRef();
|
m_p->addRef();
|
||||||
}
|
}
|
||||||
|
@ -31,38 +36,28 @@ namespace Catch {
|
||||||
if( m_p )
|
if( m_p )
|
||||||
m_p->release();
|
m_p->release();
|
||||||
}
|
}
|
||||||
|
void reset() {
|
||||||
|
if( m_p )
|
||||||
|
m_p->release();
|
||||||
|
m_p = NULL;
|
||||||
|
}
|
||||||
Ptr& operator = ( T* p ){
|
Ptr& operator = ( T* p ){
|
||||||
Ptr temp( p );
|
Ptr temp( p );
|
||||||
swap( temp );
|
swap( temp );
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
Ptr& operator = ( const Ptr& other ){
|
Ptr& operator = ( Ptr const& other ){
|
||||||
Ptr temp( other );
|
Ptr temp( other );
|
||||||
swap( temp );
|
swap( temp );
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
void swap( Ptr& other ){
|
void swap( Ptr& other ) { std::swap( m_p, other.m_p ); }
|
||||||
std::swap( m_p, other.m_p );
|
T* get() { return m_p; }
|
||||||
}
|
const T* get() const{ return m_p; }
|
||||||
|
T& operator*() const { return *m_p; }
|
||||||
T* get(){
|
T* operator->() const { return m_p; }
|
||||||
return m_p;
|
bool operator !() const { return m_p == NULL; }
|
||||||
}
|
operator SafeBool::type() const { return SafeBool::makeSafe( m_p != NULL ); }
|
||||||
const T* get() const{
|
|
||||||
return m_p;
|
|
||||||
}
|
|
||||||
|
|
||||||
T& operator*() const {
|
|
||||||
return *m_p;
|
|
||||||
}
|
|
||||||
|
|
||||||
T* operator->() const {
|
|
||||||
return m_p;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator !() const {
|
|
||||||
return m_p == NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
T* m_p;
|
T* m_p;
|
||||||
|
@ -70,26 +65,30 @@ namespace Catch {
|
||||||
|
|
||||||
struct IShared : NonCopyable {
|
struct IShared : NonCopyable {
|
||||||
virtual ~IShared();
|
virtual ~IShared();
|
||||||
virtual void addRef() = 0;
|
virtual void addRef() const = 0;
|
||||||
virtual void release() = 0;
|
virtual void release() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T = IShared>
|
||||||
struct SharedImpl : T {
|
struct SharedImpl : T {
|
||||||
|
|
||||||
SharedImpl() : m_rc( 0 ){}
|
SharedImpl() : m_rc( 0 ){}
|
||||||
|
|
||||||
virtual void addRef(){
|
virtual void addRef() const {
|
||||||
++m_rc;
|
++m_rc;
|
||||||
}
|
}
|
||||||
virtual void release(){
|
virtual void release() const {
|
||||||
if( --m_rc == 0 )
|
if( --m_rc == 0 )
|
||||||
delete this;
|
delete this;
|
||||||
}
|
}
|
||||||
|
|
||||||
int m_rc;
|
mutable unsigned int m_rc;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace Catch
|
} // end namespace Catch
|
||||||
|
|
||||||
|
#ifdef __clang__
|
||||||
|
#pragma clang diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED
|
#endif // TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED
|
||||||
|
|
|
@ -20,16 +20,16 @@ namespace Catch {
|
||||||
|
|
||||||
class RegistryHub : public IRegistryHub, public IMutableRegistryHub {
|
class RegistryHub : public IRegistryHub, public IMutableRegistryHub {
|
||||||
|
|
||||||
RegistryHub( const RegistryHub& );
|
RegistryHub( RegistryHub const& );
|
||||||
void operator=( const RegistryHub& );
|
void operator=( RegistryHub const& );
|
||||||
|
|
||||||
public: // IRegistryHub
|
public: // IRegistryHub
|
||||||
RegistryHub() {
|
RegistryHub() {
|
||||||
}
|
}
|
||||||
virtual const IReporterRegistry& getReporterRegistry() const {
|
virtual IReporterRegistry const& getReporterRegistry() const {
|
||||||
return m_reporterRegistry;
|
return m_reporterRegistry;
|
||||||
}
|
}
|
||||||
virtual const ITestCaseRegistry& getTestCaseRegistry() const {
|
virtual ITestCaseRegistry const& getTestCaseRegistry() const {
|
||||||
return m_testCaseRegistry;
|
return m_testCaseRegistry;
|
||||||
}
|
}
|
||||||
virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() {
|
virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() {
|
||||||
|
@ -37,10 +37,10 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
|
|
||||||
public: // IMutableRegistryHub
|
public: // IMutableRegistryHub
|
||||||
virtual void registerReporter( const std::string& name, IReporterFactory* factory ) {
|
virtual void registerReporter( std::string const& name, IReporterFactory* factory ) {
|
||||||
m_reporterRegistry.registerReporter( name, factory );
|
m_reporterRegistry.registerReporter( name, factory );
|
||||||
}
|
}
|
||||||
virtual void registerTest( const TestCaseInfo& testInfo ) {
|
virtual void registerTest( TestCase const& testInfo ) {
|
||||||
m_testCaseRegistry.registerTest( testInfo );
|
m_testCaseRegistry.registerTest( testInfo );
|
||||||
}
|
}
|
||||||
virtual void registerTranslator( const IExceptionTranslator* translator ) {
|
virtual void registerTranslator( const IExceptionTranslator* translator ) {
|
||||||
|
|
|
@ -9,15 +9,48 @@
|
||||||
#define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED
|
#define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED
|
||||||
|
|
||||||
#include "catch_interfaces_registry_hub.h"
|
#include "catch_interfaces_registry_hub.h"
|
||||||
|
#include "catch_legacy_reporter_adapter.h"
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class LegacyReporterRegistrar {
|
||||||
|
|
||||||
|
class ReporterFactory : public IReporterFactory {
|
||||||
|
|
||||||
|
virtual IStreamingReporter* create( ReporterConfig const& config ) const {
|
||||||
|
return new LegacyReporterAdapter( new T( config ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual std::string getDescription() const {
|
||||||
|
return T::getDescription();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
LegacyReporterRegistrar( std::string const& name ) {
|
||||||
|
getMutableRegistryHub().registerReporter( name, new ReporterFactory() );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
class ReporterRegistrar {
|
class ReporterRegistrar {
|
||||||
|
|
||||||
class ReporterFactory : public IReporterFactory {
|
class ReporterFactory : public IReporterFactory {
|
||||||
|
|
||||||
virtual IReporter* create( const ReporterConfig& config ) const {
|
// *** Please Note ***:
|
||||||
|
// - If you end up here looking at a compiler error because it's trying to register
|
||||||
|
// your custom reporter class be aware that the native reporter interface has changed
|
||||||
|
// to IStreamingReporter. The "legacy" interface, IReporter, is still supported via
|
||||||
|
// an adapter. Just use REGISTER_LEGACY_REPORTER to take advantage of the adapter.
|
||||||
|
// However please consider updating to the new interface as the old one is now
|
||||||
|
// deprecated and will probably be removed quite soon!
|
||||||
|
// Please contact me via github if you have any questions at all about this.
|
||||||
|
// In fact, ideally, please contact me anyway to let me know you've hit this - as I have
|
||||||
|
// no idea who is actually using custom reporters at all (possibly no-one!).
|
||||||
|
// The new interface is designed to minimise exposure to interface changes in the future.
|
||||||
|
virtual IStreamingReporter* create( ReporterConfig const& config ) const {
|
||||||
return new T( config );
|
return new T( config );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,12 +61,14 @@ namespace Catch {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ReporterRegistrar( const std::string& name ) {
|
ReporterRegistrar( std::string const& name ) {
|
||||||
getMutableRegistryHub().registerReporter( name, new ReporterFactory() );
|
getMutableRegistryHub().registerReporter( name, new ReporterFactory() );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) \
|
||||||
|
Catch::LegacyReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name );
|
||||||
#define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \
|
#define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \
|
||||||
Catch::ReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name );
|
Catch::ReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name );
|
||||||
|
|
||||||
|
|
|
@ -22,18 +22,18 @@ namespace Catch {
|
||||||
deleteAllValues( m_factories );
|
deleteAllValues( m_factories );
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual IReporter* create( const std::string& name, const ReporterConfig& config ) const {
|
virtual IStreamingReporter* create( std::string const& name, Ptr<IConfig> const& config ) const {
|
||||||
FactoryMap::const_iterator it = m_factories.find( name );
|
FactoryMap::const_iterator it = m_factories.find( name );
|
||||||
if( it == m_factories.end() )
|
if( it == m_factories.end() )
|
||||||
return NULL;
|
return NULL;
|
||||||
return it->second->create( config );
|
return it->second->create( ReporterConfig( config ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void registerReporter( const std::string& name, IReporterFactory* factory ) {
|
void registerReporter( std::string const& name, IReporterFactory* factory ) {
|
||||||
m_factories.insert( std::make_pair( name, factory ) );
|
m_factories.insert( std::make_pair( name, factory ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
const FactoryMap& getFactories() const {
|
FactoryMap const& getFactories() const {
|
||||||
return m_factories;
|
return m_factories;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,9 @@ namespace Catch {
|
||||||
inline bool isOk( ResultWas::OfType resultType ) {
|
inline bool isOk( ResultWas::OfType resultType ) {
|
||||||
return ( resultType & ResultWas::FailureBit ) == 0;
|
return ( resultType & ResultWas::FailureBit ) == 0;
|
||||||
}
|
}
|
||||||
|
inline bool isJustInfo( int flags ) {
|
||||||
|
return flags == ResultWas::Info;
|
||||||
|
}
|
||||||
|
|
||||||
// ResultAction::Value enum
|
// ResultAction::Value enum
|
||||||
struct ResultAction { enum Value {
|
struct ResultAction { enum Value {
|
||||||
|
@ -54,9 +57,9 @@ namespace Catch {
|
||||||
return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) | static_cast<int>( rhs ) );
|
return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) | static_cast<int>( rhs ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool shouldContinueOnFailure( int flags ) { return flags & ResultDisposition::ContinueOnFailure; }
|
inline bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; }
|
||||||
inline bool shouldNegate( int flags ) { return flags & ResultDisposition::NegateResult; }
|
inline bool shouldNegate( int flags ) { return ( flags & ResultDisposition::NegateResult ) != 0; }
|
||||||
inline bool shouldSuppressFailure( int flags ) { return flags & ResultDisposition::SuppressFail; }
|
inline bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; }
|
||||||
|
|
||||||
} // end namespace Catch
|
} // end namespace Catch
|
||||||
|
|
||||||
|
|
|
@ -49,15 +49,16 @@ namespace Catch {
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
class Runner : public IResultCapture, public IRunner {
|
class RunContext : public IResultCapture, public IRunner {
|
||||||
|
|
||||||
Runner( const Runner& );
|
RunContext( RunContext const& );
|
||||||
void operator =( const Runner& );
|
void operator =( RunContext const& );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
explicit Runner( const Config& config, const Ptr<IReporter>& reporter )
|
explicit RunContext( Ptr<IConfig const> const& config, Ptr<IStreamingReporter> const& reporter )
|
||||||
: m_context( getCurrentMutableContext() ),
|
: m_runInfo( config->name() ),
|
||||||
|
m_context( getCurrentMutableContext() ),
|
||||||
m_runningTest( NULL ),
|
m_runningTest( NULL ),
|
||||||
m_config( config ),
|
m_config( config ),
|
||||||
m_reporter( reporter ),
|
m_reporter( reporter ),
|
||||||
|
@ -66,46 +67,54 @@ namespace Catch {
|
||||||
m_prevConfig( m_context.getConfig() )
|
m_prevConfig( m_context.getConfig() )
|
||||||
{
|
{
|
||||||
m_context.setRunner( this );
|
m_context.setRunner( this );
|
||||||
m_context.setConfig( &m_config );
|
m_context.setConfig( m_config );
|
||||||
m_context.setResultCapture( this );
|
m_context.setResultCapture( this );
|
||||||
m_reporter->StartTesting();
|
m_reporter->testRunStarting( m_runInfo );
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~Runner() {
|
virtual ~RunContext() {
|
||||||
m_reporter->EndTesting( m_totals );
|
m_reporter->testRunEnded( TestRunStats( m_runInfo, m_totals, aborting() ) );
|
||||||
m_context.setRunner( m_prevRunner );
|
m_context.setRunner( m_prevRunner );
|
||||||
m_context.setConfig( NULL );
|
m_context.setConfig( NULL );
|
||||||
m_context.setResultCapture( m_prevResultCapture );
|
m_context.setResultCapture( m_prevResultCapture );
|
||||||
m_context.setConfig( m_prevConfig );
|
m_context.setConfig( m_prevConfig );
|
||||||
}
|
}
|
||||||
|
|
||||||
Totals runMatching( const std::string& testSpec ) {
|
void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) {
|
||||||
|
m_reporter->testGroupStarting( GroupInfo( testSpec, groupIndex, groupsCount ) );
|
||||||
|
}
|
||||||
|
void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ) {
|
||||||
|
m_reporter->testGroupEnded( TestGroupStats( GroupInfo( testSpec, groupIndex, groupsCount ), totals, aborting() ) );
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<TestCaseInfo> matchingTests = getRegistryHub().getTestCaseRegistry().getMatchingTestCases( testSpec );
|
Totals runMatching( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ) {
|
||||||
|
|
||||||
|
std::vector<TestCase> matchingTests = getRegistryHub().getTestCaseRegistry().getMatchingTestCases( testSpec );
|
||||||
|
|
||||||
Totals totals;
|
Totals totals;
|
||||||
|
|
||||||
m_reporter->StartGroup( testSpec );
|
testGroupStarting( testSpec, groupIndex, groupsCount );
|
||||||
|
|
||||||
std::vector<TestCaseInfo>::const_iterator it = matchingTests.begin();
|
std::vector<TestCase>::const_iterator it = matchingTests.begin();
|
||||||
std::vector<TestCaseInfo>::const_iterator itEnd = matchingTests.end();
|
std::vector<TestCase>::const_iterator itEnd = matchingTests.end();
|
||||||
for(; it != itEnd; ++it )
|
for(; it != itEnd; ++it )
|
||||||
totals += runTest( *it );
|
totals += runTest( *it );
|
||||||
// !TBD use std::accumulate?
|
|
||||||
|
|
||||||
m_reporter->EndGroup( testSpec, totals );
|
testGroupEnded( testSpec, totals, groupIndex, groupsCount );
|
||||||
return totals;
|
return totals;
|
||||||
}
|
}
|
||||||
|
|
||||||
Totals runTest( const TestCaseInfo& testInfo ) {
|
Totals runTest( TestCase const& testCase ) {
|
||||||
Totals prevTotals = m_totals;
|
Totals prevTotals = m_totals;
|
||||||
|
|
||||||
std::string redirectedCout;
|
std::string redirectedCout;
|
||||||
std::string redirectedCerr;
|
std::string redirectedCerr;
|
||||||
|
|
||||||
m_reporter->StartTestCase( testInfo );
|
TestCaseInfo testInfo = testCase.getTestCaseInfo();
|
||||||
|
|
||||||
m_runningTest = new RunningTest( &testInfo );
|
m_reporter->testCaseStarting( testInfo );
|
||||||
|
|
||||||
|
m_runningTest = new RunningTest( testCase );
|
||||||
|
|
||||||
do {
|
do {
|
||||||
do {
|
do {
|
||||||
|
@ -115,105 +124,118 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() );
|
while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() );
|
||||||
|
|
||||||
|
Totals deltaTotals = m_totals.delta( prevTotals );
|
||||||
|
bool missingAssertions = false;
|
||||||
|
if( deltaTotals.assertions.total() == 0 && m_config->warnAboutMissingAssertions() ) {
|
||||||
|
m_totals.assertions.failed++;
|
||||||
|
deltaTotals = m_totals.delta( prevTotals );
|
||||||
|
missingAssertions = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_totals.testCases += deltaTotals.testCases;
|
||||||
|
|
||||||
|
m_reporter->testCaseEnded( TestCaseStats( testInfo,
|
||||||
|
deltaTotals,
|
||||||
|
redirectedCout,
|
||||||
|
redirectedCerr,
|
||||||
|
missingAssertions,
|
||||||
|
aborting() ) );
|
||||||
|
|
||||||
|
|
||||||
delete m_runningTest;
|
delete m_runningTest;
|
||||||
m_runningTest = NULL;
|
m_runningTest = NULL;
|
||||||
|
|
||||||
Totals deltaTotals = m_totals.delta( prevTotals );
|
|
||||||
m_totals.testCases += deltaTotals.testCases;
|
|
||||||
m_reporter->EndTestCase( testInfo, deltaTotals, redirectedCout, redirectedCerr );
|
|
||||||
return deltaTotals;
|
return deltaTotals;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Config& config() const {
|
Ptr<IConfig const> config() const {
|
||||||
return m_config;
|
return m_config;
|
||||||
}
|
}
|
||||||
|
|
||||||
private: // IResultCapture
|
private: // IResultCapture
|
||||||
|
|
||||||
virtual ResultAction::Value acceptExpression( const ExpressionResultBuilder& assertionResult, const AssertionInfo& assertionInfo ) {
|
virtual void acceptMessage( MessageBuilder const& messageBuilder ) {
|
||||||
|
m_messages.push_back( messageBuilder.build() );
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ResultAction::Value acceptExpression( ExpressionResultBuilder const& assertionResult, AssertionInfo const& assertionInfo ) {
|
||||||
m_lastAssertionInfo = assertionInfo;
|
m_lastAssertionInfo = assertionInfo;
|
||||||
return actOnCurrentResult( assertionResult.buildResult( assertionInfo ) );
|
return actOnCurrentResult( assertionResult.buildResult( assertionInfo ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void testEnded( const AssertionResult& result ) {
|
virtual void assertionEnded( AssertionResult const& result ) {
|
||||||
if( result.getResultType() == ResultWas::Ok ) {
|
if( result.getResultType() == ResultWas::Ok ) {
|
||||||
m_totals.assertions.passed++;
|
m_totals.assertions.passed++;
|
||||||
}
|
}
|
||||||
else if( !result.isOk() ) {
|
else if( !result.isOk() ) {
|
||||||
m_totals.assertions.failed++;
|
m_totals.assertions.failed++;
|
||||||
|
|
||||||
{
|
|
||||||
std::vector<ScopedInfo*>::const_iterator it = m_scopedInfos.begin();
|
|
||||||
std::vector<ScopedInfo*>::const_iterator itEnd = m_scopedInfos.end();
|
|
||||||
for(; it != itEnd; ++it )
|
|
||||||
m_reporter->Result( (*it)->buildResult( m_lastAssertionInfo ) );
|
|
||||||
}
|
|
||||||
{
|
|
||||||
std::vector<AssertionResult>::const_iterator it = m_assertionResults.begin();
|
|
||||||
std::vector<AssertionResult>::const_iterator itEnd = m_assertionResults.end();
|
|
||||||
for(; it != itEnd; ++it )
|
|
||||||
m_reporter->Result( *it );
|
|
||||||
}
|
|
||||||
m_assertionResults.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( result.getResultType() == ResultWas::Info )
|
m_reporter->assertionEnded( AssertionStats( result, m_messages, m_totals ) );
|
||||||
m_assertionResults.push_back( result );
|
|
||||||
else
|
// Reset working state
|
||||||
m_reporter->Result( result );
|
m_lastAssertionInfo = AssertionInfo( "", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition );
|
||||||
|
m_messages.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool sectionStarted (
|
virtual bool sectionStarted (
|
||||||
const std::string& name,
|
SectionInfo const& sectionInfo,
|
||||||
const std::string& description,
|
|
||||||
const SourceLineInfo& lineInfo,
|
|
||||||
Counts& assertions
|
Counts& assertions
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << name << "@" << lineInfo;
|
oss << sectionInfo.name << "@" << sectionInfo.lineInfo;
|
||||||
|
|
||||||
|
|
||||||
if( !m_runningTest->addSection( oss.str() ) )
|
if( !m_runningTest->addSection( oss.str() ) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
m_lastAssertionInfo.lineInfo = lineInfo;
|
m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo;
|
||||||
|
|
||||||
|
m_reporter->sectionStarting( sectionInfo );
|
||||||
|
|
||||||
m_reporter->StartSection( name, description );
|
|
||||||
assertions = m_totals.assertions;
|
assertions = m_totals.assertions;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void sectionEnded( const std::string& name, const Counts& prevAssertions ) {
|
virtual void sectionEnded( SectionInfo const& info, Counts const& prevAssertions ) {
|
||||||
|
if( std::uncaught_exception() ) {
|
||||||
|
m_unfinishedSections.push_back( UnfinishedSections( info, prevAssertions ) );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Counts assertions = m_totals.assertions - prevAssertions;
|
Counts assertions = m_totals.assertions - prevAssertions;
|
||||||
|
bool missingAssertions = false;
|
||||||
if( assertions.total() == 0 &&
|
if( assertions.total() == 0 &&
|
||||||
( m_config.data().warnings & ConfigData::WarnAbout::NoAssertions ) &&
|
m_config->warnAboutMissingAssertions() &&
|
||||||
!m_runningTest->isBranchSection() ) {
|
!m_runningTest->isBranchSection() ) {
|
||||||
m_reporter->NoAssertionsInSection( name );
|
|
||||||
m_totals.assertions.failed++;
|
m_totals.assertions.failed++;
|
||||||
assertions.failed++;
|
assertions.failed++;
|
||||||
|
missingAssertions = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
m_runningTest->endSection( name );
|
m_runningTest->endSection( info.name, false );
|
||||||
m_reporter->EndSection( name, assertions );
|
|
||||||
|
m_reporter->sectionEnded( SectionStats( info, assertions, missingAssertions ) );
|
||||||
|
m_messages.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void pushScopedInfo( ScopedInfo* scopedInfo ) {
|
virtual void pushScopedMessage( ScopedMessageBuilder const& _builder ) {
|
||||||
m_scopedInfos.push_back( scopedInfo );
|
m_messages.push_back( _builder.build() );
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void popScopedInfo( ScopedInfo* scopedInfo ) {
|
virtual void popScopedMessage( ScopedMessageBuilder const& _builder ) {
|
||||||
if( m_scopedInfos.back() == scopedInfo )
|
m_messages.erase( std::remove( m_messages.begin(), m_messages.end(), _builder ), m_messages.end() );
|
||||||
m_scopedInfos.pop_back();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool shouldDebugBreak() const {
|
virtual bool shouldDebugBreak() const {
|
||||||
return m_config.shouldDebugBreak();
|
return m_config->shouldDebugBreak();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual std::string getCurrentTestName() const {
|
virtual std::string getCurrentTestName() const {
|
||||||
return m_runningTest
|
return m_runningTest
|
||||||
? m_runningTest->getTestCaseInfo().getName()
|
? m_runningTest->getTestCase().getTestCaseInfo().name
|
||||||
: "";
|
: "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -224,14 +246,14 @@ namespace Catch {
|
||||||
public:
|
public:
|
||||||
// !TBD We need to do this another way!
|
// !TBD We need to do this another way!
|
||||||
bool aborting() const {
|
bool aborting() const {
|
||||||
return m_totals.assertions.failed == static_cast<std::size_t>( m_config.getCutoff() );
|
return m_totals.assertions.failed == static_cast<std::size_t>( m_config->abortAfter() );
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
ResultAction::Value actOnCurrentResult( const AssertionResult& result ) {
|
ResultAction::Value actOnCurrentResult( AssertionResult const& result ) {
|
||||||
m_lastResult = result;
|
m_lastResult = result;
|
||||||
testEnded( m_lastResult );
|
assertionEnded( m_lastResult );
|
||||||
|
|
||||||
ResultAction::Value action = ResultAction::None;
|
ResultAction::Value action = ResultAction::None;
|
||||||
|
|
||||||
|
@ -247,23 +269,16 @@ namespace Catch {
|
||||||
|
|
||||||
void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) {
|
void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ) {
|
||||||
try {
|
try {
|
||||||
m_lastAssertionInfo = AssertionInfo( "TEST_CASE", m_runningTest->getTestCaseInfo().getLineInfo(), "", ResultDisposition::Normal );
|
m_lastAssertionInfo = AssertionInfo( "TEST_CASE", m_runningTest->getTestCase().getTestCaseInfo().lineInfo, "", ResultDisposition::Normal );
|
||||||
m_runningTest->reset();
|
m_runningTest->reset();
|
||||||
Counts prevAssertions = m_totals.assertions;
|
|
||||||
if( m_reporter->shouldRedirectStdout() ) {
|
if( m_reporter->getPreferences().shouldRedirectStdOut ) {
|
||||||
StreamRedirect coutRedir( std::cout, redirectedCout );
|
StreamRedirect coutRedir( std::cout, redirectedCout );
|
||||||
StreamRedirect cerrRedir( std::cerr, redirectedCerr );
|
StreamRedirect cerrRedir( std::cerr, redirectedCerr );
|
||||||
m_runningTest->getTestCaseInfo().invoke();
|
m_runningTest->getTestCase().invoke();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
m_runningTest->getTestCaseInfo().invoke();
|
m_runningTest->getTestCase().invoke();
|
||||||
}
|
|
||||||
Counts assertions = m_totals.assertions - prevAssertions;
|
|
||||||
if( assertions.total() == 0 &&
|
|
||||||
( m_config.data().warnings & ConfigData::WarnAbout::NoAssertions ) &&
|
|
||||||
!m_runningTest->hasSections() ) {
|
|
||||||
m_totals.assertions.failed++;
|
|
||||||
m_reporter->NoAssertionsInTestCase( m_runningTest->getTestCaseInfo().getName() );
|
|
||||||
}
|
}
|
||||||
m_runningTest->ranToCompletion();
|
m_runningTest->ranToCompletion();
|
||||||
}
|
}
|
||||||
|
@ -275,23 +290,39 @@ namespace Catch {
|
||||||
exResult << translateActiveException();
|
exResult << translateActiveException();
|
||||||
actOnCurrentResult( exResult.buildResult( m_lastAssertionInfo ) );
|
actOnCurrentResult( exResult.buildResult( m_lastAssertionInfo ) );
|
||||||
}
|
}
|
||||||
m_assertionResults.clear();
|
for( std::vector<UnfinishedSections>::const_iterator it = m_unfinishedSections.begin(),
|
||||||
|
itEnd = m_unfinishedSections.end();
|
||||||
|
it != itEnd;
|
||||||
|
++it )
|
||||||
|
sectionEnded( it->info, it->prevAssertions );
|
||||||
|
m_unfinishedSections.clear();
|
||||||
|
m_messages.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
struct UnfinishedSections {
|
||||||
|
UnfinishedSections( SectionInfo const& _info, Counts const& _prevAssertions )
|
||||||
|
: info( _info ), prevAssertions( _prevAssertions )
|
||||||
|
{}
|
||||||
|
|
||||||
|
SectionInfo info;
|
||||||
|
Counts prevAssertions;
|
||||||
|
};
|
||||||
|
|
||||||
|
TestRunInfo m_runInfo;
|
||||||
IMutableContext& m_context;
|
IMutableContext& m_context;
|
||||||
RunningTest* m_runningTest;
|
RunningTest* m_runningTest;
|
||||||
AssertionResult m_lastResult;
|
AssertionResult m_lastResult;
|
||||||
|
|
||||||
const Config& m_config;
|
Ptr<IConfig const> m_config;
|
||||||
Totals m_totals;
|
Totals m_totals;
|
||||||
Ptr<IReporter> m_reporter;
|
Ptr<IStreamingReporter> m_reporter;
|
||||||
std::vector<ScopedInfo*> m_scopedInfos;
|
std::vector<MessageInfo> m_messages;
|
||||||
std::vector<AssertionResult> m_assertionResults;
|
|
||||||
IRunner* m_prevRunner;
|
IRunner* m_prevRunner;
|
||||||
IResultCapture* m_prevResultCapture;
|
IResultCapture* m_prevResultCapture;
|
||||||
const IConfig* m_prevConfig;
|
Ptr<IConfig const> m_prevConfig;
|
||||||
AssertionInfo m_lastAssertionInfo;
|
AssertionInfo m_lastAssertionInfo;
|
||||||
|
std::vector<UnfinishedSections> m_unfinishedSections;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace Catch
|
} // end namespace Catch
|
||||||
|
|
|
@ -24,9 +24,10 @@ namespace Catch {
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit RunningTest( const TestCaseInfo* info = NULL )
|
explicit RunningTest( TestCase const& info )
|
||||||
: m_info( info ),
|
: m_info( info ),
|
||||||
m_runStatus( RanAtLeastOneSection ),
|
m_runStatus( RanAtLeastOneSection ),
|
||||||
|
m_rootSection( info.getTestCaseInfo().name ),
|
||||||
m_currentSection( &m_rootSection ),
|
m_currentSection( &m_rootSection ),
|
||||||
m_changed( false )
|
m_changed( false )
|
||||||
{}
|
{}
|
||||||
|
@ -54,28 +55,20 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ranToCompletion() {
|
void ranToCompletion() {
|
||||||
if( m_runStatus == RanAtLeastOneSection ||
|
if( m_runStatus != RanAtLeastOneSection && m_runStatus != EncounteredASection )
|
||||||
m_runStatus == EncounteredASection ) {
|
m_runStatus = RanToCompletionWithNoSections;
|
||||||
m_runStatus = RanToCompletionWithSections;
|
m_runStatus = RanToCompletionWithSections;
|
||||||
if( m_lastSectionToRun ) {
|
if( m_lastSectionToRun ) {
|
||||||
m_lastSectionToRun->ranToCompletion();
|
m_lastSectionToRun->ranToCompletion();
|
||||||
m_changed = true;
|
m_changed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
m_runStatus = RanToCompletionWithNoSections;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool addSection( const std::string& name ) {
|
bool addSection( std::string const& name ) {
|
||||||
if( m_runStatus == NothingRun )
|
if( m_runStatus == NothingRun )
|
||||||
m_runStatus = EncounteredASection;
|
m_runStatus = EncounteredASection;
|
||||||
|
|
||||||
SectionInfo* thisSection = m_currentSection->findSubSection( name );
|
RunningSection* thisSection = m_currentSection->findOrAddSubSection( name, m_changed );
|
||||||
if( !thisSection ) {
|
|
||||||
thisSection = m_currentSection->addSubSection( name );
|
|
||||||
m_changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !wasSectionSeen() && thisSection->shouldRun() ) {
|
if( !wasSectionSeen() && thisSection->shouldRun() ) {
|
||||||
m_currentSection = thisSection;
|
m_currentSection = thisSection;
|
||||||
|
@ -85,20 +78,22 @@ namespace Catch {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void endSection( const std::string& ) {
|
void endSection( std::string const&, bool stealth ) {
|
||||||
if( m_currentSection->ran() ) {
|
if( m_currentSection->ran() ) {
|
||||||
|
if( !stealth )
|
||||||
m_runStatus = RanAtLeastOneSection;
|
m_runStatus = RanAtLeastOneSection;
|
||||||
m_changed = true;
|
m_changed = true;
|
||||||
}
|
}
|
||||||
else if( m_runStatus == EncounteredASection ) {
|
else if( m_runStatus == EncounteredASection ) {
|
||||||
|
if( !stealth )
|
||||||
m_runStatus = RanAtLeastOneSection;
|
m_runStatus = RanAtLeastOneSection;
|
||||||
m_lastSectionToRun = m_currentSection;
|
m_lastSectionToRun = m_currentSection;
|
||||||
}
|
}
|
||||||
m_currentSection = m_currentSection->getParent();
|
m_currentSection = m_currentSection->getParent();
|
||||||
}
|
}
|
||||||
|
|
||||||
const TestCaseInfo& getTestCaseInfo() const {
|
TestCase const& getTestCase() const {
|
||||||
return *m_info;
|
return m_info;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasUntestedSections() const {
|
bool hasUntestedSections() const {
|
||||||
|
@ -107,11 +102,14 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const TestCaseInfo* m_info;
|
RunningTest( RunningTest const& );
|
||||||
|
void operator=( RunningTest const& );
|
||||||
|
|
||||||
|
TestCase const& m_info;
|
||||||
RunStatus m_runStatus;
|
RunStatus m_runStatus;
|
||||||
SectionInfo m_rootSection;
|
RunningSection m_rootSection;
|
||||||
SectionInfo* m_currentSection;
|
RunningSection* m_currentSection;
|
||||||
SectionInfo* m_lastSectionToRun;
|
RunningSection* m_lastSectionToRun;
|
||||||
bool m_changed;
|
bool m_changed;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
#include "catch_capture.hpp"
|
#include "catch_capture.hpp"
|
||||||
#include "catch_totals.hpp"
|
#include "catch_totals.hpp"
|
||||||
|
#include "catch_compiler_capabilities.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
@ -17,16 +18,16 @@ namespace Catch {
|
||||||
|
|
||||||
class Section {
|
class Section {
|
||||||
public:
|
public:
|
||||||
Section( const std::string& name,
|
Section( SourceLineInfo const& lineInfo,
|
||||||
const std::string& description,
|
std::string const& name,
|
||||||
const SourceLineInfo& lineInfo )
|
std::string const& description = "" )
|
||||||
: m_name( name ),
|
: m_info( name, description, lineInfo ),
|
||||||
m_sectionIncluded( getCurrentContext().getResultCapture().sectionStarted( name, description, lineInfo, m_assertions ) )
|
m_sectionIncluded( getCurrentContext().getResultCapture().sectionStarted( m_info, m_assertions ) )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
~Section() {
|
~Section() {
|
||||||
if( m_sectionIncluded )
|
if( m_sectionIncluded )
|
||||||
getCurrentContext().getResultCapture().sectionEnded( m_name, m_assertions );
|
getCurrentContext().getResultCapture().sectionEnded( m_info, m_assertions );
|
||||||
}
|
}
|
||||||
|
|
||||||
// This indicates whether the section should be executed or not
|
// This indicates whether the section should be executed or not
|
||||||
|
@ -35,6 +36,7 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
SectionInfo m_info;
|
||||||
|
|
||||||
std::string m_name;
|
std::string m_name;
|
||||||
Counts m_assertions;
|
Counts m_assertions;
|
||||||
|
@ -43,7 +45,12 @@ namespace Catch {
|
||||||
|
|
||||||
} // end namespace Catch
|
} // end namespace Catch
|
||||||
|
|
||||||
#define INTERNAL_CATCH_SECTION( name, desc ) \
|
#ifdef CATCH_CONFIG_VARIADIC_MACROS
|
||||||
if( Catch::Section INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::Section( name, desc, CATCH_INTERNAL_LINEINFO ) )
|
#define INTERNAL_CATCH_SECTION( ... ) \
|
||||||
|
if( Catch::Section INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::Section( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) )
|
||||||
|
#else
|
||||||
|
#define INTERNAL_CATCH_SECTION( name, desc ) \
|
||||||
|
if( Catch::Section INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::Section( CATCH_INTERNAL_LINEINFO, name, desc ) )
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED
|
#endif // TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED
|
||||||
|
|
|
@ -15,10 +15,12 @@
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
class SectionInfo {
|
class RunningSection {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
enum Status {
|
typedef std::vector<RunningSection*> SubSections;
|
||||||
|
|
||||||
|
enum State {
|
||||||
Root,
|
Root,
|
||||||
Unknown,
|
Unknown,
|
||||||
Branch,
|
Branch,
|
||||||
|
@ -26,76 +28,85 @@ namespace Catch {
|
||||||
TestedLeaf
|
TestedLeaf
|
||||||
};
|
};
|
||||||
|
|
||||||
SectionInfo( SectionInfo* parent )
|
RunningSection( RunningSection* parent, std::string const& name )
|
||||||
: m_status( Unknown ),
|
: m_state( Unknown ),
|
||||||
m_parent( parent )
|
m_parent( parent ),
|
||||||
|
m_name( name )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
SectionInfo()
|
RunningSection( std::string const& name )
|
||||||
: m_status( Root ),
|
: m_state( Root ),
|
||||||
m_parent( NULL )
|
m_parent( NULL ),
|
||||||
|
m_name( name )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
~SectionInfo() {
|
~RunningSection() {
|
||||||
deleteAllValues( m_subSections );
|
deleteAll( m_subSections );
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getName() const {
|
||||||
|
return m_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool shouldRun() const {
|
bool shouldRun() const {
|
||||||
return m_status < TestedBranch;
|
return m_state < TestedBranch;
|
||||||
}
|
|
||||||
|
|
||||||
bool ran() {
|
|
||||||
if( m_status < Branch ) {
|
|
||||||
m_status = TestedLeaf;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isBranch() const {
|
bool isBranch() const {
|
||||||
return m_status == Branch;
|
return m_state == Branch;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ranToCompletion() {
|
const RunningSection* getParent() const {
|
||||||
if( m_status == Branch && !hasUntestedSections() )
|
|
||||||
m_status = TestedBranch;
|
|
||||||
}
|
|
||||||
|
|
||||||
SectionInfo* findSubSection( const std::string& name ) {
|
|
||||||
std::map<std::string, SectionInfo*>::const_iterator it = m_subSections.find( name );
|
|
||||||
return it != m_subSections.end()
|
|
||||||
? it->second
|
|
||||||
: NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
SectionInfo* addSubSection( const std::string& name ) {
|
|
||||||
SectionInfo* subSection = new SectionInfo( this );
|
|
||||||
m_subSections.insert( std::make_pair( name, subSection ) );
|
|
||||||
m_status = Branch;
|
|
||||||
return subSection;
|
|
||||||
}
|
|
||||||
|
|
||||||
SectionInfo* getParent() {
|
|
||||||
return m_parent;
|
return m_parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasUntestedSections() const {
|
bool hasUntestedSections() const {
|
||||||
if( m_status == Unknown )
|
if( m_state == Unknown )
|
||||||
return true;
|
return true;
|
||||||
|
for( SubSections::const_iterator it = m_subSections.begin();
|
||||||
std::map<std::string, SectionInfo*>::const_iterator it = m_subSections.begin();
|
it != m_subSections.end();
|
||||||
std::map<std::string, SectionInfo*>::const_iterator itEnd = m_subSections.end();
|
++it)
|
||||||
for(; it != itEnd; ++it ) {
|
if( (*it)->hasUntestedSections() )
|
||||||
if( it->second->hasUntestedSections() )
|
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Mutable methods:
|
||||||
|
|
||||||
|
RunningSection* getParent() {
|
||||||
|
return m_parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
RunningSection* findOrAddSubSection( std::string const& name, bool& changed ) {
|
||||||
|
for( SubSections::const_iterator it = m_subSections.begin();
|
||||||
|
it != m_subSections.end();
|
||||||
|
++it)
|
||||||
|
if( (*it)->getName() == name )
|
||||||
|
return *it;
|
||||||
|
RunningSection* subSection = new RunningSection( this, name );
|
||||||
|
m_subSections.push_back( subSection );
|
||||||
|
m_state = Branch;
|
||||||
|
changed = true;
|
||||||
|
return subSection;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ran() {
|
||||||
|
if( m_state >= Branch )
|
||||||
|
return false;
|
||||||
|
m_state = TestedLeaf;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ranToCompletion() {
|
||||||
|
if( m_state == Branch && !hasUntestedSections() )
|
||||||
|
m_state = TestedBranch;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Status m_status;
|
State m_state;
|
||||||
std::map<std::string, SectionInfo*> m_subSections;
|
RunningSection* m_parent;
|
||||||
SectionInfo* m_parent;
|
std::string m_name;
|
||||||
|
SubSections m_subSections;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* Created by Phil on 15/04/2013.
|
||||||
|
* Copyright 2013 Two Blue Cubes Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef TWOBLUECUBES_CATCH_SFINAE_HPP_INCLUDED
|
||||||
|
#define TWOBLUECUBES_CATCH_SFINAE_HPP_INCLUDED
|
||||||
|
|
||||||
|
// Try to detect if the current compiler supports SFINAE
|
||||||
|
#include "catch_compiler_capabilities.h"
|
||||||
|
|
||||||
|
namespace Catch {
|
||||||
|
|
||||||
|
struct TrueType {
|
||||||
|
static const bool value = true;
|
||||||
|
typedef void Enable;
|
||||||
|
char sizer[1];
|
||||||
|
};
|
||||||
|
struct FalseType {
|
||||||
|
static const bool value = false;
|
||||||
|
typedef void Disable;
|
||||||
|
char sizer[2];
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef CATCH_CONFIG_SFINAE
|
||||||
|
|
||||||
|
template<bool> struct NotABooleanExpression;
|
||||||
|
|
||||||
|
template<bool c> struct If : NotABooleanExpression<c> {};
|
||||||
|
template<> struct If<true> : TrueType {};
|
||||||
|
template<> struct If<false> : FalseType {};
|
||||||
|
|
||||||
|
template<int size> struct SizedIf;
|
||||||
|
template<> struct SizedIf<sizeof(TrueType)> : TrueType {};
|
||||||
|
template<> struct SizedIf<sizeof(FalseType)> : FalseType {};
|
||||||
|
|
||||||
|
#endif // CATCH_CONFIG_SFINAE
|
||||||
|
|
||||||
|
} // end namespace Catch
|
||||||
|
|
||||||
|
#endif // TWOBLUECUBES_CATCH_SFINAE_HPP_INCLUDED
|
||||||
|
|
|
@ -57,7 +57,7 @@ namespace Catch {
|
||||||
|
|
||||||
struct OutputDebugWriter {
|
struct OutputDebugWriter {
|
||||||
|
|
||||||
void operator()( const std::string &str ) {
|
void operator()( std::string const&str ) {
|
||||||
writeToDebugConsole( str );
|
writeToDebugConsole( str );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
#ifndef TWOBLUECUBES_CATCH_TAGS_HPP_INCLUDED
|
#ifndef TWOBLUECUBES_CATCH_TAGS_HPP_INCLUDED
|
||||||
#define TWOBLUECUBES_CATCH_TAGS_HPP_INCLUDED
|
#define TWOBLUECUBES_CATCH_TAGS_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include "catch_common.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
@ -22,7 +24,7 @@ namespace Catch {
|
||||||
public:
|
public:
|
||||||
virtual ~TagParser();
|
virtual ~TagParser();
|
||||||
|
|
||||||
void parse( const std::string& str ) {
|
void parse( std::string const& str ) {
|
||||||
std::size_t pos = 0;
|
std::size_t pos = 0;
|
||||||
while( pos < str.size() ) {
|
while( pos < str.size() ) {
|
||||||
char c = str[pos];
|
char c = str[pos];
|
||||||
|
@ -46,7 +48,7 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void acceptTag( const std::string& tag ) = 0;
|
virtual void acceptTag( std::string const& tag ) = 0;
|
||||||
virtual void acceptChar( char c ) = 0;
|
virtual void acceptChar( char c ) = 0;
|
||||||
virtual void endParse() {}
|
virtual void endParse() {}
|
||||||
|
|
||||||
|
@ -67,14 +69,14 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual void acceptTag( const std::string& tag ) {
|
virtual void acceptTag( std::string const& tag ) {
|
||||||
m_tags.insert( tag );
|
m_tags.insert( toLower( tag ) );
|
||||||
}
|
}
|
||||||
virtual void acceptChar( char c ) {
|
virtual void acceptChar( char c ) {
|
||||||
m_remainder += c;
|
m_remainder += c;
|
||||||
}
|
}
|
||||||
|
|
||||||
TagExtracter& operator=(const TagExtracter&);
|
TagExtracter& operator=(TagExtracter const&);
|
||||||
|
|
||||||
std::set<std::string>& m_tags;
|
std::set<std::string>& m_tags;
|
||||||
std::string m_remainder;
|
std::string m_remainder;
|
||||||
|
@ -86,7 +88,7 @@ namespace Catch {
|
||||||
: m_isNegated( false )
|
: m_isNegated( false )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
Tag( const std::string& name, bool isNegated )
|
Tag( std::string const& name, bool isNegated )
|
||||||
: m_name( name ),
|
: m_name( name ),
|
||||||
m_isNegated( isNegated )
|
m_isNegated( isNegated )
|
||||||
{}
|
{}
|
||||||
|
@ -110,15 +112,15 @@ namespace Catch {
|
||||||
class TagSet {
|
class TagSet {
|
||||||
typedef std::map<std::string, Tag> TagMap;
|
typedef std::map<std::string, Tag> TagMap;
|
||||||
public:
|
public:
|
||||||
void add( const Tag& tag ) {
|
void add( Tag const& tag ) {
|
||||||
m_tags.insert( std::make_pair( tag.getName(), tag ) );
|
m_tags.insert( std::make_pair( toLower( tag.getName() ), tag ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool empty() const {
|
bool empty() const {
|
||||||
return m_tags.empty();
|
return m_tags.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool matches( const std::set<std::string>& tags ) const {
|
bool matches( std::set<std::string> const& tags ) const {
|
||||||
TagMap::const_iterator it = m_tags.begin();
|
TagMap::const_iterator it = m_tags.begin();
|
||||||
TagMap::const_iterator itEnd = m_tags.end();
|
TagMap::const_iterator itEnd = m_tags.end();
|
||||||
for(; it != itEnd; ++it ) {
|
for(; it != itEnd; ++it ) {
|
||||||
|
@ -135,7 +137,7 @@ namespace Catch {
|
||||||
|
|
||||||
class TagExpression {
|
class TagExpression {
|
||||||
public:
|
public:
|
||||||
bool matches( const std::set<std::string>& tags ) const {
|
bool matches( std::set<std::string> const& tags ) const {
|
||||||
std::vector<TagSet>::const_iterator it = m_tagSets.begin();
|
std::vector<TagSet>::const_iterator it = m_tagSets.begin();
|
||||||
std::vector<TagSet>::const_iterator itEnd = m_tagSets.end();
|
std::vector<TagSet>::const_iterator itEnd = m_tagSets.end();
|
||||||
for(; it != itEnd; ++it )
|
for(; it != itEnd; ++it )
|
||||||
|
@ -160,7 +162,7 @@ namespace Catch {
|
||||||
~TagExpressionParser();
|
~TagExpressionParser();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual void acceptTag( const std::string& tag ) {
|
virtual void acceptTag( std::string const& tag ) {
|
||||||
m_currentTagSet.add( Tag( tag, m_isNegated ) );
|
m_currentTagSet.add( Tag( tag, m_isNegated ) );
|
||||||
m_isNegated = false;
|
m_isNegated = false;
|
||||||
}
|
}
|
||||||
|
@ -179,7 +181,7 @@ namespace Catch {
|
||||||
m_exp.m_tagSets.push_back( m_currentTagSet );
|
m_exp.m_tagSets.push_back( m_currentTagSet );
|
||||||
}
|
}
|
||||||
|
|
||||||
TagExpressionParser& operator=(const TagExpressionParser&);
|
TagExpressionParser& operator=(TagExpressionParser const&);
|
||||||
|
|
||||||
bool m_isNegated;
|
bool m_isNegated;
|
||||||
TagSet m_currentTagSet;
|
TagSet m_currentTagSet;
|
||||||
|
|
|
@ -9,53 +9,74 @@
|
||||||
#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED
|
#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED
|
||||||
|
|
||||||
#include "catch_common.h"
|
#include "catch_common.h"
|
||||||
|
#include "catch_ptr.hpp"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
|
#ifdef __clang__
|
||||||
|
#pragma clang diagnostic push
|
||||||
|
#pragma clang diagnostic ignored "-Wpadded"
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
struct ITestCase;
|
struct ITestCase;
|
||||||
|
|
||||||
class TestCaseInfo {
|
struct TestCaseInfo {
|
||||||
|
TestCaseInfo( std::string const& _name,
|
||||||
|
std::string const& _className,
|
||||||
|
std::string const& _description,
|
||||||
|
std::set<std::string> const& _tags,
|
||||||
|
bool _isHidden,
|
||||||
|
SourceLineInfo const& _lineInfo );
|
||||||
|
|
||||||
|
TestCaseInfo( TestCaseInfo const& other );
|
||||||
|
|
||||||
|
std::string name;
|
||||||
|
std::string className;
|
||||||
|
std::string description;
|
||||||
|
std::set<std::string> tags;
|
||||||
|
std::string tagsAsString;
|
||||||
|
SourceLineInfo lineInfo;
|
||||||
|
bool isHidden;
|
||||||
|
};
|
||||||
|
|
||||||
|
class TestCase : protected TestCaseInfo {
|
||||||
public:
|
public:
|
||||||
TestCaseInfo();
|
|
||||||
|
|
||||||
TestCaseInfo( ITestCase* testCase,
|
TestCase( ITestCase* testCase, TestCaseInfo const& info );
|
||||||
const std::string& className,
|
TestCase( TestCase const& other );
|
||||||
const std::string& name,
|
|
||||||
const std::string& description,
|
|
||||||
const SourceLineInfo& lineInfo );
|
|
||||||
|
|
||||||
|
TestCase withName( std::string const& _newName ) const;
|
||||||
TestCaseInfo( const TestCaseInfo& other, const std::string& name );
|
|
||||||
TestCaseInfo( const TestCaseInfo& other );
|
|
||||||
|
|
||||||
void invoke() const;
|
void invoke() const;
|
||||||
|
|
||||||
const std::string& getClassName() const;
|
TestCaseInfo const& getTestCaseInfo() const;
|
||||||
const std::string& getName() const;
|
|
||||||
const std::string& getDescription() const;
|
|
||||||
const SourceLineInfo& getLineInfo() const;
|
|
||||||
bool isHidden() const;
|
|
||||||
bool hasTag( const std::string& tag ) const;
|
|
||||||
bool matchesTags( const std::string& tagPattern ) const;
|
|
||||||
const std::set<std::string>& getTags() const;
|
|
||||||
|
|
||||||
void swap( TestCaseInfo& other );
|
bool isHidden() const;
|
||||||
bool operator == ( const TestCaseInfo& other ) const;
|
bool hasTag( std::string const& tag ) const;
|
||||||
bool operator < ( const TestCaseInfo& other ) const;
|
bool matchesTags( std::string const& tagPattern ) const;
|
||||||
TestCaseInfo& operator = ( const TestCaseInfo& other );
|
std::set<std::string> const& getTags() const;
|
||||||
|
|
||||||
|
void swap( TestCase& other );
|
||||||
|
bool operator == ( TestCase const& other ) const;
|
||||||
|
bool operator < ( TestCase const& other ) const;
|
||||||
|
TestCase& operator = ( TestCase const& other );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ptr<ITestCase> m_test;
|
Ptr<ITestCase> test;
|
||||||
std::string m_className;
|
|
||||||
std::string m_name;
|
|
||||||
std::string m_description;
|
|
||||||
std::set<std::string> m_tags;
|
|
||||||
SourceLineInfo m_lineInfo;
|
|
||||||
bool m_isHidden;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
TestCase makeTestCase( ITestCase* testCase,
|
||||||
|
std::string const& className,
|
||||||
|
std::string const& name,
|
||||||
|
std::string const& description,
|
||||||
|
SourceLineInfo const& lineInfo );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __clang__
|
||||||
|
#pragma clang diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED
|
#endif // TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED
|
||||||
|
|
|
@ -11,111 +11,117 @@
|
||||||
#include "catch_tags.hpp"
|
#include "catch_tags.hpp"
|
||||||
#include "catch_test_case_info.h"
|
#include "catch_test_case_info.h"
|
||||||
#include "catch_interfaces_testcase.h"
|
#include "catch_interfaces_testcase.h"
|
||||||
|
#include "catch_common.h"
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
|
TestCase makeTestCase( ITestCase* _testCase,
|
||||||
TestCaseInfo::TestCaseInfo( ITestCase* testCase,
|
std::string const& _className,
|
||||||
const std::string& className,
|
std::string const& _name,
|
||||||
const std::string& name,
|
std::string const& _descOrTags,
|
||||||
const std::string& description,
|
SourceLineInfo const& _lineInfo )
|
||||||
const SourceLineInfo& lineInfo )
|
|
||||||
: m_test( testCase ),
|
|
||||||
m_className( className ),
|
|
||||||
m_name( name ),
|
|
||||||
m_description( description ),
|
|
||||||
m_lineInfo( lineInfo ),
|
|
||||||
m_isHidden( startsWith( name, "./" ) )
|
|
||||||
{
|
{
|
||||||
TagExtracter( m_tags ).parse( m_description );
|
std::string desc = _descOrTags;
|
||||||
if( hasTag( "hide" ) )
|
bool isHidden( startsWith( _name, "./" ) );
|
||||||
m_isHidden = true;
|
std::set<std::string> tags;
|
||||||
|
TagExtracter( tags ).parse( desc );
|
||||||
|
if( tags.find( "hide" ) != tags.end() )
|
||||||
|
isHidden = true;
|
||||||
|
|
||||||
|
TestCaseInfo info( _name, _className, desc, tags, isHidden, _lineInfo );
|
||||||
|
return TestCase( _testCase, info );
|
||||||
}
|
}
|
||||||
|
|
||||||
TestCaseInfo::TestCaseInfo()
|
TestCaseInfo::TestCaseInfo( std::string const& _name,
|
||||||
: m_test( NULL ),
|
std::string const& _className,
|
||||||
m_className(),
|
std::string const& _description,
|
||||||
m_name(),
|
std::set<std::string> const& _tags,
|
||||||
m_description(),
|
bool _isHidden,
|
||||||
m_isHidden( false )
|
SourceLineInfo const& _lineInfo )
|
||||||
|
: name( _name ),
|
||||||
|
className( _className ),
|
||||||
|
description( _description ),
|
||||||
|
tags( _tags ),
|
||||||
|
lineInfo( _lineInfo ),
|
||||||
|
isHidden( _isHidden )
|
||||||
|
{
|
||||||
|
std::ostringstream oss;
|
||||||
|
for( std::set<std::string>::const_iterator it = _tags.begin(), itEnd = _tags.end(); it != itEnd; ++it )
|
||||||
|
oss << "[" << *it << "]";
|
||||||
|
tagsAsString = oss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
TestCaseInfo::TestCaseInfo( TestCaseInfo const& other )
|
||||||
|
: name( other.name ),
|
||||||
|
className( other.className ),
|
||||||
|
description( other.description ),
|
||||||
|
tags( other.tags ),
|
||||||
|
tagsAsString( other.tagsAsString ),
|
||||||
|
lineInfo( other.lineInfo ),
|
||||||
|
isHidden( other.isHidden )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
TestCaseInfo::TestCaseInfo( const TestCaseInfo& other, const std::string& name )
|
TestCase::TestCase( ITestCase* testCase, TestCaseInfo const& info ) : TestCaseInfo( info ), test( testCase ) {}
|
||||||
: m_test( other.m_test ),
|
|
||||||
m_className( other.m_className ),
|
TestCase::TestCase( TestCase const& other )
|
||||||
m_name( name ),
|
: TestCaseInfo( other ),
|
||||||
m_description( other.m_description ),
|
test( other.test )
|
||||||
m_tags( other.m_tags ),
|
|
||||||
m_lineInfo( other.m_lineInfo ),
|
|
||||||
m_isHidden( other.m_isHidden )
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
TestCaseInfo::TestCaseInfo( const TestCaseInfo& other )
|
TestCase TestCase::withName( std::string const& _newName ) const {
|
||||||
: m_test( other.m_test ),
|
TestCase other( *this );
|
||||||
m_className( other.m_className ),
|
other.name = _newName;
|
||||||
m_name( other.m_name ),
|
return other;
|
||||||
m_description( other.m_description ),
|
|
||||||
m_tags( other.m_tags ),
|
|
||||||
m_lineInfo( other.m_lineInfo ),
|
|
||||||
m_isHidden( other.m_isHidden )
|
|
||||||
{}
|
|
||||||
|
|
||||||
void TestCaseInfo::invoke() const {
|
|
||||||
m_test->invoke();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& TestCaseInfo::getClassName() const {
|
void TestCase::invoke() const {
|
||||||
return m_className;
|
test->invoke();
|
||||||
}
|
|
||||||
const std::string& TestCaseInfo::getName() const {
|
|
||||||
return m_name;
|
|
||||||
}
|
|
||||||
const std::string& TestCaseInfo::getDescription() const {
|
|
||||||
return m_description;
|
|
||||||
}
|
|
||||||
const SourceLineInfo& TestCaseInfo::getLineInfo() const {
|
|
||||||
return m_lineInfo;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TestCaseInfo::isHidden() const {
|
bool TestCase::isHidden() const {
|
||||||
return m_isHidden;
|
return TestCaseInfo::isHidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TestCaseInfo::hasTag( const std::string& tag ) const {
|
bool TestCase::hasTag( std::string const& tag ) const {
|
||||||
return m_tags.find( tag ) != m_tags.end();
|
return tags.find( toLower( tag ) ) != tags.end();
|
||||||
}
|
}
|
||||||
bool TestCaseInfo::matchesTags( const std::string& tagPattern ) const {
|
bool TestCase::matchesTags( std::string const& tagPattern ) const {
|
||||||
TagExpression exp;
|
TagExpression exp;
|
||||||
TagExpressionParser( exp ).parse( tagPattern );
|
TagExpressionParser( exp ).parse( tagPattern );
|
||||||
return exp.matches( m_tags );
|
return exp.matches( tags );
|
||||||
}
|
}
|
||||||
const std::set<std::string>& TestCaseInfo::getTags() const {
|
std::set<std::string> const& TestCase::getTags() const {
|
||||||
return m_tags;
|
return tags;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestCaseInfo::swap( TestCaseInfo& other ) {
|
void TestCase::swap( TestCase& other ) {
|
||||||
m_test.swap( other.m_test );
|
test.swap( other.test );
|
||||||
m_className.swap( other.m_className );
|
className.swap( other.className );
|
||||||
m_name.swap( other.m_name );
|
name.swap( other.name );
|
||||||
m_description.swap( other.m_description );
|
description.swap( other.description );
|
||||||
std::swap( m_lineInfo, other.m_lineInfo );
|
std::swap( lineInfo, other.lineInfo );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TestCaseInfo::operator == ( const TestCaseInfo& other ) const {
|
bool TestCase::operator == ( TestCase const& other ) const {
|
||||||
return m_test.get() == other.m_test.get() &&
|
return test.get() == other.test.get() &&
|
||||||
m_name == other.m_name &&
|
name == other.name &&
|
||||||
m_className == other.m_className;
|
className == other.className;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TestCaseInfo::operator < ( const TestCaseInfo& other ) const {
|
bool TestCase::operator < ( TestCase const& other ) const {
|
||||||
return m_name < other.m_name;
|
return name < other.name;
|
||||||
}
|
}
|
||||||
TestCaseInfo& TestCaseInfo::operator = ( const TestCaseInfo& other ) {
|
TestCase& TestCase::operator = ( TestCase const& other ) {
|
||||||
TestCaseInfo temp( other );
|
TestCase temp( other );
|
||||||
swap( temp );
|
swap( temp );
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TestCaseInfo const& TestCase::getTestCaseInfo() const
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
} // end namespace Catch
|
} // end namespace Catch
|
||||||
|
|
||||||
#endif // TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED
|
#endif // TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED
|
||||||
|
|
|
@ -25,58 +25,59 @@ namespace Catch {
|
||||||
TestRegistry() : m_unnamedCount( 0 ) {}
|
TestRegistry() : m_unnamedCount( 0 ) {}
|
||||||
virtual ~TestRegistry();
|
virtual ~TestRegistry();
|
||||||
|
|
||||||
virtual void registerTest( const TestCaseInfo& testInfo ) {
|
virtual void registerTest( TestCase const& testCase ) {
|
||||||
if( testInfo.getName() == "" ) {
|
std::string name = testCase.getTestCaseInfo().name;
|
||||||
|
if( name == "" ) {
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << testInfo.getName() << "unnamed/" << ++m_unnamedCount;
|
oss << "Anonymous test case " << ++m_unnamedCount;
|
||||||
return registerTest( TestCaseInfo( testInfo, oss.str() ) );
|
return registerTest( testCase.withName( oss.str() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( m_functions.find( testInfo ) == m_functions.end() ) {
|
if( m_functions.find( testCase ) == m_functions.end() ) {
|
||||||
m_functions.insert( testInfo );
|
m_functions.insert( testCase );
|
||||||
m_functionsInOrder.push_back( testInfo );
|
m_functionsInOrder.push_back( testCase );
|
||||||
if( !testInfo.isHidden() )
|
if( !testCase.isHidden() )
|
||||||
m_nonHiddenFunctions.push_back( testInfo );
|
m_nonHiddenFunctions.push_back( testCase );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const TestCaseInfo& prev = *m_functions.find( testInfo );
|
TestCase const& prev = *m_functions.find( testCase );
|
||||||
std::cerr << "error: TEST_CASE( \"" << testInfo.getName() << "\" ) already defined.\n"
|
std::cerr << "error: TEST_CASE( \"" << name << "\" ) already defined.\n"
|
||||||
<< "\tFirst seen at " << SourceLineInfo( prev.getLineInfo() ) << "\n"
|
<< "\tFirst seen at " << SourceLineInfo( prev.getTestCaseInfo().lineInfo ) << "\n"
|
||||||
<< "\tRedefined at " << SourceLineInfo( testInfo.getLineInfo() ) << std::endl;
|
<< "\tRedefined at " << SourceLineInfo( testCase.getTestCaseInfo().lineInfo ) << std::endl;
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual const std::vector<TestCaseInfo>& getAllTests() const {
|
virtual std::vector<TestCase> const& getAllTests() const {
|
||||||
return m_functionsInOrder;
|
return m_functionsInOrder;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual const std::vector<TestCaseInfo>& getAllNonHiddenTests() const {
|
virtual std::vector<TestCase> const& getAllNonHiddenTests() const {
|
||||||
return m_nonHiddenFunctions;
|
return m_nonHiddenFunctions;
|
||||||
}
|
}
|
||||||
|
|
||||||
// !TBD deprecated
|
// !TBD deprecated
|
||||||
virtual std::vector<TestCaseInfo> getMatchingTestCases( const std::string& rawTestSpec ) const {
|
virtual std::vector<TestCase> getMatchingTestCases( std::string const& rawTestSpec ) const {
|
||||||
std::vector<TestCaseInfo> matchingTests;
|
std::vector<TestCase> matchingTests;
|
||||||
getMatchingTestCases( rawTestSpec, matchingTests );
|
getMatchingTestCases( rawTestSpec, matchingTests );
|
||||||
return matchingTests;
|
return matchingTests;
|
||||||
}
|
}
|
||||||
|
|
||||||
// !TBD deprecated
|
// !TBD deprecated
|
||||||
virtual void getMatchingTestCases( const std::string& rawTestSpec, std::vector<TestCaseInfo>& matchingTestsOut ) const {
|
virtual void getMatchingTestCases( std::string const& rawTestSpec, std::vector<TestCase>& matchingTestsOut ) const {
|
||||||
TestCaseFilter filter( rawTestSpec );
|
TestCaseFilter filter( rawTestSpec );
|
||||||
|
|
||||||
std::vector<TestCaseInfo>::const_iterator it = m_functionsInOrder.begin();
|
std::vector<TestCase>::const_iterator it = m_functionsInOrder.begin();
|
||||||
std::vector<TestCaseInfo>::const_iterator itEnd = m_functionsInOrder.end();
|
std::vector<TestCase>::const_iterator itEnd = m_functionsInOrder.end();
|
||||||
for(; it != itEnd; ++it ) {
|
for(; it != itEnd; ++it ) {
|
||||||
if( filter.shouldInclude( *it ) ) {
|
if( filter.shouldInclude( *it ) ) {
|
||||||
matchingTestsOut.push_back( *it );
|
matchingTestsOut.push_back( *it );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
virtual void getMatchingTestCases( const TestCaseFilters& filters, std::vector<TestCaseInfo>& matchingTestsOut ) const {
|
virtual void getMatchingTestCases( TestCaseFilters const& filters, std::vector<TestCase>& matchingTestsOut ) const {
|
||||||
std::vector<TestCaseInfo>::const_iterator it = m_functionsInOrder.begin();
|
std::vector<TestCase>::const_iterator it = m_functionsInOrder.begin();
|
||||||
std::vector<TestCaseInfo>::const_iterator itEnd = m_functionsInOrder.end();
|
std::vector<TestCase>::const_iterator itEnd = m_functionsInOrder.end();
|
||||||
// !TBD: replace with algorithm
|
// !TBD: replace with algorithm
|
||||||
for(; it != itEnd; ++it )
|
for(; it != itEnd; ++it )
|
||||||
if( filters.shouldInclude( *it ) )
|
if( filters.shouldInclude( *it ) )
|
||||||
|
@ -85,9 +86,9 @@ namespace Catch {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
std::set<TestCaseInfo> m_functions;
|
std::set<TestCase> m_functions;
|
||||||
std::vector<TestCaseInfo> m_functionsInOrder;
|
std::vector<TestCase> m_functionsInOrder;
|
||||||
std::vector<TestCaseInfo> m_nonHiddenFunctions;
|
std::vector<TestCase> m_nonHiddenFunctions;
|
||||||
size_t m_unnamedCount;
|
size_t m_unnamedCount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -108,7 +109,7 @@ namespace Catch {
|
||||||
TestFunction m_fun;
|
TestFunction m_fun;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline std::string extractClassName( const std::string& classOrQualifiedMethodName ) {
|
inline std::string extractClassName( std::string const& classOrQualifiedMethodName ) {
|
||||||
std::string className = classOrQualifiedMethodName;
|
std::string className = classOrQualifiedMethodName;
|
||||||
if( className[0] == '&' )
|
if( className[0] == '&' )
|
||||||
{
|
{
|
||||||
|
@ -124,21 +125,24 @@ namespace Catch {
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
AutoReg::AutoReg( TestFunction function,
|
AutoReg::AutoReg( TestFunction function,
|
||||||
const char* name,
|
SourceLineInfo const& lineInfo,
|
||||||
const char* description,
|
NameAndDesc const& nameAndDesc ) {
|
||||||
const SourceLineInfo& lineInfo ) {
|
registerTestCase( new FreeFunctionTestCase( function ), "global", nameAndDesc, lineInfo );
|
||||||
registerTestCase( new FreeFunctionTestCase( function ), "global", name, description, lineInfo );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AutoReg::~AutoReg() {}
|
AutoReg::~AutoReg() {}
|
||||||
|
|
||||||
void AutoReg::registerTestCase( ITestCase* testCase,
|
void AutoReg::registerTestCase( ITestCase* testCase,
|
||||||
const char* classOrQualifiedMethodName,
|
char const* classOrQualifiedMethodName,
|
||||||
const char* name,
|
NameAndDesc const& nameAndDesc,
|
||||||
const char* description,
|
SourceLineInfo const& lineInfo ) {
|
||||||
const SourceLineInfo& lineInfo ) {
|
|
||||||
|
|
||||||
getMutableRegistryHub().registerTest( TestCaseInfo( testCase, extractClassName( classOrQualifiedMethodName ), name, description, lineInfo ) );
|
getMutableRegistryHub().registerTest
|
||||||
|
( makeTestCase( testCase,
|
||||||
|
extractClassName( classOrQualifiedMethodName ),
|
||||||
|
nameAndDesc.name,
|
||||||
|
nameAndDesc.description,
|
||||||
|
lineInfo ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
} // end namespace Catch
|
} // end namespace Catch
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
#include "catch_common.h"
|
#include "catch_common.h"
|
||||||
#include "catch_interfaces_testcase.h"
|
#include "catch_interfaces_testcase.h"
|
||||||
|
#include "internal/catch_compiler_capabilities.h"
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
|
@ -32,61 +33,88 @@ private:
|
||||||
|
|
||||||
typedef void(*TestFunction)();
|
typedef void(*TestFunction)();
|
||||||
|
|
||||||
|
struct NameAndDesc {
|
||||||
|
NameAndDesc( const char* _name = "", const char* _description= "" )
|
||||||
|
: name( _name ), description( _description )
|
||||||
|
{}
|
||||||
|
|
||||||
|
const char* name;
|
||||||
|
const char* description;
|
||||||
|
};
|
||||||
|
|
||||||
struct AutoReg {
|
struct AutoReg {
|
||||||
|
|
||||||
AutoReg( TestFunction function,
|
AutoReg( TestFunction function,
|
||||||
const char* name,
|
SourceLineInfo const& lineInfo,
|
||||||
const char* description,
|
NameAndDesc const& nameAndDesc );
|
||||||
const SourceLineInfo& lineInfo );
|
|
||||||
|
|
||||||
template<typename C>
|
template<typename C>
|
||||||
AutoReg( void (C::*method)(),
|
AutoReg( void (C::*method)(),
|
||||||
const char* className,
|
char const* className,
|
||||||
const char* name,
|
NameAndDesc const& nameAndDesc,
|
||||||
const char* description,
|
SourceLineInfo const& lineInfo ) {
|
||||||
const SourceLineInfo& lineInfo ) {
|
registerTestCase( new MethodTestCase<C>( method ),
|
||||||
registerTestCase( new MethodTestCase<C>( method ), className, name, description, lineInfo );
|
className,
|
||||||
|
nameAndDesc,
|
||||||
|
lineInfo );
|
||||||
}
|
}
|
||||||
|
|
||||||
void registerTestCase( ITestCase* testCase,
|
void registerTestCase( ITestCase* testCase,
|
||||||
const char* className,
|
char const* className,
|
||||||
const char* name,
|
NameAndDesc const& nameAndDesc,
|
||||||
const char* description,
|
SourceLineInfo const& lineInfo );
|
||||||
const SourceLineInfo& lineInfo );
|
|
||||||
|
|
||||||
~AutoReg();
|
~AutoReg();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
AutoReg( const AutoReg& );
|
AutoReg( AutoReg const& );
|
||||||
void operator= ( const AutoReg& );
|
void operator= ( AutoReg const& );
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace Catch
|
} // end namespace Catch
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
#ifdef CATCH_CONFIG_VARIADIC_MACROS
|
||||||
#define INTERNAL_CATCH_TESTCASE( Name, Desc ) \
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
static void INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ )(); \
|
#define INTERNAL_CATCH_TESTCASE( ... ) \
|
||||||
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ ), Name, Desc, CATCH_INTERNAL_LINEINFO ); }\
|
static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \
|
||||||
static void INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ )()
|
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\
|
||||||
|
static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )()
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_TESTCASE_NORETURN( Name, Desc ) \
|
#define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \
|
||||||
static void INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ )() CATCH_ATTRIBUTE_NORETURN; \
|
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); }
|
||||||
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ ), Name, Desc, CATCH_INTERNAL_LINEINFO ); }\
|
|
||||||
static void INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ )()
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \
|
#define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... )\
|
||||||
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Name, Desc, CATCH_INTERNAL_LINEINFO ); }
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
#define TEST_CASE_METHOD( ClassName, TestName, Desc )\
|
|
||||||
namespace{ \
|
namespace{ \
|
||||||
struct INTERNAL_CATCH_UNIQUE_NAME( TestCaseMethod_catch_internal_ ) : ClassName{ \
|
struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \
|
||||||
void test(); \
|
void test(); \
|
||||||
}; \
|
}; \
|
||||||
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( TestCaseMethod_catch_internal_ )::test, #ClassName, TestName, Desc, CATCH_INTERNAL_LINEINFO ); \
|
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \
|
||||||
} \
|
} \
|
||||||
void INTERNAL_CATCH_UNIQUE_NAME( TestCaseMethod_catch_internal_ )::test()
|
void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test()
|
||||||
|
|
||||||
|
#else
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
#define INTERNAL_CATCH_TESTCASE( Name, Desc ) \
|
||||||
|
static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \
|
||||||
|
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\
|
||||||
|
static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )()
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
#define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \
|
||||||
|
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); }
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
#define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\
|
||||||
|
namespace{ \
|
||||||
|
struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \
|
||||||
|
void test(); \
|
||||||
|
}; \
|
||||||
|
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \
|
||||||
|
} \
|
||||||
|
void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test()
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED
|
#endif // TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
#include "catch_test_case_info.h"
|
#include "catch_test_case_info.h"
|
||||||
#include "catch_tags.hpp"
|
#include "catch_tags.hpp"
|
||||||
|
#include "catch_common.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
@ -31,8 +32,8 @@ namespace Catch {
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TestCaseFilter( const std::string& testSpec, IfFilterMatches::DoWhat matchBehaviour = IfFilterMatches::AutoDetectBehaviour )
|
TestCaseFilter( std::string const& testSpec, IfFilterMatches::DoWhat matchBehaviour = IfFilterMatches::AutoDetectBehaviour )
|
||||||
: m_stringToMatch( testSpec ),
|
: m_stringToMatch( toLower( testSpec ) ),
|
||||||
m_filterType( matchBehaviour ),
|
m_filterType( matchBehaviour ),
|
||||||
m_wildcardPosition( NoWildcard )
|
m_wildcardPosition( NoWildcard )
|
||||||
{
|
{
|
||||||
|
@ -50,11 +51,11 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( m_stringToMatch[0] == '*' ) {
|
if( startsWith( m_stringToMatch, "*" ) ) {
|
||||||
m_stringToMatch = m_stringToMatch.substr( 1 );
|
m_stringToMatch = m_stringToMatch.substr( 1 );
|
||||||
m_wildcardPosition = (WildcardPosition)( m_wildcardPosition | WildcardAtStart );
|
m_wildcardPosition = (WildcardPosition)( m_wildcardPosition | WildcardAtStart );
|
||||||
}
|
}
|
||||||
if( m_stringToMatch[m_stringToMatch.size()-1] == '*' ) {
|
if( endsWith( m_stringToMatch, "*" ) ) {
|
||||||
m_stringToMatch = m_stringToMatch.substr( 0, m_stringToMatch.size()-1 );
|
m_stringToMatch = m_stringToMatch.substr( 0, m_stringToMatch.size()-1 );
|
||||||
m_wildcardPosition = (WildcardPosition)( m_wildcardPosition | WildcardAtEnd );
|
m_wildcardPosition = (WildcardPosition)( m_wildcardPosition | WildcardAtEnd );
|
||||||
}
|
}
|
||||||
|
@ -64,7 +65,7 @@ namespace Catch {
|
||||||
return m_filterType;
|
return m_filterType;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool shouldInclude( const TestCaseInfo& testCase ) const {
|
bool shouldInclude( TestCase const& testCase ) const {
|
||||||
return isMatch( testCase ) == (m_filterType == IfFilterMatches::IncludeTests);
|
return isMatch( testCase ) == (m_filterType == IfFilterMatches::IncludeTests);
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
|
@ -74,8 +75,9 @@ namespace Catch {
|
||||||
#pragma clang diagnostic ignored "-Wunreachable-code"
|
#pragma clang diagnostic ignored "-Wunreachable-code"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool isMatch( const TestCaseInfo& testCase ) const {
|
bool isMatch( TestCase const& testCase ) const {
|
||||||
const std::string& name = testCase.getName();
|
std::string name = testCase.getTestCaseInfo().name;
|
||||||
|
toLowerInPlace( name );
|
||||||
|
|
||||||
switch( m_wildcardPosition ) {
|
switch( m_wildcardPosition ) {
|
||||||
case NoWildcard:
|
case NoWildcard:
|
||||||
|
@ -101,27 +103,27 @@ namespace Catch {
|
||||||
|
|
||||||
class TestCaseFilters {
|
class TestCaseFilters {
|
||||||
public:
|
public:
|
||||||
TestCaseFilters( const std::string& name ) : m_name( name ) {}
|
TestCaseFilters( std::string const& name ) : m_name( name ) {}
|
||||||
|
|
||||||
std::string getName() const {
|
std::string getName() const {
|
||||||
return m_name;
|
return m_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
void addFilter( const TestCaseFilter& filter ) {
|
void addFilter( TestCaseFilter const& filter ) {
|
||||||
if( filter.getFilterType() == IfFilterMatches::ExcludeTests )
|
if( filter.getFilterType() == IfFilterMatches::ExcludeTests )
|
||||||
m_exclusionFilters.push_back( filter );
|
m_exclusionFilters.push_back( filter );
|
||||||
else
|
else
|
||||||
m_inclusionFilters.push_back( filter );
|
m_inclusionFilters.push_back( filter );
|
||||||
}
|
}
|
||||||
|
|
||||||
void addTags( const std::string& tagPattern ) {
|
void addTags( std::string const& tagPattern ) {
|
||||||
TagExpression exp;
|
TagExpression exp;
|
||||||
TagExpressionParser( exp ).parse( tagPattern );
|
TagExpressionParser( exp ).parse( tagPattern );
|
||||||
|
|
||||||
m_tagExpressions.push_back( exp );
|
m_tagExpressions.push_back( exp );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool shouldInclude( const TestCaseInfo& testCase ) const {
|
bool shouldInclude( TestCase const& testCase ) const {
|
||||||
if( !m_tagExpressions.empty() ) {
|
if( !m_tagExpressions.empty() ) {
|
||||||
std::vector<TagExpression>::const_iterator it = m_tagExpressions.begin();
|
std::vector<TagExpression>::const_iterator it = m_tagExpressions.begin();
|
||||||
std::vector<TagExpression>::const_iterator itEnd = m_tagExpressions.end();
|
std::vector<TagExpression>::const_iterator itEnd = m_tagExpressions.end();
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
* Created by Phil on 18/4/2013.
|
||||||
|
* Copyright 2013 Two Blue Cubes Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef TWOBLUECUBES_CATCH_TEXT_H_INCLUDED
|
||||||
|
#define TWOBLUECUBES_CATCH_TEXT_H_INCLUDED
|
||||||
|
|
||||||
|
#include "catch_config.hpp"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace Catch {
|
||||||
|
|
||||||
|
struct TextAttributes {
|
||||||
|
TextAttributes()
|
||||||
|
: initialIndent( std::string::npos ),
|
||||||
|
indent( 0 ),
|
||||||
|
width( CATCH_CONFIG_CONSOLE_WIDTH-1 ),
|
||||||
|
tabChar( '\t' )
|
||||||
|
{}
|
||||||
|
|
||||||
|
TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; }
|
||||||
|
TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; }
|
||||||
|
TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; }
|
||||||
|
TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; }
|
||||||
|
|
||||||
|
std::size_t initialIndent; // indent of first line, or npos
|
||||||
|
std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos
|
||||||
|
std::size_t width; // maximum width of text, including indent. Longer text will wrap
|
||||||
|
char tabChar; // If this char is seen the indent is changed to current pos
|
||||||
|
};
|
||||||
|
|
||||||
|
class Text {
|
||||||
|
public:
|
||||||
|
Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() );
|
||||||
|
void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos );
|
||||||
|
|
||||||
|
typedef std::vector<std::string>::const_iterator const_iterator;
|
||||||
|
|
||||||
|
const_iterator begin() const { return lines.begin(); }
|
||||||
|
const_iterator end() const { return lines.end(); }
|
||||||
|
std::string const& last() const { return lines.back(); }
|
||||||
|
std::size_t size() const { return lines.size(); }
|
||||||
|
std::string const& operator[]( std::size_t _index ) const { return lines[_index]; }
|
||||||
|
std::string toString() const;
|
||||||
|
|
||||||
|
friend std::ostream& operator << ( std::ostream& _stream, Text const& _text );
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string str;
|
||||||
|
TextAttributes attr;
|
||||||
|
std::vector<std::string> lines;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // end namespace Catch
|
||||||
|
|
||||||
|
#endif // TWOBLUECUBES_CATCH_TEXT_H_INCLUDED
|
|
@ -0,0 +1,92 @@
|
||||||
|
/*
|
||||||
|
* Created by Phil on 20/4/2013.
|
||||||
|
* Copyright 2013 Two Blue Cubes Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef TWOBLUECUBES_CATCH_TEXT_HPP_INCLUDED
|
||||||
|
#define TWOBLUECUBES_CATCH_TEXT_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace Catch {
|
||||||
|
|
||||||
|
Text::Text( std::string const& _str, TextAttributes const& _attr )
|
||||||
|
: attr( _attr )
|
||||||
|
{
|
||||||
|
std::string wrappableChars = " [({.,/|\\-";
|
||||||
|
std::size_t indent = _attr.initialIndent != std::string::npos
|
||||||
|
? _attr.initialIndent
|
||||||
|
: _attr.indent;
|
||||||
|
std::string remainder = _str;
|
||||||
|
|
||||||
|
while( !remainder.empty() ) {
|
||||||
|
assert( lines.size() < 1000 );
|
||||||
|
std::size_t tabPos = std::string::npos;
|
||||||
|
std::size_t width = (std::min)( remainder.size(), _attr.width - indent );
|
||||||
|
std::size_t pos = remainder.find_first_of( '\n' );
|
||||||
|
if( pos <= width ) {
|
||||||
|
width = pos;
|
||||||
|
}
|
||||||
|
pos = remainder.find_last_of( _attr.tabChar, width );
|
||||||
|
if( pos != std::string::npos ) {
|
||||||
|
tabPos = pos;
|
||||||
|
if( remainder[width] == '\n' )
|
||||||
|
width--;
|
||||||
|
remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( width == remainder.size() ) {
|
||||||
|
spliceLine( indent, remainder, width );
|
||||||
|
}
|
||||||
|
else if( remainder[width] == '\n' ) {
|
||||||
|
spliceLine( indent, remainder, width );
|
||||||
|
if( width <= 1 || remainder.size() != 1 )
|
||||||
|
remainder = remainder.substr( 1 );
|
||||||
|
indent = _attr.indent;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pos = remainder.find_last_of( wrappableChars, width );
|
||||||
|
if( pos != std::string::npos && pos > 0 ) {
|
||||||
|
spliceLine( indent, remainder, pos );
|
||||||
|
if( remainder[0] == ' ' )
|
||||||
|
remainder = remainder.substr( 1 );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
spliceLine( indent, remainder, width-1 );
|
||||||
|
lines.back() += "-";
|
||||||
|
}
|
||||||
|
if( lines.size() == 1 )
|
||||||
|
indent = _attr.indent;
|
||||||
|
if( tabPos != std::string::npos )
|
||||||
|
indent += tabPos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Text::spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) {
|
||||||
|
lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) );
|
||||||
|
_remainder = _remainder.substr( _pos );
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string Text::toString() const {
|
||||||
|
std::ostringstream oss;
|
||||||
|
oss << *this;
|
||||||
|
return oss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream& operator << ( std::ostream& _stream, Text const& _text ) {
|
||||||
|
for( Text::const_iterator it = _text.begin(), itEnd = _text.end();
|
||||||
|
it != itEnd; ++it ) {
|
||||||
|
if( it != _text.begin() )
|
||||||
|
_stream << "\n";
|
||||||
|
_stream << *it;
|
||||||
|
}
|
||||||
|
return _stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // end namespace Catch
|
||||||
|
|
||||||
|
#endif // TWOBLUECUBES_CATCH_TEXT_HPP_INCLUDED
|
|
@ -9,7 +9,11 @@
|
||||||
#define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED
|
#define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED
|
||||||
|
|
||||||
#include "catch_common.h"
|
#include "catch_common.h"
|
||||||
|
#include "catch_sfinae.hpp"
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
#ifdef __OBJC__
|
#ifdef __OBJC__
|
||||||
#include "catch_objc_arc.hpp"
|
#include "catch_objc_arc.hpp"
|
||||||
|
@ -18,41 +22,99 @@
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
namespace Detail {
|
namespace Detail {
|
||||||
|
|
||||||
struct NonStreamable {
|
// SFINAE is currently disabled by default for all compilers.
|
||||||
template<typename T> NonStreamable( const T& ){}
|
// If the non SFINAE version of IsStreamInsertable is ambiguous for you
|
||||||
|
// and your compiler supports SFINAE, try #defining CATCH_CONFIG_SFINAE
|
||||||
|
#ifdef CATCH_CONFIG_SFINAE
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class IsStreamInsertableHelper {
|
||||||
|
template<int N> struct TrueIfSizeable : TrueType {};
|
||||||
|
|
||||||
|
template<typename T2>
|
||||||
|
static TrueIfSizeable<sizeof((*(std::ostream*)0) << *((T2 const*)0))> dummy(T2*);
|
||||||
|
static FalseType dummy(...);
|
||||||
|
|
||||||
|
public:
|
||||||
|
typedef SizedIf<sizeof(dummy((T*)0))> type;
|
||||||
};
|
};
|
||||||
|
|
||||||
// If the type does not have its own << overload for ostream then
|
template<typename T>
|
||||||
// this one will be used instead
|
struct IsStreamInsertable : IsStreamInsertableHelper<T>::type {};
|
||||||
inline std::ostream& operator << ( std::ostream& ss, NonStreamable ){
|
|
||||||
return ss << "{?}";
|
#else
|
||||||
}
|
|
||||||
|
struct BorgType {
|
||||||
|
template<typename T> BorgType( T const& );
|
||||||
|
};
|
||||||
|
|
||||||
|
TrueType& testStreamable( std::ostream& );
|
||||||
|
FalseType testStreamable( FalseType );
|
||||||
|
|
||||||
|
FalseType operator<<( std::ostream const&, BorgType const& );
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline std::string makeString( const T& value ) {
|
struct IsStreamInsertable {
|
||||||
|
static std::ostream &s;
|
||||||
|
static T const&t;
|
||||||
|
enum { value = sizeof( testStreamable(s << t) ) == sizeof( TrueType ) };
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template<bool C>
|
||||||
|
struct StringMakerBase {
|
||||||
|
template<typename T>
|
||||||
|
static std::string convert( T const& ) { return "{?}"; }
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct StringMakerBase<true> {
|
||||||
|
template<typename T>
|
||||||
|
static std::string convert( T const& _value ) {
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << value;
|
oss << _value;
|
||||||
return oss.str();
|
return oss.str();
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
template<typename T>
|
} // end namespace Detail
|
||||||
inline std::string makeString( T* p ) {
|
|
||||||
|
template<typename T>
|
||||||
|
struct StringMaker :
|
||||||
|
Detail::StringMakerBase<Detail::IsStreamInsertable<T>::value> {};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct StringMaker<T*> {
|
||||||
|
static std::string convert( T const* p ) {
|
||||||
if( !p )
|
if( !p )
|
||||||
return INTERNAL_CATCH_STRINGIFY( NULL );
|
return INTERNAL_CATCH_STRINGIFY( NULL );
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << p;
|
oss << p;
|
||||||
return oss.str();
|
return oss.str();
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline std::string makeString( const T* p ) {
|
struct StringMaker<std::vector<T> > {
|
||||||
if( !p )
|
static std::string convert( std::vector<T> const& v ) {
|
||||||
return INTERNAL_CATCH_STRINGIFY( NULL );
|
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << p;
|
oss << "{ ";
|
||||||
|
for( std::size_t i = 0; i < v.size(); ++ i ) {
|
||||||
|
oss << toString( v[i] );
|
||||||
|
if( i < v.size() - 1 )
|
||||||
|
oss << ", ";
|
||||||
|
}
|
||||||
|
oss << " }";
|
||||||
return oss.str();
|
return oss.str();
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace Detail {
|
||||||
|
template<typename T>
|
||||||
|
inline std::string makeString( T const& value ) {
|
||||||
|
return StringMaker<T>::convert( value );
|
||||||
|
}
|
||||||
} // end namespace Detail
|
} // end namespace Detail
|
||||||
|
|
||||||
/// \brief converts any type to a string
|
/// \brief converts any type to a string
|
||||||
|
@ -63,17 +125,17 @@ namespace Detail {
|
||||||
/// Overload (not specialise) this template for custom typs that you don't want
|
/// Overload (not specialise) this template for custom typs that you don't want
|
||||||
/// to provide an ostream overload for.
|
/// to provide an ostream overload for.
|
||||||
template<typename T>
|
template<typename T>
|
||||||
std::string toString( const T& value ) {
|
std::string toString( T const& value ) {
|
||||||
return Detail::makeString( value );
|
return StringMaker<T>::convert( value );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Built in overloads
|
// Built in overloads
|
||||||
|
|
||||||
inline std::string toString( const std::string& value ) {
|
inline std::string toString( std::string const& value ) {
|
||||||
return "\"" + value + "\"";
|
return "\"" + value + "\"";
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::string toString( const std::wstring& value ) {
|
inline std::string toString( std::wstring const& value ) {
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << "\"";
|
oss << "\"";
|
||||||
for(size_t i = 0; i < value.size(); ++i )
|
for(size_t i = 0; i < value.size(); ++i )
|
||||||
|
@ -111,7 +173,8 @@ inline std::string toString( unsigned int value ) {
|
||||||
|
|
||||||
inline std::string toString( const double value ) {
|
inline std::string toString( const double value ) {
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << value;
|
oss << std::setprecision (std::numeric_limits<double>::digits10 + 1)
|
||||||
|
<< value;
|
||||||
return oss.str();
|
return oss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,7 +184,7 @@ inline std::string toString( bool value ) {
|
||||||
|
|
||||||
inline std::string toString( char value ) {
|
inline std::string toString( char value ) {
|
||||||
return value < ' '
|
return value < ' '
|
||||||
? toString( (unsigned int)value )
|
? toString( static_cast<unsigned int>( value ) )
|
||||||
: Detail::makeString( value );
|
: Detail::makeString( value );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,6 +192,10 @@ inline std::string toString( signed char value ) {
|
||||||
return toString( static_cast<char>( value ) );
|
return toString( static_cast<char>( value ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline std::string toString( unsigned char value ) {
|
||||||
|
return toString( static_cast<char>( value ) );
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CATCH_CONFIG_CPP11_NULLPTR
|
#ifdef CATCH_CONFIG_CPP11_NULLPTR
|
||||||
inline std::string toString( std::nullptr_t ) {
|
inline std::string toString( std::nullptr_t ) {
|
||||||
return "nullptr";
|
return "nullptr";
|
||||||
|
@ -137,9 +204,13 @@ inline std::string toString( std::nullptr_t ) {
|
||||||
|
|
||||||
#ifdef __OBJC__
|
#ifdef __OBJC__
|
||||||
inline std::string toString( NSString const * const& nsstring ) {
|
inline std::string toString( NSString const * const& nsstring ) {
|
||||||
|
if( !nsstring )
|
||||||
|
return "nil";
|
||||||
return std::string( "@\"" ) + [nsstring UTF8String] + "\"";
|
return std::string( "@\"" ) + [nsstring UTF8String] + "\"";
|
||||||
}
|
}
|
||||||
inline std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ) {
|
inline std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ) {
|
||||||
|
if( !nsstring )
|
||||||
|
return "nil";
|
||||||
return std::string( "@\"" ) + [nsstring UTF8String] + "\"";
|
return std::string( "@\"" ) + [nsstring UTF8String] + "\"";
|
||||||
}
|
}
|
||||||
inline std::string toString( NSObject* const& nsObject ) {
|
inline std::string toString( NSObject* const& nsObject ) {
|
||||||
|
|
|
@ -15,13 +15,13 @@ namespace Catch {
|
||||||
struct Counts {
|
struct Counts {
|
||||||
Counts() : passed( 0 ), failed( 0 ) {}
|
Counts() : passed( 0 ), failed( 0 ) {}
|
||||||
|
|
||||||
Counts operator - ( const Counts& other ) const {
|
Counts operator - ( Counts const& other ) const {
|
||||||
Counts diff;
|
Counts diff;
|
||||||
diff.passed = passed - other.passed;
|
diff.passed = passed - other.passed;
|
||||||
diff.failed = failed - other.failed;
|
diff.failed = failed - other.failed;
|
||||||
return diff;
|
return diff;
|
||||||
}
|
}
|
||||||
Counts& operator += ( const Counts& other ) {
|
Counts& operator += ( Counts const& other ) {
|
||||||
passed += other.passed;
|
passed += other.passed;
|
||||||
failed += other.failed;
|
failed += other.failed;
|
||||||
return *this;
|
return *this;
|
||||||
|
@ -37,14 +37,14 @@ namespace Catch {
|
||||||
|
|
||||||
struct Totals {
|
struct Totals {
|
||||||
|
|
||||||
Totals operator - ( const Totals& other ) const {
|
Totals operator - ( Totals const& other ) const {
|
||||||
Totals diff;
|
Totals diff;
|
||||||
diff.assertions = assertions - other.assertions;
|
diff.assertions = assertions - other.assertions;
|
||||||
diff.testCases = testCases - other.testCases;
|
diff.testCases = testCases - other.testCases;
|
||||||
return diff;
|
return diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
Totals delta( const Totals& prevTotals ) const {
|
Totals delta( Totals const& prevTotals ) const {
|
||||||
Totals diff = *this - prevTotals;
|
Totals diff = *this - prevTotals;
|
||||||
if( diff.assertions.failed > 0 )
|
if( diff.assertions.failed > 0 )
|
||||||
++diff.testCases.failed;
|
++diff.testCases.failed;
|
||||||
|
@ -53,7 +53,7 @@ namespace Catch {
|
||||||
return diff;
|
return diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
Totals& operator += ( const Totals& other ) {
|
Totals& operator += ( Totals const& other ) {
|
||||||
assertions += other.assertions;
|
assertions += other.assertions;
|
||||||
testCases += other.testCases;
|
testCases += other.testCases;
|
||||||
return *this;
|
return *this;
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Created by Phil on 13/11/2012.
|
||||||
|
* Copyright 2012 Two Blue Cubes Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef TWOBLUECUBES_CATCH_VERSION_H_INCLUDED
|
||||||
|
#define TWOBLUECUBES_CATCH_VERSION_H_INCLUDED
|
||||||
|
|
||||||
|
namespace Catch {
|
||||||
|
|
||||||
|
// Versioning information
|
||||||
|
struct Version {
|
||||||
|
Version( unsigned int _majorVersion,
|
||||||
|
unsigned int _minorVersion,
|
||||||
|
unsigned int _buildNumber,
|
||||||
|
std::string const& _branchName )
|
||||||
|
: majorVersion( _majorVersion ),
|
||||||
|
minorVersion( _minorVersion ),
|
||||||
|
buildNumber( _buildNumber ),
|
||||||
|
branchName( _branchName )
|
||||||
|
{}
|
||||||
|
|
||||||
|
const unsigned int majorVersion;
|
||||||
|
const unsigned int minorVersion;
|
||||||
|
const unsigned int buildNumber;
|
||||||
|
const std::string branchName;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void operator=( Version const& );
|
||||||
|
};
|
||||||
|
|
||||||
|
extern Version libraryVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // TWOBLUECUBES_CATCH_VERSION_H_INCLUDED
|
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
* Created by Phil on 14/11/2012.
|
||||||
|
* Copyright 2012 Two Blue Cubes Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED
|
||||||
|
#define TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include "catch_version.h"
|
||||||
|
|
||||||
|
namespace Catch {
|
||||||
|
|
||||||
|
// These numbers are maintained by a script
|
||||||
|
Version libraryVersion( 1, 0, 1, "master" );
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED
|
|
@ -24,7 +24,7 @@ namespace Catch {
|
||||||
: m_writer( writer )
|
: m_writer( writer )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
ScopedElement( const ScopedElement& other )
|
ScopedElement( ScopedElement const& other )
|
||||||
: m_writer( other.m_writer ){
|
: m_writer( other.m_writer ){
|
||||||
other.m_writer = NULL;
|
other.m_writer = NULL;
|
||||||
}
|
}
|
||||||
|
@ -34,13 +34,13 @@ namespace Catch {
|
||||||
m_writer->endElement();
|
m_writer->endElement();
|
||||||
}
|
}
|
||||||
|
|
||||||
ScopedElement& writeText( const std::string& text ) {
|
ScopedElement& writeText( std::string const& text, bool indent = true ) {
|
||||||
m_writer->writeText( text );
|
m_writer->writeText( text, indent );
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
ScopedElement& writeAttribute( const std::string& name, const T& attribute ) {
|
ScopedElement& writeAttribute( std::string const& name, T const& attribute ) {
|
||||||
m_writer->writeAttribute( name, attribute );
|
m_writer->writeAttribute( name, attribute );
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ namespace Catch {
|
||||||
endElement();
|
endElement();
|
||||||
}
|
}
|
||||||
|
|
||||||
XmlWriter& operator = ( const XmlWriter& other ) {
|
XmlWriter& operator = ( XmlWriter const& other ) {
|
||||||
XmlWriter temp( other );
|
XmlWriter temp( other );
|
||||||
swap( temp );
|
swap( temp );
|
||||||
return *this;
|
return *this;
|
||||||
|
@ -80,7 +80,7 @@ namespace Catch {
|
||||||
std::swap( m_os, other.m_os );
|
std::swap( m_os, other.m_os );
|
||||||
}
|
}
|
||||||
|
|
||||||
XmlWriter& startElement( const std::string& name ) {
|
XmlWriter& startElement( std::string const& name ) {
|
||||||
ensureTagClosed();
|
ensureTagClosed();
|
||||||
newlineIfNecessary();
|
newlineIfNecessary();
|
||||||
stream() << m_indent << "<" << name;
|
stream() << m_indent << "<" << name;
|
||||||
|
@ -90,7 +90,7 @@ namespace Catch {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
ScopedElement scopedElement( const std::string& name ) {
|
ScopedElement scopedElement( std::string const& name ) {
|
||||||
ScopedElement scoped( this );
|
ScopedElement scoped( this );
|
||||||
startElement( name );
|
startElement( name );
|
||||||
return scoped;
|
return scoped;
|
||||||
|
@ -110,7 +110,7 @@ namespace Catch {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
XmlWriter& writeAttribute( const std::string& name, const std::string& attribute ) {
|
XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ) {
|
||||||
if( !name.empty() && !attribute.empty() ) {
|
if( !name.empty() && !attribute.empty() ) {
|
||||||
stream() << " " << name << "=\"";
|
stream() << " " << name << "=\"";
|
||||||
writeEncodedText( attribute );
|
writeEncodedText( attribute );
|
||||||
|
@ -119,23 +119,23 @@ namespace Catch {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
XmlWriter& writeAttribute( const std::string& name, bool attribute ) {
|
XmlWriter& writeAttribute( std::string const& name, bool attribute ) {
|
||||||
stream() << " " << name << "=\"" << ( attribute ? "true" : "false" ) << "\"";
|
stream() << " " << name << "=\"" << ( attribute ? "true" : "false" ) << "\"";
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
XmlWriter& writeAttribute( const std::string& name, const T& attribute ) {
|
XmlWriter& writeAttribute( std::string const& name, T const& attribute ) {
|
||||||
if( !name.empty() )
|
if( !name.empty() )
|
||||||
stream() << " " << name << "=\"" << attribute << "\"";
|
stream() << " " << name << "=\"" << attribute << "\"";
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
XmlWriter& writeText( const std::string& text ) {
|
XmlWriter& writeText( std::string const& text, bool indent = true ) {
|
||||||
if( !text.empty() ){
|
if( !text.empty() ){
|
||||||
bool tagWasOpen = m_tagIsOpen;
|
bool tagWasOpen = m_tagIsOpen;
|
||||||
ensureTagClosed();
|
ensureTagClosed();
|
||||||
if( tagWasOpen )
|
if( tagWasOpen && indent )
|
||||||
stream() << m_indent;
|
stream() << m_indent;
|
||||||
writeEncodedText( text );
|
writeEncodedText( text );
|
||||||
m_needsNewline = true;
|
m_needsNewline = true;
|
||||||
|
@ -143,7 +143,7 @@ namespace Catch {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
XmlWriter& writeComment( const std::string& text ) {
|
XmlWriter& writeComment( std::string const& text ) {
|
||||||
ensureTagClosed();
|
ensureTagClosed();
|
||||||
stream() << m_indent << "<!--" << text << "-->";
|
stream() << m_indent << "<!--" << text << "-->";
|
||||||
m_needsNewline = true;
|
m_needsNewline = true;
|
||||||
|
@ -176,7 +176,7 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void writeEncodedText( const std::string& text ) {
|
void writeEncodedText( std::string const& text ) {
|
||||||
static const char* charsToEncode = "<&\"";
|
static const char* charsToEncode = "<&\"";
|
||||||
std::string mtext = text;
|
std::string mtext = text;
|
||||||
std::string::size_type pos = mtext.find_first_of( charsToEncode );
|
std::string::size_type pos = mtext.find_first_of( charsToEncode );
|
||||||
|
|
|
@ -0,0 +1,553 @@
|
||||||
|
/*
|
||||||
|
* Created by Phil on 25/05/2013.
|
||||||
|
* Copyright 2013 Two Blue Cubes Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef TWOBLUECUBES_CLARA_H_INCLUDED
|
||||||
|
#define TWOBLUECUBES_CLARA_H_INCLUDED
|
||||||
|
|
||||||
|
#include "catch_text.h" // This will get moved out too
|
||||||
|
|
||||||
|
namespace Clara {
|
||||||
|
namespace Detail {
|
||||||
|
template<typename T> struct RemoveConstRef{ typedef T type; };
|
||||||
|
template<typename T> struct RemoveConstRef<T&>{ typedef T type; };
|
||||||
|
template<typename T> struct RemoveConstRef<T const&>{ typedef T type; };
|
||||||
|
template<typename T> struct RemoveConstRef<T const>{ typedef T type; };
|
||||||
|
|
||||||
|
template<typename T> struct IsBool { static const bool value = false; };
|
||||||
|
template<> struct IsBool<bool> { static const bool value = true; };
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void convertInto( std::string const& _source, T& _dest ) {
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << _source;
|
||||||
|
ss >> _dest;
|
||||||
|
if( ss.fail() )
|
||||||
|
throw std::runtime_error( "Unable to convert " + _source + " to destination type" );
|
||||||
|
}
|
||||||
|
inline void convertInto( std::string const& _source, std::string& _dest ) {
|
||||||
|
_dest = _source;
|
||||||
|
}
|
||||||
|
inline void convertInto( std::string const& _source, bool& _dest ) {
|
||||||
|
std::string sourceLC = _source;
|
||||||
|
std::transform( sourceLC.begin(), sourceLC.end(), sourceLC.begin(), ::tolower );
|
||||||
|
if( sourceLC == "1" || sourceLC == "true" || sourceLC == "yes" || sourceLC == "on" )
|
||||||
|
_dest = true;
|
||||||
|
else if( sourceLC == "0" || sourceLC == "false" || sourceLC == "no" || sourceLC == "off" )
|
||||||
|
_dest = false;
|
||||||
|
else
|
||||||
|
throw std::runtime_error( "Expected a boolean value but did recognise: '" + _source + "'" );
|
||||||
|
}
|
||||||
|
inline void convertInto( bool _source, bool& _dest ) {
|
||||||
|
_dest = _source;
|
||||||
|
}
|
||||||
|
template<typename T>
|
||||||
|
inline void convertInto( bool, T& ) {
|
||||||
|
throw std::runtime_error( "Invalid conversion" );
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename ConfigT>
|
||||||
|
struct IArgFunction {
|
||||||
|
virtual ~IArgFunction() {}
|
||||||
|
virtual void set( ConfigT& config, std::string const& value ) const = 0;
|
||||||
|
virtual void setFlag( ConfigT& config ) const = 0;
|
||||||
|
virtual bool takesArg() const = 0;
|
||||||
|
virtual IArgFunction* clone() const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename ConfigT>
|
||||||
|
class BoundArgFunction {
|
||||||
|
public:
|
||||||
|
BoundArgFunction( IArgFunction<ConfigT>* _functionObj ) : functionObj( _functionObj ) {}
|
||||||
|
BoundArgFunction( BoundArgFunction const& other ) : functionObj( other.functionObj->clone() ) {}
|
||||||
|
BoundArgFunction& operator = ( BoundArgFunction const& other ) {
|
||||||
|
IArgFunction<ConfigT>* newFunctionObj = other.functionObj->clone();
|
||||||
|
delete functionObj;
|
||||||
|
functionObj = newFunctionObj;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
~BoundArgFunction() { delete functionObj; }
|
||||||
|
|
||||||
|
void set( ConfigT& config, std::string const& value ) const {
|
||||||
|
functionObj->set( config, value );
|
||||||
|
}
|
||||||
|
void setFlag( ConfigT& config ) const {
|
||||||
|
functionObj->setFlag( config );
|
||||||
|
}
|
||||||
|
bool takesArg() const { return functionObj->takesArg(); }
|
||||||
|
private:
|
||||||
|
IArgFunction<ConfigT>* functionObj;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template<typename C>
|
||||||
|
struct NullBinder : IArgFunction<C>{
|
||||||
|
virtual void set( C&, std::string const& ) const {}
|
||||||
|
virtual void setFlag( C& ) const {}
|
||||||
|
virtual bool takesArg() const { return true; }
|
||||||
|
virtual IArgFunction<C>* clone() const { return new NullBinder( *this ); }
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename C, typename M>
|
||||||
|
struct BoundDataMember : IArgFunction<C>{
|
||||||
|
BoundDataMember( M C::* _member ) : member( _member ) {}
|
||||||
|
virtual void set( C& p, std::string const& stringValue ) const {
|
||||||
|
convertInto( stringValue, p.*member );
|
||||||
|
}
|
||||||
|
virtual void setFlag( C& p ) const {
|
||||||
|
convertInto( true, p.*member );
|
||||||
|
}
|
||||||
|
virtual bool takesArg() const { return !IsBool<M>::value; }
|
||||||
|
virtual IArgFunction<C>* clone() const { return new BoundDataMember( *this ); }
|
||||||
|
M C::* member;
|
||||||
|
};
|
||||||
|
template<typename C, typename M>
|
||||||
|
struct BoundUnaryMethod : IArgFunction<C>{
|
||||||
|
BoundUnaryMethod( void (C::*_member)( M ) ) : member( _member ) {}
|
||||||
|
virtual void set( C& p, std::string const& stringValue ) const {
|
||||||
|
typename RemoveConstRef<M>::type value;
|
||||||
|
convertInto( stringValue, value );
|
||||||
|
(p.*member)( value );
|
||||||
|
}
|
||||||
|
virtual void setFlag( C& p ) const {
|
||||||
|
typename RemoveConstRef<M>::type value;
|
||||||
|
convertInto( true, value );
|
||||||
|
(p.*member)( value );
|
||||||
|
}
|
||||||
|
virtual bool takesArg() const { return !IsBool<M>::value; }
|
||||||
|
virtual IArgFunction<C>* clone() const { return new BoundUnaryMethod( *this ); }
|
||||||
|
void (C::*member)( M );
|
||||||
|
};
|
||||||
|
template<typename C>
|
||||||
|
struct BoundNullaryMethod : IArgFunction<C>{
|
||||||
|
BoundNullaryMethod( void (C::*_member)() ) : member( _member ) {}
|
||||||
|
virtual void set( C& p, std::string const& stringValue ) const {
|
||||||
|
bool value;
|
||||||
|
convertInto( stringValue, value );
|
||||||
|
if( value )
|
||||||
|
(p.*member)();
|
||||||
|
}
|
||||||
|
virtual void setFlag( C& p ) const {
|
||||||
|
(p.*member)();
|
||||||
|
}
|
||||||
|
virtual bool takesArg() const { return false; }
|
||||||
|
virtual IArgFunction<C>* clone() const { return new BoundNullaryMethod( *this ); }
|
||||||
|
void (C::*member)();
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename C>
|
||||||
|
struct BoundUnaryFunction : IArgFunction<C>{
|
||||||
|
BoundUnaryFunction( void (*_function)( C& ) ) : function( _function ) {}
|
||||||
|
virtual void set( C& obj, std::string const& stringValue ) const {
|
||||||
|
bool value;
|
||||||
|
convertInto( stringValue, value );
|
||||||
|
if( value )
|
||||||
|
function( obj );
|
||||||
|
}
|
||||||
|
virtual void setFlag( C& p ) const {
|
||||||
|
function( p );
|
||||||
|
}
|
||||||
|
virtual bool takesArg() const { return false; }
|
||||||
|
virtual IArgFunction<C>* clone() const { return new BoundUnaryFunction( *this ); }
|
||||||
|
void (*function)( C& );
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename C, typename T>
|
||||||
|
struct BoundBinaryFunction : IArgFunction<C>{
|
||||||
|
BoundBinaryFunction( void (*_function)( C&, T ) ) : function( _function ) {}
|
||||||
|
virtual void set( C& obj, std::string const& stringValue ) const {
|
||||||
|
typename RemoveConstRef<T>::type value;
|
||||||
|
convertInto( stringValue, value );
|
||||||
|
function( obj, value );
|
||||||
|
}
|
||||||
|
virtual void setFlag( C& obj ) const {
|
||||||
|
typename RemoveConstRef<T>::type value;
|
||||||
|
convertInto( true, value );
|
||||||
|
function( obj, value );
|
||||||
|
}
|
||||||
|
virtual bool takesArg() const { return !IsBool<T>::value; }
|
||||||
|
virtual IArgFunction<C>* clone() const { return new BoundBinaryFunction( *this ); }
|
||||||
|
void (*function)( C&, T );
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename C, typename M>
|
||||||
|
BoundArgFunction<C> makeBoundField( M C::* _member ) {
|
||||||
|
return BoundArgFunction<C>( new BoundDataMember<C,M>( _member ) );
|
||||||
|
}
|
||||||
|
template<typename C, typename M>
|
||||||
|
BoundArgFunction<C> makeBoundField( void (C::*_member)( M ) ) {
|
||||||
|
return BoundArgFunction<C>( new BoundUnaryMethod<C,M>( _member ) );
|
||||||
|
}
|
||||||
|
template<typename C>
|
||||||
|
BoundArgFunction<C> makeBoundField( void (C::*_member)() ) {
|
||||||
|
return BoundArgFunction<C>( new BoundNullaryMethod<C>( _member ) );
|
||||||
|
}
|
||||||
|
template<typename C>
|
||||||
|
BoundArgFunction<C> makeBoundField( void (*_function)( C& ) ) {
|
||||||
|
return BoundArgFunction<C>( new BoundUnaryFunction<C>( _function ) );
|
||||||
|
}
|
||||||
|
template<typename C, typename T>
|
||||||
|
BoundArgFunction<C> makeBoundField( void (*_function)( C&, T ) ) {
|
||||||
|
return BoundArgFunction<C>( new BoundBinaryFunction<C, T>( _function ) );
|
||||||
|
}
|
||||||
|
} // namespace Detail
|
||||||
|
|
||||||
|
struct Parser {
|
||||||
|
Parser() : separators( " \t=:" ) {}
|
||||||
|
|
||||||
|
struct Token {
|
||||||
|
enum Type { Positional, ShortOpt, LongOpt };
|
||||||
|
Token( Type _type, std::string const& _data ) : type( _type ), data( _data ) {}
|
||||||
|
Type type;
|
||||||
|
std::string data;
|
||||||
|
};
|
||||||
|
|
||||||
|
void parseIntoTokens( int argc, char const * const * argv, std::vector<Parser::Token>& tokens ) const {
|
||||||
|
for( int i = 1; i < argc; ++i )
|
||||||
|
parseIntoTokens( argv[i] , tokens);
|
||||||
|
}
|
||||||
|
void parseIntoTokens( std::string arg, std::vector<Parser::Token>& tokens ) const {
|
||||||
|
while( !arg.empty() ) {
|
||||||
|
Parser::Token token( Parser::Token::Positional, arg );
|
||||||
|
arg = "";
|
||||||
|
if( token.data[0] == '-' ) {
|
||||||
|
if( token.data.size() > 1 && token.data[1] == '-' ) {
|
||||||
|
token = Parser::Token( Parser::Token::LongOpt, token.data.substr( 2 ) );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
token = Parser::Token( Parser::Token::ShortOpt, token.data.substr( 1 ) );
|
||||||
|
if( token.data.size() > 1 && separators.find( token.data[1] ) == std::string::npos ) {
|
||||||
|
arg = "-" + token.data.substr( 1 );
|
||||||
|
token.data = token.data.substr( 0, 1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( token.type != Parser::Token::Positional ) {
|
||||||
|
std::size_t pos = token.data.find_first_of( separators );
|
||||||
|
if( pos != std::string::npos ) {
|
||||||
|
arg = token.data.substr( pos+1 );
|
||||||
|
token.data = token.data.substr( 0, pos );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tokens.push_back( token );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::string separators;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename ConfigT>
|
||||||
|
class CommandLine {
|
||||||
|
|
||||||
|
struct Arg {
|
||||||
|
Arg( Detail::BoundArgFunction<ConfigT> const& _boundField ) : boundField( _boundField ), position( -1 ) {}
|
||||||
|
|
||||||
|
bool hasShortName( std::string const& shortName ) const {
|
||||||
|
for( std::vector<std::string>::const_iterator
|
||||||
|
it = shortNames.begin(), itEnd = shortNames.end();
|
||||||
|
it != itEnd;
|
||||||
|
++it )
|
||||||
|
if( *it == shortName )
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
bool hasLongName( std::string const& _longName ) const {
|
||||||
|
return _longName == longName;
|
||||||
|
}
|
||||||
|
bool takesArg() const {
|
||||||
|
return !argName.empty();
|
||||||
|
}
|
||||||
|
bool isFixedPositional() const {
|
||||||
|
return position != -1;
|
||||||
|
}
|
||||||
|
bool isAnyPositional() const {
|
||||||
|
return position == -1 && shortNames.empty() && longName.empty();
|
||||||
|
}
|
||||||
|
std::string dbgName() const {
|
||||||
|
if( !longName.empty() )
|
||||||
|
return "--" + longName;
|
||||||
|
if( !shortNames.empty() )
|
||||||
|
return "-" + shortNames[0];
|
||||||
|
return "positional args";
|
||||||
|
}
|
||||||
|
void validate() const {
|
||||||
|
if( boundField.takesArg() && !takesArg() )
|
||||||
|
throw std::logic_error( dbgName() + " must specify an arg name" );
|
||||||
|
}
|
||||||
|
std::string commands() const {
|
||||||
|
std::ostringstream oss;
|
||||||
|
bool first = true;
|
||||||
|
std::vector<std::string>::const_iterator it = shortNames.begin(), itEnd = shortNames.end();
|
||||||
|
for(; it != itEnd; ++it ) {
|
||||||
|
if( first )
|
||||||
|
first = false;
|
||||||
|
else
|
||||||
|
oss << ", ";
|
||||||
|
oss << "-" << *it;
|
||||||
|
}
|
||||||
|
if( !longName.empty() ) {
|
||||||
|
if( !first )
|
||||||
|
oss << ", ";
|
||||||
|
oss << "--" << longName;
|
||||||
|
}
|
||||||
|
if( !argName.empty() )
|
||||||
|
oss << " <" << argName << ">";
|
||||||
|
return oss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
Detail::BoundArgFunction<ConfigT> boundField;
|
||||||
|
std::vector<std::string> shortNames;
|
||||||
|
std::string longName;
|
||||||
|
std::string description;
|
||||||
|
std::string argName;
|
||||||
|
int position;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ArgBinder {
|
||||||
|
public:
|
||||||
|
template<typename F>
|
||||||
|
ArgBinder( CommandLine* cl, F f )
|
||||||
|
: m_cl( cl ),
|
||||||
|
m_arg( Detail::makeBoundField( f ) )
|
||||||
|
{}
|
||||||
|
ArgBinder( ArgBinder& other )
|
||||||
|
: m_cl( other.m_cl ),
|
||||||
|
m_arg( other.m_arg )
|
||||||
|
{
|
||||||
|
other.m_cl = NULL;
|
||||||
|
}
|
||||||
|
~ArgBinder() {
|
||||||
|
if( m_cl ) {
|
||||||
|
m_arg.validate();
|
||||||
|
if( m_arg.isFixedPositional() ) {
|
||||||
|
m_cl->m_positionalArgs.insert( std::make_pair( m_arg.position, m_arg ) );
|
||||||
|
if( m_arg.position > m_cl->m_highestSpecifiedArgPosition )
|
||||||
|
m_cl->m_highestSpecifiedArgPosition = m_arg.position;
|
||||||
|
}
|
||||||
|
else if( m_arg.isAnyPositional() ) {
|
||||||
|
if( m_cl->m_arg.get() )
|
||||||
|
throw std::logic_error( "Only one unpositional argument can be added" );
|
||||||
|
m_cl->m_arg = std::auto_ptr<Arg>( new Arg( m_arg ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_cl->m_options.push_back( m_arg );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ArgBinder& shortOpt( std::string const& name ) {
|
||||||
|
m_arg.shortNames.push_back( name );
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
ArgBinder& longOpt( std::string const& name ) {
|
||||||
|
m_arg.longName = name;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
ArgBinder& describe( std::string const& description ) {
|
||||||
|
m_arg.description = description;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
ArgBinder& argName( std::string const& argName ) {
|
||||||
|
m_arg.argName = argName;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
ArgBinder& position( int position ) {
|
||||||
|
m_arg.position = position;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
CommandLine* m_cl;
|
||||||
|
Arg m_arg;
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
CommandLine()
|
||||||
|
: m_boundProcessName( new Detail::NullBinder<ConfigT>() ),
|
||||||
|
m_highestSpecifiedArgPosition( 0 )
|
||||||
|
{}
|
||||||
|
CommandLine( CommandLine const& other )
|
||||||
|
: m_boundProcessName( other.m_boundProcessName ),
|
||||||
|
m_options ( other.m_options ),
|
||||||
|
m_positionalArgs( other.m_positionalArgs ),
|
||||||
|
m_highestSpecifiedArgPosition( other.m_highestSpecifiedArgPosition )
|
||||||
|
{
|
||||||
|
if( other.m_arg.get() )
|
||||||
|
m_arg = std::auto_ptr<Arg>( new Arg( *other.m_arg ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename F>
|
||||||
|
ArgBinder bind( F f ) {
|
||||||
|
ArgBinder binder( this, f );
|
||||||
|
return binder;
|
||||||
|
}
|
||||||
|
template<typename F>
|
||||||
|
void bindProcessName( F f ) {
|
||||||
|
m_boundProcessName = Detail::makeBoundField( f );
|
||||||
|
}
|
||||||
|
|
||||||
|
void optUsage( std::ostream& os, std::size_t indent = 0, std::size_t width = CATCH_CONFIG_CONSOLE_WIDTH ) const {
|
||||||
|
typename std::vector<Arg>::const_iterator itBegin = m_options.begin(), itEnd = m_options.end(), it;
|
||||||
|
std::size_t maxWidth = 0;
|
||||||
|
for( it = itBegin; it != itEnd; ++it )
|
||||||
|
maxWidth = (std::max)( maxWidth, it->commands().size() );
|
||||||
|
|
||||||
|
for( it = itBegin; it != itEnd; ++it ) {
|
||||||
|
Catch::Text usage( it->commands(), Catch::TextAttributes()
|
||||||
|
.setWidth( maxWidth+indent )
|
||||||
|
.setIndent( indent ) );
|
||||||
|
// !TBD handle longer usage strings
|
||||||
|
Catch::Text desc( it->description, Catch::TextAttributes()
|
||||||
|
.setWidth( width - maxWidth -3 ) );
|
||||||
|
|
||||||
|
for( std::size_t i = 0; i < std::max( usage.size(), desc.size() ); ++i ) {
|
||||||
|
std::string usageCol = i < usage.size() ? usage[i] : "";
|
||||||
|
os << usageCol;
|
||||||
|
|
||||||
|
if( i < desc.size() && !desc[i].empty() )
|
||||||
|
os << std::string( indent + 2 + maxWidth - usageCol.size(), ' ' )
|
||||||
|
<< desc[i];
|
||||||
|
os << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::string optUsage() const {
|
||||||
|
std::ostringstream oss;
|
||||||
|
optUsage( oss );
|
||||||
|
return oss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
void argSynopsis( std::ostream& os ) const {
|
||||||
|
for( int i = 1; i <= m_highestSpecifiedArgPosition; ++i ) {
|
||||||
|
if( i > 1 )
|
||||||
|
os << " ";
|
||||||
|
typename std::map<int, Arg>::const_iterator it = m_positionalArgs.find( i );
|
||||||
|
if( it != m_positionalArgs.end() )
|
||||||
|
os << "<" << it->second.argName << ">";
|
||||||
|
else if( m_arg.get() )
|
||||||
|
os << "<" << m_arg->argName << ">";
|
||||||
|
else
|
||||||
|
throw std::logic_error( "non consecutive positional arguments with no floating args" );
|
||||||
|
}
|
||||||
|
// !TBD No indication of mandatory args
|
||||||
|
if( m_arg.get() ) {
|
||||||
|
if( m_highestSpecifiedArgPosition > 1 )
|
||||||
|
os << " ";
|
||||||
|
os << "[<" << m_arg->argName << "> ...]";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::string argSynopsis() const {
|
||||||
|
std::ostringstream oss;
|
||||||
|
argSynopsis( oss );
|
||||||
|
return oss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
void usage( std::ostream& os, std::string const& procName ) const {
|
||||||
|
os << "usage:\n " << procName << " ";
|
||||||
|
argSynopsis( os );
|
||||||
|
if( !m_options.empty() ) {
|
||||||
|
os << " [options]\n\nwhere options are: \n";
|
||||||
|
optUsage( os, 2 );
|
||||||
|
}
|
||||||
|
os << "\n";
|
||||||
|
}
|
||||||
|
std::string usage( std::string const& procName ) const {
|
||||||
|
std::ostringstream oss;
|
||||||
|
usage( oss, procName );
|
||||||
|
return oss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<Parser::Token> parseInto( int argc, char const * const * argv, ConfigT& config ) const {
|
||||||
|
std::string processName = argv[0];
|
||||||
|
std::size_t lastSlash = processName.find_last_of( "/\\" );
|
||||||
|
if( lastSlash != std::string::npos )
|
||||||
|
processName = processName.substr( lastSlash+1 );
|
||||||
|
m_boundProcessName.set( config, processName );
|
||||||
|
std::vector<Parser::Token> tokens;
|
||||||
|
Parser parser;
|
||||||
|
parser.parseIntoTokens( argc, argv, tokens );
|
||||||
|
return populate( tokens, config );
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<Parser::Token> populate( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {
|
||||||
|
if( m_options.empty() && m_positionalArgs.empty() )
|
||||||
|
throw std::logic_error( "No options or arguments specified" );
|
||||||
|
|
||||||
|
std::vector<Parser::Token> unusedTokens = populateOptions( tokens, config );
|
||||||
|
unusedTokens = populateFixedArgs( unusedTokens, config );
|
||||||
|
unusedTokens = populateFloatingArgs( unusedTokens, config );
|
||||||
|
return unusedTokens;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<Parser::Token> populateOptions( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {
|
||||||
|
std::vector<Parser::Token> unusedTokens;
|
||||||
|
for( std::size_t i = 0; i < tokens.size(); ++i ) {
|
||||||
|
Parser::Token const& token = tokens[i];
|
||||||
|
typename std::vector<Arg>::const_iterator it = m_options.begin(), itEnd = m_options.end();
|
||||||
|
for(; it != itEnd; ++it ) {
|
||||||
|
Arg const& arg = *it;
|
||||||
|
|
||||||
|
try {
|
||||||
|
if( ( token.type == Parser::Token::ShortOpt && arg.hasShortName( token.data ) ) ||
|
||||||
|
( token.type == Parser::Token::LongOpt && arg.hasLongName( token.data ) ) ) {
|
||||||
|
if( arg.takesArg() ) {
|
||||||
|
if( i == tokens.size()-1 || tokens[i+1].type != Parser::Token::Positional )
|
||||||
|
throw std::domain_error( "Expected argument to option " + token.data );
|
||||||
|
arg.boundField.set( config, tokens[++i].data );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
arg.boundField.setFlag( config );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( std::exception& ex ) {
|
||||||
|
throw std::runtime_error( std::string( ex.what() ) + " while parsing: (" + arg.commands() + ")" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( it == itEnd )
|
||||||
|
unusedTokens.push_back( token );
|
||||||
|
}
|
||||||
|
return unusedTokens;
|
||||||
|
}
|
||||||
|
std::vector<Parser::Token> populateFixedArgs( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {
|
||||||
|
std::vector<Parser::Token> unusedTokens;
|
||||||
|
int position = 1;
|
||||||
|
for( std::size_t i = 0; i < tokens.size(); ++i ) {
|
||||||
|
Parser::Token const& token = tokens[i];
|
||||||
|
typename std::map<int, Arg>::const_iterator it = m_positionalArgs.find( position );
|
||||||
|
if( it != m_positionalArgs.end() )
|
||||||
|
it->second.boundField.set( config, token.data );
|
||||||
|
else
|
||||||
|
unusedTokens.push_back( token );
|
||||||
|
if( token.type == Parser::Token::Positional )
|
||||||
|
position++;
|
||||||
|
}
|
||||||
|
return unusedTokens;
|
||||||
|
}
|
||||||
|
std::vector<Parser::Token> populateFloatingArgs( std::vector<Parser::Token> const& tokens, ConfigT& config ) const {
|
||||||
|
if( !m_arg.get() )
|
||||||
|
return tokens;
|
||||||
|
std::vector<Parser::Token> unusedTokens;
|
||||||
|
for( std::size_t i = 0; i < tokens.size(); ++i ) {
|
||||||
|
Parser::Token const& token = tokens[i];
|
||||||
|
if( token.type == Parser::Token::Positional )
|
||||||
|
m_arg->boundField.set( config, token.data );
|
||||||
|
else
|
||||||
|
unusedTokens.push_back( token );
|
||||||
|
}
|
||||||
|
return unusedTokens;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Detail::BoundArgFunction<ConfigT> m_boundProcessName;
|
||||||
|
std::vector<Arg> m_options;
|
||||||
|
std::map<int, Arg> m_positionalArgs;
|
||||||
|
std::auto_ptr<Arg> m_arg;
|
||||||
|
int m_highestSpecifiedArgPosition;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // end namespace Clara
|
||||||
|
|
||||||
|
|
||||||
|
#endif // TWOBLUECUBES_CLARA_H_INCLUDED
|
|
@ -54,27 +54,27 @@ namespace Catch {
|
||||||
|
|
||||||
void ReportCounts( const std::string& label, const Counts& counts, const std::string& allPrefix = "All " ) {
|
void ReportCounts( const std::string& label, const Counts& counts, const std::string& allPrefix = "All " ) {
|
||||||
if( counts.passed )
|
if( counts.passed )
|
||||||
m_config.stream << counts.failed << " of " << counts.total() << " " << label << "s failed";
|
m_config.stream() << counts.failed << " of " << counts.total() << " " << label << "s failed";
|
||||||
else
|
else
|
||||||
m_config.stream << ( counts.failed > 1 ? allPrefix : "" ) << pluralise( counts.failed, label ) << " failed";
|
m_config.stream() << ( counts.failed > 1 ? allPrefix : "" ) << pluralise( counts.failed, label ) << " failed";
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReportCounts( const Totals& totals, const std::string& allPrefix = "All " ) {
|
void ReportCounts( const Totals& totals, const std::string& allPrefix = "All " ) {
|
||||||
if( totals.assertions.total() == 0 ) {
|
if( totals.assertions.total() == 0 ) {
|
||||||
m_config.stream << "No tests ran";
|
m_config.stream() << "No tests ran";
|
||||||
}
|
}
|
||||||
else if( totals.assertions.failed ) {
|
else if( totals.assertions.failed ) {
|
||||||
TextColour colour( TextColour::ResultError );
|
Colour colour( Colour::ResultError );
|
||||||
ReportCounts( "test case", totals.testCases, allPrefix );
|
ReportCounts( "test case", totals.testCases, allPrefix );
|
||||||
if( totals.testCases.failed > 0 ) {
|
if( totals.testCases.failed > 0 ) {
|
||||||
m_config.stream << " (";
|
m_config.stream() << " (";
|
||||||
ReportCounts( "assertion", totals.assertions, allPrefix );
|
ReportCounts( "assertion", totals.assertions, allPrefix );
|
||||||
m_config.stream << ")";
|
m_config.stream() << ")";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
TextColour colour( TextColour::ResultSuccess );
|
Colour colour( Colour::ResultSuccess );
|
||||||
m_config.stream << allPrefix << "tests passed ("
|
m_config.stream() << allPrefix << "tests passed ("
|
||||||
<< pluralise( totals.assertions.passed, "assertion" ) << " in "
|
<< pluralise( totals.assertions.passed, "assertion" ) << " in "
|
||||||
<< pluralise( totals.testCases.passed, "test case" ) << ")";
|
<< pluralise( totals.testCases.passed, "test case" ) << ")";
|
||||||
}
|
}
|
||||||
|
@ -97,14 +97,14 @@ namespace Catch {
|
||||||
virtual void EndTesting( const Totals& totals ) {
|
virtual void EndTesting( const Totals& totals ) {
|
||||||
// Output the overall test results even if "Started Testing" was not emitted
|
// Output the overall test results even if "Started Testing" was not emitted
|
||||||
if( m_aborted ) {
|
if( m_aborted ) {
|
||||||
m_config.stream << "\n[Testing aborted. ";
|
m_config.stream() << "\n[Testing aborted. ";
|
||||||
ReportCounts( totals, "The first " );
|
ReportCounts( totals, "The first " );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
m_config.stream << "\n[Testing completed. ";
|
m_config.stream() << "\n[Testing completed. ";
|
||||||
ReportCounts( totals );
|
ReportCounts( totals );
|
||||||
}
|
}
|
||||||
m_config.stream << "]\n" << std::endl;
|
m_config.stream() << "]\n" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void StartGroup( const std::string& groupName ) {
|
virtual void StartGroup( const std::string& groupName ) {
|
||||||
|
@ -113,15 +113,15 @@ namespace Catch {
|
||||||
|
|
||||||
virtual void EndGroup( const std::string& groupName, const Totals& totals ) {
|
virtual void EndGroup( const std::string& groupName, const Totals& totals ) {
|
||||||
if( m_groupSpan.emitted && !groupName.empty() ) {
|
if( m_groupSpan.emitted && !groupName.empty() ) {
|
||||||
m_config.stream << "[End of group: '" << groupName << "'. ";
|
m_config.stream() << "[End of group: '" << groupName << "'. ";
|
||||||
ReportCounts( totals );
|
ReportCounts( totals );
|
||||||
m_config.stream << "]\n" << std::endl;
|
m_config.stream() << "]\n" << std::endl;
|
||||||
m_groupSpan = SpanInfo();
|
m_groupSpan = SpanInfo();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void StartTestCase( const TestCaseInfo& testInfo ) {
|
virtual void StartTestCase( const TestCaseInfo& testInfo ) {
|
||||||
m_testSpan = testInfo.getName();
|
m_testSpan = testInfo.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void StartSection( const std::string& sectionName, const std::string& ) {
|
virtual void StartSection( const std::string& sectionName, const std::string& ) {
|
||||||
|
@ -130,98 +130,98 @@ namespace Catch {
|
||||||
|
|
||||||
virtual void NoAssertionsInSection( const std::string& sectionName ) {
|
virtual void NoAssertionsInSection( const std::string& sectionName ) {
|
||||||
startSpansLazily();
|
startSpansLazily();
|
||||||
TextColour colour( TextColour::ResultError );
|
Colour colour( Colour::ResultError );
|
||||||
m_config.stream << "\nNo assertions in section, '" << sectionName << "'\n" << std::endl;
|
m_config.stream() << "\nNo assertions in section, '" << sectionName << "'\n" << std::endl;
|
||||||
}
|
}
|
||||||
virtual void NoAssertionsInTestCase( const std::string& testName ) {
|
virtual void NoAssertionsInTestCase( const std::string& testName ) {
|
||||||
startSpansLazily();
|
startSpansLazily();
|
||||||
TextColour colour( TextColour::ResultError );
|
Colour colour( Colour::ResultError );
|
||||||
m_config.stream << "\nNo assertions in test case, '" << testName << "'\n" << std::endl;
|
m_config.stream() << "\nNo assertions in test case, '" << testName << "'\n" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void EndSection( const std::string& sectionName, const Counts& assertions ) {
|
virtual void EndSection( const std::string& sectionName, const Counts& assertions ) {
|
||||||
|
|
||||||
SpanInfo& sectionSpan = m_sectionSpans.back();
|
SpanInfo& sectionSpan = m_sectionSpans.back();
|
||||||
if( sectionSpan.emitted && !sectionSpan.name.empty() ) {
|
if( sectionSpan.emitted && !sectionSpan.name.empty() ) {
|
||||||
m_config.stream << "[End of section: '" << sectionName << "' ";
|
m_config.stream() << "[End of section: '" << sectionName << "' ";
|
||||||
|
|
||||||
if( assertions.failed ) {
|
if( assertions.failed ) {
|
||||||
TextColour colour( TextColour::ResultError );
|
Colour colour( Colour::ResultError );
|
||||||
ReportCounts( "assertion", assertions);
|
ReportCounts( "assertion", assertions);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
TextColour colour( TextColour::ResultSuccess );
|
Colour colour( Colour::ResultSuccess );
|
||||||
m_config.stream << ( assertions.passed > 1 ? "All " : "" )
|
m_config.stream() << ( assertions.passed > 1 ? "All " : "" )
|
||||||
<< pluralise( assertions.passed, "assertion" ) << " passed" ;
|
<< pluralise( assertions.passed, "assertion" ) << " passed" ;
|
||||||
}
|
}
|
||||||
m_config.stream << "]\n" << std::endl;
|
m_config.stream() << "]\n" << std::endl;
|
||||||
}
|
}
|
||||||
m_sectionSpans.pop_back();
|
m_sectionSpans.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void Result( const AssertionResult& assertionResult ) {
|
virtual void Result( const AssertionResult& assertionResult ) {
|
||||||
if( !m_config.includeSuccessfulResults && assertionResult.getResultType() == ResultWas::Ok )
|
if( !m_config.fullConfig()->includeSuccessfulResults() && assertionResult.getResultType() == ResultWas::Ok )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
startSpansLazily();
|
startSpansLazily();
|
||||||
|
|
||||||
if( !assertionResult.getSourceInfo().empty() ) {
|
if( !assertionResult.getSourceInfo().empty() ) {
|
||||||
TextColour colour( TextColour::FileName );
|
Colour colour( Colour::FileName );
|
||||||
m_config.stream << assertionResult.getSourceInfo();
|
m_config.stream() << assertionResult.getSourceInfo() << ": ";
|
||||||
}
|
}
|
||||||
|
|
||||||
if( assertionResult.hasExpression() ) {
|
if( assertionResult.hasExpression() ) {
|
||||||
TextColour colour( TextColour::OriginalExpression );
|
Colour colour( Colour::OriginalExpression );
|
||||||
m_config.stream << assertionResult.getExpression();
|
m_config.stream() << assertionResult.getExpression();
|
||||||
if( assertionResult.succeeded() ) {
|
if( assertionResult.succeeded() ) {
|
||||||
TextColour successColour( TextColour::Success );
|
Colour successColour( Colour::Success );
|
||||||
m_config.stream << " succeeded";
|
m_config.stream() << " succeeded";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
TextColour errorColour( TextColour::Error );
|
Colour errorColour( Colour::Error );
|
||||||
m_config.stream << " failed";
|
m_config.stream() << " failed";
|
||||||
if( assertionResult.isOk() ) {
|
if( assertionResult.isOk() ) {
|
||||||
TextColour okAnywayColour( TextColour::Success );
|
Colour okAnywayColour( Colour::Success );
|
||||||
m_config.stream << " - but was ok";
|
m_config.stream() << " - but was ok";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch( assertionResult.getResultType() ) {
|
switch( assertionResult.getResultType() ) {
|
||||||
case ResultWas::ThrewException:
|
case ResultWas::ThrewException:
|
||||||
{
|
{
|
||||||
TextColour colour( TextColour::Error );
|
Colour colour( Colour::Error );
|
||||||
if( assertionResult.hasExpression() )
|
if( assertionResult.hasExpression() )
|
||||||
m_config.stream << " with unexpected";
|
m_config.stream() << " with unexpected";
|
||||||
else
|
else
|
||||||
m_config.stream << "Unexpected";
|
m_config.stream() << "Unexpected";
|
||||||
m_config.stream << " exception with message: '" << assertionResult.getMessage() << "'";
|
m_config.stream() << " exception with message: '" << assertionResult.getMessage() << "'";
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ResultWas::DidntThrowException:
|
case ResultWas::DidntThrowException:
|
||||||
{
|
{
|
||||||
TextColour colour( TextColour::Error );
|
Colour colour( Colour::Error );
|
||||||
if( assertionResult.hasExpression() )
|
if( assertionResult.hasExpression() )
|
||||||
m_config.stream << " because no exception was thrown where one was expected";
|
m_config.stream() << " because no exception was thrown where one was expected";
|
||||||
else
|
else
|
||||||
m_config.stream << "No exception thrown where one was expected";
|
m_config.stream() << "No exception thrown where one was expected";
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ResultWas::Info:
|
case ResultWas::Info:
|
||||||
{
|
{
|
||||||
TextColour colour( TextColour::ReconstructedExpression );
|
Colour colour( Colour::ReconstructedExpression );
|
||||||
streamVariableLengthText( "info", assertionResult.getMessage() );
|
streamVariableLengthText( "info", assertionResult.getMessage() );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ResultWas::Warning:
|
case ResultWas::Warning:
|
||||||
{
|
{
|
||||||
TextColour colour( TextColour::ReconstructedExpression );
|
Colour colour( Colour::ReconstructedExpression );
|
||||||
streamVariableLengthText( "warning", assertionResult.getMessage() );
|
streamVariableLengthText( "warning", assertionResult.getMessage() );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ResultWas::ExplicitFailure:
|
case ResultWas::ExplicitFailure:
|
||||||
{
|
{
|
||||||
TextColour colour( TextColour::Error );
|
Colour colour( Colour::Error );
|
||||||
m_config.stream << "failed with message: '" << assertionResult.getMessage() << "'";
|
m_config.stream() << "failed with message: '" << assertionResult.getMessage() << "'";
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ResultWas::Unknown: // These cases are here to prevent compiler warnings
|
case ResultWas::Unknown: // These cases are here to prevent compiler warnings
|
||||||
|
@ -231,32 +231,37 @@ namespace Catch {
|
||||||
case ResultWas::Exception:
|
case ResultWas::Exception:
|
||||||
if( !assertionResult.hasExpression() ) {
|
if( !assertionResult.hasExpression() ) {
|
||||||
if( assertionResult.succeeded() ) {
|
if( assertionResult.succeeded() ) {
|
||||||
TextColour colour( TextColour::Success );
|
Colour colour( Colour::Success );
|
||||||
m_config.stream << " succeeded";
|
m_config.stream() << " succeeded";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
TextColour colour( TextColour::Error );
|
Colour colour( Colour::Error );
|
||||||
m_config.stream << " failed";
|
m_config.stream() << " failed";
|
||||||
if( assertionResult.isOk() ) {
|
if( assertionResult.isOk() ) {
|
||||||
TextColour okAnywayColour( TextColour::Success );
|
Colour okAnywayColour( Colour::Success );
|
||||||
m_config.stream << " - but was ok";
|
m_config.stream() << " - but was ok";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if( assertionResult.hasMessage() ) {
|
||||||
|
m_config.stream() << "\n";
|
||||||
|
Colour colour( Colour::ReconstructedExpression );
|
||||||
|
streamVariableLengthText( "with message", assertionResult.getMessage() );
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( assertionResult.hasExpandedExpression() ) {
|
if( assertionResult.hasExpandedExpression() ) {
|
||||||
m_config.stream << " for: ";
|
m_config.stream() << " for: ";
|
||||||
if( assertionResult.getExpandedExpression().size() > 40 ) {
|
if( assertionResult.getExpandedExpression().size() > 40 ) {
|
||||||
m_config.stream << "\n";
|
m_config.stream() << "\n";
|
||||||
if( assertionResult.getExpandedExpression().size() < 70 )
|
if( assertionResult.getExpandedExpression().size() < 70 )
|
||||||
m_config.stream << "\t";
|
m_config.stream() << "\t";
|
||||||
}
|
}
|
||||||
TextColour colour( TextColour::ReconstructedExpression );
|
Colour colour( Colour::ReconstructedExpression );
|
||||||
m_config.stream << assertionResult.getExpandedExpression();
|
m_config.stream() << assertionResult.getExpandedExpression();
|
||||||
}
|
}
|
||||||
m_config.stream << std::endl;
|
m_config.stream() << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void EndTestCase( const TestCaseInfo& testInfo,
|
virtual void EndTestCase( const TestCaseInfo& testInfo,
|
||||||
|
@ -274,9 +279,9 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
|
|
||||||
if( m_testSpan.emitted ) {
|
if( m_testSpan.emitted ) {
|
||||||
m_config.stream << "[Finished: '" << testInfo.getName() << "' ";
|
m_config.stream() << "[Finished: '" << testInfo.name << "' ";
|
||||||
ReportCounts( totals );
|
ReportCounts( totals );
|
||||||
m_config.stream << "]" << std::endl;
|
m_config.stream() << "]" << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,20 +289,20 @@ namespace Catch {
|
||||||
|
|
||||||
void startSpansLazily() {
|
void startSpansLazily() {
|
||||||
if( !m_testingSpan.emitted ) {
|
if( !m_testingSpan.emitted ) {
|
||||||
if( m_config.name.empty() )
|
if( m_config.fullConfig()->name().empty() )
|
||||||
m_config.stream << "[Started testing]" << std::endl;
|
m_config.stream() << "[Started testing]" << std::endl;
|
||||||
else
|
else
|
||||||
m_config.stream << "[Started testing: " << m_config.name << "]" << std::endl;
|
m_config.stream() << "[Started testing: " << m_config.fullConfig()->name() << "]" << std::endl;
|
||||||
m_testingSpan.emitted = true;
|
m_testingSpan.emitted = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !m_groupSpan.emitted && !m_groupSpan.name.empty() ) {
|
if( !m_groupSpan.emitted && !m_groupSpan.name.empty() ) {
|
||||||
m_config.stream << "[Started group: '" << m_groupSpan.name << "']" << std::endl;
|
m_config.stream() << "[Started group: '" << m_groupSpan.name << "']" << std::endl;
|
||||||
m_groupSpan.emitted = true;
|
m_groupSpan.emitted = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !m_testSpan.emitted ) {
|
if( !m_testSpan.emitted ) {
|
||||||
m_config.stream << std::endl << "[Running: " << m_testSpan.name << "]" << std::endl;
|
m_config.stream() << std::endl << "[Running: " << m_testSpan.name << "]" << std::endl;
|
||||||
m_testSpan.emitted = true;
|
m_testSpan.emitted = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -305,7 +310,7 @@ namespace Catch {
|
||||||
SpanInfo& sectionSpan = m_sectionSpans.back();
|
SpanInfo& sectionSpan = m_sectionSpans.back();
|
||||||
if( !sectionSpan.emitted && !sectionSpan.name.empty() ) {
|
if( !sectionSpan.emitted && !sectionSpan.name.empty() ) {
|
||||||
if( m_firstSectionInTestCase ) {
|
if( m_firstSectionInTestCase ) {
|
||||||
m_config.stream << "\n";
|
m_config.stream() << "\n";
|
||||||
m_firstSectionInTestCase = false;
|
m_firstSectionInTestCase = false;
|
||||||
}
|
}
|
||||||
std::vector<SpanInfo>::iterator it = m_sectionSpans.begin();
|
std::vector<SpanInfo>::iterator it = m_sectionSpans.begin();
|
||||||
|
@ -313,7 +318,7 @@ namespace Catch {
|
||||||
for(; it != itEnd; ++it ) {
|
for(; it != itEnd; ++it ) {
|
||||||
SpanInfo& prevSpan = *it;
|
SpanInfo& prevSpan = *it;
|
||||||
if( !prevSpan.emitted && !prevSpan.name.empty() ) {
|
if( !prevSpan.emitted && !prevSpan.name.empty() ) {
|
||||||
m_config.stream << "[Started section: '" << prevSpan.name << "']" << std::endl;
|
m_config.stream() << "[Started section: '" << prevSpan.name << "']" << std::endl;
|
||||||
prevSpan.emitted = true;
|
prevSpan.emitted = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -324,10 +329,10 @@ namespace Catch {
|
||||||
void streamVariableLengthText( const std::string& prefix, const std::string& text ) {
|
void streamVariableLengthText( const std::string& prefix, const std::string& text ) {
|
||||||
std::string trimmed = trim( text );
|
std::string trimmed = trim( text );
|
||||||
if( trimmed.find_first_of( "\r\n" ) == std::string::npos ) {
|
if( trimmed.find_first_of( "\r\n" ) == std::string::npos ) {
|
||||||
m_config.stream << "[" << prefix << ": " << trimmed << "]";
|
m_config.stream() << "[" << prefix << ": " << trimmed << "]";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
m_config.stream << "\n[" << prefix << "] >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n" << trimmed
|
m_config.stream() << "\n[" << prefix << "] >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n" << trimmed
|
||||||
<< "\n[end of " << prefix << "] <<<<<<<<<<<<<<<<<<<<<<<<\n";
|
<< "\n[end of " << prefix << "] <<<<<<<<<<<<<<<<<<<<<<<<\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,396 @@
|
||||||
|
/*
|
||||||
|
* Created by Phil on 5/12/2012.
|
||||||
|
* Copyright 2012 Two Blue Cubes Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED
|
||||||
|
#define TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include "../internal/catch_interfaces_reporter.h"
|
||||||
|
#include "../internal/catch_reporter_registrars.hpp"
|
||||||
|
#include "../internal/catch_console_colour.hpp"
|
||||||
|
|
||||||
|
namespace Catch {
|
||||||
|
|
||||||
|
struct ConsoleReporter : StreamingReporterBase {
|
||||||
|
ConsoleReporter( ReporterConfig const& _config )
|
||||||
|
: StreamingReporterBase( _config ),
|
||||||
|
m_headerPrinted( false ),
|
||||||
|
m_atLeastOneTestCasePrinted( false )
|
||||||
|
{}
|
||||||
|
|
||||||
|
virtual ~ConsoleReporter();
|
||||||
|
static std::string getDescription() {
|
||||||
|
return "Reports test results as plain lines of text";
|
||||||
|
}
|
||||||
|
virtual ReporterPreferences getPreferences() const {
|
||||||
|
ReporterPreferences prefs;
|
||||||
|
prefs.shouldRedirectStdOut = false;
|
||||||
|
return prefs;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void noMatchingTestCases( std::string const& spec ) {
|
||||||
|
stream << "No test cases matched '" << spec << "'" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void assertionStarting( AssertionInfo const& ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void assertionEnded( AssertionStats const& _assertionStats ) {
|
||||||
|
AssertionResult const& result = _assertionStats.assertionResult;
|
||||||
|
|
||||||
|
// Drop out if result was successful and we're not printing those
|
||||||
|
if( !m_config->includeSuccessfulResults() && result.isOk() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
lazyPrint();
|
||||||
|
|
||||||
|
AssertionPrinter printer( stream, _assertionStats );
|
||||||
|
printer.print();
|
||||||
|
stream << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void sectionStarting( SectionInfo const& _sectionInfo ) {
|
||||||
|
m_headerPrinted = false;
|
||||||
|
StreamingReporterBase::sectionStarting( _sectionInfo );
|
||||||
|
}
|
||||||
|
virtual void sectionEnded( SectionStats const& _sectionStats ) {
|
||||||
|
if( _sectionStats.missingAssertions ) {
|
||||||
|
lazyPrint();
|
||||||
|
Colour colour( Colour::ResultError );
|
||||||
|
stream << "\nNo assertions in section, '" << _sectionStats.sectionInfo.name << "'\n" << std::endl;
|
||||||
|
}
|
||||||
|
m_headerPrinted = false;
|
||||||
|
StreamingReporterBase::sectionEnded( _sectionStats );
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) {
|
||||||
|
|
||||||
|
if( _testCaseStats.missingAssertions ) {
|
||||||
|
lazyPrint();
|
||||||
|
Colour colour( Colour::ResultError );
|
||||||
|
stream << "\nNo assertions in test case, '" << _testCaseStats.testInfo.name << "'\n" << std::endl;
|
||||||
|
}
|
||||||
|
StreamingReporterBase::testCaseEnded( _testCaseStats );
|
||||||
|
m_headerPrinted = false;
|
||||||
|
}
|
||||||
|
virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) {
|
||||||
|
if( !unusedGroupInfo ) {
|
||||||
|
printSummaryDivider();
|
||||||
|
stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n";
|
||||||
|
printTotals( _testGroupStats.totals );
|
||||||
|
stream << "\n" << std::endl;
|
||||||
|
}
|
||||||
|
StreamingReporterBase::testGroupEnded( _testGroupStats );
|
||||||
|
}
|
||||||
|
virtual void testRunEnded( TestRunStats const& _testRunStats ) {
|
||||||
|
if( m_atLeastOneTestCasePrinted )
|
||||||
|
printTotalsDivider();
|
||||||
|
printTotals( _testRunStats.totals );
|
||||||
|
stream << "\n" << std::endl;
|
||||||
|
StreamingReporterBase::testRunEnded( _testRunStats );
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
class AssertionPrinter {
|
||||||
|
void operator= ( AssertionPrinter const& );
|
||||||
|
public:
|
||||||
|
AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats )
|
||||||
|
: stream( _stream ),
|
||||||
|
stats( _stats ),
|
||||||
|
result( _stats.assertionResult ),
|
||||||
|
colour( Colour::None ),
|
||||||
|
message( result.getMessage() ),
|
||||||
|
messages( _stats.infoMessages )
|
||||||
|
{
|
||||||
|
switch( result.getResultType() ) {
|
||||||
|
case ResultWas::Ok:
|
||||||
|
colour = Colour::Success;
|
||||||
|
passOrFail = "PASSED";
|
||||||
|
//if( result.hasMessage() )
|
||||||
|
if( _stats.infoMessages.size() == 1 )
|
||||||
|
messageLabel = "with message";
|
||||||
|
if( _stats.infoMessages.size() > 1 )
|
||||||
|
messageLabel = "with messages";
|
||||||
|
break;
|
||||||
|
case ResultWas::ExpressionFailed:
|
||||||
|
if( result.isOk() ) {
|
||||||
|
colour = Colour::Success;
|
||||||
|
passOrFail = "FAILED - but was ok";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
colour = Colour::Error;
|
||||||
|
passOrFail = "FAILED";
|
||||||
|
}
|
||||||
|
if( _stats.infoMessages.size() == 1 )
|
||||||
|
messageLabel = "with message";
|
||||||
|
if( _stats.infoMessages.size() > 1 )
|
||||||
|
messageLabel = "with messages";
|
||||||
|
break;
|
||||||
|
case ResultWas::ThrewException:
|
||||||
|
colour = Colour::Error;
|
||||||
|
passOrFail = "FAILED";
|
||||||
|
messageLabel = "due to unexpected exception with message";
|
||||||
|
break;
|
||||||
|
case ResultWas::DidntThrowException:
|
||||||
|
colour = Colour::Error;
|
||||||
|
passOrFail = "FAILED";
|
||||||
|
messageLabel = "because no exception was thrown where one was expected";
|
||||||
|
break;
|
||||||
|
case ResultWas::Info:
|
||||||
|
messageLabel = "info";
|
||||||
|
break;
|
||||||
|
case ResultWas::Warning:
|
||||||
|
messageLabel = "warning";
|
||||||
|
break;
|
||||||
|
case ResultWas::ExplicitFailure:
|
||||||
|
passOrFail = "FAILED";
|
||||||
|
colour = Colour::Error;
|
||||||
|
if( _stats.infoMessages.size() == 1 )
|
||||||
|
messageLabel = "explicitly with message";
|
||||||
|
if( _stats.infoMessages.size() > 1 )
|
||||||
|
messageLabel = "explicitly with messages";
|
||||||
|
break;
|
||||||
|
// These cases are here to prevent compiler warnings
|
||||||
|
case ResultWas::Unknown:
|
||||||
|
case ResultWas::FailureBit:
|
||||||
|
case ResultWas::Exception:
|
||||||
|
passOrFail = "** internal error **";
|
||||||
|
colour = Colour::Error;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void print() const {
|
||||||
|
printSourceInfo();
|
||||||
|
if( stats.totals.assertions.total() > 0 ) {
|
||||||
|
if( result.isOk() )
|
||||||
|
stream << "\n";
|
||||||
|
printResultType();
|
||||||
|
printOriginalExpression();
|
||||||
|
printReconstructedExpression();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
stream << "\n";
|
||||||
|
}
|
||||||
|
printMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void printResultType() const {
|
||||||
|
if( !passOrFail.empty() ) {
|
||||||
|
Colour colourGuard( colour );
|
||||||
|
stream << passOrFail << ":\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void printOriginalExpression() const {
|
||||||
|
if( result.hasExpression() ) {
|
||||||
|
Colour colourGuard( Colour::OriginalExpression );
|
||||||
|
stream << " ";
|
||||||
|
stream << result.getExpressionInMacro();
|
||||||
|
stream << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void printReconstructedExpression() const {
|
||||||
|
if( result.hasExpandedExpression() ) {
|
||||||
|
stream << "with expansion:\n";
|
||||||
|
Colour colourGuard( Colour::ReconstructedExpression );
|
||||||
|
stream << Text( result.getExpandedExpression(), TextAttributes().setIndent(2) ) << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void printMessage() const {
|
||||||
|
if( !messageLabel.empty() )
|
||||||
|
stream << messageLabel << ":" << "\n";
|
||||||
|
for( std::vector<MessageInfo>::const_iterator it = messages.begin(), itEnd = messages.end();
|
||||||
|
it != itEnd;
|
||||||
|
++it ) {
|
||||||
|
stream << Text( it->message, TextAttributes().setIndent(2) ) << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void printSourceInfo() const {
|
||||||
|
Colour colourGuard( Colour::FileName );
|
||||||
|
stream << result.getSourceInfo() << ": ";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream& stream;
|
||||||
|
AssertionStats const& stats;
|
||||||
|
AssertionResult const& result;
|
||||||
|
Colour::Code colour;
|
||||||
|
std::string passOrFail;
|
||||||
|
std::string messageLabel;
|
||||||
|
std::string message;
|
||||||
|
std::vector<MessageInfo> messages;
|
||||||
|
};
|
||||||
|
|
||||||
|
void lazyPrint() {
|
||||||
|
|
||||||
|
if( testRunInfo )
|
||||||
|
lazyPrintRunInfo();
|
||||||
|
if( unusedGroupInfo )
|
||||||
|
lazyPrintGroupInfo();
|
||||||
|
|
||||||
|
if( !m_headerPrinted ) {
|
||||||
|
printTestCaseAndSectionHeader();
|
||||||
|
m_headerPrinted = true;
|
||||||
|
}
|
||||||
|
m_atLeastOneTestCasePrinted = true;
|
||||||
|
}
|
||||||
|
void lazyPrintRunInfo() {
|
||||||
|
stream << "\n" << getTildes() << "\n";
|
||||||
|
Colour colour( Colour::SecondaryText );
|
||||||
|
stream << testRunInfo->name
|
||||||
|
<< " is a Catch v" << libraryVersion.majorVersion << "."
|
||||||
|
<< libraryVersion.minorVersion << " b"
|
||||||
|
<< libraryVersion.buildNumber;
|
||||||
|
if( libraryVersion.branchName != "master" )
|
||||||
|
stream << " (" << libraryVersion.branchName << ")";
|
||||||
|
stream << " host application.\n"
|
||||||
|
<< "Run with -? for options\n\n";
|
||||||
|
|
||||||
|
testRunInfo.reset();
|
||||||
|
}
|
||||||
|
void lazyPrintGroupInfo() {
|
||||||
|
if( !unusedGroupInfo->name.empty() && unusedGroupInfo->groupsCounts > 1 ) {
|
||||||
|
printClosedHeader( "Group: " + unusedGroupInfo->name );
|
||||||
|
unusedGroupInfo.reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void printTestCaseAndSectionHeader() {
|
||||||
|
printOpenHeader( unusedTestCaseInfo->name );
|
||||||
|
if( currentSectionInfo ) {
|
||||||
|
Colour colourGuard( Colour::Headers );
|
||||||
|
std::vector<ThreadedSectionInfo*> sections;
|
||||||
|
for( ThreadedSectionInfo* section = currentSectionInfo.get();
|
||||||
|
section;
|
||||||
|
section = section->parent )
|
||||||
|
sections.push_back( section );
|
||||||
|
|
||||||
|
// Sections
|
||||||
|
if( !sections.empty() ) {
|
||||||
|
typedef std::vector<ThreadedSectionInfo*>::const_reverse_iterator It;
|
||||||
|
for( It it = sections.rbegin(), itEnd = sections.rend(); it != itEnd; ++it )
|
||||||
|
printHeaderString( (*it)->name, 2 );
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SourceLineInfo lineInfo = currentSectionInfo
|
||||||
|
? currentSectionInfo->lineInfo
|
||||||
|
: unusedTestCaseInfo->lineInfo;
|
||||||
|
|
||||||
|
if( !lineInfo.empty() ){
|
||||||
|
stream << getDashes() << "\n";
|
||||||
|
Colour colourGuard( Colour::FileName );
|
||||||
|
stream << lineInfo << "\n";
|
||||||
|
}
|
||||||
|
stream << getDots() << "\n" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void printClosedHeader( std::string const& _name ) {
|
||||||
|
printOpenHeader( _name );
|
||||||
|
stream << getDots() << "\n";
|
||||||
|
}
|
||||||
|
void printOpenHeader( std::string const& _name ) {
|
||||||
|
stream << getDashes() << "\n";
|
||||||
|
{
|
||||||
|
Colour colourGuard( Colour::Headers );
|
||||||
|
printHeaderString( _name );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if string has a : in first line will set indent to follow it on
|
||||||
|
// subsequent lines
|
||||||
|
void printHeaderString( std::string const& _string, std::size_t indent = 0 ) {
|
||||||
|
std::size_t i = _string.find( ": " );
|
||||||
|
if( i != std::string::npos )
|
||||||
|
i+=2;
|
||||||
|
else
|
||||||
|
i = 0;
|
||||||
|
stream << Text( _string, TextAttributes()
|
||||||
|
.setIndent( indent+i)
|
||||||
|
.setInitialIndent( indent ) ) << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void printTotals( const Totals& totals ) {
|
||||||
|
if( totals.assertions.total() == 0 ) {
|
||||||
|
stream << "No tests ran";
|
||||||
|
}
|
||||||
|
else if( totals.assertions.failed ) {
|
||||||
|
Colour colour( Colour::ResultError );
|
||||||
|
printCounts( "test case", totals.testCases );
|
||||||
|
if( totals.testCases.failed > 0 ) {
|
||||||
|
stream << " (";
|
||||||
|
printCounts( "assertion", totals.assertions );
|
||||||
|
stream << ")";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Colour colour( Colour::ResultSuccess );
|
||||||
|
stream << "All tests passed ("
|
||||||
|
<< pluralise( totals.assertions.passed, "assertion" ) << " in "
|
||||||
|
<< pluralise( totals.testCases.passed, "test case" ) << ")";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void printCounts( std::string const& label, Counts const& counts ) {
|
||||||
|
if( counts.total() == 1 ) {
|
||||||
|
stream << "1 " << label << " - ";
|
||||||
|
if( counts.failed )
|
||||||
|
stream << "failed";
|
||||||
|
else
|
||||||
|
stream << "passed";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
stream << counts.total() << " " << label << "s ";
|
||||||
|
if( counts.passed ) {
|
||||||
|
if( counts.failed )
|
||||||
|
stream << "- " << counts.failed << " failed";
|
||||||
|
else if( counts.passed == 2 )
|
||||||
|
stream << "- both passed";
|
||||||
|
else
|
||||||
|
stream << "- all passed";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if( counts.failed == 2 )
|
||||||
|
stream << "- both failed";
|
||||||
|
else
|
||||||
|
stream << "- all failed";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void printTotalsDivider() {
|
||||||
|
stream << getDoubleDashes() << "\n";
|
||||||
|
}
|
||||||
|
void printSummaryDivider() {
|
||||||
|
stream << getDashes() << "\n";
|
||||||
|
}
|
||||||
|
static std::string const& getDashes() {
|
||||||
|
static const std::string dashes( CATCH_CONFIG_CONSOLE_WIDTH-1, '-' );
|
||||||
|
return dashes;
|
||||||
|
}
|
||||||
|
static std::string const& getDots() {
|
||||||
|
static const std::string dots( CATCH_CONFIG_CONSOLE_WIDTH-1, '.' );
|
||||||
|
return dots;
|
||||||
|
}
|
||||||
|
static std::string const& getDoubleDashes() {
|
||||||
|
static const std::string doubleDashes( CATCH_CONFIG_CONSOLE_WIDTH-1, '=' );
|
||||||
|
return doubleDashes;
|
||||||
|
}
|
||||||
|
static std::string const& getTildes() {
|
||||||
|
static const std::string dots( CATCH_CONFIG_CONSOLE_WIDTH-1, '~' );
|
||||||
|
return dots;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool m_headerPrinted;
|
||||||
|
bool m_atLeastOneTestCasePrinted;
|
||||||
|
};
|
||||||
|
|
||||||
|
INTERNAL_CATCH_REGISTER_REPORTER( "console", ConsoleReporter )
|
||||||
|
|
||||||
|
} // end namespace Catch
|
||||||
|
|
||||||
|
#endif // TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED
|
|
@ -13,6 +13,8 @@
|
||||||
#include "../internal/catch_reporter_registrars.hpp"
|
#include "../internal/catch_reporter_registrars.hpp"
|
||||||
#include "../internal/catch_xmlwriter.hpp"
|
#include "../internal/catch_xmlwriter.hpp"
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
class JunitReporter : public SharedImpl<IReporter> {
|
class JunitReporter : public SharedImpl<IReporter> {
|
||||||
|
@ -35,7 +37,10 @@ namespace Catch {
|
||||||
std::string m_status;
|
std::string m_status;
|
||||||
std::string m_className;
|
std::string m_className;
|
||||||
std::string m_name;
|
std::string m_name;
|
||||||
|
std::string m_stdOut;
|
||||||
|
std::string m_stdErr;
|
||||||
std::vector<TestStats> m_testStats;
|
std::vector<TestStats> m_testStats;
|
||||||
|
std::vector<TestCaseStats> m_sections;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Stats {
|
struct Stats {
|
||||||
|
@ -60,7 +65,7 @@ namespace Catch {
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
JunitReporter( const ReporterConfig& config )
|
JunitReporter( ReporterConfig const& config )
|
||||||
: m_config( config ),
|
: m_config( config ),
|
||||||
m_testSuiteStats( "AllTests" ),
|
m_testSuiteStats( "AllTests" ),
|
||||||
m_currentStats( &m_testSuiteStats )
|
m_currentStats( &m_testSuiteStats )
|
||||||
|
@ -80,6 +85,9 @@ namespace Catch {
|
||||||
virtual void StartTesting(){}
|
virtual void StartTesting(){}
|
||||||
|
|
||||||
virtual void StartGroup( const std::string& groupName ) {
|
virtual void StartGroup( const std::string& groupName ) {
|
||||||
|
if( groupName.empty() )
|
||||||
|
m_statsForSuites.push_back( Stats( m_config.fullConfig()->name() ) );
|
||||||
|
else
|
||||||
m_statsForSuites.push_back( Stats( groupName ) );
|
m_statsForSuites.push_back( Stats( groupName ) );
|
||||||
m_currentStats = &m_statsForSuites.back();
|
m_currentStats = &m_statsForSuites.back();
|
||||||
}
|
}
|
||||||
|
@ -97,11 +105,12 @@ namespace Catch {
|
||||||
virtual void EndSection( const std::string&, const Counts& ) {}
|
virtual void EndSection( const std::string&, const Counts& ) {}
|
||||||
|
|
||||||
virtual void StartTestCase( const Catch::TestCaseInfo& testInfo ) {
|
virtual void StartTestCase( const Catch::TestCaseInfo& testInfo ) {
|
||||||
m_currentStats->m_testCaseStats.push_back( TestCaseStats( testInfo.getClassName(), testInfo.getName() ) );
|
m_currentStats->m_testCaseStats.push_back( TestCaseStats( testInfo.className, testInfo.name ) );
|
||||||
|
m_currentTestCaseStats.push_back( &m_currentStats->m_testCaseStats.back() );
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void Result( const Catch::AssertionResult& assertionResult ) {
|
virtual void Result( const Catch::AssertionResult& assertionResult ) {
|
||||||
if( assertionResult.getResultType() != ResultWas::Ok || m_config.includeSuccessfulResults ) {
|
if( assertionResult.getResultType() != ResultWas::Ok || m_config.fullConfig()->includeSuccessfulResults() ) {
|
||||||
TestCaseStats& testCaseStats = m_currentStats->m_testCaseStats.back();
|
TestCaseStats& testCaseStats = m_currentStats->m_testCaseStats.back();
|
||||||
TestStats stats;
|
TestStats stats;
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
|
@ -134,10 +143,14 @@ namespace Catch {
|
||||||
case ResultWas::Ok:
|
case ResultWas::Ok:
|
||||||
stats.m_element = "success";
|
stats.m_element = "success";
|
||||||
break;
|
break;
|
||||||
|
case ResultWas::DidntThrowException:
|
||||||
|
stats.m_element = "failure";
|
||||||
|
m_currentStats->m_failuresCount++;
|
||||||
|
break;
|
||||||
case ResultWas::Unknown:
|
case ResultWas::Unknown:
|
||||||
case ResultWas::FailureBit:
|
case ResultWas::FailureBit:
|
||||||
case ResultWas::Exception:
|
case ResultWas::Exception:
|
||||||
case ResultWas::DidntThrowException:
|
stats.m_element = "* internal error *";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
testCaseStats.m_testStats.push_back( stats );
|
testCaseStats.m_testStats.push_back( stats );
|
||||||
|
@ -145,6 +158,11 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void EndTestCase( const Catch::TestCaseInfo&, const Totals&, const std::string& stdOut, const std::string& stdErr ) {
|
virtual void EndTestCase( const Catch::TestCaseInfo&, const Totals&, const std::string& stdOut, const std::string& stdErr ) {
|
||||||
|
m_currentTestCaseStats.pop_back();
|
||||||
|
assert( m_currentTestCaseStats.empty() );
|
||||||
|
TestCaseStats& testCaseStats = m_currentStats->m_testCaseStats.back();
|
||||||
|
testCaseStats.m_stdOut = stdOut;
|
||||||
|
testCaseStats.m_stdErr = stdErr;
|
||||||
if( !stdOut.empty() )
|
if( !stdOut.empty() )
|
||||||
m_stdOut << stdOut << "\n";
|
m_stdOut << stdOut << "\n";
|
||||||
if( !stdErr.empty() )
|
if( !stdErr.empty() )
|
||||||
|
@ -156,9 +174,7 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void EndTesting( const Totals& ) {
|
virtual void EndTesting( const Totals& ) {
|
||||||
std::ostream& str = m_config.stream;
|
XmlWriter xml( m_config.stream() );
|
||||||
{
|
|
||||||
XmlWriter xml( str );
|
|
||||||
|
|
||||||
if( m_statsForSuites.size() > 0 )
|
if( m_statsForSuites.size() > 0 )
|
||||||
xml.startElement( "testsuites" );
|
xml.startElement( "testsuites" );
|
||||||
|
@ -179,17 +195,14 @@ namespace Catch {
|
||||||
OutputTestCases( xml, *it );
|
OutputTestCases( xml, *it );
|
||||||
}
|
}
|
||||||
|
|
||||||
xml.scopedElement( "system-out" ).writeText( trim( m_stdOut.str() ) );
|
xml.scopedElement( "system-out" ).writeText( trim( m_stdOut.str() ), false );
|
||||||
xml.scopedElement( "system-err" ).writeText( trim( m_stdErr.str() ) );
|
xml.scopedElement( "system-err" ).writeText( trim( m_stdErr.str() ), false );
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OutputTestCases( XmlWriter& xml, const Stats& stats ) {
|
void OutputTestCases( XmlWriter& xml, const Stats& stats ) {
|
||||||
std::vector<TestCaseStats>::const_iterator it = stats.m_testCaseStats.begin();
|
std::vector<TestCaseStats>::const_iterator it = stats.m_testCaseStats.begin();
|
||||||
std::vector<TestCaseStats>::const_iterator itEnd = stats.m_testCaseStats.end();
|
std::vector<TestCaseStats>::const_iterator itEnd = stats.m_testCaseStats.end();
|
||||||
for(; it != itEnd; ++it ) {
|
for(; it != itEnd; ++it ) {
|
||||||
xml.writeBlankLine();
|
|
||||||
xml.writeComment( "Test case" );
|
|
||||||
|
|
||||||
XmlWriter::ScopedElement e = xml.scopedElement( "testcase" );
|
XmlWriter::ScopedElement e = xml.scopedElement( "testcase" );
|
||||||
xml.writeAttribute( "classname", it->m_className );
|
xml.writeAttribute( "classname", it->m_className );
|
||||||
|
@ -197,6 +210,13 @@ namespace Catch {
|
||||||
xml.writeAttribute( "time", "tbd" );
|
xml.writeAttribute( "time", "tbd" );
|
||||||
|
|
||||||
OutputTestResult( xml, *it );
|
OutputTestResult( xml, *it );
|
||||||
|
|
||||||
|
std::string stdOut = trim( it->m_stdOut );
|
||||||
|
if( !stdOut.empty() )
|
||||||
|
xml.scopedElement( "system-out" ).writeText( stdOut, false );
|
||||||
|
std::string stdErr = trim( it->m_stdErr );
|
||||||
|
if( !stdErr.empty() )
|
||||||
|
xml.scopedElement( "system-err" ).writeText( stdErr, false );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -218,11 +238,11 @@ namespace Catch {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ReporterConfig m_config;
|
ReporterConfig m_config;
|
||||||
bool m_currentTestSuccess;
|
|
||||||
|
|
||||||
Stats m_testSuiteStats;
|
Stats m_testSuiteStats;
|
||||||
Stats* m_currentStats;
|
Stats* m_currentStats;
|
||||||
std::vector<Stats> m_statsForSuites;
|
std::vector<Stats> m_statsForSuites;
|
||||||
|
std::vector<const TestCaseStats*> m_currentTestCaseStats;
|
||||||
std::ostringstream m_stdOut;
|
std::ostringstream m_stdOut;
|
||||||
std::ostringstream m_stdErr;
|
std::ostringstream m_stdErr;
|
||||||
};
|
};
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
class XmlReporter : public SharedImpl<IReporter> {
|
class XmlReporter : public SharedImpl<IReporter> {
|
||||||
public:
|
public:
|
||||||
XmlReporter( const ReporterConfig& config ) : m_config( config ) {}
|
XmlReporter( ReporterConfig const& config ) : m_config( config ) {}
|
||||||
|
|
||||||
static std::string getDescription() {
|
static std::string getDescription() {
|
||||||
return "Reports test results as an XML document";
|
return "Reports test results as an XML document";
|
||||||
|
@ -30,10 +30,10 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void StartTesting() {
|
virtual void StartTesting() {
|
||||||
m_xml = XmlWriter( m_config.stream );
|
m_xml = XmlWriter( m_config.stream() );
|
||||||
m_xml.startElement( "Catch" );
|
m_xml.startElement( "Catch" );
|
||||||
if( !m_config.name.empty() )
|
if( !m_config.fullConfig()->name().empty() )
|
||||||
m_xml.writeAttribute( "name", m_config.name );
|
m_xml.writeAttribute( "name", m_config.fullConfig()->name() );
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void EndTesting( const Totals& totals ) {
|
virtual void EndTesting( const Totals& totals ) {
|
||||||
|
@ -71,12 +71,12 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void StartTestCase( const Catch::TestCaseInfo& testInfo ) {
|
virtual void StartTestCase( const Catch::TestCaseInfo& testInfo ) {
|
||||||
m_xml.startElement( "TestCase" ).writeAttribute( "name", testInfo.getName() );
|
m_xml.startElement( "TestCase" ).writeAttribute( "name", testInfo.name );
|
||||||
m_currentTestSuccess = true;
|
m_currentTestSuccess = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void Result( const Catch::AssertionResult& assertionResult ) {
|
virtual void Result( const Catch::AssertionResult& assertionResult ) {
|
||||||
if( !m_config.includeSuccessfulResults && assertionResult.getResultType() == ResultWas::Ok )
|
if( !m_config.fullConfig()->includeSuccessfulResults() && assertionResult.getResultType() == ResultWas::Ok )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( assertionResult.hasExpression() ) {
|
if( assertionResult.hasExpression() ) {
|
||||||
|
|
|
@ -101,3 +101,12 @@ TEST_CASE
|
||||||
REQUIRE( approx( d ) != 1.25 );
|
REQUIRE( approx( d ) != 1.25 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline double divide( double a, double b ) {
|
||||||
|
return a/b;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE( "Approximate PI", "[Approx][PI]" )
|
||||||
|
{
|
||||||
|
REQUIRE( divide( 22, 7 ) == Approx( 3.141 ).epsilon( 0.001 ) );
|
||||||
|
REQUIRE( divide( 22, 7 ) != Approx( 3.141 ).epsilon( 0.0001 ) );
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* Created by Phil on 29/11/2010.
|
||||||
|
* Copyright 2010 Two Blue Cubes Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "catch.hpp"
|
||||||
|
|
||||||
|
inline bool itDoesThis(){ return true; }
|
||||||
|
inline bool itDoesThat(){ return true; }
|
||||||
|
|
||||||
|
SCENARIO( "Do that thing with the thing", "[Tags]" ) {
|
||||||
|
GIVEN( "This stuff exists" ) {
|
||||||
|
// make stuff exist
|
||||||
|
WHEN( "I do this" ) {
|
||||||
|
// do this
|
||||||
|
THEN( "it should do this")
|
||||||
|
{
|
||||||
|
REQUIRE( itDoesThis() );
|
||||||
|
AND_THEN( "do that")
|
||||||
|
REQUIRE( itDoesThat() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SCENARIO( "Vector resizing affects size and capacity", "[vector][bdd][size][capacity]" ) {
|
||||||
|
GIVEN( "an empty vector" ) {
|
||||||
|
std::vector<int> v;
|
||||||
|
REQUIRE( v.size() == 0 );
|
||||||
|
|
||||||
|
WHEN( "it is made larger" ) {
|
||||||
|
v.resize( 10 );
|
||||||
|
THEN( "the size and capacity go up" ) {
|
||||||
|
REQUIRE( v.size() == 10 );
|
||||||
|
REQUIRE( v.capacity() >= 10 );
|
||||||
|
|
||||||
|
AND_WHEN( "it is made smaller again" ) {
|
||||||
|
v.resize( 5 );
|
||||||
|
THEN( "the size goes down but the capacity stays the same" ) {
|
||||||
|
REQUIRE( v.size() == 5 );
|
||||||
|
REQUIRE( v.capacity() >= 10 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
WHEN( "we reserve more space" ) {
|
||||||
|
v.reserve( 10 );
|
||||||
|
THEN( "The capacity is increased but the size remains the same" ) {
|
||||||
|
REQUIRE( v.capacity() >= 10 );
|
||||||
|
REQUIRE( v.size() == 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SCENARIO( "This is a really long scenario name to see how the list command deals with wrapping",
|
||||||
|
"[very long tags][lots][long][tags][verbose]"
|
||||||
|
"[one very long tag name that should cause line wrapping writing out using the list command]"
|
||||||
|
"[anotherReallyLongTagNameButThisOneHasNoObviousWrapPointsSoShouldSplitWithinAWordUsingADashCharacter]" ) {
|
||||||
|
GIVEN( "A section name that is so long that it cannot fit in a single console width" )
|
||||||
|
WHEN( "The test headers are printed as part of the normal running of the scenario" )
|
||||||
|
THEN( "The, deliberately very long and overly verbose (you see what I did there?) section names must wrap, along with an indent" )
|
||||||
|
SUCCEED("boo!");
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -1,169 +0,0 @@
|
||||||
[Started testing]
|
|
||||||
[Started group: './failing*']
|
|
||||||
|
|
||||||
[Running: ./failing/TestClass/failingCase]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ClassTests.cpp:28: s == "world" failed for: "hello" == "world"
|
|
||||||
[Finished: './failing/TestClass/failingCase' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/Fixture/failingCase]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ClassTests.cpp:55: m_a == 2 failed for: 1 == 2
|
|
||||||
[Finished: './failing/Fixture/failingCase' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/conditions/equality]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:71: data.int_seven == 6 failed for: 7 == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:72: data.int_seven == 8 failed for: 7 == 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:73: data.int_seven == 0 failed for: 7 == 0
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:74: data.float_nine_point_one == Approx( 9.11f ) failed for: 9.1 == Approx( 9.11 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:75: data.float_nine_point_one == Approx( 9.0f ) failed for: 9.1 == Approx( 9 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:76: data.float_nine_point_one == Approx( 1 ) failed for: 9.1 == Approx( 1 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:77: data.float_nine_point_one == Approx( 0 ) failed for: 9.1 == Approx( 0 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:78: data.double_pi == Approx( 3.1415 ) failed for: 3.14159 == Approx( 3.1415 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:79: data.str_hello == "goodbye" failed for: "hello" == "goodbye"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:80: data.str_hello == "hell" failed for: "hello" == "hell"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:81: data.str_hello == "hello1" failed for: "hello" == "hello1"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:82: data.str_hello.size() == 6 failed for: 5 == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:85: x == Approx( 1.301 ) failed for: 1.3 == Approx( 1.301 )
|
|
||||||
[Finished: './failing/conditions/equality' 1 test case failed (All 13 assertions failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/conditions/inequality]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:111: data.int_seven != 7 failed for: 7 != 7
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:112: data.float_nine_point_one != Approx( 9.1f ) failed for: 9.1 != Approx( 9.1 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:113: data.double_pi != Approx( 3.1415926535 ) failed for: 3.14159 != Approx( 3.14159 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:114: data.str_hello != "hello" failed for: "hello" != "hello"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:115: data.str_hello.size() != 5 failed for: 5 != 5
|
|
||||||
[Finished: './failing/conditions/inequality' 1 test case failed (All 5 assertions failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/conditions/ordered]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:152: data.int_seven > 7 failed for: 7 > 7
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:153: data.int_seven < 7 failed for: 7 < 7
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:154: data.int_seven > 8 failed for: 7 > 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:155: data.int_seven < 6 failed for: 7 < 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:156: data.int_seven < 0 failed for: 7 < 0
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:157: data.int_seven < -1 failed for: 7 < -1
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:159: data.int_seven >= 8 failed for: 7 >= 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:160: data.int_seven <= 6 failed for: 7 <= 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:162: data.float_nine_point_one < 9 failed for: 9.1 < 9
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:163: data.float_nine_point_one > 10 failed for: 9.1 > 10
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:164: data.float_nine_point_one > 9.2 failed for: 9.1 > 9.2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:166: data.str_hello > "hello" failed for: "hello" > "hello"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:167: data.str_hello < "hello" failed for: "hello" < "hello"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:168: data.str_hello > "hellp" failed for: "hello" > "hellp"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:169: data.str_hello > "z" failed for: "hello" > "z"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:170: data.str_hello < "hellm" failed for: "hello" < "hellm"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:171: data.str_hello < "a" failed for: "hello" < "a"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:173: data.str_hello >= "z" failed for: "hello" >= "z"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:174: data.str_hello <= "a" failed for: "hello" <= "a"
|
|
||||||
[Finished: './failing/conditions/ordered' 1 test case failed (All 19 assertions failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/conditions/not]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:320: false != false failed
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:321: true != true failed
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:322: !true failed for: false
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:323: !true failed
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:325: !trueValue failed for: false
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:326: !trueValue failed for: !true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:328: !(1 == 1) failed for: false
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:329: !1 == 1 failed for: !(1 == 1)
|
|
||||||
[Finished: './failing/conditions/not' 1 test case failed (All 8 assertions failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/exceptions/explicit]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:47: thisThrows() failed with unexpected exception with message: 'expected exception'
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:48: thisDoesntThrow() failed because no exception was thrown where one was expected
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:49: thisThrows() failed with unexpected exception with message: 'expected exception'
|
|
||||||
[Finished: './failing/exceptions/explicit' 1 test case failed (All 3 assertions failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/exceptions/implicit]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:52: Unexpected exception with message: 'unexpected exception'
|
|
||||||
[Finished: './failing/exceptions/implicit' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/exceptions/custom]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:95: Unexpected exception with message: 'custom exception'
|
|
||||||
[Finished: './failing/exceptions/custom' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/exceptions/custom/nothrow]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:102: throw CustomException( "unexpected custom exception" ) failed with unexpected exception with message: 'unexpected custom exception'
|
|
||||||
[Finished: './failing/exceptions/custom/nothrow' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/exceptions/custom/throw]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:107: throw CustomException( "custom exception - not std" ) failed with unexpected exception with message: 'custom exception - not std'
|
|
||||||
[Finished: './failing/exceptions/custom/throw' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/exceptions/custom/double]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:111: Unexpected exception with message: '3.14'
|
|
||||||
[Finished: './failing/exceptions/custom/double' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/exceptions/in-section]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:125: Unexpected exception with message: 'Exception from section'
|
|
||||||
[Finished: './failing/exceptions/in-section' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/message/info/1]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MessageTests.cpp:19: [info: this message should be logged]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MessageTests.cpp:20: [info: so should this]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MessageTests.cpp:22: a == 1 failed for: 2 == 1
|
|
||||||
[Finished: './failing/message/info/1' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/message/fail]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MessageTests.cpp:46: failed with message: 'This is a failure'
|
|
||||||
[Finished: './failing/message/fail' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/message/sections]
|
|
||||||
|
|
||||||
[Started section: 'one']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MessageTests.cpp:53: failed with message: 'Message from section one'
|
|
||||||
[End of section: 'one' 1 assertion failed]
|
|
||||||
|
|
||||||
[Started section: 'two']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MessageTests.cpp:58: failed with message: 'Message from section two'
|
|
||||||
[End of section: 'two' 1 assertion failed]
|
|
||||||
|
|
||||||
[Finished: './failing/message/sections' 1 test case failed (All 2 assertions failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/info]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:169: [info: hi]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:171: [info: i := 7]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:172: false failed
|
|
||||||
[Finished: './failing/info' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/checkedif]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:177: flag failed for: false
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:190: testCheckedIf( false ) failed for: false
|
|
||||||
[Finished: './failing/checkedif' 1 test case failed (All 2 assertions failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/checkedelse]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:195: flag failed for: false
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:208: testCheckedElse( false ) failed for: false
|
|
||||||
[Finished: './failing/checkedelse' 1 test case failed (All 2 assertions failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/matchers/Contains]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:255: testStringForMatching() Contains( "not there" ) failed for:
|
|
||||||
"this string contains 'abc' as a substring" contains: "not there"
|
|
||||||
[Finished: './failing/matchers/Contains' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/matchers/StartsWith]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:260: testStringForMatching() StartsWith( "string" ) failed for:
|
|
||||||
"this string contains 'abc' as a substring" starts with: "string"
|
|
||||||
[Finished: './failing/matchers/StartsWith' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/matchers/EndsWith]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:265: testStringForMatching() EndsWith( "this" ) failed for:
|
|
||||||
"this string contains 'abc' as a substring" ends with: "this"
|
|
||||||
[Finished: './failing/matchers/EndsWith' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/matchers/Equals]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:270: testStringForMatching() Equals( "something else" ) failed for:
|
|
||||||
"this string contains 'abc' as a substring" equals: "something else"
|
|
||||||
[Finished: './failing/matchers/Equals' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/Tricky/non streamable type]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:95: &o1 == &o2 failed for: 0x7fff522b88b8 == 0x7fff522b88b0
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:96: o1 == o2 failed for: {?} == {?}
|
|
||||||
[Finished: './failing/Tricky/non streamable type' 1 test case failed (All 2 assertions failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/string literals]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:106: std::string( "first" ) == "second" failed for: "first" == "second"
|
|
||||||
[Finished: './failing/string literals' 1 test case failed (1 assertion failed)]
|
|
||||||
[End of group: './failing*'. All 25 test cases failed (All 72 assertions failed)]
|
|
||||||
|
|
||||||
|
|
||||||
[Testing completed. All 25 test cases failed (All 72 assertions failed)]
|
|
||||||
|
|
|
@ -1,646 +0,0 @@
|
||||||
[Started testing]
|
|
||||||
[Started group: './failing* ./succeeding*']
|
|
||||||
|
|
||||||
[Running: ./succeeding/Approx/simple]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:20: d == Approx( 1.23 ) succeeded for: 1.23 == Approx( 1.23 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:21: d != Approx( 1.22 ) succeeded for: 1.23 != Approx( 1.22 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:22: d != Approx( 1.24 ) succeeded for: 1.23 != Approx( 1.24 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:24: Approx( d ) == 1.23 succeeded for: Approx( 1.23 ) == 1.23
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:25: Approx( d ) != 1.22 succeeded for: Approx( 1.23 ) != 1.22
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:26: Approx( d ) != 1.24 succeeded for: Approx( 1.23 ) != 1.24
|
|
||||||
[Finished: './succeeding/Approx/simple' All tests passed (6 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/Approx/epsilon]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:38: d != Approx( 1.231 ) succeeded for: 1.23 != Approx( 1.231 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:39: d == Approx( 1.231 ).epsilon( 0.1 ) succeeded for: 1.23 == Approx( 1.231 )
|
|
||||||
[Finished: './succeeding/Approx/epsilon' All tests passed (2 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/Approx/float]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:49: 1.23f == Approx( 1.23f ) succeeded for: 1.23 == Approx( 1.23 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:50: 0.0f == Approx( 0.0f ) succeeded for: 0 == Approx( 0 )
|
|
||||||
[Finished: './succeeding/Approx/float' All tests passed (2 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/Approx/int]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:60: 1 == Approx( 1 ) succeeded
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:61: 0 == Approx( 0 ) succeeded
|
|
||||||
[Finished: './succeeding/Approx/int' All tests passed (2 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/Approx/mixed]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:75: 1.0f == Approx( 1 ) succeeded for: 1 == Approx( 1 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:76: 0 == Approx( dZero) succeeded for: 0 == Approx( 0 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:77: 0 == Approx( dSmall ).epsilon( 0.001 ) succeeded for: 0 == Approx( 1e-05 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:78: 1.234f == Approx( dMedium ) succeeded for: 1.234 == Approx( 1.234 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:79: dMedium == Approx( 1.234f ) succeeded for: 1.234 == Approx( 1.234 )
|
|
||||||
[Finished: './succeeding/Approx/mixed' All tests passed (5 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/Approx/custom]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:93: d == approx( 1.23 ) succeeded for: 1.23 == Approx( 1.23 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:94: d == approx( 1.22 ) succeeded for: 1.23 == Approx( 1.22 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:95: d == approx( 1.24 ) succeeded for: 1.23 == Approx( 1.24 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:96: d != approx( 1.25 ) succeeded for: 1.23 != Approx( 1.25 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:98: approx( d ) == 1.23 succeeded for: Approx( 1.23 ) == 1.23
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:99: approx( d ) == 1.22 succeeded for: Approx( 1.23 ) == 1.22
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:100: approx( d ) == 1.24 succeeded for: Approx( 1.23 ) == 1.24
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:101: approx( d ) != 1.25 succeeded for: Approx( 1.23 ) != 1.25
|
|
||||||
[Finished: './succeeding/Approx/custom' All tests passed (8 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/TestClass/succeedingCase]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ClassTests.cpp:24: s == "hello" succeeded for: "hello" == "hello"
|
|
||||||
[Finished: './succeeding/TestClass/succeedingCase' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./failing/TestClass/failingCase]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ClassTests.cpp:28: s == "world" failed for: "hello" == "world"
|
|
||||||
[Finished: './failing/TestClass/failingCase' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/Fixture/succeedingCase]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ClassTests.cpp:47: m_a == 1 succeeded for: 1 == 1
|
|
||||||
[Finished: './succeeding/Fixture/succeedingCase' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./failing/Fixture/failingCase]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ClassTests.cpp:55: m_a == 2 failed for: 1 == 2
|
|
||||||
[Finished: './failing/Fixture/failingCase' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/conditions/equality]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:55: data.int_seven == 7 succeeded for: 7 == 7
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:56: data.float_nine_point_one == Approx( 9.1f ) succeeded for: 9.1 == Approx( 9.1 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:57: data.double_pi == Approx( 3.1415926535 ) succeeded for: 3.14159 == Approx( 3.14159 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:58: data.str_hello == "hello" succeeded for: "hello" == "hello"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:59: "hello" == data.str_hello succeeded for: "hello" == "hello"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:60: data.str_hello.size() == 5 succeeded for: 5 == 5
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:63: x == Approx( 1.3 ) succeeded for: 1.3 == Approx( 1.3 )
|
|
||||||
[Finished: './succeeding/conditions/equality' All tests passed (7 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./failing/conditions/equality]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:71: data.int_seven == 6 failed for: 7 == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:72: data.int_seven == 8 failed for: 7 == 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:73: data.int_seven == 0 failed for: 7 == 0
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:74: data.float_nine_point_one == Approx( 9.11f ) failed for: 9.1 == Approx( 9.11 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:75: data.float_nine_point_one == Approx( 9.0f ) failed for: 9.1 == Approx( 9 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:76: data.float_nine_point_one == Approx( 1 ) failed for: 9.1 == Approx( 1 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:77: data.float_nine_point_one == Approx( 0 ) failed for: 9.1 == Approx( 0 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:78: data.double_pi == Approx( 3.1415 ) failed for: 3.14159 == Approx( 3.1415 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:79: data.str_hello == "goodbye" failed for: "hello" == "goodbye"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:80: data.str_hello == "hell" failed for: "hello" == "hell"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:81: data.str_hello == "hello1" failed for: "hello" == "hello1"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:82: data.str_hello.size() == 6 failed for: 5 == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:85: x == Approx( 1.301 ) failed for: 1.3 == Approx( 1.301 )
|
|
||||||
[Finished: './failing/conditions/equality' 1 test case failed (All 13 assertions failed)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/conditions/inequality]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:93: data.int_seven != 6 succeeded for: 7 != 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:94: data.int_seven != 8 succeeded for: 7 != 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:95: data.float_nine_point_one != Approx( 9.11f ) succeeded for: 9.1 != Approx( 9.11 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:96: data.float_nine_point_one != Approx( 9.0f ) succeeded for: 9.1 != Approx( 9 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:97: data.float_nine_point_one != Approx( 1 ) succeeded for: 9.1 != Approx( 1 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:98: data.float_nine_point_one != Approx( 0 ) succeeded for: 9.1 != Approx( 0 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:99: data.double_pi != Approx( 3.1415 ) succeeded for: 3.14159 != Approx( 3.1415 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:100: data.str_hello != "goodbye" succeeded for: "hello" != "goodbye"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:101: data.str_hello != "hell" succeeded for: "hello" != "hell"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:102: data.str_hello != "hello1" succeeded for: "hello" != "hello1"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:103: data.str_hello.size() != 6 succeeded for: 5 != 6
|
|
||||||
[Finished: './succeeding/conditions/inequality' All tests passed (11 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./failing/conditions/inequality]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:111: data.int_seven != 7 failed for: 7 != 7
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:112: data.float_nine_point_one != Approx( 9.1f ) failed for: 9.1 != Approx( 9.1 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:113: data.double_pi != Approx( 3.1415926535 ) failed for: 3.14159 != Approx( 3.14159 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:114: data.str_hello != "hello" failed for: "hello" != "hello"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:115: data.str_hello.size() != 5 failed for: 5 != 5
|
|
||||||
[Finished: './failing/conditions/inequality' 1 test case failed (All 5 assertions failed)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/conditions/ordered]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:124: data.int_seven < 8 succeeded for: 7 < 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:125: data.int_seven > 6 succeeded for: 7 > 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:126: data.int_seven > 0 succeeded for: 7 > 0
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:127: data.int_seven > -1 succeeded for: 7 > -1
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:129: data.int_seven >= 7 succeeded for: 7 >= 7
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:130: data.int_seven >= 6 succeeded for: 7 >= 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:131: data.int_seven <= 7 succeeded for: 7 <= 7
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:132: data.int_seven <= 8 succeeded for: 7 <= 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:134: data.float_nine_point_one > 9 succeeded for: 9.1 > 9
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:135: data.float_nine_point_one < 10 succeeded for: 9.1 < 10
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:136: data.float_nine_point_one < 9.2 succeeded for: 9.1 < 9.2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:138: data.str_hello <= "hello" succeeded for: "hello" <= "hello"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:139: data.str_hello >= "hello" succeeded for: "hello" >= "hello"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:141: data.str_hello < "hellp" succeeded for: "hello" < "hellp"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:142: data.str_hello < "zebra" succeeded for: "hello" < "zebra"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:143: data.str_hello > "hellm" succeeded for: "hello" > "hellm"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:144: data.str_hello > "a" succeeded for: "hello" > "a"
|
|
||||||
[Finished: './succeeding/conditions/ordered' All tests passed (17 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./failing/conditions/ordered]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:152: data.int_seven > 7 failed for: 7 > 7
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:153: data.int_seven < 7 failed for: 7 < 7
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:154: data.int_seven > 8 failed for: 7 > 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:155: data.int_seven < 6 failed for: 7 < 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:156: data.int_seven < 0 failed for: 7 < 0
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:157: data.int_seven < -1 failed for: 7 < -1
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:159: data.int_seven >= 8 failed for: 7 >= 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:160: data.int_seven <= 6 failed for: 7 <= 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:162: data.float_nine_point_one < 9 failed for: 9.1 < 9
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:163: data.float_nine_point_one > 10 failed for: 9.1 > 10
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:164: data.float_nine_point_one > 9.2 failed for: 9.1 > 9.2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:166: data.str_hello > "hello" failed for: "hello" > "hello"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:167: data.str_hello < "hello" failed for: "hello" < "hello"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:168: data.str_hello > "hellp" failed for: "hello" > "hellp"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:169: data.str_hello > "z" failed for: "hello" > "z"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:170: data.str_hello < "hellm" failed for: "hello" < "hellm"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:171: data.str_hello < "a" failed for: "hello" < "a"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:173: data.str_hello >= "z" failed for: "hello" >= "z"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:174: data.str_hello <= "a" failed for: "hello" <= "a"
|
|
||||||
[Finished: './failing/conditions/ordered' 1 test case failed (All 19 assertions failed)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/conditions/int literals]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:188: i == 1 succeeded for: 1 == 1
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:189: ui == 2 succeeded for: 2 == 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:190: l == 3 succeeded for: 3 == 3
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:191: ul == 4 succeeded for: 4 == 4
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:192: c == 5 succeeded for: 5 == 5
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:193: uc == 6 succeeded for: == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:195: 1 == i succeeded for: 1 == 1
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:196: 2 == ui succeeded for: 2 == 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:197: 3 == l succeeded for: 3 == 3
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:198: 4 == ul succeeded for: 4 == 4
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:199: 5 == c succeeded for: 5 == 5
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:200: 6 == uc succeeded for: 6 ==
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:202: (std::numeric_limits<unsigned long>::max)() > ul succeeded for: 0xffffffffffffffff > 4
|
|
||||||
[Finished: './succeeding/conditions/int literals' All tests passed (13 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/conditions//long_to_unsigned_x]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:223: long_var == unsigned_char_var succeeded for: 1 ==
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:224: long_var == unsigned_short_var succeeded for: 1 == 1
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:225: long_var == unsigned_int_var succeeded for: 1 == 1
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:226: long_var == unsigned_long_var succeeded for: 1 == 1
|
|
||||||
[Finished: './succeeding/conditions//long_to_unsigned_x' All tests passed (4 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/conditions/negative ints]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:232: ( -1 > 2u ) succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:233: -1 > 2u succeeded for: -1 > 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:235: ( 2u < -1 ) succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:236: 2u < -1 succeeded for: 2 < -1
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:239: ( minInt > 2u ) succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:240: minInt > 2u succeeded for: -2147483648 > 2
|
|
||||||
[Finished: './succeeding/conditions/negative ints' All tests passed (6 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/conditions/computed ints]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:255: 54 == 6*9 succeeded for: 54 == 54
|
|
||||||
[Finished: './succeeding/conditions/computed ints' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/conditions/ptr]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:271: p == __null succeeded for: __null == 0
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:272: p == pNULL succeeded for: __null == __null
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:277: p != __null succeeded for: 0x7fff54208078 != 0
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:280: cp != __null succeeded for: 0x7fff54208078 != 0
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:283: cpc != __null succeeded for: 0x7fff54208078 != 0
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:285: returnsNull() == __null succeeded for: {null string} == 0
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:286: returnsConstNull() == __null succeeded for: {null string} == 0
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:288: __null != p succeeded for: 0 != 0x7fff54208078
|
|
||||||
[Finished: './succeeding/conditions/ptr' All tests passed (8 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/conditions/not]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:303: false == false succeeded
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:304: true == true succeeded
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:305: !false succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:306: !false succeeded
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:308: !falseValue succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:309: !falseValue succeeded for: !false
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:311: !(1 == 2) succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:312: !1 == 2 succeeded for: !(1 == 2)
|
|
||||||
[Finished: './succeeding/conditions/not' All tests passed (8 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./failing/conditions/not]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:320: false != false failed
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:321: true != true failed
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:322: !true failed for: false
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:323: !true failed
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:325: !trueValue failed for: false
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:326: !trueValue failed for: !true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:328: !(1 == 1) failed for: false
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:329: !1 == 1 failed for: !(1 == 1)
|
|
||||||
[Finished: './failing/conditions/not' 1 test case failed (All 8 assertions failed)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/exceptions/explicit]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:39: thisThrows() succeeded
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:40: thisDoesntThrow() succeeded
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:41: thisThrows() succeeded
|
|
||||||
[Finished: './succeeding/exceptions/explicit' All tests passed (3 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./failing/exceptions/explicit]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:47: thisThrows() failed with unexpected exception with message: 'expected exception'
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:48: thisDoesntThrow() failed because no exception was thrown where one was expected
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:49: thisThrows() failed with unexpected exception with message: 'expected exception'
|
|
||||||
[Finished: './failing/exceptions/explicit' 1 test case failed (All 3 assertions failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/exceptions/implicit]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:52: Unexpected exception with message: 'unexpected exception'
|
|
||||||
[Finished: './failing/exceptions/implicit' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/exceptions/custom]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:95: Unexpected exception with message: 'custom exception'
|
|
||||||
[Finished: './failing/exceptions/custom' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/exceptions/custom/nothrow]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:102: throw CustomException( "unexpected custom exception" ) failed with unexpected exception with message: 'unexpected custom exception'
|
|
||||||
[Finished: './failing/exceptions/custom/nothrow' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/exceptions/custom/throw]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:107: throw CustomException( "custom exception - not std" ) failed with unexpected exception with message: 'custom exception - not std'
|
|
||||||
[Finished: './failing/exceptions/custom/throw' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/exceptions/custom/double]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:111: Unexpected exception with message: '3.14'
|
|
||||||
[Finished: './failing/exceptions/custom/double' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/exceptions/in-section]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:125: Unexpected exception with message: 'Exception from section'
|
|
||||||
[Finished: './failing/exceptions/in-section' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/exceptions/error messages]
|
|
||||||
|
|
||||||
[Started section: 'custom, unexpected']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:145: runner.getLog() Contains( "custom exception" ) succeeded for:
|
|
||||||
"\[g] ./failing/exceptions/custom
|
|
||||||
\[tc] ./failing/exceptions/custom
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:95: ThrewException'custom exception' /[tc] ./failing/exceptions/custom
|
|
||||||
/[g] ./failing/exceptions/custom
|
|
||||||
" contains: "custom exception"
|
|
||||||
[End of section: 'custom, unexpected' 1 assertion passed]
|
|
||||||
|
|
||||||
[Started section: 'in section']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:153: runner.getLog() Contains( "Exception from section" ) succeeded for:
|
|
||||||
"\[g] ./failing/exceptions/in-section
|
|
||||||
\[tc] ./failing/exceptions/in-section
|
|
||||||
\ [s] the section
|
|
||||||
\ [s] the section2
|
|
||||||
/ [s] the section2
|
|
||||||
/ [s] the section
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:125: ThrewException'Exception from section' \ [s] the section
|
|
||||||
/ [s] the section
|
|
||||||
/[tc] ./failing/exceptions/in-section
|
|
||||||
/[g] ./failing/exceptions/in-section
|
|
||||||
" contains: "Exception from section"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:154: runner.getLog() Contains( ::Catch::LineInfoRegistry::get().infoForName( "the section2" ) ) succeeded for:
|
|
||||||
"\[g] ./failing/exceptions/in-section
|
|
||||||
\[tc] ./failing/exceptions/in-section
|
|
||||||
\ [s] the section
|
|
||||||
\ [s] the section2
|
|
||||||
/ [s] the section2
|
|
||||||
/ [s] the section
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:125: ThrewException'Exception from section' \ [s] the section
|
|
||||||
/ [s] the section
|
|
||||||
/[tc] ./failing/exceptions/in-section
|
|
||||||
/[g] ./failing/exceptions/in-section
|
|
||||||
" contains: "/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:125: "
|
|
||||||
[End of section: 'in section' All 2 assertions passed]
|
|
||||||
|
|
||||||
[Finished: './succeeding/exceptions/error messages' All tests passed (3 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/exceptions/notimplemented]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:165: thisFunctionNotImplemented( 7 ) succeeded
|
|
||||||
[Finished: './succeeding/exceptions/notimplemented' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/generators/1]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 2 == 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 200 == 200
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 4 == 4
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 200 == 200
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 6 == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 200 == 200
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 8 == 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 200 == 200
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 10 == 10
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 200 == 200
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 30 == 30
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 200 == 200
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 40 == 40
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 200 == 200
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 42 == 42
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 200 == 200
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 72 == 72
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 200 == 200
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 2 == 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 202 == 202
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 4 == 4
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 202 == 202
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 6 == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 202 == 202
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 8 == 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 202 == 202
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 10 == 10
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 202 == 202
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 30 == 30
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 202 == 202
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 40 == 40
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 202 == 202
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 42 == 42
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 202 == 202
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 72 == 72
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 202 == 202
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 2 == 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 204 == 204
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 4 == 4
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 204 == 204
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 6 == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 204 == 204
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 8 == 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 204 == 204
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 10 == 10
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 204 == 204
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 30 == 30
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 204 == 204
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 40 == 40
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 204 == 204
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 42 == 42
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 204 == 204
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 72 == 72
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 204 == 204
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 2 == 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 206 == 206
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 4 == 4
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 206 == 206
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 6 == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 206 == 206
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 8 == 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 206 == 206
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 10 == 10
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 206 == 206
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 30 == 30
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 206 == 206
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 40 == 40
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 206 == 206
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 42 == 42
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 206 == 206
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 72 == 72
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 206 == 206
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 2 == 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 208 == 208
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 4 == 4
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 208 == 208
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 6 == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 208 == 208
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 8 == 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 208 == 208
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 10 == 10
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 208 == 208
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 30 == 30
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 208 == 208
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 40 == 40
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 208 == 208
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 42 == 42
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 208 == 208
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 72 == 72
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 208 == 208
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 2 == 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 210 == 210
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 4 == 4
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 210 == 210
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 6 == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 210 == 210
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 8 == 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 210 == 210
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 10 == 10
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 210 == 210
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 30 == 30
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 210 == 210
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 40 == 40
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 210 == 210
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 42 == 42
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 210 == 210
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 72 == 72
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 210 == 210
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 2 == 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 212 == 212
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 4 == 4
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 212 == 212
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 6 == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 212 == 212
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 8 == 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 212 == 212
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 10 == 10
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 212 == 212
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 30 == 30
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 212 == 212
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 40 == 40
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 212 == 212
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 42 == 42
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 212 == 212
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 72 == 72
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 212 == 212
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 2 == 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 214 == 214
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 4 == 4
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 214 == 214
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 6 == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 214 == 214
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 8 == 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 214 == 214
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 10 == 10
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 214 == 214
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 30 == 30
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 214 == 214
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 40 == 40
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 214 == 214
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 42 == 42
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 214 == 214
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 72 == 72
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 214 == 214
|
|
||||||
[Finished: './succeeding/generators/1' All tests passed (144 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/message]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MessageTests.cpp:14: [warning: this is a warning]
|
|
||||||
[Finished: './succeeding/message' No tests ran]
|
|
||||||
|
|
||||||
[Running: ./failing/message/info/1]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MessageTests.cpp:19: [info: this message should be logged]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MessageTests.cpp:20: [info: so should this]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MessageTests.cpp:22: a == 1 failed for: 2 == 1
|
|
||||||
[Finished: './failing/message/info/1' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/message/fail]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MessageTests.cpp:47: failed with message: 'This is a failure'
|
|
||||||
[Finished: './failing/message/fail' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/message/sections]
|
|
||||||
[Started section: 'one']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MessageTests.cpp:54: failed with message: 'Message from section one'
|
|
||||||
[End of section: 'one' 1 assertion failed]
|
|
||||||
|
|
||||||
[Started section: 'two']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MessageTests.cpp:59: failed with message: 'Message from section two'
|
|
||||||
[End of section: 'two' 1 assertion failed]
|
|
||||||
|
|
||||||
[Finished: './failing/message/sections' 1 test case failed (All 2 assertions failed)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/nofail]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MessageTests.cpp:88: 1 == 2 failed - but was ok
|
|
||||||
[Finished: './succeeding/nofail' No tests ran]
|
|
||||||
|
|
||||||
[Running: ./succeeding/Misc/Sections]
|
|
||||||
[Started section: 's1']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:25: a != b succeeded for: 1 != 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:26: b != a succeeded for: 2 != 1
|
|
||||||
[End of section: 's1' All 2 assertions passed]
|
|
||||||
|
|
||||||
[Started section: 's2']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:31: a != b succeeded for: 1 != 2
|
|
||||||
[End of section: 's2' 1 assertion passed]
|
|
||||||
|
|
||||||
[Finished: './succeeding/Misc/Sections' All tests passed (3 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/Misc/Sections/nested]
|
|
||||||
[Started section: 's1']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:42: a != b succeeded for: 1 != 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:43: b != a succeeded for: 2 != 1
|
|
||||||
[Started section: 's2']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:47: a != b succeeded for: 1 != 2
|
|
||||||
[End of section: 's2' 1 assertion passed]
|
|
||||||
|
|
||||||
[End of section: 's1' All 3 assertions passed]
|
|
||||||
|
|
||||||
[Finished: './succeeding/Misc/Sections/nested' All tests passed (3 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/Misc/null strings]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:163: makeString( false ) != static_cast<char*>(__null) succeeded for: "valid string" != {null string}
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:164: makeString( true ) == static_cast<char*>(__null) succeeded for: {null string} == {null string}
|
|
||||||
[Finished: './succeeding/Misc/null strings' All tests passed (2 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./failing/info]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:169: [info: hi]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:171: [info: i := 7]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:172: false failed
|
|
||||||
[Finished: './failing/info' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/checkedif]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:177: flag succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:185: testCheckedIf( true ) succeeded for: true
|
|
||||||
[Finished: './succeeding/checkedif' All tests passed (2 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./failing/checkedif]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:177: flag failed for: false
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:190: testCheckedIf( false ) failed for: false
|
|
||||||
[Finished: './failing/checkedif' 1 test case failed (All 2 assertions failed)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/checkedelse]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:195: flag succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:203: testCheckedElse( true ) succeeded for: true
|
|
||||||
[Finished: './succeeding/checkedelse' All tests passed (2 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./failing/checkedelse]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:195: flag failed for: false
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:208: testCheckedElse( false ) failed for: false
|
|
||||||
[Finished: './failing/checkedelse' 1 test case failed (All 2 assertions failed)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/atomic if]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:236: x == 0 succeeded for: 0 == 0
|
|
||||||
[Finished: './succeeding/atomic if' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/matchers]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:246: testStringForMatching() Contains( "string" ) succeeded for:
|
|
||||||
"this string contains 'abc' as a substring" contains: "string"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:247: testStringForMatching() Contains( "abc" ) succeeded for:
|
|
||||||
"this string contains 'abc' as a substring" contains: "abc"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:249: testStringForMatching() StartsWith( "this" ) succeeded for:
|
|
||||||
"this string contains 'abc' as a substring" starts with: "this"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:250: testStringForMatching() EndsWith( "substring" ) succeeded for:
|
|
||||||
"this string contains 'abc' as a substring" ends with: "substring"
|
|
||||||
[Finished: './succeeding/matchers' All tests passed (4 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./failing/matchers/Contains]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:255: testStringForMatching() Contains( "not there" ) failed for:
|
|
||||||
"this string contains 'abc' as a substring" contains: "not there"
|
|
||||||
[Finished: './failing/matchers/Contains' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/matchers/StartsWith]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:260: testStringForMatching() StartsWith( "string" ) failed for:
|
|
||||||
"this string contains 'abc' as a substring" starts with: "string"
|
|
||||||
[Finished: './failing/matchers/StartsWith' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/matchers/EndsWith]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:265: testStringForMatching() EndsWith( "this" ) failed for:
|
|
||||||
"this string contains 'abc' as a substring" ends with: "this"
|
|
||||||
[Finished: './failing/matchers/EndsWith' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/matchers/Equals]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:270: testStringForMatching() Equals( "something else" ) failed for:
|
|
||||||
"this string contains 'abc' as a substring" equals: "something else"
|
|
||||||
[Finished: './failing/matchers/Equals' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/matchers/Equals]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:285: testStringForMatching() Equals( "this string contains 'abc' as a substring" ) succeeded for:
|
|
||||||
"this string contains 'abc' as a substring" equals: "this string contains 'abc' as a substring"
|
|
||||||
[Finished: './succeeding/matchers/Equals' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/Tricky/std::pair]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:37: (std::pair<int, int>( 1, 2 )) == aNicePair succeeded for:
|
|
||||||
|
|
||||||
std::pair( 1, 2 )
|
|
||||||
==
|
|
||||||
std::pair( 1, 2 )
|
|
||||||
[Finished: './succeeding/Tricky/std::pair' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./failing/Tricky/non streamable type]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:95: &o1 == &o2 failed for: 0x7fff54208858 == 0x7fff54208850
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:96: o1 == o2 failed for: {?} == {?}
|
|
||||||
[Finished: './failing/Tricky/non streamable type' 1 test case failed (All 2 assertions failed)]
|
|
||||||
|
|
||||||
[Running: ./failing/string literals]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:106: std::string( "first" ) == "second" failed for: "first" == "second"
|
|
||||||
[Finished: './failing/string literals' 1 test case failed (1 assertion failed)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/side-effects]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:119: i++ == 7 succeeded for: 7 == 7
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:120: i++ == 8 succeeded for: 8 == 8
|
|
||||||
[Finished: './succeeding/side-effects' All tests passed (2 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/koenig]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:186: 0xc0000000 == o succeeded for: 0xc0000000 == {?}
|
|
||||||
[Finished: './succeeding/koenig' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/non-const==]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:212: t == 1u succeeded for: {?} == 1
|
|
||||||
[Finished: './succeeding/non-const==' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/enum/bits]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:224: 0xc0000000 == bit30and31 succeeded for: 0xc0000000 == 3221225472
|
|
||||||
[Finished: './succeeding/enum/bits' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/boolean member]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:239: obj.prop != __null succeeded for: 0x7fff54208850 != 0
|
|
||||||
[Finished: './succeeding/boolean member' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/unimplemented static bool]
|
|
||||||
[Started section: 'compare to true']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:259: is_true<true>::value == true succeeded for: true == true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:260: true == is_true<true>::value succeeded for: true == true
|
|
||||||
[End of section: 'compare to true' All 2 assertions passed]
|
|
||||||
|
|
||||||
[Started section: 'compare to false']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:264: is_true<false>::value == false succeeded for: false == false
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:265: false == is_true<false>::value succeeded for: false == false
|
|
||||||
[End of section: 'compare to false' All 2 assertions passed]
|
|
||||||
|
|
||||||
[Started section: 'negation']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:270: !is_true<false>::value succeeded for: true
|
|
||||||
[End of section: 'negation' 1 assertion passed]
|
|
||||||
|
|
||||||
[Started section: 'double negation']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:275: !!is_true<true>::value succeeded for: true
|
|
||||||
[End of section: 'double negation' 1 assertion passed]
|
|
||||||
|
|
||||||
[Started section: 'direct']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:280: is_true<true>::value succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:281: !is_true<false>::value succeeded for: !false
|
|
||||||
[End of section: 'direct' All 2 assertions passed]
|
|
||||||
|
|
||||||
[Finished: './succeeding/unimplemented static bool' All tests passed (8 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/SafeBool]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:313: True succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:314: !False succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:315: !False succeeded for: !false
|
|
||||||
[Finished: './succeeding/SafeBool' All tests passed (3 assertions in 1 test case)]
|
|
||||||
[End of group: './failing* ./succeeding*'. 25 of 67 test cases failed (72 of 361 assertions failed)]
|
|
||||||
|
|
||||||
|
|
||||||
[Testing completed. 25 of 67 test cases failed (72 of 361 assertions failed)]
|
|
||||||
|
|
|
@ -1,469 +0,0 @@
|
||||||
[Started testing]
|
|
||||||
[Started group: './succeeding*']
|
|
||||||
|
|
||||||
[Running: ./succeeding/Approx/simple]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:20: d == Approx( 1.23 ) succeeded for: 1.23 == Approx( 1.23 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:21: d != Approx( 1.22 ) succeeded for: 1.23 != Approx( 1.22 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:22: d != Approx( 1.24 ) succeeded for: 1.23 != Approx( 1.24 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:24: Approx( d ) == 1.23 succeeded for: Approx( 1.23 ) == 1.23
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:25: Approx( d ) != 1.22 succeeded for: Approx( 1.23 ) != 1.22
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:26: Approx( d ) != 1.24 succeeded for: Approx( 1.23 ) != 1.24
|
|
||||||
[Finished: './succeeding/Approx/simple' All tests passed (6 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/Approx/epsilon]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:38: d != Approx( 1.231 ) succeeded for: 1.23 != Approx( 1.231 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:39: d == Approx( 1.231 ).epsilon( 0.1 ) succeeded for: 1.23 == Approx( 1.231 )
|
|
||||||
[Finished: './succeeding/Approx/epsilon' All tests passed (2 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/Approx/float]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:49: 1.23f == Approx( 1.23f ) succeeded for: 1.23 == Approx( 1.23 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:50: 0.0f == Approx( 0.0f ) succeeded for: 0 == Approx( 0 )
|
|
||||||
[Finished: './succeeding/Approx/float' All tests passed (2 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/Approx/int]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:60: 1 == Approx( 1 ) succeeded
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:61: 0 == Approx( 0 ) succeeded
|
|
||||||
[Finished: './succeeding/Approx/int' All tests passed (2 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/Approx/mixed]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:75: 1.0f == Approx( 1 ) succeeded for: 1 == Approx( 1 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:76: 0 == Approx( dZero) succeeded for: 0 == Approx( 0 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:77: 0 == Approx( dSmall ).epsilon( 0.001 ) succeeded for: 0 == Approx( 1e-05 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:78: 1.234f == Approx( dMedium ) succeeded for: 1.234 == Approx( 1.234 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:79: dMedium == Approx( 1.234f ) succeeded for: 1.234 == Approx( 1.234 )
|
|
||||||
[Finished: './succeeding/Approx/mixed' All tests passed (5 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/Approx/custom]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:93: d == approx( 1.23 ) succeeded for: 1.23 == Approx( 1.23 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:94: d == approx( 1.22 ) succeeded for: 1.23 == Approx( 1.22 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:95: d == approx( 1.24 ) succeeded for: 1.23 == Approx( 1.24 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:96: d != approx( 1.25 ) succeeded for: 1.23 != Approx( 1.25 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:98: approx( d ) == 1.23 succeeded for: Approx( 1.23 ) == 1.23
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:99: approx( d ) == 1.22 succeeded for: Approx( 1.23 ) == 1.22
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:100: approx( d ) == 1.24 succeeded for: Approx( 1.23 ) == 1.24
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp:101: approx( d ) != 1.25 succeeded for: Approx( 1.23 ) != 1.25
|
|
||||||
[Finished: './succeeding/Approx/custom' All tests passed (8 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/TestClass/succeedingCase]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ClassTests.cpp:24: s == "hello" succeeded for: "hello" == "hello"
|
|
||||||
[Finished: './succeeding/TestClass/succeedingCase' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/Fixture/succeedingCase]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ClassTests.cpp:47: m_a == 1 succeeded for: 1 == 1
|
|
||||||
[Finished: './succeeding/Fixture/succeedingCase' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/conditions/equality]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:55: data.int_seven == 7 succeeded for: 7 == 7
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:56: data.float_nine_point_one == Approx( 9.1f ) succeeded for: 9.1 == Approx( 9.1 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:57: data.double_pi == Approx( 3.1415926535 ) succeeded for: 3.14159 == Approx( 3.14159 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:58: data.str_hello == "hello" succeeded for: "hello" == "hello"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:59: "hello" == data.str_hello succeeded for: "hello" == "hello"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:60: data.str_hello.size() == 5 succeeded for: 5 == 5
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:63: x == Approx( 1.3 ) succeeded for: 1.3 == Approx( 1.3 )
|
|
||||||
[Finished: './succeeding/conditions/equality' All tests passed (7 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/conditions/inequality]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:93: data.int_seven != 6 succeeded for: 7 != 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:94: data.int_seven != 8 succeeded for: 7 != 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:95: data.float_nine_point_one != Approx( 9.11f ) succeeded for: 9.1 != Approx( 9.11 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:96: data.float_nine_point_one != Approx( 9.0f ) succeeded for: 9.1 != Approx( 9 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:97: data.float_nine_point_one != Approx( 1 ) succeeded for: 9.1 != Approx( 1 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:98: data.float_nine_point_one != Approx( 0 ) succeeded for: 9.1 != Approx( 0 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:99: data.double_pi != Approx( 3.1415 ) succeeded for: 3.14159 != Approx( 3.1415 )
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:100: data.str_hello != "goodbye" succeeded for: "hello" != "goodbye"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:101: data.str_hello != "hell" succeeded for: "hello" != "hell"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:102: data.str_hello != "hello1" succeeded for: "hello" != "hello1"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:103: data.str_hello.size() != 6 succeeded for: 5 != 6
|
|
||||||
[Finished: './succeeding/conditions/inequality' All tests passed (11 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/conditions/ordered]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:124: data.int_seven < 8 succeeded for: 7 < 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:125: data.int_seven > 6 succeeded for: 7 > 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:126: data.int_seven > 0 succeeded for: 7 > 0
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:127: data.int_seven > -1 succeeded for: 7 > -1
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:129: data.int_seven >= 7 succeeded for: 7 >= 7
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:130: data.int_seven >= 6 succeeded for: 7 >= 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:131: data.int_seven <= 7 succeeded for: 7 <= 7
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:132: data.int_seven <= 8 succeeded for: 7 <= 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:134: data.float_nine_point_one > 9 succeeded for: 9.1 > 9
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:135: data.float_nine_point_one < 10 succeeded for: 9.1 < 10
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:136: data.float_nine_point_one < 9.2 succeeded for: 9.1 < 9.2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:138: data.str_hello <= "hello" succeeded for: "hello" <= "hello"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:139: data.str_hello >= "hello" succeeded for: "hello" >= "hello"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:141: data.str_hello < "hellp" succeeded for: "hello" < "hellp"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:142: data.str_hello < "zebra" succeeded for: "hello" < "zebra"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:143: data.str_hello > "hellm" succeeded for: "hello" > "hellm"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:144: data.str_hello > "a" succeeded for: "hello" > "a"
|
|
||||||
[Finished: './succeeding/conditions/ordered' All tests passed (17 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/conditions/int literals]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:188: i == 1 succeeded for: 1 == 1
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:189: ui == 2 succeeded for: 2 == 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:190: l == 3 succeeded for: 3 == 3
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:191: ul == 4 succeeded for: 4 == 4
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:192: c == 5 succeeded for: 5 == 5
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:193: uc == 6 succeeded for: == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:195: 1 == i succeeded for: 1 == 1
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:196: 2 == ui succeeded for: 2 == 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:197: 3 == l succeeded for: 3 == 3
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:198: 4 == ul succeeded for: 4 == 4
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:199: 5 == c succeeded for: 5 == 5
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:200: 6 == uc succeeded for: 6 ==
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:202: (std::numeric_limits<unsigned long>::max)() > ul succeeded for: 0xffffffffffffffff > 4
|
|
||||||
[Finished: './succeeding/conditions/int literals' All tests passed (13 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/conditions//long_to_unsigned_x]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:223: long_var == unsigned_char_var succeeded for: 1 ==
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:224: long_var == unsigned_short_var succeeded for: 1 == 1
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:225: long_var == unsigned_int_var succeeded for: 1 == 1
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:226: long_var == unsigned_long_var succeeded for: 1 == 1
|
|
||||||
[Finished: './succeeding/conditions//long_to_unsigned_x' All tests passed (4 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/conditions/negative ints]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:232: ( -1 > 2u ) succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:233: -1 > 2u succeeded for: -1 > 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:235: ( 2u < -1 ) succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:236: 2u < -1 succeeded for: 2 < -1
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:239: ( minInt > 2u ) succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:240: minInt > 2u succeeded for: -2147483648 > 2
|
|
||||||
[Finished: './succeeding/conditions/negative ints' All tests passed (6 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/conditions/computed ints]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:255: 54 == 6*9 succeeded for: 54 == 54
|
|
||||||
[Finished: './succeeding/conditions/computed ints' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/conditions/ptr]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:271: p == __null succeeded for: __null == 0
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:272: p == pNULL succeeded for: __null == __null
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:277: p != __null succeeded for: 0x7fff556be0f8 != 0
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:280: cp != __null succeeded for: 0x7fff556be0f8 != 0
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:283: cpc != __null succeeded for: 0x7fff556be0f8 != 0
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:285: returnsNull() == __null succeeded for: {null string} == 0
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:286: returnsConstNull() == __null succeeded for: {null string} == 0
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:288: __null != p succeeded for: 0 != 0x7fff556be0f8
|
|
||||||
[Finished: './succeeding/conditions/ptr' All tests passed (8 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/conditions/not]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:303: false == false succeeded
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:304: true == true succeeded
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:305: !false succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:306: !false succeeded
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:308: !falseValue succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:309: !falseValue succeeded for: !false
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:311: !(1 == 2) succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp:312: !1 == 2 succeeded for: !(1 == 2)
|
|
||||||
[Finished: './succeeding/conditions/not' All tests passed (8 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/exceptions/explicit]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:39: thisThrows() succeeded
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:40: thisDoesntThrow() succeeded
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:41: thisThrows() succeeded
|
|
||||||
[Finished: './succeeding/exceptions/explicit' All tests passed (3 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/exceptions/error messages]
|
|
||||||
|
|
||||||
[Started section: 'custom, unexpected']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:145: runner.getLog() Contains( "custom exception" ) succeeded for:
|
|
||||||
"\[g] ./failing/exceptions/custom
|
|
||||||
\[tc] ./failing/exceptions/custom
|
|
||||||
ThrewException'custom exception' /[tc] ./failing/exceptions/custom
|
|
||||||
/[g] ./failing/exceptions/custom
|
|
||||||
" contains: "custom exception"
|
|
||||||
[End of section: 'custom, unexpected' 1 assertion passed]
|
|
||||||
|
|
||||||
[Started section: 'in section']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:153: runner.getLog() Contains( "Exception from section" ) succeeded for:
|
|
||||||
"\[g] ./failing/exceptions/in-section
|
|
||||||
\[tc] ./failing/exceptions/in-section
|
|
||||||
\ [s] the section
|
|
||||||
\ [s] the section2
|
|
||||||
/ [s] the section2
|
|
||||||
/ [s] the section
|
|
||||||
ThrewException'Exception from section' \ [s] the section
|
|
||||||
/ [s] the section
|
|
||||||
/[tc] ./failing/exceptions/in-section
|
|
||||||
/[g] ./failing/exceptions/in-section
|
|
||||||
" contains: "Exception from section"
|
|
||||||
[End of section: 'in section' 1 assertion passed]
|
|
||||||
|
|
||||||
[Finished: './succeeding/exceptions/error messages' All tests passed (2 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/exceptions/notimplemented]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ExceptionTests.cpp:165: thisFunctionNotImplemented( 7 ) succeeded
|
|
||||||
[Finished: './succeeding/exceptions/notimplemented' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/generators/1]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 2 == 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 200 == 200
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 4 == 4
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 200 == 200
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 6 == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 200 == 200
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 8 == 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 200 == 200
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 10 == 10
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 200 == 200
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 30 == 30
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 200 == 200
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 40 == 40
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 200 == 200
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 42 == 42
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 200 == 200
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 72 == 72
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 200 == 200
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 2 == 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 202 == 202
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 4 == 4
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 202 == 202
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 6 == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 202 == 202
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 8 == 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 202 == 202
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 10 == 10
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 202 == 202
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 30 == 30
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 202 == 202
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 40 == 40
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 202 == 202
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 42 == 42
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 202 == 202
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 72 == 72
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 202 == 202
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 2 == 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 204 == 204
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 4 == 4
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 204 == 204
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 6 == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 204 == 204
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 8 == 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 204 == 204
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 10 == 10
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 204 == 204
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 30 == 30
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 204 == 204
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 40 == 40
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 204 == 204
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 42 == 42
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 204 == 204
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 72 == 72
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 204 == 204
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 2 == 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 206 == 206
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 4 == 4
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 206 == 206
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 6 == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 206 == 206
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 8 == 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 206 == 206
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 10 == 10
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 206 == 206
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 30 == 30
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 206 == 206
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 40 == 40
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 206 == 206
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 42 == 42
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 206 == 206
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 72 == 72
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 206 == 206
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 2 == 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 208 == 208
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 4 == 4
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 208 == 208
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 6 == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 208 == 208
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 8 == 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 208 == 208
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 10 == 10
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 208 == 208
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 30 == 30
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 208 == 208
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 40 == 40
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 208 == 208
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 42 == 42
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 208 == 208
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 72 == 72
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 208 == 208
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 2 == 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 210 == 210
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 4 == 4
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 210 == 210
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 6 == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 210 == 210
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 8 == 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 210 == 210
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 10 == 10
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 210 == 210
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 30 == 30
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 210 == 210
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 40 == 40
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 210 == 210
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 42 == 42
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 210 == 210
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 72 == 72
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 210 == 210
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 2 == 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 212 == 212
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 4 == 4
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 212 == 212
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 6 == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 212 == 212
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 8 == 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 212 == 212
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 10 == 10
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 212 == 212
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 30 == 30
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 212 == 212
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 40 == 40
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 212 == 212
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 42 == 42
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 212 == 212
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 72 == 72
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 212 == 212
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 2 == 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 214 == 214
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 4 == 4
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 214 == 214
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 6 == 6
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 214 == 214
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 8 == 8
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 214 == 214
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 10 == 10
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 214 == 214
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 30 == 30
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 214 == 214
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 40 == 40
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 214 == 214
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 42 == 42
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 214 == 214
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:26: multiply( i, 2 ) == i*2 succeeded for: 72 == 72
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/GeneratorTests.cpp:27: multiply( j, 2 ) == j*2 succeeded for: 214 == 214
|
|
||||||
[Finished: './succeeding/generators/1' All tests passed (144 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/message]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MessageTests.cpp:14: [warning: this is a warning]
|
|
||||||
[Finished: './succeeding/message' No tests ran]
|
|
||||||
|
|
||||||
[Running: ./succeeding/Misc/Sections]
|
|
||||||
[Started section: 's1']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:25: a != b succeeded for: 1 != 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:26: b != a succeeded for: 2 != 1
|
|
||||||
[End of section: 's1' All 2 assertions passed]
|
|
||||||
|
|
||||||
[Started section: 's2']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:31: a != b succeeded for: 1 != 2
|
|
||||||
[End of section: 's2' 1 assertion passed]
|
|
||||||
|
|
||||||
[Finished: './succeeding/Misc/Sections' All tests passed (3 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/Misc/Sections/nested]
|
|
||||||
[Started section: 's1']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:42: a != b succeeded for: 1 != 2
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:43: b != a succeeded for: 2 != 1
|
|
||||||
[Started section: 's2']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:47: a != b succeeded for: 1 != 2
|
|
||||||
[End of section: 's2' 1 assertion passed]
|
|
||||||
|
|
||||||
[End of section: 's1' All 3 assertions passed]
|
|
||||||
|
|
||||||
[Finished: './succeeding/Misc/Sections/nested' All tests passed (3 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/Misc/null strings]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:163: makeString( false ) != static_cast<char*>(__null) succeeded for: "valid string" != {null string}
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:164: makeString( true ) == static_cast<char*>(__null) succeeded for: {null string} == {null string}
|
|
||||||
[Finished: './succeeding/Misc/null strings' All tests passed (2 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/checkedif]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:177: flag succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:185: testCheckedIf( true ) succeeded for: true
|
|
||||||
[Finished: './succeeding/checkedif' All tests passed (2 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/checkedelse]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:195: flag succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:203: testCheckedElse( true ) succeeded for: true
|
|
||||||
[Finished: './succeeding/checkedelse' All tests passed (2 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/atomic if]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:236: x == 0 succeeded for: 0 == 0
|
|
||||||
[Finished: './succeeding/atomic if' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/matchers]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:246: testStringForMatching() Contains( "string" ) succeeded for:
|
|
||||||
"this string contains 'abc' as a substring" contains: "string"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:247: testStringForMatching() Contains( "abc" ) succeeded for:
|
|
||||||
"this string contains 'abc' as a substring" contains: "abc"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:249: testStringForMatching() StartsWith( "this" ) succeeded for:
|
|
||||||
"this string contains 'abc' as a substring" starts with: "this"
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:250: testStringForMatching() EndsWith( "substring" ) succeeded for:
|
|
||||||
"this string contains 'abc' as a substring" ends with: "substring"
|
|
||||||
[Finished: './succeeding/matchers' All tests passed (4 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/matchers/Equals]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/MiscTests.cpp:285: testStringForMatching() Equals( "this string contains 'abc' as a substring" ) succeeded for:
|
|
||||||
"this string contains 'abc' as a substring" equals: "this string contains 'abc' as a substring"
|
|
||||||
[Finished: './succeeding/matchers/Equals' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/Tricky/std::pair]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:37: (std::pair<int, int>( 1, 2 )) == aNicePair succeeded for:
|
|
||||||
|
|
||||||
std::pair( 1, 2 )
|
|
||||||
==
|
|
||||||
std::pair( 1, 2 )
|
|
||||||
[Finished: './succeeding/Tricky/std::pair' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/side-effects]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:119: i++ == 7 succeeded for: 7 == 7
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:120: i++ == 8 succeeded for: 8 == 8
|
|
||||||
[Finished: './succeeding/side-effects' All tests passed (2 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/koenig]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:186: 0xc0000000 == o succeeded for: 0xc0000000 == {?}
|
|
||||||
[Finished: './succeeding/koenig' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/non-const==]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:212: t == 1u succeeded for: {?} == 1
|
|
||||||
[Finished: './succeeding/non-const==' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/enum/bits]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:224: 0xc0000000 == bit30and31 succeeded for: 0xc0000000 == 3221225472
|
|
||||||
[Finished: './succeeding/enum/bits' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/boolean member]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:239: obj.prop != __null succeeded for: 0x7fff556be8e0 != 0
|
|
||||||
[Finished: './succeeding/boolean member' All tests passed (1 assertion in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/unimplemented static bool]
|
|
||||||
[Started section: 'compare to true']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:259: is_true<true>::value == true succeeded for: true == true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:260: true == is_true<true>::value succeeded for: true == true
|
|
||||||
[End of section: 'compare to true' All 2 assertions passed]
|
|
||||||
|
|
||||||
[Started section: 'compare to false']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:264: is_true<false>::value == false succeeded for: false == false
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:265: false == is_true<false>::value succeeded for: false == false
|
|
||||||
[End of section: 'compare to false' All 2 assertions passed]
|
|
||||||
|
|
||||||
[Started section: 'negation']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:270: !is_true<false>::value succeeded for: true
|
|
||||||
[End of section: 'negation' 1 assertion passed]
|
|
||||||
|
|
||||||
[Started section: 'double negation']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:275: !!is_true<true>::value succeeded for: true
|
|
||||||
[End of section: 'double negation' 1 assertion passed]
|
|
||||||
|
|
||||||
[Started section: 'direct']
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:280: is_true<true>::value succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:281: !is_true<false>::value succeeded for: !false
|
|
||||||
[End of section: 'direct' All 2 assertions passed]
|
|
||||||
|
|
||||||
[Finished: './succeeding/unimplemented static bool' All tests passed (8 assertions in 1 test case)]
|
|
||||||
|
|
||||||
[Running: ./succeeding/SafeBool]
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:313: True succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:314: !False succeeded for: true
|
|
||||||
/Users/Phil/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/TrickyTests.cpp:315: !False succeeded for: !false
|
|
||||||
[Finished: './succeeding/SafeBool' All tests passed (3 assertions in 1 test case)]
|
|
||||||
[End of group: './succeeding*'. All tests passed (288 assertions in 41 test cases)]
|
|
||||||
|
|
||||||
|
|
||||||
[Testing completed. All tests passed (288 assertions in 41 test cases)]
|
|
||||||
|
|
|
@ -0,0 +1,191 @@
|
||||||
|
/*
|
||||||
|
* Created by Phil on 22/10/2010.
|
||||||
|
* Copyright 2010 Two Blue Cubes Ltd
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifdef __clang__
|
||||||
|
#pragma clang diagnostic ignored "-Wpadded"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "internal/clara.h"
|
||||||
|
|
||||||
|
#include "catch.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
// Helper to deduce size from array literals and pass on to parser
|
||||||
|
template<size_t size, typename ConfigT>
|
||||||
|
std::vector<Clara::Parser::Token> parseInto( Clara::CommandLine<ConfigT>& cli, char const * (&argv)[size], ConfigT& config ) {
|
||||||
|
return cli.parseInto( size, argv, config );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct TestOpt {
|
||||||
|
TestOpt() : number( 0 ), index( 0 ), flag( false ) {}
|
||||||
|
|
||||||
|
std::string processName;
|
||||||
|
std::string fileName;
|
||||||
|
int number;
|
||||||
|
int index;
|
||||||
|
bool flag;
|
||||||
|
std::string firstPos;
|
||||||
|
std::string secondPos;
|
||||||
|
std::string unpositional;
|
||||||
|
|
||||||
|
void setValidIndex( int i ) {
|
||||||
|
if( i < 0 || i > 10 )
|
||||||
|
throw std::domain_error( "index must be between 0 and 10" );
|
||||||
|
index = i;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TestOpt2 {
|
||||||
|
std::string description;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef CATCH_CONFIG_VARIADIC_MACROS
|
||||||
|
|
||||||
|
TEST_CASE( "cmdline" ) {
|
||||||
|
|
||||||
|
TestOpt config;
|
||||||
|
Clara::CommandLine<TestOpt> cli;
|
||||||
|
cli.bindProcessName( &TestOpt::processName );
|
||||||
|
cli.bind( &TestOpt::fileName )
|
||||||
|
.describe( "specifies output file" )
|
||||||
|
.shortOpt( "o" )
|
||||||
|
.longOpt( "output" )
|
||||||
|
.argName( "filename" );
|
||||||
|
|
||||||
|
SECTION( "process name" ) {
|
||||||
|
char const * argv[] = { "test", "-o filename.ext" };
|
||||||
|
parseInto( cli, argv, config );
|
||||||
|
|
||||||
|
CHECK( config.processName == "test" );
|
||||||
|
}
|
||||||
|
SECTION( "arg separated by spaces" ) {
|
||||||
|
char const * argv[] = { "test", "-o filename.ext" };
|
||||||
|
parseInto( cli, argv, config );
|
||||||
|
|
||||||
|
CHECK( config.fileName == "filename.ext" );
|
||||||
|
}
|
||||||
|
SECTION( "arg separated by colon" ) {
|
||||||
|
const char* argv[] = { "test", "-o:filename.ext" };
|
||||||
|
parseInto( cli, argv, config );
|
||||||
|
|
||||||
|
CHECK( config.fileName == "filename.ext" );
|
||||||
|
}
|
||||||
|
SECTION( "arg separated by =" ) {
|
||||||
|
const char* argv[] = { "test", "-o=filename.ext" };
|
||||||
|
parseInto( cli, argv, config );
|
||||||
|
|
||||||
|
CHECK( config.fileName == "filename.ext" );
|
||||||
|
}
|
||||||
|
SECTION( "long opt" ) {
|
||||||
|
const char* argv[] = { "test", "--output %stdout" };
|
||||||
|
parseInto( cli, argv, config );
|
||||||
|
|
||||||
|
CHECK( config.fileName == "%stdout" );
|
||||||
|
}
|
||||||
|
|
||||||
|
cli.bind( &TestOpt::number )
|
||||||
|
.shortOpt( "n" )
|
||||||
|
.argName( "an integral value" );
|
||||||
|
|
||||||
|
SECTION( "a number" ) {
|
||||||
|
const char* argv[] = { "test", "-n 42" };
|
||||||
|
parseInto( cli, argv, config );
|
||||||
|
|
||||||
|
CHECK( config.number == 42 );
|
||||||
|
}
|
||||||
|
SECTION( "not a number" ) {
|
||||||
|
const char* argv[] = { "test", "-n forty-two" };
|
||||||
|
CHECK_THROWS( parseInto( cli, argv, config ) );
|
||||||
|
|
||||||
|
CHECK( config.number == 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION( "two parsers" ) {
|
||||||
|
|
||||||
|
TestOpt config1;
|
||||||
|
TestOpt2 config2;
|
||||||
|
Clara::CommandLine<TestOpt2> cli2;
|
||||||
|
|
||||||
|
cli2.bind( &TestOpt2::description )
|
||||||
|
.describe( "description" )
|
||||||
|
.shortOpt( "d" )
|
||||||
|
.longOpt( "description" )
|
||||||
|
.argName( "some text" );
|
||||||
|
|
||||||
|
const char* argv[] = { "test", "-n 42", "-d some text" };
|
||||||
|
std::vector<Clara::Parser::Token> unusedTokens = parseInto( cli, argv, config1 );
|
||||||
|
|
||||||
|
CHECK( config1.number == 42 );
|
||||||
|
|
||||||
|
REQUIRE_FALSE( unusedTokens.empty() );
|
||||||
|
cli2.populate( unusedTokens, config2 );
|
||||||
|
CHECK( config2.description == "some text" );
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION( "methods" ) {
|
||||||
|
cli.bind( &TestOpt::setValidIndex )
|
||||||
|
.describe( "An index, which is an integer between 0 and 10, inclusive" )
|
||||||
|
.shortOpt( "i" )
|
||||||
|
.argName( "index" );
|
||||||
|
|
||||||
|
SECTION( "in range" ) {
|
||||||
|
const char* argv[] = { "test", "-i 3" };
|
||||||
|
parseInto( cli, argv, config );
|
||||||
|
|
||||||
|
REQUIRE( config.index == 3 );
|
||||||
|
}
|
||||||
|
SECTION( "out of range" ) {
|
||||||
|
const char* argv[] = { "test", "-i 42" };
|
||||||
|
|
||||||
|
REQUIRE_THROWS( parseInto( cli, argv, config ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION( "flags" ) {
|
||||||
|
cli.bind( &TestOpt::flag )
|
||||||
|
.describe( "A flag" )
|
||||||
|
.shortOpt( "f" );
|
||||||
|
|
||||||
|
SECTION( "set" ) {
|
||||||
|
const char* argv[] = { "test", "-f" };
|
||||||
|
parseInto( cli, argv, config );
|
||||||
|
|
||||||
|
REQUIRE( config.flag );
|
||||||
|
}
|
||||||
|
SECTION( "not set" ) {
|
||||||
|
const char* argv[] = { "test" };
|
||||||
|
parseInto( cli, argv, config );
|
||||||
|
|
||||||
|
REQUIRE( config.flag == false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SECTION( "positional" ) {
|
||||||
|
cli.bind( &TestOpt::secondPos )
|
||||||
|
.describe( "Second position" )
|
||||||
|
.argName( "second arg" )
|
||||||
|
.position( 2 );
|
||||||
|
cli.bind( &TestOpt::unpositional )
|
||||||
|
.argName( "any arg" )
|
||||||
|
.describe( "Unpositional" );
|
||||||
|
cli.bind( &TestOpt::firstPos )
|
||||||
|
.describe( "First position" )
|
||||||
|
.argName( "first arg" )
|
||||||
|
.position( 1 );
|
||||||
|
|
||||||
|
// std::cout << cli.usage( "testApp" ) << std::endl;
|
||||||
|
|
||||||
|
const char* argv[] = { "test", "-f", "1st", "-o", "filename", "2nd", "3rd" };
|
||||||
|
parseInto( cli, argv, config );
|
||||||
|
|
||||||
|
REQUIRE( config.firstPos == "1st" );
|
||||||
|
REQUIRE( config.secondPos == "2nd" );
|
||||||
|
REQUIRE( config.unpositional == "3rd" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -204,12 +204,15 @@ TEST_CASE( "./succeeding/conditions/int literals",
|
||||||
|
|
||||||
// Disable warnings about sign conversions for the next two tests
|
// Disable warnings about sign conversions for the next two tests
|
||||||
// (as we are deliberately invoking them)
|
// (as we are deliberately invoking them)
|
||||||
// - Current only disabled for GCC/ LLVM. Should add VC++ too
|
// - Currently only disabled for GCC/ LLVM. Should add VC++ too
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
#pragma GCC diagnostic ignored "-Wsign-compare"
|
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||||
#pragma GCC diagnostic ignored "-Wsign-conversion"
|
#pragma GCC diagnostic ignored "-Wsign-conversion"
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(disable:4389) // '==' : signed/unsigned mismatch
|
||||||
|
#endif
|
||||||
|
|
||||||
TEST_CASE( "./succeeding/conditions//long_to_unsigned_x",
|
TEST_CASE( "./succeeding/conditions//long_to_unsigned_x",
|
||||||
"comparisons between int variables" )
|
"comparisons between int variables" )
|
||||||
|
@ -226,6 +229,20 @@ TEST_CASE( "./succeeding/conditions//long_to_unsigned_x",
|
||||||
REQUIRE( long_var == unsigned_long_var );
|
REQUIRE( long_var == unsigned_long_var );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE( "./succeeding/conditions/const ints to int literal",
|
||||||
|
"comparisons between const int variables" )
|
||||||
|
{
|
||||||
|
const unsigned char unsigned_char_var = 1;
|
||||||
|
const unsigned short unsigned_short_var = 1;
|
||||||
|
const unsigned int unsigned_int_var = 1;
|
||||||
|
const unsigned long unsigned_long_var = 1L;
|
||||||
|
|
||||||
|
REQUIRE( unsigned_char_var == 1 );
|
||||||
|
REQUIRE( unsigned_short_var == 1 );
|
||||||
|
REQUIRE( unsigned_int_var == 1 );
|
||||||
|
REQUIRE( unsigned_long_var == 1 );
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE( "./succeeding/conditions/negative ints",
|
TEST_CASE( "./succeeding/conditions/negative ints",
|
||||||
"Comparisons between unsigned ints and negative signed ints match c++ standard behaviour" )
|
"Comparisons between unsigned ints and negative signed ints match c++ standard behaviour" )
|
||||||
{
|
{
|
||||||
|
|
|
@ -6,10 +6,6 @@
|
||||||
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __clang__
|
|
||||||
#pragma clang diagnostic ignored "-Wpadded"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "catch.hpp"
|
#include "catch.hpp"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -19,13 +15,11 @@
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
CATCH_ATTRIBUTE_NORETURN
|
inline int thisThrows()
|
||||||
int thisThrows();
|
|
||||||
|
|
||||||
int thisThrows()
|
|
||||||
{
|
{
|
||||||
|
if( Catch::isTrue( true ) )
|
||||||
throw std::domain_error( "expected exception" );
|
throw std::domain_error( "expected exception" );
|
||||||
/*NOTREACHED*/
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int thisDoesntThrow()
|
int thisDoesntThrow()
|
||||||
|
@ -41,7 +35,6 @@ TEST_CASE( "./succeeding/exceptions/explicit", "When checked exceptions are thro
|
||||||
REQUIRE_THROWS( thisThrows() );
|
REQUIRE_THROWS( thisThrows() );
|
||||||
}
|
}
|
||||||
|
|
||||||
CATCH_ATTRIBUTE_NORETURN
|
|
||||||
TEST_CASE( "./failing/exceptions/explicit", "When checked exceptions are thrown they can be expected or unexpected" )
|
TEST_CASE( "./failing/exceptions/explicit", "When checked exceptions are thrown they can be expected or unexpected" )
|
||||||
{
|
{
|
||||||
CHECK_THROWS_AS( thisThrows(), std::string );
|
CHECK_THROWS_AS( thisThrows(), std::string );
|
||||||
|
@ -49,10 +42,30 @@ TEST_CASE( "./failing/exceptions/explicit", "When checked exceptions are thrown
|
||||||
CHECK_NOTHROW( thisThrows() );
|
CHECK_NOTHROW( thisThrows() );
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE_NORETURN( "./failing/exceptions/implicit", "When unchecked exceptions are thrown they are always failures" )
|
TEST_CASE( "./failing/exceptions/implicit", "When unchecked exceptions are thrown they are always failures" )
|
||||||
{
|
{
|
||||||
|
if( Catch::isTrue( true ) )
|
||||||
throw std::domain_error( "unexpected exception" );
|
throw std::domain_error( "unexpected exception" );
|
||||||
/*NOTREACHED*/
|
}
|
||||||
|
|
||||||
|
TEST_CASE( "./failing/exceptions/implicit/2", "An unchecked exception reports the line of the last assertion" )
|
||||||
|
{
|
||||||
|
CHECK( 1 == 1 );
|
||||||
|
if( Catch::isTrue( true ) )
|
||||||
|
throw std::domain_error( "unexpected exception" );
|
||||||
|
}
|
||||||
|
TEST_CASE( "./failing/exceptions/implicit/3", "When unchecked exceptions are thrown they are always failures" )
|
||||||
|
{
|
||||||
|
SECTION( "section name", "" )
|
||||||
|
{
|
||||||
|
if( Catch::isTrue( true ) )
|
||||||
|
throw std::domain_error( "unexpected exception" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE( "./failing/exceptions/implicit/4", "When unchecked exceptions are thrown they are always failures" )
|
||||||
|
{
|
||||||
|
CHECK( thisThrows() == 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE( "./succeeding/exceptions/implicit", "When unchecked exceptions are thrown, but caught, they do not affect the test" )
|
TEST_CASE( "./succeeding/exceptions/implicit", "When unchecked exceptions are thrown, but caught, they do not affect the test" )
|
||||||
|
@ -92,70 +105,34 @@ CATCH_TRANSLATE_EXCEPTION( double& ex )
|
||||||
return Catch::toString( ex );
|
return Catch::toString( ex );
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE_NORETURN( "./failing/exceptions/custom", "Unexpected custom exceptions can be translated" )
|
TEST_CASE( "./failing/exceptions/custom", "Unexpected custom exceptions can be translated" )
|
||||||
{
|
{
|
||||||
|
if( Catch::isTrue( true ) )
|
||||||
throw CustomException( "custom exception" );
|
throw CustomException( "custom exception" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void throwCustom() {
|
||||||
|
if( Catch::isTrue( true ) )
|
||||||
|
throw CustomException( "custom exception - not std" );
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE( "./failing/exceptions/custom/nothrow", "Custom exceptions can be translated when testing for nothrow" )
|
TEST_CASE( "./failing/exceptions/custom/nothrow", "Custom exceptions can be translated when testing for nothrow" )
|
||||||
{
|
{
|
||||||
REQUIRE_NOTHROW( throw CustomException( "unexpected custom exception" ) );
|
REQUIRE_NOTHROW( throwCustom() );
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE( "./failing/exceptions/custom/throw", "Custom exceptions can be translated when testing for throwing as something else" )
|
TEST_CASE( "./failing/exceptions/custom/throw", "Custom exceptions can be translated when testing for throwing as something else" )
|
||||||
{
|
{
|
||||||
REQUIRE_THROWS_AS( throw CustomException( "custom exception - not std" ), std::exception );
|
REQUIRE_THROWS_AS( throwCustom(), std::exception );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST_CASE_NORETURN( "./failing/exceptions/custom/double", "Unexpected custom exceptions can be translated" )
|
TEST_CASE( "./failing/exceptions/custom/double", "Unexpected custom exceptions can be translated" )
|
||||||
{
|
{
|
||||||
|
if( Catch::isTrue( true ) )
|
||||||
throw double( 3.14 );
|
throw double( 3.14 );
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Wunused-variable"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
TEST_CASE( "./failing/exceptions/in-section", "Exceptions thrown from sections report file/ line or section" )
|
|
||||||
{
|
|
||||||
SECTION( "the section", "" )
|
|
||||||
{
|
|
||||||
CATCH_REGISTER_LINE_INFO( "the section2" ) SECTION( "the section2", "" )
|
|
||||||
{
|
|
||||||
throw std::domain_error( "Exception from section" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
TEST_CASE( "./succeeding/exceptions/error messages", "The error messages produced by exceptions caught by Catch matched the expected form" )
|
|
||||||
{
|
|
||||||
Catch::EmbeddedRunner runner;
|
|
||||||
using namespace Catch::Matchers;
|
|
||||||
|
|
||||||
SECTION( "custom, unexpected", "" )
|
|
||||||
{
|
|
||||||
runner.runMatching( "./failing/exceptions/custom" );
|
|
||||||
// CHECK_THAT( runner.getLog(), Contains( "Unexpected exception" ) ); // Mock reporter doesn't say this
|
|
||||||
CHECK_THAT( runner.getLog(), Contains( "custom exception" ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION( "in section", "" )
|
|
||||||
{
|
|
||||||
runner.runMatching( "./failing/exceptions/in-section" );
|
|
||||||
INFO( runner.getLog() );
|
|
||||||
// CHECK( runner.getLog().find( "Unexpected exception" ) != std::string::npos ); // Mock reporter doesn't say this
|
|
||||||
CHECK_THAT( runner.getLog(), Contains( "Exception from section" ) );
|
|
||||||
CHECK_THAT( runner.getLog(), Contains( CATCH_GET_LINE_INFO( "the section2" ) ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
inline int thisFunctionNotImplemented( int ) {
|
inline int thisFunctionNotImplemented( int ) {
|
||||||
CATCH_NOT_IMPLEMENTED;
|
CATCH_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,3 +26,17 @@ CATCH_TEST_CASE( "./succeeding/generators/1", "Generators over two ranges" )
|
||||||
CATCH_REQUIRE( multiply( i, 2 ) == i*2 );
|
CATCH_REQUIRE( multiply( i, 2 ) == i*2 );
|
||||||
CATCH_REQUIRE( multiply( j, 2 ) == j*2 );
|
CATCH_REQUIRE( multiply( j, 2 ) == j*2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct IntPair { int first, second; };
|
||||||
|
|
||||||
|
CATCH_TEST_CASE( "./succeeding/generators/2", "Generator over a range of pairs" )
|
||||||
|
{
|
||||||
|
using namespace Catch::Generators;
|
||||||
|
|
||||||
|
IntPair p[] = { { 0, 1 }, { 2, 3 } };
|
||||||
|
|
||||||
|
IntPair* i = CATCH_GENERATE( between( p, &p[1] ) );
|
||||||
|
|
||||||
|
CATCH_REQUIRE( i->first == i->second-1 );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -13,6 +13,10 @@ TEST_CASE( "./succeeding/message", "INFO and WARN do not abort tests" )
|
||||||
INFO( "this is a " << "message" ); // This should output the message if a failure occurs
|
INFO( "this is a " << "message" ); // This should output the message if a failure occurs
|
||||||
WARN( "this is a " << "warning" ); // This should always output the message but then continue
|
WARN( "this is a " << "warning" ); // This should always output the message but then continue
|
||||||
}
|
}
|
||||||
|
TEST_CASE( "./succeeding/succeed", "SUCCEED counts as a test pass" )
|
||||||
|
{
|
||||||
|
SUCCEED( "this is a " << "success" );
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE( "./failing/message/info/1", "INFO gets logged on failure" )
|
TEST_CASE( "./failing/message/info/1", "INFO gets logged on failure" )
|
||||||
{
|
{
|
||||||
|
@ -24,11 +28,11 @@ TEST_CASE( "./failing/message/info/1", "INFO gets logged on failure" )
|
||||||
|
|
||||||
TEST_CASE( "./mixed/message/info/2", "INFO gets logged on failure" )
|
TEST_CASE( "./mixed/message/info/2", "INFO gets logged on failure" )
|
||||||
{
|
{
|
||||||
INFO( "this message should be logged" );
|
INFO( "this message should not be logged" );
|
||||||
int a = 2;
|
int a = 2;
|
||||||
CHECK( a == 2 );
|
CHECK( a == 2 );
|
||||||
|
|
||||||
INFO( "this message should be logged, too" );
|
INFO( "this message should be logged" );
|
||||||
|
|
||||||
CHECK( a == 1 );
|
CHECK( a == 1 );
|
||||||
|
|
||||||
|
@ -43,7 +47,7 @@ TEST_CASE( "./mixed/message/info/2", "INFO gets logged on failure" )
|
||||||
|
|
||||||
TEST_CASE( "./failing/message/fail", "FAIL aborts the test" )
|
TEST_CASE( "./failing/message/fail", "FAIL aborts the test" )
|
||||||
{
|
{
|
||||||
if( true )
|
if( Catch::isTrue( true ) )
|
||||||
FAIL( "This is a " << "failure" ); // This should output the message and abort
|
FAIL( "This is a " << "failure" ); // This should output the message and abort
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,3 +91,12 @@ TEST_CASE( "./succeeding/nofail", "The NO_FAIL macro reports a failure but does
|
||||||
{
|
{
|
||||||
CHECK_NOFAIL( 1 == 2 );
|
CHECK_NOFAIL( 1 == 2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE( "just info", "[info][isolated info][hide]" )
|
||||||
|
{
|
||||||
|
INFO( "this should never be seen" );
|
||||||
|
}
|
||||||
|
TEST_CASE( "just failure", "[fail][isolated info][hide]" )
|
||||||
|
{
|
||||||
|
FAIL( "Previous info should not be seen" );
|
||||||
|
}
|
||||||
|
|
|
@ -6,10 +6,6 @@
|
||||||
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __clang__
|
|
||||||
#pragma clang diagnostic ignored "-Wpadded"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "catch.hpp"
|
#include "catch.hpp"
|
||||||
#include "catch_self_test.hpp"
|
#include "catch_self_test.hpp"
|
||||||
|
|
||||||
|
@ -90,36 +86,6 @@ TEST_CASE( "./Sections/nested/a/b", "nested SECTION tests" )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE( "Sections/nested3", "nested SECTION tests" )
|
|
||||||
{
|
|
||||||
Catch::EmbeddedRunner runner;
|
|
||||||
|
|
||||||
runner.runMatching( "./Sections/nested/a/b", "mock" );
|
|
||||||
CHECK( runner.getLog() ==
|
|
||||||
"\\[g] ./Sections/nested/a/b\n"
|
|
||||||
" \\[tc] ./Sections/nested/a/b\n"
|
|
||||||
|
|
||||||
" \\ [s] c\n"
|
|
||||||
" \\ [s] d (leaf)\n"
|
|
||||||
" / [s] d (leaf)\n"
|
|
||||||
" / [s] c\n"
|
|
||||||
|
|
||||||
" \\ [s] c\n"
|
|
||||||
" \\ [s] e (leaf)\n"
|
|
||||||
" / [s] e (leaf)\n"
|
|
||||||
" / [s] c\n"
|
|
||||||
|
|
||||||
" \\ [s] c\n"
|
|
||||||
" / [s] c\n"
|
|
||||||
|
|
||||||
" \\ [s] f (leaf)\n"
|
|
||||||
" / [s] f (leaf)\n"
|
|
||||||
|
|
||||||
" /[tc] ./Sections/nested/a/b\n"
|
|
||||||
"/[g] ./Sections/nested/a/b\n" );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE( "./mixed/Misc/Sections/loops", "looped SECTION tests" )
|
TEST_CASE( "./mixed/Misc/Sections/loops", "looped SECTION tests" )
|
||||||
{
|
{
|
||||||
int a = 1;
|
int a = 1;
|
||||||
|
@ -269,12 +235,15 @@ TEST_CASE("./failing/matchers/Equals", "")
|
||||||
{
|
{
|
||||||
CHECK_THAT( testStringForMatching(), Equals( "something else" ) );
|
CHECK_THAT( testStringForMatching(), Equals( "something else" ) );
|
||||||
}
|
}
|
||||||
|
TEST_CASE("string", "Equals with NULL")
|
||||||
TEST_CASE("/succeeding/matchers/AllOf", "")
|
{
|
||||||
|
REQUIRE_THAT("", Equals(NULL));
|
||||||
|
}
|
||||||
|
TEST_CASE("./succeeding/matchers/AllOf", "")
|
||||||
{
|
{
|
||||||
CHECK_THAT( testStringForMatching(), AllOf( Catch::Contains( "string" ), Catch::Contains( "abc" ) ) );
|
CHECK_THAT( testStringForMatching(), AllOf( Catch::Contains( "string" ), Catch::Contains( "abc" ) ) );
|
||||||
}
|
}
|
||||||
TEST_CASE("/succeeding/matchers/AnyOf", "")
|
TEST_CASE("./succeeding/matchers/AnyOf", "")
|
||||||
{
|
{
|
||||||
CHECK_THAT( testStringForMatching(), AnyOf( Catch::Contains( "string" ), Catch::Contains( "not there" ) ) );
|
CHECK_THAT( testStringForMatching(), AnyOf( Catch::Contains( "string" ), Catch::Contains( "not there" ) ) );
|
||||||
CHECK_THAT( testStringForMatching(), AnyOf( Catch::Contains( "not there" ), Catch::Contains( "string" ) ) );
|
CHECK_THAT( testStringForMatching(), AnyOf( Catch::Contains( "not there" ), Catch::Contains( "string" ) ) );
|
||||||
|
@ -291,8 +260,7 @@ inline unsigned int Factorial( unsigned int number )
|
||||||
return number > 1 ? Factorial(number-1)*number : 1;
|
return number > 1 ? Factorial(number-1)*number : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE( "example/factorial", "The Factorial function should return the factorial of the number passed in" )
|
TEST_CASE( "Factorials are computed", "[factorial]" ) {
|
||||||
{
|
|
||||||
REQUIRE( Factorial(0) == 1 );
|
REQUIRE( Factorial(0) == 1 );
|
||||||
REQUIRE( Factorial(1) == 1 );
|
REQUIRE( Factorial(1) == 1 );
|
||||||
REQUIRE( Factorial(2) == 2 );
|
REQUIRE( Factorial(2) == 2 );
|
||||||
|
@ -323,3 +291,53 @@ TEST_CASE( "second tag", "[tag2]" )
|
||||||
// while ( fgets(line, 199, output) )
|
// while ( fgets(line, 199, output) )
|
||||||
// std::cout << line;
|
// std::cout << line;
|
||||||
//}
|
//}
|
||||||
|
|
||||||
|
TEST_CASE( "vectors can be sized and resized", "[vector]" ) {
|
||||||
|
|
||||||
|
std::vector<int> v( 5 );
|
||||||
|
|
||||||
|
REQUIRE( v.size() == 5 );
|
||||||
|
REQUIRE( v.capacity() >= 5 );
|
||||||
|
|
||||||
|
SECTION( "resizing bigger changes size and capacity", "" ) {
|
||||||
|
v.resize( 10 );
|
||||||
|
|
||||||
|
REQUIRE( v.size() == 10 );
|
||||||
|
REQUIRE( v.capacity() >= 10 );
|
||||||
|
}
|
||||||
|
SECTION( "resizing smaller changes size but not capacity", "" ) {
|
||||||
|
v.resize( 0 );
|
||||||
|
|
||||||
|
REQUIRE( v.size() == 0 );
|
||||||
|
REQUIRE( v.capacity() >= 5 );
|
||||||
|
|
||||||
|
SECTION( "We can use the 'swap trick' to reset the capacity", "" ) {
|
||||||
|
std::vector<int> empty;
|
||||||
|
empty.swap( v );
|
||||||
|
|
||||||
|
REQUIRE( v.capacity() == 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SECTION( "reserving bigger changes capacity but not size", "" ) {
|
||||||
|
v.reserve( 10 );
|
||||||
|
|
||||||
|
REQUIRE( v.size() == 5 );
|
||||||
|
REQUIRE( v.capacity() >= 10 );
|
||||||
|
}
|
||||||
|
SECTION( "reserving smaller does not change size or capacity", "" ) {
|
||||||
|
v.reserve( 0 );
|
||||||
|
|
||||||
|
REQUIRE( v.size() == 5 );
|
||||||
|
REQUIRE( v.capacity() >= 5 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/philsquared/Catch/issues/166
|
||||||
|
//TEST_CASE("CatchSectionInfiniteLoop", "")
|
||||||
|
//{
|
||||||
|
// SECTION("Outer", "")
|
||||||
|
// SECTION("Inner", "")
|
||||||
|
// SUCCEED("that's not flying - that's failing in style");
|
||||||
|
//
|
||||||
|
// FAIL("to infinity and beyond");
|
||||||
|
//}
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
// This file is only here to verify (to the extent possible) the self sufficiency of the header
|
||||||
|
#include "catch_message.h"
|
|
@ -0,0 +1,2 @@
|
||||||
|
// This file is only here to verify (to the extent possible) the self sufficiency of the header
|
||||||
|
#include "catch_option.hpp"
|
|
@ -10,6 +10,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "catch_self_test.hpp"
|
#include "catch_self_test.hpp"
|
||||||
|
#include "internal/catch_text.h"
|
||||||
|
|
||||||
TEST_CASE( "selftest/main", "Runs all Catch self tests and checks their results" ) {
|
TEST_CASE( "selftest/main", "Runs all Catch self tests and checks their results" ) {
|
||||||
using namespace Catch;
|
using namespace Catch;
|
||||||
|
@ -20,12 +21,12 @@ TEST_CASE( "selftest/main", "Runs all Catch self tests and checks their results"
|
||||||
|
|
||||||
SECTION( "selftest/expected result/failing tests",
|
SECTION( "selftest/expected result/failing tests",
|
||||||
"Tests in the 'failing' branch fail" ) {
|
"Tests in the 'failing' branch fail" ) {
|
||||||
MetaTestRunner::runMatching( "./failing/*", MetaTestRunner::Expected::ToFail );
|
MetaTestRunner::runMatching( "./failing/*", MetaTestRunner::Expected::ToFail, 0, 2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION( "selftest/expected result/succeeding tests",
|
SECTION( "selftest/expected result/succeeding tests",
|
||||||
"Tests in the 'succeeding' branch succeed" ) {
|
"Tests in the 'succeeding' branch succeed" ) {
|
||||||
MetaTestRunner::runMatching( "./succeeding/*", MetaTestRunner::Expected::ToSucceed );
|
MetaTestRunner::runMatching( "./succeeding/*", MetaTestRunner::Expected::ToSucceed, 1, 2 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,16 +37,16 @@ TEST_CASE( "selftest/main", "Runs all Catch self tests and checks their results"
|
||||||
|
|
||||||
SECTION( "selftest/test counts/succeeding tests",
|
SECTION( "selftest/test counts/succeeding tests",
|
||||||
"Number of 'succeeding' tests is fixed" ) {
|
"Number of 'succeeding' tests is fixed" ) {
|
||||||
Totals totals = runner.runMatching( "./succeeding/*" );
|
Totals totals = runner.runMatching( "./succeeding/*", 0, 2 );
|
||||||
CHECK( totals.assertions.passed == 289 );
|
CHECK( totals.assertions.passed == 296 );
|
||||||
CHECK( totals.assertions.failed == 0 );
|
CHECK( totals.assertions.failed == 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION( "selftest/test counts/failing tests",
|
SECTION( "selftest/test counts/failing tests",
|
||||||
"Number of 'failing' tests is fixed" ) {
|
"Number of 'failing' tests is fixed" ) {
|
||||||
Totals totals = runner.runMatching( "./failing/*" );
|
Totals totals = runner.runMatching( "./failing/*", 1, 2 );
|
||||||
CHECK( totals.assertions.passed == 0 );
|
CHECK( totals.assertions.passed == 1 );
|
||||||
CHECK( totals.assertions.failed == 72 );
|
CHECK( totals.assertions.failed == 74 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -53,7 +54,7 @@ TEST_CASE( "selftest/main", "Runs all Catch self tests and checks their results"
|
||||||
TEST_CASE( "meta/Misc/Sections", "looped tests" ) {
|
TEST_CASE( "meta/Misc/Sections", "looped tests" ) {
|
||||||
Catch::EmbeddedRunner runner;
|
Catch::EmbeddedRunner runner;
|
||||||
|
|
||||||
Catch::Totals totals = runner.runMatching( "./mixed/Misc/Sections/nested2" );
|
Catch::Totals totals = runner.runMatching( "./mixed/Misc/Sections/nested2", 0, 1 );
|
||||||
CHECK( totals.assertions.passed == 2 );
|
CHECK( totals.assertions.passed == 2 );
|
||||||
CHECK( totals.assertions.failed == 1 );
|
CHECK( totals.assertions.failed == 1 );
|
||||||
}
|
}
|
||||||
|
@ -70,8 +71,8 @@ TEST_CASE( "meta/Misc/Sections", "looped tests" ) {
|
||||||
|
|
||||||
template<size_t size>
|
template<size_t size>
|
||||||
void parseIntoConfig( const char * (&argv)[size], Catch::ConfigData& config ) {
|
void parseIntoConfig( const char * (&argv)[size], Catch::ConfigData& config ) {
|
||||||
static Catch::AllOptions options;
|
Clara::CommandLine<Catch::ConfigData> parser = Catch::makeCommandLineParser();
|
||||||
options.parseIntoConfig( Catch::CommandParser( size, argv ), config );
|
parser.parseInto( size, argv, config );
|
||||||
}
|
}
|
||||||
|
|
||||||
template<size_t size>
|
template<size_t size>
|
||||||
|
@ -86,105 +87,82 @@ std::string parseIntoConfigAndReturnError( const char * (&argv)[size], Catch::Co
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Catch::TestCaseInfo makeTestCase( const char* name ){ return Catch::TestCaseInfo( NULL, "", name, "", CATCH_INTERNAL_LINEINFO ); }
|
inline Catch::TestCase fakeTestCase( const char* name ){ return Catch::makeTestCase( NULL, "", name, "", CATCH_INTERNAL_LINEINFO ); }
|
||||||
|
|
||||||
TEST_CASE( "selftest/parser/2", "ConfigData" ) {
|
TEST_CASE( "Process can be configured on command line", "[config][command-line]" ) {
|
||||||
|
|
||||||
Catch::ConfigData config;
|
Catch::ConfigData config;
|
||||||
|
|
||||||
SECTION( "default", "" ) {
|
SECTION( "default - no arguments", "" ) {
|
||||||
const char* argv[] = { "test" };
|
const char* argv[] = { "test" };
|
||||||
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
||||||
|
|
||||||
CHECK( config.shouldDebugBreak == false );
|
CHECK( config.shouldDebugBreak == false );
|
||||||
CHECK( config.cutoff == -1 );
|
CHECK( config.abortAfter == -1 );
|
||||||
CHECK( config.allowThrows == true );
|
CHECK( config.noThrow == false );
|
||||||
CHECK( config.reporter.empty() );
|
CHECK( config.reporterName.empty() );
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION( "test lists", "" ) {
|
SECTION( "test lists", "" ) {
|
||||||
SECTION( "-t/1", "Specify one test case using -t" ) {
|
SECTION( "1 test", "Specify one test case using" ) {
|
||||||
const char* argv[] = { "test", "-t", "test1" };
|
const char* argv[] = { "test", "test1" };
|
||||||
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
||||||
|
|
||||||
REQUIRE( config.filters.size() == 1 );
|
Catch::Config cfg( config );
|
||||||
REQUIRE( config.filters[0].shouldInclude( makeTestCase( "notIncluded" ) ) == false );
|
REQUIRE( cfg.filters().size() == 1 );
|
||||||
REQUIRE( config.filters[0].shouldInclude( makeTestCase( "test1" ) ) );
|
REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "notIncluded" ) ) == false );
|
||||||
|
REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "test1" ) ) );
|
||||||
}
|
}
|
||||||
SECTION( "-t/exclude:1", "Specify one test case exclusion using -t exclude:" ) {
|
SECTION( "Specify one test case exclusion using exclude:", "" ) {
|
||||||
const char* argv[] = { "test", "-t", "exclude:test1" };
|
const char* argv[] = { "test", "exclude:test1" };
|
||||||
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
||||||
|
|
||||||
REQUIRE( config.filters.size() == 1 );
|
Catch::Config cfg( config );
|
||||||
REQUIRE( config.filters[0].shouldInclude( makeTestCase( "test1" ) ) == false );
|
REQUIRE( cfg.filters().size() == 1 );
|
||||||
REQUIRE( config.filters[0].shouldInclude( makeTestCase( "alwaysIncluded" ) ) );
|
REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "test1" ) ) == false );
|
||||||
|
REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "alwaysIncluded" ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION( "--test/1", "Specify one test case using --test" ) {
|
SECTION( "Specify one test case exclusion using ~", "" ) {
|
||||||
const char* argv[] = { "test", "--test", "test1" };
|
const char* argv[] = { "test", "~test1" };
|
||||||
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
||||||
|
|
||||||
REQUIRE( config.filters.size() == 1 );
|
Catch::Config cfg( config );
|
||||||
REQUIRE( config.filters[0].shouldInclude( makeTestCase( "notIncluded" ) ) == false );
|
REQUIRE( cfg.filters().size() == 1 );
|
||||||
REQUIRE( config.filters[0].shouldInclude( makeTestCase( "test1" ) ) );
|
REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "test1" ) ) == false );
|
||||||
|
REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "alwaysIncluded" ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION( "--test/exclude:1", "Specify one test case exclusion using --test exclude:" ) {
|
SECTION( "Specify two test cases using -t", "" ) {
|
||||||
const char* argv[] = { "test", "--test", "exclude:test1" };
|
|
||||||
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
|
||||||
|
|
||||||
REQUIRE( config.filters.size() == 1 );
|
|
||||||
REQUIRE( config.filters[0].shouldInclude( makeTestCase( "test1" ) ) == false );
|
|
||||||
REQUIRE( config.filters[0].shouldInclude( makeTestCase( "alwaysIncluded" ) ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION( "--test/exclude:2", "Specify one test case exclusion using --test ~" ) {
|
|
||||||
const char* argv[] = { "test", "--test", "~test1" };
|
|
||||||
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
|
||||||
|
|
||||||
REQUIRE( config.filters.size() == 1 );
|
|
||||||
REQUIRE( config.filters[0].shouldInclude( makeTestCase( "test1" ) ) == false );
|
|
||||||
REQUIRE( config.filters[0].shouldInclude( makeTestCase( "alwaysIncluded" ) ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION( "-t/2", "Specify two test cases using -t" ) {
|
|
||||||
const char* argv[] = { "test", "-t", "test1", "test2" };
|
const char* argv[] = { "test", "-t", "test1", "test2" };
|
||||||
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
||||||
|
|
||||||
REQUIRE( config.filters.size() == 1 );
|
Catch::Config cfg( config );
|
||||||
REQUIRE( config.filters[0].shouldInclude( makeTestCase( "notIncluded" ) ) == false );
|
REQUIRE( cfg.filters().size() == 1 );
|
||||||
REQUIRE( config.filters[0].shouldInclude( makeTestCase( "test1" ) ) );
|
REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "notIncluded" ) ) == false );
|
||||||
REQUIRE( config.filters[0].shouldInclude( makeTestCase( "test2" ) ) );
|
REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "test1" ) ) );
|
||||||
}
|
REQUIRE( cfg.filters()[0].shouldInclude( fakeTestCase( "test2" ) ) );
|
||||||
|
|
||||||
SECTION( "-t/0", "When no test names are supplied it is an error" ) {
|
|
||||||
const char* argv[] = { "test", "-t" };
|
|
||||||
REQUIRE_THAT( parseIntoConfigAndReturnError( argv, config ), Contains( "at least 1" ) );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION( "reporter", "" ) {
|
SECTION( "reporter", "" ) {
|
||||||
SECTION( "-r/basic", "" ) {
|
SECTION( "-r/console", "" ) {
|
||||||
const char* argv[] = { "test", "-r", "basic" };
|
const char* argv[] = { "test", "-r", "console" };
|
||||||
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
||||||
|
|
||||||
REQUIRE( config.reporter == "basic" );
|
REQUIRE( config.reporterName == "console" );
|
||||||
}
|
}
|
||||||
SECTION( "-r/xml", "" ) {
|
SECTION( "-r/xml", "" ) {
|
||||||
const char* argv[] = { "test", "-r", "xml" };
|
const char* argv[] = { "test", "-r", "xml" };
|
||||||
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
||||||
|
|
||||||
REQUIRE( config.reporter == "xml" );
|
REQUIRE( config.reporterName == "xml" );
|
||||||
}
|
}
|
||||||
SECTION( "--reporter/junit", "" ) {
|
SECTION( "--reporter/junit", "" ) {
|
||||||
const char* argv[] = { "test", "--reporter", "junit" };
|
const char* argv[] = { "test", "--reporter", "junit" };
|
||||||
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
||||||
|
|
||||||
REQUIRE( config.reporter == "junit" );
|
REQUIRE( config.reporterName == "junit" );
|
||||||
}
|
|
||||||
SECTION( "-r/error", "reporter config only accepts one argument" ) {
|
|
||||||
const char* argv[] = { "test", "-r", "one", "two" };
|
|
||||||
REQUIRE_THAT( parseIntoConfigAndReturnError( argv, config ), Contains( "1 argument" ) );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,68 +179,52 @@ TEST_CASE( "selftest/parser/2", "ConfigData" ) {
|
||||||
|
|
||||||
REQUIRE( config.shouldDebugBreak );
|
REQUIRE( config.shouldDebugBreak );
|
||||||
}
|
}
|
||||||
SECTION( "-b", "break option has no arguments" ) {
|
|
||||||
const char* argv[] = { "test", "-b", "unexpected" };
|
|
||||||
REQUIRE_THAT( parseIntoConfigAndReturnError( argv, config ), Contains( "0 arguments" ) );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION( "abort", "" ) {
|
SECTION( "abort", "" ) {
|
||||||
SECTION( "-a", "" ) {
|
SECTION( "-a aborts after first failure", "" ) {
|
||||||
const char* argv[] = { "test", "-a" };
|
const char* argv[] = { "test", "-a" };
|
||||||
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
||||||
|
|
||||||
REQUIRE( config.cutoff == 1 );
|
REQUIRE( config.abortAfter == 1 );
|
||||||
}
|
}
|
||||||
SECTION( "-a/2", "" ) {
|
SECTION( "-x 2 aborts after two failures", "" ) {
|
||||||
const char* argv[] = { "test", "-a", "2" };
|
const char* argv[] = { "test", "-x", "2" };
|
||||||
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
||||||
|
|
||||||
REQUIRE( config.cutoff == 2 );
|
REQUIRE( config.abortAfter == 2 );
|
||||||
}
|
}
|
||||||
SECTION( "-a/error/0", "" ) {
|
SECTION( "-x must be greater than zero", "" ) {
|
||||||
const char* argv[] = { "test", "-a", "0" };
|
const char* argv[] = { "test", "-x", "0" };
|
||||||
REQUIRE_THAT( parseIntoConfigAndReturnError( argv, config ), Contains( "greater than zero" ) );
|
REQUIRE_THAT( parseIntoConfigAndReturnError( argv, config ), Contains( "greater than zero" ) );
|
||||||
}
|
}
|
||||||
SECTION( "-a/error/non numeric", "" ) {
|
SECTION( "-x must be numeric", "" ) {
|
||||||
const char* argv[] = { "test", "-a", "oops" };
|
const char* argv[] = { "test", "-x", "oops" };
|
||||||
REQUIRE_THAT( parseIntoConfigAndReturnError( argv, config ), Contains( "greater than zero" ) );
|
REQUIRE_THAT( parseIntoConfigAndReturnError( argv, config ), Contains( "-x" ) );
|
||||||
}
|
|
||||||
SECTION( "-a/error/two args", "cutoff only takes one argument" ) {
|
|
||||||
const char* argv[] = { "test", "-a", "1", "2" };
|
|
||||||
REQUIRE_THAT( parseIntoConfigAndReturnError( argv, config ), Contains( "0 and 1 argument" ) );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION( "nothrow", "" ) {
|
SECTION( "nothrow", "" ) {
|
||||||
SECTION( "-nt", "" ) {
|
SECTION( "-e", "" ) {
|
||||||
const char* argv[] = { "test", "-nt" };
|
const char* argv[] = { "test", "-e" };
|
||||||
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
||||||
|
|
||||||
REQUIRE( config.allowThrows == false );
|
REQUIRE( config.noThrow == true );
|
||||||
}
|
}
|
||||||
SECTION( "--nothrow", "" ) {
|
SECTION( "--nothrow", "" ) {
|
||||||
const char* argv[] = { "test", "--nothrow" };
|
const char* argv[] = { "test", "--nothrow" };
|
||||||
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
||||||
|
|
||||||
REQUIRE( config.allowThrows == false );
|
REQUIRE( config.noThrow == true );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION( "streams", "" ) {
|
SECTION( "output filename", "" ) {
|
||||||
SECTION( "-o filename", "" ) {
|
SECTION( "-o filename", "" ) {
|
||||||
const char* argv[] = { "test", "-o", "filename.ext" };
|
const char* argv[] = { "test", "-o", "filename.ext" };
|
||||||
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
||||||
|
|
||||||
REQUIRE( config.outputFilename == "filename.ext" );
|
REQUIRE( config.outputFilename == "filename.ext" );
|
||||||
REQUIRE( config.stream.empty() );
|
|
||||||
}
|
|
||||||
SECTION( "-o %stdout", "" ) {
|
|
||||||
const char* argv[] = { "test", "-o", "%stdout" };
|
|
||||||
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
|
||||||
|
|
||||||
REQUIRE( config.stream == "stdout" );
|
|
||||||
REQUIRE( config.outputFilename.empty() );
|
|
||||||
}
|
}
|
||||||
SECTION( "--out", "" ) {
|
SECTION( "--out", "" ) {
|
||||||
const char* argv[] = { "test", "--out", "filename.ext" };
|
const char* argv[] = { "test", "--out", "filename.ext" };
|
||||||
|
@ -273,13 +235,13 @@ TEST_CASE( "selftest/parser/2", "ConfigData" ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION( "combinations", "" ) {
|
SECTION( "combinations", "" ) {
|
||||||
SECTION( "-a -b", "" ) {
|
SECTION( "Single character flags can be combined", "" ) {
|
||||||
const char* argv[] = { "test", "-a", "-b", "-nt" };
|
const char* argv[] = { "test", "-abe" };
|
||||||
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
CHECK_NOTHROW( parseIntoConfig( argv, config ) );
|
||||||
|
|
||||||
CHECK( config.cutoff == 1 );
|
CHECK( config.abortAfter == 1 );
|
||||||
CHECK( config.shouldDebugBreak );
|
CHECK( config.shouldDebugBreak );
|
||||||
CHECK( config.allowThrows == false );
|
CHECK( config.noThrow == true );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -288,17 +250,17 @@ TEST_CASE( "selftest/test filter", "Individual filters" ) {
|
||||||
|
|
||||||
Catch::TestCaseFilter matchAny( "*" );
|
Catch::TestCaseFilter matchAny( "*" );
|
||||||
Catch::TestCaseFilter matchNone( "*", Catch::IfFilterMatches::ExcludeTests );
|
Catch::TestCaseFilter matchNone( "*", Catch::IfFilterMatches::ExcludeTests );
|
||||||
CHECK( matchAny.shouldInclude( makeTestCase( "any" ) ));
|
CHECK( matchAny.shouldInclude( fakeTestCase( "any" ) ));
|
||||||
CHECK( matchNone.shouldInclude( makeTestCase( "any" ) ) == false );
|
CHECK( matchNone.shouldInclude( fakeTestCase( "any" ) ) == false );
|
||||||
|
|
||||||
Catch::TestCaseFilter matchHidden( "./*" );
|
Catch::TestCaseFilter matchHidden( "./*" );
|
||||||
Catch::TestCaseFilter matchNonHidden( "./*", Catch::IfFilterMatches::ExcludeTests );
|
Catch::TestCaseFilter matchNonHidden( "./*", Catch::IfFilterMatches::ExcludeTests );
|
||||||
|
|
||||||
CHECK( matchHidden.shouldInclude( makeTestCase( "any" ) ) == false );
|
CHECK( matchHidden.shouldInclude( fakeTestCase( "any" ) ) == false );
|
||||||
CHECK( matchNonHidden.shouldInclude( makeTestCase( "any" ) ) );
|
CHECK( matchNonHidden.shouldInclude( fakeTestCase( "any" ) ) );
|
||||||
|
|
||||||
CHECK( matchHidden.shouldInclude( makeTestCase( "./any" ) ) );
|
CHECK( matchHidden.shouldInclude( fakeTestCase( "./any" ) ) );
|
||||||
CHECK( matchNonHidden.shouldInclude( makeTestCase( "./any" ) ) == false );
|
CHECK( matchNonHidden.shouldInclude( fakeTestCase( "./any" ) ) == false );
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE( "selftest/test filters", "Sets of filters" ) {
|
TEST_CASE( "selftest/test filters", "Sets of filters" ) {
|
||||||
|
@ -309,26 +271,26 @@ TEST_CASE( "selftest/test filters", "Sets of filters" ) {
|
||||||
filters.addFilter( matchHidden );
|
filters.addFilter( matchHidden );
|
||||||
filters.addFilter( dontMatchA );
|
filters.addFilter( dontMatchA );
|
||||||
|
|
||||||
CHECK( matchHidden.shouldInclude( makeTestCase( "./something" ) ) );
|
CHECK( matchHidden.shouldInclude( fakeTestCase( "./something" ) ) );
|
||||||
|
|
||||||
CHECK( filters.shouldInclude( makeTestCase( "any" ) ) == false );
|
CHECK( filters.shouldInclude( fakeTestCase( "any" ) ) == false );
|
||||||
CHECK( filters.shouldInclude( makeTestCase( "./something" ) ) );
|
CHECK( filters.shouldInclude( fakeTestCase( "./something" ) ) );
|
||||||
CHECK( filters.shouldInclude( makeTestCase( "./anything" ) ) == false );
|
CHECK( filters.shouldInclude( fakeTestCase( "./anything" ) ) == false );
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE( "selftest/filter/prefix wildcard", "Individual filters with wildcards at the start" ) {
|
TEST_CASE( "selftest/filter/prefix wildcard", "Individual filters with wildcards at the start" ) {
|
||||||
Catch::TestCaseFilter matchBadgers( "*badger" );
|
Catch::TestCaseFilter matchBadgers( "*badger" );
|
||||||
|
|
||||||
CHECK( matchBadgers.shouldInclude( makeTestCase( "big badger" ) ));
|
CHECK( matchBadgers.shouldInclude( fakeTestCase( "big badger" ) ));
|
||||||
CHECK( matchBadgers.shouldInclude( makeTestCase( "little badgers" ) ) == false );
|
CHECK( matchBadgers.shouldInclude( fakeTestCase( "little badgers" ) ) == false );
|
||||||
}
|
}
|
||||||
TEST_CASE( "selftest/filter/wildcard at both ends", "Individual filters with wildcards at both ends" ) {
|
TEST_CASE( "selftest/filter/wildcard at both ends", "Individual filters with wildcards at both ends" ) {
|
||||||
Catch::TestCaseFilter matchBadgers( "*badger*" );
|
Catch::TestCaseFilter matchBadgers( "*badger*" );
|
||||||
|
|
||||||
CHECK( matchBadgers.shouldInclude( makeTestCase( "big badger" ) ));
|
CHECK( matchBadgers.shouldInclude( fakeTestCase( "big badger" ) ));
|
||||||
CHECK( matchBadgers.shouldInclude( makeTestCase( "little badgers" ) ) );
|
CHECK( matchBadgers.shouldInclude( fakeTestCase( "little badgers" ) ) );
|
||||||
CHECK( matchBadgers.shouldInclude( makeTestCase( "badgers are big" ) ) );
|
CHECK( matchBadgers.shouldInclude( fakeTestCase( "badgers are big" ) ) );
|
||||||
CHECK( matchBadgers.shouldInclude( makeTestCase( "hedgehogs" ) ) == false );
|
CHECK( matchBadgers.shouldInclude( fakeTestCase( "hedgehogs" ) ) == false );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -337,24 +299,6 @@ int getArgc( const char * (&)[size] ) {
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE( "selftest/option parsers", "" )
|
|
||||||
{
|
|
||||||
Catch::ConfigData config;
|
|
||||||
|
|
||||||
Catch::SharedImpl<Catch::Options::TestCaseOptionParser> tcOpt;
|
|
||||||
Catch::OptionParser& opt = tcOpt;
|
|
||||||
|
|
||||||
const char* argv[] = { "test", "-t", "test1" };
|
|
||||||
|
|
||||||
Catch::CommandParser parser( getArgc( argv ), argv );
|
|
||||||
|
|
||||||
CHECK_NOTHROW( opt.parseIntoConfig( parser, config ) );
|
|
||||||
|
|
||||||
REQUIRE( config.filters.size() == 1 );
|
|
||||||
REQUIRE( config.filters[0].shouldInclude( makeTestCase( "notIncluded" ) ) == false );
|
|
||||||
REQUIRE( config.filters[0].shouldInclude( makeTestCase( "test1" ) ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE( "selftest/tags", "" ) {
|
TEST_CASE( "selftest/tags", "" ) {
|
||||||
|
|
||||||
std::string p1 = "[one]";
|
std::string p1 = "[one]";
|
||||||
|
@ -364,9 +308,9 @@ TEST_CASE( "selftest/tags", "" ) {
|
||||||
std::string p5 = "[one][two]~[hide],[three]";
|
std::string p5 = "[one][two]~[hide],[three]";
|
||||||
|
|
||||||
SECTION( "one tag", "" ) {
|
SECTION( "one tag", "" ) {
|
||||||
Catch::TestCaseInfo oneTag( NULL, "", "test", "[one]", CATCH_INTERNAL_LINEINFO );
|
Catch::TestCase oneTag = makeTestCase( NULL, "", "test", "[one]", CATCH_INTERNAL_LINEINFO );
|
||||||
|
|
||||||
CHECK( oneTag.getDescription() == "" );
|
CHECK( oneTag.getTestCaseInfo().description == "" );
|
||||||
CHECK( oneTag.hasTag( "one" ) );
|
CHECK( oneTag.hasTag( "one" ) );
|
||||||
CHECK( oneTag.getTags().size() == 1 );
|
CHECK( oneTag.getTags().size() == 1 );
|
||||||
|
|
||||||
|
@ -378,11 +322,12 @@ TEST_CASE( "selftest/tags", "" ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION( "two tags", "" ) {
|
SECTION( "two tags", "" ) {
|
||||||
Catch::TestCaseInfo twoTags( NULL, "", "test", "[one][two]", CATCH_INTERNAL_LINEINFO );
|
Catch::TestCase twoTags= makeTestCase( NULL, "", "test", "[one][two]", CATCH_INTERNAL_LINEINFO );
|
||||||
|
|
||||||
CHECK( twoTags.getDescription() == "" );
|
CHECK( twoTags.getTestCaseInfo().description == "" );
|
||||||
CHECK( twoTags.hasTag( "one" ) );
|
CHECK( twoTags.hasTag( "one" ) );
|
||||||
CHECK( twoTags.hasTag( "two" ) );
|
CHECK( twoTags.hasTag( "two" ) );
|
||||||
|
CHECK( twoTags.hasTag( "Two" ) );
|
||||||
CHECK( twoTags.hasTag( "three" ) == false );
|
CHECK( twoTags.hasTag( "three" ) == false );
|
||||||
CHECK( twoTags.getTags().size() == 2 );
|
CHECK( twoTags.getTags().size() == 2 );
|
||||||
|
|
||||||
|
@ -395,8 +340,8 @@ TEST_CASE( "selftest/tags", "" ) {
|
||||||
|
|
||||||
SECTION( "one tag with characters either side", "" ) {
|
SECTION( "one tag with characters either side", "" ) {
|
||||||
|
|
||||||
Catch::TestCaseInfo oneTagWithExtras( NULL, "", "test", "12[one]34", CATCH_INTERNAL_LINEINFO );
|
Catch::TestCase oneTagWithExtras = makeTestCase( NULL, "", "test", "12[one]34", CATCH_INTERNAL_LINEINFO );
|
||||||
CHECK( oneTagWithExtras.getDescription() == "1234" );
|
CHECK( oneTagWithExtras.getTestCaseInfo().description == "1234" );
|
||||||
CHECK( oneTagWithExtras.hasTag( "one" ) );
|
CHECK( oneTagWithExtras.hasTag( "one" ) );
|
||||||
CHECK( oneTagWithExtras.hasTag( "two" ) == false );
|
CHECK( oneTagWithExtras.hasTag( "two" ) == false );
|
||||||
CHECK( oneTagWithExtras.getTags().size() == 1 );
|
CHECK( oneTagWithExtras.getTags().size() == 1 );
|
||||||
|
@ -404,22 +349,213 @@ TEST_CASE( "selftest/tags", "" ) {
|
||||||
|
|
||||||
SECTION( "start of a tag, but not closed", "" ) {
|
SECTION( "start of a tag, but not closed", "" ) {
|
||||||
|
|
||||||
Catch::TestCaseInfo oneTagOpen( NULL, "", "test", "[one", CATCH_INTERNAL_LINEINFO );
|
Catch::TestCase oneTagOpen = makeTestCase( NULL, "", "test", "[one", CATCH_INTERNAL_LINEINFO );
|
||||||
|
|
||||||
CHECK( oneTagOpen.getDescription() == "[one" );
|
CHECK( oneTagOpen.getTestCaseInfo().description == "[one" );
|
||||||
CHECK( oneTagOpen.hasTag( "one" ) == false );
|
CHECK( oneTagOpen.hasTag( "one" ) == false );
|
||||||
CHECK( oneTagOpen.getTags().size() == 0 );
|
CHECK( oneTagOpen.getTags().size() == 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION( "hidden", "" ) {
|
SECTION( "hidden", "" ) {
|
||||||
Catch::TestCaseInfo oneTag( NULL, "", "test", "[hide]", CATCH_INTERNAL_LINEINFO );
|
Catch::TestCase oneTag = makeTestCase( NULL, "", "test", "[hide]", CATCH_INTERNAL_LINEINFO );
|
||||||
|
|
||||||
CHECK( oneTag.getDescription() == "" );
|
CHECK( oneTag.getTestCaseInfo().description == "" );
|
||||||
CHECK( oneTag.hasTag( "hide" ) );
|
CHECK( oneTag.hasTag( "hide" ) );
|
||||||
CHECK( oneTag.isHidden() );
|
CHECK( oneTag.isHidden() );
|
||||||
|
|
||||||
CHECK( oneTag.matchesTags( "~[hide]" ) == false );
|
CHECK( oneTag.matchesTags( "~[hide]" ) == false );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE( "Long strings can be wrapped", "[wrap]" ) {
|
||||||
|
|
||||||
|
using namespace Catch;
|
||||||
|
SECTION( "plain string", "" ) {
|
||||||
|
// guide: 123456789012345678
|
||||||
|
std::string testString = "one two three four";
|
||||||
|
|
||||||
|
SECTION( "No wrapping", "" ) {
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 80 ) ).toString() == testString );
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 18 ) ).toString() == testString );
|
||||||
|
}
|
||||||
|
SECTION( "Wrapped once", "" ) {
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 17 ) ).toString() == "one two three\nfour" );
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 16 ) ).toString() == "one two three\nfour" );
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 14 ) ).toString() == "one two three\nfour" );
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 13 ) ).toString() == "one two three\nfour" );
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 12 ) ).toString() == "one two\nthree four" );
|
||||||
|
}
|
||||||
|
SECTION( "Wrapped twice", "" ) {
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 9 ) ).toString() == "one two\nthree\nfour" );
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 8 ) ).toString() == "one two\nthree\nfour" );
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 7 ) ).toString() == "one two\nthree\nfour" );
|
||||||
|
}
|
||||||
|
SECTION( "Wrapped three times", "" ) {
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 6 ) ).toString() == "one\ntwo\nthree\nfour" );
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 5 ) ).toString() == "one\ntwo\nthree\nfour" );
|
||||||
|
}
|
||||||
|
SECTION( "Short wrap", "" ) {
|
||||||
|
CHECK( Text( "abcdef", TextAttributes().setWidth( 4 ) ).toString() == "abc-\ndef" );
|
||||||
|
CHECK( Text( "abcdefg", TextAttributes().setWidth( 4 ) ).toString() == "abc-\ndefg" );
|
||||||
|
CHECK( Text( "abcdefgh", TextAttributes().setWidth( 4 ) ).toString() == "abc-\ndef-\ngh" );
|
||||||
|
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 4 ) ).toString() == "one\ntwo\nthr-\nee\nfour" );
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 3 ) ).toString() == "one\ntwo\nth-\nree\nfo-\nur" );
|
||||||
|
}
|
||||||
|
SECTION( "As container", "" ) {
|
||||||
|
Text text( testString, TextAttributes().setWidth( 6 ) );
|
||||||
|
REQUIRE( text.size() == 4 );
|
||||||
|
CHECK( text[0] == "one" );
|
||||||
|
CHECK( text[1] == "two" );
|
||||||
|
CHECK( text[2] == "three" );
|
||||||
|
CHECK( text[3] == "four" );
|
||||||
|
}
|
||||||
|
SECTION( "Indent first line differently", "" ) {
|
||||||
|
Text text( testString, TextAttributes()
|
||||||
|
.setWidth( 10 )
|
||||||
|
.setIndent( 4 )
|
||||||
|
.setInitialIndent( 1 ) );
|
||||||
|
CHECK( text.toString() == " one two\n three\n four" );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION( "With newlines", "" ) {
|
||||||
|
|
||||||
|
// guide: 1234567890123456789
|
||||||
|
std::string testString = "one two\nthree four";
|
||||||
|
|
||||||
|
SECTION( "No wrapping" , "" ) {
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 80 ) ).toString() == testString );
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 18 ) ).toString() == testString );
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 10 ) ).toString() == testString );
|
||||||
|
}
|
||||||
|
SECTION( "Trailing newline" , "" ) {
|
||||||
|
CHECK( Text( "abcdef\n", TextAttributes().setWidth( 10 ) ).toString() == "abcdef\n" );
|
||||||
|
CHECK( Text( "abcdef", TextAttributes().setWidth( 6 ) ).toString() == "abcdef" );
|
||||||
|
CHECK( Text( "abcdef\n", TextAttributes().setWidth( 6 ) ).toString() == "abcdef\n" );
|
||||||
|
}
|
||||||
|
SECTION( "Wrapped once", "" ) {
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 9 ) ).toString() == "one two\nthree\nfour" );
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 8 ) ).toString() == "one two\nthree\nfour" );
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 7 ) ).toString() == "one two\nthree\nfour" );
|
||||||
|
}
|
||||||
|
SECTION( "Wrapped twice", "" ) {
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 6 ) ).toString() == "one\ntwo\nthree\nfour" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION( "With tabs", "" ) {
|
||||||
|
|
||||||
|
// guide: 1234567890123456789
|
||||||
|
std::string testString = "one two \tthree four five six";
|
||||||
|
|
||||||
|
CHECK( Text( testString, TextAttributes().setWidth( 15 ) ).toString()
|
||||||
|
== "one two three\n four\n five\n six" );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
using namespace Catch;
|
||||||
|
|
||||||
|
class ColourString {
|
||||||
|
public:
|
||||||
|
|
||||||
|
struct ColourIndex {
|
||||||
|
ColourIndex( Colour::Code _colour, std::size_t _fromIndex, std::size_t _toIndex )
|
||||||
|
: colour( _colour ),
|
||||||
|
fromIndex( _fromIndex ),
|
||||||
|
toIndex( _toIndex )
|
||||||
|
{}
|
||||||
|
|
||||||
|
Colour::Code colour;
|
||||||
|
std::size_t fromIndex;
|
||||||
|
std::size_t toIndex;
|
||||||
|
};
|
||||||
|
|
||||||
|
ColourString( std::string const& _string )
|
||||||
|
: string( _string )
|
||||||
|
{}
|
||||||
|
ColourString( std::string const& _string, std::vector<ColourIndex> const& _colours )
|
||||||
|
: string( _string ), colours( _colours )
|
||||||
|
{}
|
||||||
|
|
||||||
|
ColourString& addColour( Colour::Code colour, int _index ) {
|
||||||
|
colours.push_back( ColourIndex( colour,
|
||||||
|
resolveRelativeIndex( _index ),
|
||||||
|
resolveRelativeIndex( _index )+1 ) );
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
ColourString& addColour( Colour::Code colour, int _fromIndex, int _toIndex ) {
|
||||||
|
colours.push_back( ColourIndex( colour,
|
||||||
|
resolveRelativeIndex(_fromIndex),
|
||||||
|
resolveLastRelativeIndex( _toIndex ) ) );
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void writeToStream( std::ostream& _stream ) const {
|
||||||
|
std::size_t last = 0;
|
||||||
|
for( std::size_t i = 0; i < colours.size(); ++i ) {
|
||||||
|
ColourIndex const& index = colours[i];
|
||||||
|
if( index.fromIndex > last )
|
||||||
|
_stream << string.substr( last, index.fromIndex-last );
|
||||||
|
{
|
||||||
|
Colour colourGuard( index.colour );
|
||||||
|
_stream << string.substr( index.fromIndex, index.toIndex-index.fromIndex );
|
||||||
|
}
|
||||||
|
last = index.toIndex;
|
||||||
|
}
|
||||||
|
if( last < string.size() )
|
||||||
|
_stream << string.substr( last );
|
||||||
|
}
|
||||||
|
friend std::ostream& operator << ( std::ostream& _stream, ColourString const& _colourString ) {
|
||||||
|
_colourString.writeToStream( _stream );
|
||||||
|
return _stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
std::size_t resolveLastRelativeIndex( int _index ) {
|
||||||
|
std::size_t index = resolveRelativeIndex( _index );
|
||||||
|
return index == 0 ? string.size() : index;
|
||||||
|
}
|
||||||
|
std::size_t resolveRelativeIndex( int _index ) {
|
||||||
|
return static_cast<std::size_t>( _index >= 0
|
||||||
|
? _index
|
||||||
|
: static_cast<int>( string.size() )+_index );
|
||||||
|
}
|
||||||
|
std::string string;
|
||||||
|
std::vector<ColourIndex> colours;
|
||||||
|
};
|
||||||
|
|
||||||
|
// !TBD: This will be folded into Text class
|
||||||
|
TEST_CASE( "Strings can be rendered with colour", "[colour]" ) {
|
||||||
|
|
||||||
|
{
|
||||||
|
ColourString cs( "hello" );
|
||||||
|
cs .addColour( Colour::Red, 0 )
|
||||||
|
.addColour( Colour::Green, -1 );
|
||||||
|
|
||||||
|
std::cout << cs << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
ColourString cs( "hello" );
|
||||||
|
cs .addColour( Colour::Blue, 1, -2 );
|
||||||
|
|
||||||
|
std::cout << cs << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE( "Text can be formatted using the Text class", "" ) {
|
||||||
|
|
||||||
|
CHECK( Text( "hi there" ).toString() == "hi there" );
|
||||||
|
|
||||||
|
TextAttributes narrow;
|
||||||
|
narrow.setWidth( 6 );
|
||||||
|
|
||||||
|
CHECK( Text( "hi there", narrow ).toString() == "hi\nthere" );
|
||||||
|
}
|
||||||
|
|
|
@ -314,3 +314,49 @@ TEST_CASE( "./succeeding/SafeBool", "Objects that evaluated in boolean contexts
|
||||||
CHECK( !False );
|
CHECK( !False );
|
||||||
CHECK_FALSE( False );
|
CHECK_FALSE( False );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE( "Assertions then sections", "" )
|
||||||
|
{
|
||||||
|
// This was causing a failure due to the way the console reporter was handling
|
||||||
|
// the current section
|
||||||
|
|
||||||
|
REQUIRE( Catch::isTrue( true ) );
|
||||||
|
|
||||||
|
SECTION( "A section", "" )
|
||||||
|
{
|
||||||
|
REQUIRE( Catch::isTrue( true ) );
|
||||||
|
|
||||||
|
SECTION( "Another section", "" )
|
||||||
|
{
|
||||||
|
REQUIRE( Catch::isTrue( true ) );
|
||||||
|
}
|
||||||
|
SECTION( "Another other section", "" )
|
||||||
|
{
|
||||||
|
REQUIRE( Catch::isTrue( true ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Awkward
|
||||||
|
{
|
||||||
|
operator int() const { return 7; }
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_CASE( "non streamable - with conv. op", "" )
|
||||||
|
{
|
||||||
|
Awkward awkward;
|
||||||
|
std::string s = Catch::toString( awkward );
|
||||||
|
REQUIRE( s == "7" );
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CATCH_CONFIG_CPP11_NULLPTR
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
TEST_CASE( "null_ptr", "" )
|
||||||
|
{
|
||||||
|
std::unique_ptr<int> ptr;
|
||||||
|
REQUIRE(ptr.get() == nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
* Created by Phil on 15/03/2013.
|
||||||
|
* Copyright 2013 Two Blue Cubes Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "catch.hpp"
|
||||||
|
|
||||||
|
#ifdef CATCH_CONFIG_VARIADIC_MACROS
|
||||||
|
|
||||||
|
TEST_CASE()
|
||||||
|
{
|
||||||
|
SUCCEED( "anonymous test case" );
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE( "Test case with one argument" )
|
||||||
|
{
|
||||||
|
SUCCEED( "no assertions" );
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE( "Variadic macros", "[variadic][sections]" )
|
||||||
|
{
|
||||||
|
SECTION( "Section with one argument" )
|
||||||
|
{
|
||||||
|
SUCCEED( "no assertions" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue