mirror of
https://github.com/catchorg/Catch2.git
synced 2025-09-15 09:55:39 +02:00
Compare commits
36 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
2ce6c74f8f | ||
![]() |
9688891868 | ||
![]() |
4f21bb72ff | ||
![]() |
b435e0d7c7 | ||
![]() |
ba0a09fd9e | ||
![]() |
7e4038d848 | ||
![]() |
92d714ee12 | ||
![]() |
705a1bf527 | ||
![]() |
d5613fb18a | ||
![]() |
62875c857e | ||
![]() |
ec2074e558 | ||
![]() |
7575749e56 | ||
![]() |
8a2ff20982 | ||
![]() |
d3377c791d | ||
![]() |
c5dfa73d56 | ||
![]() |
d65091fa06 | ||
![]() |
7a22bad763 | ||
![]() |
8ebe94ca2e | ||
![]() |
106d7e2a74 | ||
![]() |
a53ea30723 | ||
![]() |
8d380a7399 | ||
![]() |
3083de9ea6 | ||
![]() |
431e8d06e7 | ||
![]() |
6f32db35af | ||
![]() |
7013e388f7 | ||
![]() |
0270afb21b | ||
![]() |
df7c5622b9 | ||
![]() |
ee67ac6b7c | ||
![]() |
8a14af701e | ||
![]() |
07c6bfc3b9 | ||
![]() |
616f7235ef | ||
![]() |
396ecf6021 | ||
![]() |
3491804598 | ||
![]() |
6234e3d54d | ||
![]() |
a6cdcd43aa | ||
![]() |
dcab8a5971 |
3
.github/pull_request_template.md
vendored
3
.github/pull_request_template.md
vendored
@@ -2,6 +2,9 @@
|
|||||||
Please do not submit pull requests changing the `version.hpp`
|
Please do not submit pull requests changing the `version.hpp`
|
||||||
or the single-include `catch.hpp` file, these are changed
|
or the single-include `catch.hpp` file, these are changed
|
||||||
only when a new release is made.
|
only when a new release is made.
|
||||||
|
|
||||||
|
Before submitting a PR you should probably read the contributor documentation
|
||||||
|
at docs/contributing.md. It will tell you how to properly test your changes.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
18
.travis.yml
18
.travis.yml
@@ -192,15 +192,15 @@ matrix:
|
|||||||
env: COMPILER='g++-6' BUILD_TYPE='Debug' CPP14=1
|
env: COMPILER='g++-6' BUILD_TYPE='Debug' CPP14=1
|
||||||
|
|
||||||
# 4b/ Linux C++14 Clang builds
|
# 4b/ Linux C++14 Clang builds
|
||||||
- os: linux
|
# - os: linux
|
||||||
compiler: clang
|
# compiler: clang
|
||||||
addons: *clang38
|
# addons: *clang38
|
||||||
env: COMPILER='clang++-3.8' BUILD_TYPE='Release' CPP14=1
|
# env: COMPILER='clang++-3.8' BUILD_TYPE='Release' CPP14=1
|
||||||
|
#
|
||||||
- os: linux
|
# - os: linux
|
||||||
compiler: clang
|
# compiler: clang
|
||||||
addons: *clang38
|
# addons: *clang38
|
||||||
env: COMPILER='clang++-3.8' BUILD_TYPE='Debug' CPP14=1
|
# env: COMPILER='clang++-3.8' BUILD_TYPE='Debug' CPP14=1
|
||||||
|
|
||||||
|
|
||||||
# 5/ OSX Clang Builds
|
# 5/ OSX Clang Builds
|
||||||
|
@@ -3,8 +3,9 @@
|
|||||||
[](https://github.com/philsquared/catch/releases)
|
[](https://github.com/philsquared/catch/releases)
|
||||||
[](https://travis-ci.org/philsquared/Catch)
|
[](https://travis-ci.org/philsquared/Catch)
|
||||||
[](https://ci.appveyor.com/project/philsquared/catch/branch/master)
|
[](https://ci.appveyor.com/project/philsquared/catch/branch/master)
|
||||||
|
[](https://wandbox.org/permlink/IJ0n8142H2DROPIm)
|
||||||
|
|
||||||
<a href="https://github.com/philsquared/Catch/releases/download/v1.9.5/catch.hpp">The latest, single header, version can be downloaded directly using this link</a>
|
<a href="https://github.com/philsquared/Catch/releases/download/v1.9.7/catch.hpp">The latest, single header, version can be downloaded directly using this link</a>
|
||||||
|
|
||||||
## What's the Catch?
|
## What's the Catch?
|
||||||
|
|
||||||
@@ -21,3 +22,7 @@ This documentation comprises these three parts:
|
|||||||
* Issues and bugs can be raised on the [Issue tracker on GitHub](https://github.com/philsquared/Catch/issues)
|
* 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)
|
* For discussion or questions please use [the dedicated Google Groups forum](https://groups.google.com/forum/?fromgroups#!forum/catch-forum)
|
||||||
* See [who else is using Catch](docs/opensource-users.md)
|
* See [who else is using Catch](docs/opensource-users.md)
|
||||||
|
|
||||||
|
## Help us out
|
||||||
|
We're currently running [a survey](https://www.surveymonkey.co.uk/r/TLLYQJW) to help us shape the future of Catch.
|
||||||
|
Please take a few moments to fill it out (there's only ten questions).
|
||||||
|
16
conanfile.py
Normal file
16
conanfile.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
from conans import ConanFile
|
||||||
|
|
||||||
|
|
||||||
|
class CatchConan(ConanFile):
|
||||||
|
name = "Catch"
|
||||||
|
version = "1.9.7"
|
||||||
|
description = "A modern, C++-native, header-only, framework for unit-tests, TDD and BDD"
|
||||||
|
author = "philsquared"
|
||||||
|
generators = "cmake"
|
||||||
|
exports_sources = "single_include/*"
|
||||||
|
url = "https://github.com/philsquared/Catch"
|
||||||
|
license = "Boost Software License - Version 1.0. http://www.boost.org/LICENSE_1_0.txt"
|
||||||
|
|
||||||
|
def package(self):
|
||||||
|
self.copy(pattern="catch.hpp", src="single_include", dst="include")
|
@@ -30,12 +30,21 @@
|
|||||||
# #
|
# #
|
||||||
# PARSE_CATCH_TESTS_VERBOSE (Default OFF) #
|
# PARSE_CATCH_TESTS_VERBOSE (Default OFF) #
|
||||||
# -- enables debug messages #
|
# -- enables debug messages #
|
||||||
|
# PARSE_CATCH_TESTS_NO_HIDDEN_TESTS (Default OFF) #
|
||||||
|
# -- excludes tests marked with [!hide], [.] or [.foo] tags #
|
||||||
|
# PARSE_CATCH_TESTS_ADD_FIXTURE_IN_TEST_NAME (Default ON) #
|
||||||
|
# -- adds fixture class name to the test name #
|
||||||
|
# PARSE_CATCH_TESTS_ADD_TARGET_IN_TEST_NAME (Default ON) #
|
||||||
|
# -- adds cmake target name to the test name #
|
||||||
# #
|
# #
|
||||||
#==================================================================================================#
|
#==================================================================================================#
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 2.8.8)
|
cmake_minimum_required(VERSION 2.8.8)
|
||||||
|
|
||||||
option(PARSE_CATCH_TESTS_VERBOSE "Print Catch to CTest parser debug messages" OFF)
|
option(PARSE_CATCH_TESTS_VERBOSE "Print Catch to CTest parser debug messages" OFF)
|
||||||
|
option(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS "Exclude tests with [!hide], [.] or [.foo] tags" OFF)
|
||||||
|
option(PARSE_CATCH_TESTS_ADD_FIXTURE_IN_TEST_NAME "Add fixture class name to the test name" ON)
|
||||||
|
option(PARSE_CATCH_TESTS_ADD_TARGET_IN_TEST_NAME "Add target name to the test name" ON)
|
||||||
|
|
||||||
function(PrintDebugMessage)
|
function(PrintDebugMessage)
|
||||||
if(PARSE_CATCH_TESTS_VERBOSE)
|
if(PARSE_CATCH_TESTS_VERBOSE)
|
||||||
@@ -103,12 +112,14 @@ function(ParseFile SourceFile TestTarget)
|
|||||||
if("${TestType}" STREQUAL "SCENARIO")
|
if("${TestType}" STREQUAL "SCENARIO")
|
||||||
set(Name "Scenario: ${Name}")
|
set(Name "Scenario: ${Name}")
|
||||||
endif()
|
endif()
|
||||||
if(TestFixture)
|
if(PARSE_CATCH_TESTS_ADD_FIXTURE_IN_TEST_NAME AND TestFixture)
|
||||||
set(CTestName "${TestFixture}:${Name}")
|
set(CTestName "${TestFixture}:${Name}")
|
||||||
else()
|
else()
|
||||||
set(CTestName "${Name}")
|
set(CTestName "${Name}")
|
||||||
endif()
|
endif()
|
||||||
|
if(PARSE_CATCH_TESTS_ADD_TARGET_IN_TEST_NAME)
|
||||||
set(CTestName "${TestTarget}:${CTestName}")
|
set(CTestName "${TestTarget}:${CTestName}")
|
||||||
|
endif()
|
||||||
# add target to labels to enable running all tests added from this target
|
# add target to labels to enable running all tests added from this target
|
||||||
set(Labels ${TestTarget})
|
set(Labels ${TestTarget})
|
||||||
if(TestStringsLength EQUAL 2)
|
if(TestStringsLength EQUAL 2)
|
||||||
@@ -124,6 +135,18 @@ function(ParseFile SourceFile TestTarget)
|
|||||||
|
|
||||||
list(APPEND Labels ${Tags})
|
list(APPEND Labels ${Tags})
|
||||||
|
|
||||||
|
list(FIND Labels "!hide" IndexOfHideLabel)
|
||||||
|
set(HiddenTagFound OFF)
|
||||||
|
foreach(label ${Labels})
|
||||||
|
string(REGEX MATCH "^!hide|^\\." result ${label})
|
||||||
|
if(result)
|
||||||
|
set(HiddenTagFound ON)
|
||||||
|
break()
|
||||||
|
endif(result)
|
||||||
|
endforeach(label)
|
||||||
|
if(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS AND ${HiddenTagFound})
|
||||||
|
PrintDebugMessage("Skipping test \"${CTestName}\" as it has [!hide], [.] or [.foo] label")
|
||||||
|
else()
|
||||||
PrintDebugMessage("Adding test \"${CTestName}\"")
|
PrintDebugMessage("Adding test \"${CTestName}\"")
|
||||||
if(Labels)
|
if(Labels)
|
||||||
PrintDebugMessage("Setting labels to ${Labels}")
|
PrintDebugMessage("Setting labels to ${Labels}")
|
||||||
@@ -133,6 +156,7 @@ function(ParseFile SourceFile TestTarget)
|
|||||||
add_test(NAME "\"${CTestName}\"" COMMAND ${TestTarget} ${Name} ${AdditionalCatchParameters})
|
add_test(NAME "\"${CTestName}\"" COMMAND ${TestTarget} ${Name} ${AdditionalCatchParameters})
|
||||||
set_tests_properties("\"${CTestName}\"" PROPERTIES FAIL_REGULAR_EXPRESSION "No tests ran"
|
set_tests_properties("\"${CTestName}\"" PROPERTIES FAIL_REGULAR_EXPRESSION "No tests ran"
|
||||||
LABELS "${Labels}")
|
LABELS "${Labels}")
|
||||||
|
endif()
|
||||||
|
|
||||||
endforeach()
|
endforeach()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
@@ -43,12 +43,19 @@ By default a console width of 80 is assumed but this can be controlled by defini
|
|||||||
|
|
||||||
CATCH_CONFIG_NOSTDOUT
|
CATCH_CONFIG_NOSTDOUT
|
||||||
|
|
||||||
Catch does not use ```std::cout``` and ```std::cerr``` directly but gets them from ```Catch::cout()``` and ```Catch::cerr()``` respectively. If the above identifier is defined these functions are left unimplemented and you must implement them yourself. Their signatures are:
|
Catch does not use ```std::cout```, ```std::cerr``` and ```std::clog``` directly but gets them from ```Catch::cout()```, ```Catch::cerr()``` and ```Catch::clog``` respectively. If the above identifier is defined these functions are left unimplemented and you must implement them yourself. Their signatures are:
|
||||||
|
|
||||||
std::ostream& cout();
|
std::ostream& cout();
|
||||||
std::ostream& cerr();
|
std::ostream& cerr();
|
||||||
|
std::ostream& clog();
|
||||||
|
|
||||||
This can be useful on certain platforms that do not provide ```std::cout``` and ```std::cerr```, such as certain embedded systems.
|
This can be useful on certain platforms that do not provide the standard iostreams, such as certain embedded systems.
|
||||||
|
|
||||||
|
# Default reporter
|
||||||
|
|
||||||
|
CATCH_CONFIG_DEFAULT_REPORTER <reporter>
|
||||||
|
|
||||||
|
The default reporter (reporter used when no reporters are explicitly specified) can be overriden during compilation time by using the above macro. Note that desired value of the macro is a C string and quotes have to be escaped during compilation: `clang++ test.cpp -DCATCH_CONFIG_DEFAULT_REPORTER=\"xml\"`.
|
||||||
|
|
||||||
# C++ conformance toggles
|
# C++ conformance toggles
|
||||||
|
|
||||||
|
@@ -18,8 +18,8 @@ Ongoing development is currently on _master_. At some point an integration branc
|
|||||||
_Users_ of Catch primarily use the single header version. _Maintainers_ should work with the full source (which is still,
|
_Users_ of Catch primarily use the single header version. _Maintainers_ should work with the full source (which is still,
|
||||||
primarily, in headers). This can be found in the `include` folder. There are a set of test files, currently under
|
primarily, in headers). This can be found in the `include` folder. There are a set of test files, currently under
|
||||||
`projects/SelfTest`. The test app can be built via CMake from the `CMakeLists.txt` file in the root, or you can generate
|
`projects/SelfTest`. The test app can be built via CMake from the `CMakeLists.txt` file in the root, or you can generate
|
||||||
project files for Visual Studio, XCode, and others (instructions in the `projects` folder). If you have access to CLion
|
project files for Visual Studio, XCode, and others (instructions in the `projects` folder). If you have access to CLion,
|
||||||
that can work with the CMake file directly.
|
it can work with the CMake file directly.
|
||||||
|
|
||||||
As well as the runtime test files you'll also see a `SurrogateCpps` directory under `projects/SelfTest`.
|
As well as the runtime test files you'll also see a `SurrogateCpps` directory under `projects/SelfTest`.
|
||||||
This contains a set of .cpp files that each `#include` a single header.
|
This contains a set of .cpp files that each `#include` a single header.
|
||||||
@@ -34,6 +34,25 @@ __When submitting a pull request please do not include changes to the single inc
|
|||||||
as these are managed by the scripts!__
|
as these are managed by the scripts!__
|
||||||
|
|
||||||
|
|
||||||
|
## Testing your changes
|
||||||
|
|
||||||
|
Obviously all changes to Catch's code should be tested. If you added new functionality, you should add tests covering and
|
||||||
|
showcasing it. Even if you have only made changes to Catch internals (ie you implemented some performance improvements),
|
||||||
|
you should still test your changes.
|
||||||
|
|
||||||
|
This means 3 things
|
||||||
|
|
||||||
|
* Compiling Catch's SelfTest project -- code that does not compile is evidently incorrect. Obviously, you are not expected to
|
||||||
|
have access to all compilers and platforms Catch supports, Catch's CI pipeline will compile your code using supported compilers
|
||||||
|
once you open a PR.
|
||||||
|
* Running the SelfTest binary. There should be no unexpected failures on simple run.
|
||||||
|
* Running Catch's approval tests. Approval tests compare current output of the SelfTest binary in various configurations against
|
||||||
|
known good output. Catch's repository provides utility scripts `approvalTests.py` to help you with this. It needs to be passed
|
||||||
|
the SelfTest binary compiled with your changes, like so: `$ ./scripts/approvalTests.py clang-build/SelfTest`. The output should
|
||||||
|
be fairly self-explanatory.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
*this document is still in-progress...*
|
*this document is still in-progress...*
|
||||||
|
|
||||||
---
|
---
|
||||||
|
@@ -13,6 +13,7 @@ which consists of either a single matcher or one or more matchers combined using
|
|||||||
For example, to assert that a string ends with a certain substring:
|
For example, to assert that a string ends with a certain substring:
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
|
using Catch::Matchers::EndsWith; // or Catch::EndsWith
|
||||||
std::string str = getStringFromSomewhere();
|
std::string str = getStringFromSomewhere();
|
||||||
REQUIRE_THAT( str, EndsWith( "as a service" ) );
|
REQUIRE_THAT( str, EndsWith( "as a service" ) );
|
||||||
```
|
```
|
||||||
@@ -34,7 +35,7 @@ REQUIRE_THAT( str,
|
|||||||
```
|
```
|
||||||
|
|
||||||
## Built in matchers
|
## Built in matchers
|
||||||
Currently Catch has some string matchers and some vector matchers.
|
Currently Catch has some string matchers and some vector matchers. They are in the `Catch::Matchers` and `Catch` namespaces.
|
||||||
The string matchers are `StartsWith`, `EndsWith`, `Contains` and `Equals`. Each of them also takes an optional second argument, that decides case sensitivity (by-default, they are case sensitive).
|
The string matchers are `StartsWith`, `EndsWith`, `Contains` and `Equals`. Each of them also takes an optional second argument, that decides case sensitivity (by-default, they are case sensitive).
|
||||||
The vector matchers are `Contains`, `VectorContains` and `Equals`. `VectorContains` looks for a single element in the matched vector, `Contains` looks for a set (vector) of elements inside the matched vector.
|
The vector matchers are `Contains`, `VectorContains` and `Equals`. `VectorContains` looks for a single element in the matched vector, `Contains` looks for a set (vector) of elements inside the matched vector.
|
||||||
|
|
||||||
|
@@ -55,6 +55,9 @@ A library of algorithms for values-distributed-in-time
|
|||||||
### [Trompeloeil](https://github.com/rollbear/trompeloeil)
|
### [Trompeloeil](https://github.com/rollbear/trompeloeil)
|
||||||
A thread safe header only mocking framework for C++14
|
A thread safe header only mocking framework for C++14
|
||||||
|
|
||||||
|
### [args](https://github.com/Taywee/args)
|
||||||
|
A simple header-only C++ argument parser library.
|
||||||
|
|
||||||
## Applications & Tools
|
## Applications & Tools
|
||||||
|
|
||||||
### [ArangoDB](https://github.com/arangodb/arangodb)
|
### [ArangoDB](https://github.com/arangodb/arangodb)
|
||||||
|
@@ -1,3 +1,34 @@
|
|||||||
|
# 1.9.7
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
* Various warnings from clang-tidy, Resharper-C++ and PVS Studio have been addressed (#957)
|
||||||
|
* Dynamically generated sections are now properly reported (#963)
|
||||||
|
* Writes to `std::clog` are redirected for reporters (#989)
|
||||||
|
* Previously only `std::cerr` writes were redirected
|
||||||
|
* Interleaved writes to `std::cerr` and `std::clog` are combined properly
|
||||||
|
* Assertions failed before signals/structured exceptions fails test case are properly reported as failed (#990)
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
* Catch's runtime overhead has been decreased further (#940)
|
||||||
|
* Added support for IBM i ILE c++ compiler (#976)
|
||||||
|
* This means that AS/400 is now supported.
|
||||||
|
* The default reporter can be configured at compile time (#978)
|
||||||
|
* That is, the reporter used if no reporter is explicitly specified
|
||||||
|
|
||||||
|
### Other
|
||||||
|
* `ParseAndAddCatchTests` cmake script has couple new customization options
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 1.9.6
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
* Catch's runtime overhead has been significantly decreased (#937, #939)
|
||||||
|
* Added `--list-extra-info` cli option (#934).
|
||||||
|
* It lists all tests together with extra information, ie filename, line number and description.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# 1.9.5
|
# 1.9.5
|
||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
|
@@ -2,43 +2,62 @@
|
|||||||
|
|
||||||
When enough changes have accumulated, it is time to release new version of Catch. This document describes the proces in doing so, that no steps are forgotten. Note that all referenced scripts can be found in the `scripts/` directory.
|
When enough changes have accumulated, it is time to release new version of Catch. This document describes the proces in doing so, that no steps are forgotten. Note that all referenced scripts can be found in the `scripts/` directory.
|
||||||
|
|
||||||
|
## Neccessary steps
|
||||||
|
|
||||||
## Approval testing
|
These steps are neccessary and have to be performed before each new release. They serve to make sure that the new release is correct and linked-to from the standard places.
|
||||||
|
|
||||||
|
|
||||||
|
### Approval testing
|
||||||
|
|
||||||
Catch's releases are primarily validated against output from previous release, stored in `projects/SelfTest/Baselines`. To validate current sources, build the SelfTest binary and pass it to the `approvalTests.py` script: `approvalTests.py <path/to/SelfTest>`.
|
Catch's releases are primarily validated against output from previous release, stored in `projects/SelfTest/Baselines`. To validate current sources, build the SelfTest binary and pass it to the `approvalTests.py` script: `approvalTests.py <path/to/SelfTest>`.
|
||||||
|
|
||||||
There should be no differences, as Approval tests should be updated when changes to Catch are made, but if there are, then they need to be manually reviewed and either approved (using `approve.py`) or Catch requires other fixes.
|
There should be no differences, as Approval tests should be updated when changes to Catch are made, but if there are, then they need to be manually reviewed and either approved (using `approve.py`) or Catch requires other fixes.
|
||||||
|
|
||||||
|
|
||||||
## Incrementing version number
|
### Incrementing version number
|
||||||
|
|
||||||
Catch uses a variant of [semantic versioning](http://semver.org/), with breaking API changes (and thus major version increments) being very rare. Thus, the release will usually increment the patch version, when it only contains couple of bugfixes, or minor version, when it contains new functionality, or larger changes in implementation of current functionality.
|
Catch uses a variant of [semantic versioning](http://semver.org/), with breaking API changes (and thus major version increments) being very rare. Thus, the release will usually increment the patch version, when it only contains couple of bugfixes, or minor version, when it contains new functionality, or larger changes in implementation of current functionality.
|
||||||
|
|
||||||
After deciding which part of version number should be incremented, you can use one of the `*Release.py` scripts to perform the required changes to Catch.
|
After deciding which part of version number should be incremented, you can use one of the `*Release.py` scripts to perform the required changes to Catch.
|
||||||
|
|
||||||
|
|
||||||
## Generate updated single-include header
|
### Generate updated single-include header
|
||||||
|
|
||||||
After updating version number, regenerate single-include header using `generateSingleHeader.py`.
|
After updating version number, regenerate single-include header using `generateSingleHeader.py`.
|
||||||
|
|
||||||
|
|
||||||
## Release notes
|
### Release notes
|
||||||
|
|
||||||
Once a release is ready, release notes need to be written. They should summarize changes done since last release. For rough idea of expected notes see previous releases. Once written, release notes should be placed in `docs/release-notes.md`.
|
Once a release is ready, release notes need to be written. They should summarize changes done since last release. For rough idea of expected notes see previous releases. Once written, release notes should be placed in `docs/release-notes.md`.
|
||||||
|
|
||||||
|
|
||||||
## Commit and push update to GitHub
|
### Commit and push update to GitHub
|
||||||
|
|
||||||
After version number is incremented, single-include header is regenerated and release notes are updated, changes should be commited and pushed to GitHub.
|
After version number is incremented, single-include header is regenerated and release notes are updated, changes should be commited and pushed to GitHub.
|
||||||
|
|
||||||
|
|
||||||
## Release on GitHub
|
### Release on GitHub
|
||||||
|
|
||||||
After pushing changes to GitHub, GitHub release *needs* to be created. Tag version and release title should be same as the new version, description should contain the release notes for the current release. Single header version of `catch.hpp` *needs* to be attached as a binary, as that is where the official download link links to. Preferably it should use linux line endings.
|
After pushing changes to GitHub, GitHub release *needs* to be created. Tag version and release title should be same as the new version, description should contain the release notes for the current release. Single header version of `catch.hpp` *needs* to be attached as a binary, as that is where the official download link links to. Preferably it should use linux line endings.
|
||||||
|
|
||||||
|
## Optional steps
|
||||||
|
|
||||||
## vcpkg update
|
The following steps are optional, and do not have to be performed when releasing new version of Catch. However, they are *should* happen, but they can happen the next day without losing anything significant.
|
||||||
|
|
||||||
As a last step, optionally update Microsoft's package manager [vcpkg](https://github.com/Microsoft/vcpkg) with Catch's new version. `updateVcpkgPackage.py` can do a lot of neccessary work for you, but it assumes that you have your fork of vcpkg checked out in a directory next to the directory, where you have checked out Catch.
|
|
||||||
|
|
||||||
It creates a branch and commits neccessary changes, that you then should review, synchronize and open a PR against.
|
### vcpkg update
|
||||||
|
|
||||||
|
Catch is maintaining its own port in Microsoft's package manager [vcpkg](https://github.com/Microsoft/vcpkg). This means that when new version of Catch is released, it should be posted there as well. `updateVcpkgPackage.py` can do a lot of neccessary work for you, it creates a branch and commits neccessary changes. You should review these changes, push and open a PR against vcpkg's upstream.
|
||||||
|
|
||||||
|
Note that the script assumes you have your fork of vcpkg checked out in a directory next to the directory where you have checked out Catch, like so:
|
||||||
|
```
|
||||||
|
GitHub
|
||||||
|
Catch
|
||||||
|
vcpkg
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Wandbox update
|
||||||
|
|
||||||
|
Recently we also included a link to wandbox with preloaded Catch on the main page. Strictly speaking it is unneccessary to update this after every release, Catch usually does not change that much between versions, but it should be kept up to date anyway.
|
||||||
|
|
||||||
|
@@ -80,7 +80,7 @@ unsigned int Factorial( unsigned int number ) {
|
|||||||
|
|
||||||
Now all the tests pass.
|
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.
|
Of course there are still more issues to 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?
|
## What did we do here?
|
||||||
|
|
||||||
|
@@ -31,10 +31,14 @@ namespace Catch {
|
|||||||
return reporter;
|
return reporter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined(CATCH_CONFIG_DEFAULT_REPORTER)
|
||||||
|
#define CATCH_CONFIG_DEFAULT_REPORTER "console"
|
||||||
|
#endif
|
||||||
|
|
||||||
Ptr<IStreamingReporter> makeReporter( Ptr<Config> const& config ) {
|
Ptr<IStreamingReporter> makeReporter( Ptr<Config> const& config ) {
|
||||||
std::vector<std::string> reporters = config->getReporterNames();
|
std::vector<std::string> reporters = config->getReporterNames();
|
||||||
if( reporters.empty() )
|
if( reporters.empty() )
|
||||||
reporters.push_back( "console" );
|
reporters.push_back( CATCH_CONFIG_DEFAULT_REPORTER );
|
||||||
|
|
||||||
Ptr<IStreamingReporter> reporter;
|
Ptr<IStreamingReporter> reporter;
|
||||||
for( std::vector<std::string>::const_iterator it = reporters.begin(), itEnd = reporters.end();
|
for( std::vector<std::string>::const_iterator it = reporters.begin(), itEnd = reporters.end();
|
||||||
@@ -95,11 +99,11 @@ namespace Catch {
|
|||||||
if( lastSlash != std::string::npos )
|
if( lastSlash != std::string::npos )
|
||||||
filename = filename.substr( lastSlash+1 );
|
filename = filename.substr( lastSlash+1 );
|
||||||
|
|
||||||
std::string::size_type lastDot = filename.find_last_of( "." );
|
std::string::size_type lastDot = filename.find_last_of( '.' );
|
||||||
if( lastDot != std::string::npos )
|
if( lastDot != std::string::npos )
|
||||||
filename = filename.substr( 0, lastDot );
|
filename = filename.substr( 0, lastDot );
|
||||||
|
|
||||||
tags.insert( "#" + filename );
|
tags.insert( '#' + filename );
|
||||||
setTags( test, tags );
|
setTags( test, tags );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
2
include/external/clara.h
vendored
2
include/external/clara.h
vendored
@@ -151,7 +151,7 @@ namespace Tbc {
|
|||||||
return oss.str();
|
return oss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) {
|
friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) {
|
||||||
for( Text::const_iterator it = _text.begin(), itEnd = _text.end();
|
for( Text::const_iterator it = _text.begin(), itEnd = _text.end();
|
||||||
it != itEnd; ++it ) {
|
it != itEnd; ++it ) {
|
||||||
if( it != _text.begin() )
|
if( it != _text.begin() )
|
||||||
|
@@ -29,13 +29,6 @@ namespace Detail {
|
|||||||
m_value( value )
|
m_value( value )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
Approx( Approx const& other )
|
|
||||||
: m_epsilon( other.m_epsilon ),
|
|
||||||
m_margin( other.m_margin ),
|
|
||||||
m_scale( other.m_scale ),
|
|
||||||
m_value( other.m_value )
|
|
||||||
{}
|
|
||||||
|
|
||||||
static Approx custom() {
|
static Approx custom() {
|
||||||
return Approx( 0 );
|
return Approx( 0 );
|
||||||
}
|
}
|
||||||
|
@@ -39,16 +39,18 @@ namespace Catch {
|
|||||||
|
|
||||||
struct AssertionInfo
|
struct AssertionInfo
|
||||||
{
|
{
|
||||||
AssertionInfo() {}
|
AssertionInfo();
|
||||||
AssertionInfo( std::string const& _macroName,
|
AssertionInfo( char const * _macroName,
|
||||||
SourceLineInfo const& _lineInfo,
|
SourceLineInfo const& _lineInfo,
|
||||||
std::string const& _capturedExpression,
|
char const * _capturedExpression,
|
||||||
ResultDisposition::Flags _resultDisposition );
|
ResultDisposition::Flags _resultDisposition,
|
||||||
|
char const * _secondArg = "");
|
||||||
|
|
||||||
std::string macroName;
|
char const * macroName;
|
||||||
SourceLineInfo lineInfo;
|
SourceLineInfo lineInfo;
|
||||||
std::string capturedExpression;
|
char const * capturedExpression;
|
||||||
ResultDisposition::Flags resultDisposition;
|
ResultDisposition::Flags resultDisposition;
|
||||||
|
char const * secondArg;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct AssertionResultData
|
struct AssertionResultData
|
||||||
|
@@ -13,14 +13,18 @@
|
|||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
|
|
||||||
AssertionInfo::AssertionInfo( std::string const& _macroName,
|
AssertionInfo::AssertionInfo():macroName(""), capturedExpression(""), resultDisposition(ResultDisposition::Normal), secondArg(""){}
|
||||||
|
|
||||||
|
AssertionInfo::AssertionInfo( char const * _macroName,
|
||||||
SourceLineInfo const& _lineInfo,
|
SourceLineInfo const& _lineInfo,
|
||||||
std::string const& _capturedExpression,
|
char const * _capturedExpression,
|
||||||
ResultDisposition::Flags _resultDisposition )
|
ResultDisposition::Flags _resultDisposition,
|
||||||
|
char const * _secondArg)
|
||||||
: macroName( _macroName ),
|
: macroName( _macroName ),
|
||||||
lineInfo( _lineInfo ),
|
lineInfo( _lineInfo ),
|
||||||
capturedExpression( _capturedExpression ),
|
capturedExpression( _capturedExpression ),
|
||||||
resultDisposition( _resultDisposition )
|
resultDisposition( _resultDisposition ),
|
||||||
|
secondArg( _secondArg )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
AssertionResult::AssertionResult() {}
|
AssertionResult::AssertionResult() {}
|
||||||
@@ -47,24 +51,30 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool AssertionResult::hasExpression() const {
|
bool AssertionResult::hasExpression() const {
|
||||||
return !m_info.capturedExpression.empty();
|
return m_info.capturedExpression[0] != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AssertionResult::hasMessage() const {
|
bool AssertionResult::hasMessage() const {
|
||||||
return !m_resultData.message.empty();
|
return !m_resultData.message.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string capturedExpressionWithSecondArgument( char const * capturedExpression, char const * secondArg ) {
|
||||||
|
return (secondArg[0] == 0 || secondArg[0] == '"' && secondArg[1] == '"')
|
||||||
|
? capturedExpression
|
||||||
|
: std::string(capturedExpression) + ", " + secondArg;
|
||||||
|
}
|
||||||
|
|
||||||
std::string AssertionResult::getExpression() const {
|
std::string AssertionResult::getExpression() const {
|
||||||
if( isFalseTest( m_info.resultDisposition ) )
|
if( isFalseTest( m_info.resultDisposition ) )
|
||||||
return '!' + m_info.capturedExpression;
|
return '!' + capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg);
|
||||||
else
|
else
|
||||||
return m_info.capturedExpression;
|
return capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg);
|
||||||
}
|
}
|
||||||
std::string AssertionResult::getExpressionInMacro() const {
|
std::string AssertionResult::getExpressionInMacro() const {
|
||||||
if( m_info.macroName.empty() )
|
if( m_info.macroName[0] == 0 )
|
||||||
return m_info.capturedExpression;
|
return capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg);
|
||||||
else
|
else
|
||||||
return m_info.macroName + "( " + m_info.capturedExpression + " )";
|
return std::string(m_info.macroName) + "( " + capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg) + " )";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AssertionResult::hasExpandedExpression() const {
|
bool AssertionResult::hasExpandedExpression() const {
|
||||||
|
@@ -83,12 +83,12 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_IF( macroName, resultDisposition, expr ) \
|
#define INTERNAL_CATCH_IF( macroName, resultDisposition, expr ) \
|
||||||
INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ); \
|
INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ); \
|
||||||
if( Catch::getResultCapture().getLastResult()->succeeded() )
|
if( Catch::getResultCapture().lastAssertionPassed() )
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_ELSE( macroName, resultDisposition, expr ) \
|
#define INTERNAL_CATCH_ELSE( macroName, resultDisposition, expr ) \
|
||||||
INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ); \
|
INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ); \
|
||||||
if( !Catch::getResultCapture().getLastResult()->succeeded() )
|
if( !Catch::getResultCapture().lastAssertionPassed() )
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_NO_THROW( macroName, resultDisposition, expr ) \
|
#define INTERNAL_CATCH_NO_THROW( macroName, resultDisposition, expr ) \
|
||||||
|
@@ -187,6 +187,10 @@ namespace Catch {
|
|||||||
.describe( "list all/matching test cases names only" )
|
.describe( "list all/matching test cases names only" )
|
||||||
.bind( &ConfigData::listTestNamesOnly );
|
.bind( &ConfigData::listTestNamesOnly );
|
||||||
|
|
||||||
|
cli["--list-extra-info"]
|
||||||
|
.describe( "list all/matching test cases with more info" )
|
||||||
|
.bind( &ConfigData::listExtraInfo );
|
||||||
|
|
||||||
cli["--list-reporters"]
|
cli["--list-reporters"]
|
||||||
.describe( "list all reporters" )
|
.describe( "list all reporters" )
|
||||||
.bind( &ConfigData::listReporters );
|
.bind( &ConfigData::listReporters );
|
||||||
|
@@ -61,14 +61,14 @@ namespace Catch {
|
|||||||
};
|
};
|
||||||
|
|
||||||
template<typename ContainerT>
|
template<typename ContainerT>
|
||||||
inline void deleteAll( ContainerT& container ) {
|
void deleteAll( ContainerT& container ) {
|
||||||
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 ) {
|
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 )
|
||||||
|
@@ -89,6 +89,10 @@
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __OS400__
|
||||||
|
# define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS
|
||||||
|
# define CATCH_CONFIG_COLOUR_NONE
|
||||||
|
#endif
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Cygwin
|
// Cygwin
|
||||||
|
@@ -31,6 +31,7 @@ namespace Catch {
|
|||||||
listTags( false ),
|
listTags( false ),
|
||||||
listReporters( false ),
|
listReporters( false ),
|
||||||
listTestNamesOnly( false ),
|
listTestNamesOnly( false ),
|
||||||
|
listExtraInfo( false ),
|
||||||
showSuccessfulTests( false ),
|
showSuccessfulTests( false ),
|
||||||
shouldDebugBreak( false ),
|
shouldDebugBreak( false ),
|
||||||
noThrow( false ),
|
noThrow( false ),
|
||||||
@@ -50,6 +51,7 @@ namespace Catch {
|
|||||||
bool listTags;
|
bool listTags;
|
||||||
bool listReporters;
|
bool listReporters;
|
||||||
bool listTestNamesOnly;
|
bool listTestNamesOnly;
|
||||||
|
bool listExtraInfo;
|
||||||
|
|
||||||
bool showSuccessfulTests;
|
bool showSuccessfulTests;
|
||||||
bool shouldDebugBreak;
|
bool shouldDebugBreak;
|
||||||
@@ -109,6 +111,7 @@ namespace Catch {
|
|||||||
bool listTestNamesOnly() const { return m_data.listTestNamesOnly; }
|
bool listTestNamesOnly() const { return m_data.listTestNamesOnly; }
|
||||||
bool listTags() const { return m_data.listTags; }
|
bool listTags() const { return m_data.listTags; }
|
||||||
bool listReporters() const { return m_data.listReporters; }
|
bool listReporters() const { return m_data.listReporters; }
|
||||||
|
bool listExtraInfo() const { return m_data.listExtraInfo; }
|
||||||
|
|
||||||
std::string getProcessName() const { return m_data.processName; }
|
std::string getProcessName() const { return m_data.processName; }
|
||||||
|
|
||||||
|
@@ -26,9 +26,9 @@ namespace Catch{
|
|||||||
#if defined(__ppc64__) || defined(__ppc__)
|
#if defined(__ppc64__) || defined(__ppc__)
|
||||||
#define CATCH_TRAP() \
|
#define CATCH_TRAP() \
|
||||||
__asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \
|
__asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \
|
||||||
: : : "memory","r0","r3","r4" )
|
: : : "memory","r0","r3","r4" ) /* NOLINT */
|
||||||
#else
|
#else
|
||||||
#define CATCH_TRAP() __asm__("int $3\n" : : )
|
#define CATCH_TRAP() __asm__("int $3\n" : : /* NOLINT */ )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#elif defined(CATCH_PLATFORM_LINUX)
|
#elif defined(CATCH_PLATFORM_LINUX)
|
||||||
@@ -36,7 +36,7 @@ namespace Catch{
|
|||||||
// directly at the location of the failing check instead of breaking inside
|
// directly at the location of the failing check instead of breaking inside
|
||||||
// raise() called from it, i.e. one stack frame below.
|
// raise() called from it, i.e. one stack frame below.
|
||||||
#if defined(__GNUC__) && (defined(__i386) || defined(__x86_64))
|
#if defined(__GNUC__) && (defined(__i386) || defined(__x86_64))
|
||||||
#define CATCH_TRAP() asm volatile ("int $3")
|
#define CATCH_TRAP() asm volatile ("int $3") /* NOLINT */
|
||||||
#else // Fall back to the generic way.
|
#else // Fall back to the generic way.
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
|
@@ -37,7 +37,7 @@ namespace Internal {
|
|||||||
template<> struct OperatorTraits<IsGreaterThanOrEqualTo>{ static const char* getName(){ return ">="; } };
|
template<> struct OperatorTraits<IsGreaterThanOrEqualTo>{ static const char* getName(){ return ">="; } };
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline T& opCast(T const& t) { return const_cast<T&>(t); }
|
T& opCast(T const& t) { return const_cast<T&>(t); }
|
||||||
|
|
||||||
// nullptr_t support based on pull request #154 from Konstantin Baumann
|
// nullptr_t support based on pull request #154 from Konstantin Baumann
|
||||||
#ifdef CATCH_CONFIG_CPP11_NULLPTR
|
#ifdef CATCH_CONFIG_CPP11_NULLPTR
|
||||||
@@ -48,7 +48,7 @@ namespace Internal {
|
|||||||
// 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>
|
||||||
class Evaluator{};
|
struct Evaluator{};
|
||||||
|
|
||||||
template<typename T1, typename T2>
|
template<typename T1, typename T2>
|
||||||
struct Evaluator<T1, T2, IsEqualTo> {
|
struct Evaluator<T1, T2, IsEqualTo> {
|
||||||
|
@@ -41,6 +41,10 @@ namespace Catch {
|
|||||||
virtual void exceptionEarlyReported() = 0;
|
virtual void exceptionEarlyReported() = 0;
|
||||||
|
|
||||||
virtual void handleFatalErrorCondition( std::string const& message ) = 0;
|
virtual void handleFatalErrorCondition( std::string const& message ) = 0;
|
||||||
|
|
||||||
|
virtual bool lastAssertionPassed() = 0;
|
||||||
|
virtual void assertionPassed() = 0;
|
||||||
|
virtual void assertionRun() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
IResultCapture& getResultCapture();
|
IResultCapture& getResultCapture();
|
||||||
|
@@ -30,8 +30,9 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::size_t matchedTests = 0;
|
std::size_t matchedTests = 0;
|
||||||
TextAttributes nameAttr, tagsAttr;
|
TextAttributes nameAttr, descAttr, tagsAttr;
|
||||||
nameAttr.setInitialIndent( 2 ).setIndent( 4 );
|
nameAttr.setInitialIndent( 2 ).setIndent( 4 );
|
||||||
|
descAttr.setIndent( 4 );
|
||||||
tagsAttr.setIndent( 6 );
|
tagsAttr.setIndent( 6 );
|
||||||
|
|
||||||
std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );
|
std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );
|
||||||
@@ -46,6 +47,13 @@ namespace Catch {
|
|||||||
Colour colourGuard( colour );
|
Colour colourGuard( colour );
|
||||||
|
|
||||||
Catch::cout() << Text( testCaseInfo.name, nameAttr ) << std::endl;
|
Catch::cout() << Text( testCaseInfo.name, nameAttr ) << std::endl;
|
||||||
|
if( config.listExtraInfo() ) {
|
||||||
|
Catch::cout() << " " << testCaseInfo.lineInfo << std::endl;
|
||||||
|
std::string description = testCaseInfo.description;
|
||||||
|
if( description.empty() )
|
||||||
|
description = "(NO DESCRIPTION)";
|
||||||
|
Catch::cout() << Text( description, descAttr ) << std::endl;
|
||||||
|
}
|
||||||
if( !testCaseInfo.tags.empty() )
|
if( !testCaseInfo.tags.empty() )
|
||||||
Catch::cout() << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl;
|
Catch::cout() << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl;
|
||||||
}
|
}
|
||||||
@@ -69,9 +77,12 @@ namespace Catch {
|
|||||||
matchedTests++;
|
matchedTests++;
|
||||||
TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();
|
TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();
|
||||||
if( startsWith( testCaseInfo.name, '#' ) )
|
if( startsWith( testCaseInfo.name, '#' ) )
|
||||||
Catch::cout() << '"' << testCaseInfo.name << '"' << std::endl;
|
Catch::cout() << '"' << testCaseInfo.name << '"';
|
||||||
else
|
else
|
||||||
Catch::cout() << testCaseInfo.name << std::endl;
|
Catch::cout() << testCaseInfo.name;
|
||||||
|
if ( config.listExtraInfo() )
|
||||||
|
Catch::cout() << "\t@" << testCaseInfo.lineInfo;
|
||||||
|
Catch::cout() << std::endl;
|
||||||
}
|
}
|
||||||
return matchedTests;
|
return matchedTests;
|
||||||
}
|
}
|
||||||
@@ -163,7 +174,7 @@ namespace Catch {
|
|||||||
|
|
||||||
inline Option<std::size_t> list( Config const& config ) {
|
inline Option<std::size_t> list( Config const& config ) {
|
||||||
Option<std::size_t> listedCount;
|
Option<std::size_t> listedCount;
|
||||||
if( config.listTests() )
|
if( config.listTests() || ( config.listExtraInfo() && !config.listTestNamesOnly() ) )
|
||||||
listedCount = listedCount.valueOr(0) + listTests( config );
|
listedCount = listedCount.valueOr(0) + listTests( config );
|
||||||
if( config.listTestNamesOnly() )
|
if( config.listTestNamesOnly() )
|
||||||
listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config );
|
listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config );
|
||||||
|
@@ -147,23 +147,23 @@ namespace Matchers {
|
|||||||
// This allows the types to be inferred
|
// This allows the types to be inferred
|
||||||
// - deprecated: prefer ||, && and !
|
// - deprecated: prefer ||, && and !
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline Impl::MatchNotOf<T> Not( Impl::MatcherBase<T> const& underlyingMatcher ) {
|
Impl::MatchNotOf<T> Not( Impl::MatcherBase<T> const& underlyingMatcher ) {
|
||||||
return Impl::MatchNotOf<T>( underlyingMatcher );
|
return Impl::MatchNotOf<T>( underlyingMatcher );
|
||||||
}
|
}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline Impl::MatchAllOf<T> AllOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2 ) {
|
Impl::MatchAllOf<T> AllOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2 ) {
|
||||||
return Impl::MatchAllOf<T>() && m1 && m2;
|
return Impl::MatchAllOf<T>() && m1 && m2;
|
||||||
}
|
}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline Impl::MatchAllOf<T> AllOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2, Impl::MatcherBase<T> const& m3 ) {
|
Impl::MatchAllOf<T> AllOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2, Impl::MatcherBase<T> const& m3 ) {
|
||||||
return Impl::MatchAllOf<T>() && m1 && m2 && m3;
|
return Impl::MatchAllOf<T>() && m1 && m2 && m3;
|
||||||
}
|
}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline Impl::MatchAnyOf<T> AnyOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2 ) {
|
Impl::MatchAnyOf<T> AnyOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2 ) {
|
||||||
return Impl::MatchAnyOf<T>() || m1 || m2;
|
return Impl::MatchAnyOf<T>() || m1 || m2;
|
||||||
}
|
}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline Impl::MatchAnyOf<T> AnyOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2, Impl::MatcherBase<T> const& m3 ) {
|
Impl::MatchAnyOf<T> AnyOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2, Impl::MatcherBase<T> const& m3 ) {
|
||||||
return Impl::MatchAnyOf<T>() || m1 || m2 || m3;
|
return Impl::MatchAnyOf<T>() || m1 || m2 || m3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -16,7 +16,6 @@ namespace Catch {
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
NotImplementedException( SourceLineInfo const& lineInfo );
|
NotImplementedException( SourceLineInfo const& lineInfo );
|
||||||
NotImplementedException( NotImplementedException const& ) {}
|
|
||||||
|
|
||||||
virtual ~NotImplementedException() CATCH_NOEXCEPT {}
|
virtual ~NotImplementedException() CATCH_NOEXCEPT {}
|
||||||
|
|
||||||
|
@@ -47,7 +47,7 @@ namespace Catch {
|
|||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
ResultBuilder& operator << ( T const& value ) {
|
ResultBuilder& operator << ( T const& value ) {
|
||||||
m_stream.oss << value;
|
stream().oss << value;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,11 +80,27 @@ namespace Catch {
|
|||||||
private:
|
private:
|
||||||
AssertionInfo m_assertionInfo;
|
AssertionInfo m_assertionInfo;
|
||||||
AssertionResultData m_data;
|
AssertionResultData m_data;
|
||||||
CopyableStream m_stream;
|
|
||||||
|
CopyableStream &stream()
|
||||||
|
{
|
||||||
|
if(!m_usedStream)
|
||||||
|
{
|
||||||
|
m_usedStream = true;
|
||||||
|
m_stream().oss.str("");
|
||||||
|
}
|
||||||
|
return m_stream();
|
||||||
|
}
|
||||||
|
|
||||||
|
static CopyableStream &m_stream()
|
||||||
|
{
|
||||||
|
static CopyableStream s;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
bool m_shouldDebugBreak;
|
bool m_shouldDebugBreak;
|
||||||
bool m_shouldThrow;
|
bool m_shouldThrow;
|
||||||
bool m_guardException;
|
bool m_guardException;
|
||||||
|
bool m_usedStream;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Catch
|
} // namespace Catch
|
||||||
@@ -95,7 +111,7 @@ namespace Catch {
|
|||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline ExpressionLhs<T const&> ResultBuilder::operator <= ( T const& operand ) {
|
ExpressionLhs<T const&> ResultBuilder::operator <= ( T const& operand ) {
|
||||||
return ExpressionLhs<T const&>( *this, operand );
|
return ExpressionLhs<T const&>( *this, operand );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,7 +120,7 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename ArgT, typename MatcherT>
|
template<typename ArgT, typename MatcherT>
|
||||||
inline void ResultBuilder::captureMatch( ArgT const& arg, MatcherT const& matcher,
|
void ResultBuilder::captureMatch( ArgT const& arg, MatcherT const& matcher,
|
||||||
char const* matcherString ) {
|
char const* matcherString ) {
|
||||||
MatchExpression<ArgT const&, MatcherT const&> expr( arg, matcher, matcherString );
|
MatchExpression<ArgT const&, MatcherT const&> expr( arg, matcher, matcherString );
|
||||||
setResultType( matcher.match( arg ) );
|
setResultType( matcher.match( arg ) );
|
||||||
|
@@ -18,26 +18,22 @@
|
|||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
std::string capturedExpressionWithSecondArgument( std::string const& capturedExpression, std::string const& secondArg ) {
|
|
||||||
return secondArg.empty() || secondArg == "\"\""
|
|
||||||
? capturedExpression
|
|
||||||
: capturedExpression + ", " + secondArg;
|
|
||||||
}
|
|
||||||
ResultBuilder::ResultBuilder( char const* macroName,
|
ResultBuilder::ResultBuilder( char const* macroName,
|
||||||
SourceLineInfo const& lineInfo,
|
SourceLineInfo const& lineInfo,
|
||||||
char const* capturedExpression,
|
char const* capturedExpression,
|
||||||
ResultDisposition::Flags resultDisposition,
|
ResultDisposition::Flags resultDisposition,
|
||||||
char const* secondArg )
|
char const* secondArg )
|
||||||
: m_assertionInfo( macroName, lineInfo, capturedExpressionWithSecondArgument( capturedExpression, secondArg ), resultDisposition ),
|
: m_assertionInfo( macroName, lineInfo, capturedExpression, resultDisposition, secondArg ),
|
||||||
m_shouldDebugBreak( false ),
|
m_shouldDebugBreak( false ),
|
||||||
m_shouldThrow( false ),
|
m_shouldThrow( false ),
|
||||||
m_guardException( false )
|
m_guardException( false ),
|
||||||
|
m_usedStream( false )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
ResultBuilder::~ResultBuilder() {
|
ResultBuilder::~ResultBuilder() {
|
||||||
#if defined(CATCH_CONFIG_FAST_COMPILE)
|
#if defined(CATCH_CONFIG_FAST_COMPILE)
|
||||||
if ( m_guardException ) {
|
if ( m_guardException ) {
|
||||||
m_stream.oss << "Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE";
|
stream().oss << "Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE";
|
||||||
captureResult( ResultWas::ThrewException );
|
captureResult( ResultWas::ThrewException );
|
||||||
getCurrentContext().getResultCapture()->exceptionEarlyReported();
|
getCurrentContext().getResultCapture()->exceptionEarlyReported();
|
||||||
}
|
}
|
||||||
@@ -54,13 +50,25 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ResultBuilder::endExpression( DecomposedExpression const& expr ) {
|
void ResultBuilder::endExpression( DecomposedExpression const& expr ) {
|
||||||
|
// Flip bool results if FalseTest flag is set
|
||||||
|
if( isFalseTest( m_assertionInfo.resultDisposition ) ) {
|
||||||
|
m_data.negate( expr.isBinaryExpression() );
|
||||||
|
}
|
||||||
|
|
||||||
|
getResultCapture().assertionRun();
|
||||||
|
|
||||||
|
if(getCurrentContext().getConfig()->includeSuccessfulResults() || m_data.resultType != ResultWas::Ok)
|
||||||
|
{
|
||||||
AssertionResult result = build( expr );
|
AssertionResult result = build( expr );
|
||||||
handleResult( result );
|
handleResult( result );
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
getResultCapture().assertionPassed();
|
||||||
|
}
|
||||||
|
|
||||||
void ResultBuilder::useActiveException( ResultDisposition::Flags resultDisposition ) {
|
void ResultBuilder::useActiveException( ResultDisposition::Flags resultDisposition ) {
|
||||||
m_assertionInfo.resultDisposition = resultDisposition;
|
m_assertionInfo.resultDisposition = resultDisposition;
|
||||||
m_stream.oss << Catch::translateActiveException();
|
stream().oss << Catch::translateActiveException();
|
||||||
captureResult( ResultWas::ThrewException );
|
captureResult( ResultWas::ThrewException );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,7 +90,7 @@ namespace Catch {
|
|||||||
assert( !isFalseTest( m_assertionInfo.resultDisposition ) );
|
assert( !isFalseTest( m_assertionInfo.resultDisposition ) );
|
||||||
AssertionResultData data = m_data;
|
AssertionResultData data = m_data;
|
||||||
data.resultType = ResultWas::Ok;
|
data.resultType = ResultWas::Ok;
|
||||||
data.reconstructedExpression = m_assertionInfo.capturedExpression;
|
data.reconstructedExpression = capturedExpressionWithSecondArgument(m_assertionInfo.capturedExpression, m_assertionInfo.secondArg);
|
||||||
|
|
||||||
std::string actualMessage = Catch::translateActiveException();
|
std::string actualMessage = Catch::translateActiveException();
|
||||||
if( !matcher.match( actualMessage ) ) {
|
if( !matcher.match( actualMessage ) ) {
|
||||||
@@ -143,18 +151,14 @@ namespace Catch {
|
|||||||
assert( m_data.resultType != ResultWas::Unknown );
|
assert( m_data.resultType != ResultWas::Unknown );
|
||||||
AssertionResultData data = m_data;
|
AssertionResultData data = m_data;
|
||||||
|
|
||||||
// Flip bool results if FalseTest flag is set
|
if(m_usedStream)
|
||||||
if( isFalseTest( m_assertionInfo.resultDisposition ) ) {
|
data.message = m_stream().oss.str();
|
||||||
data.negate( expr.isBinaryExpression() );
|
|
||||||
}
|
|
||||||
|
|
||||||
data.message = m_stream.oss.str();
|
|
||||||
data.decomposedExpression = &expr; // for lazy reconstruction
|
data.decomposedExpression = &expr; // for lazy reconstruction
|
||||||
return AssertionResult( m_assertionInfo, data );
|
return AssertionResult( m_assertionInfo, data );
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResultBuilder::reconstructExpression( std::string& dest ) const {
|
void ResultBuilder::reconstructExpression( std::string& dest ) const {
|
||||||
dest = m_assertionInfo.capturedExpression;
|
dest = capturedExpressionWithSecondArgument(m_assertionInfo.capturedExpression, m_assertionInfo.secondArg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResultBuilder::setExceptionGuard() {
|
void ResultBuilder::setExceptionGuard() {
|
||||||
|
@@ -22,6 +22,7 @@
|
|||||||
#include "catch_result_builder.h"
|
#include "catch_result_builder.h"
|
||||||
#include "catch_fatal_condition.hpp"
|
#include "catch_fatal_condition.hpp"
|
||||||
|
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
@@ -50,6 +51,29 @@ namespace Catch {
|
|||||||
std::string& m_targetString;
|
std::string& m_targetString;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// StdErr has two constituent streams in C++, std::cerr and std::clog
|
||||||
|
// This means that we need to redirect 2 streams into 1 to keep proper
|
||||||
|
// order of writes and cannot use StreamRedirect on its own
|
||||||
|
class StdErrRedirect {
|
||||||
|
public:
|
||||||
|
StdErrRedirect(std::string& targetString)
|
||||||
|
:m_cerrBuf( cerr().rdbuf() ), m_clogBuf(clog().rdbuf()),
|
||||||
|
m_targetString(targetString){
|
||||||
|
cerr().rdbuf(m_oss.rdbuf());
|
||||||
|
clog().rdbuf(m_oss.rdbuf());
|
||||||
|
}
|
||||||
|
~StdErrRedirect() {
|
||||||
|
m_targetString += m_oss.str();
|
||||||
|
cerr().rdbuf(m_cerrBuf);
|
||||||
|
clog().rdbuf(m_clogBuf);
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
std::streambuf* m_cerrBuf;
|
||||||
|
std::streambuf* m_clogBuf;
|
||||||
|
std::ostringstream m_oss;
|
||||||
|
std::string& m_targetString;
|
||||||
|
};
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
class RunContext : public IResultCapture, public IRunner {
|
class RunContext : public IResultCapture, public IRunner {
|
||||||
@@ -150,10 +174,27 @@ namespace Catch {
|
|||||||
static_cast<void>(m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals)));
|
static_cast<void>(m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals)));
|
||||||
|
|
||||||
// Reset working state
|
// Reset working state
|
||||||
m_lastAssertionInfo = AssertionInfo( std::string(), m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition );
|
m_lastAssertionInfo = AssertionInfo( "", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition );
|
||||||
m_lastResult = result;
|
m_lastResult = result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual bool lastAssertionPassed()
|
||||||
|
{
|
||||||
|
return m_totals.assertions.passed == (m_prevPassed + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void assertionPassed()
|
||||||
|
{
|
||||||
|
m_totals.assertions.passed++;
|
||||||
|
m_lastAssertionInfo.capturedExpression = "{Unknown expression after the reported line}";
|
||||||
|
m_lastAssertionInfo.macroName = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void assertionRun()
|
||||||
|
{
|
||||||
|
m_prevPassed = m_totals.assertions.passed;
|
||||||
|
}
|
||||||
|
|
||||||
virtual bool sectionStarted (
|
virtual bool sectionStarted (
|
||||||
SectionInfo const& sectionInfo,
|
SectionInfo const& sectionInfo,
|
||||||
Counts& assertions
|
Counts& assertions
|
||||||
@@ -254,6 +295,7 @@ namespace Catch {
|
|||||||
|
|
||||||
Totals deltaTotals;
|
Totals deltaTotals;
|
||||||
deltaTotals.testCases.failed = 1;
|
deltaTotals.testCases.failed = 1;
|
||||||
|
deltaTotals.assertions.failed = 1;
|
||||||
m_reporter->testCaseEnded( TestCaseStats( testInfo,
|
m_reporter->testCaseEnded( TestCaseStats( testInfo,
|
||||||
deltaTotals,
|
deltaTotals,
|
||||||
std::string(),
|
std::string(),
|
||||||
@@ -280,7 +322,7 @@ namespace Catch {
|
|||||||
double duration = 0;
|
double duration = 0;
|
||||||
m_shouldReportUnexpected = true;
|
m_shouldReportUnexpected = true;
|
||||||
try {
|
try {
|
||||||
m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, std::string(), ResultDisposition::Normal );
|
m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal );
|
||||||
|
|
||||||
seedRng( *m_config );
|
seedRng( *m_config );
|
||||||
|
|
||||||
@@ -288,7 +330,7 @@ namespace Catch {
|
|||||||
timer.start();
|
timer.start();
|
||||||
if( m_reporter->getPreferences().shouldRedirectStdOut ) {
|
if( m_reporter->getPreferences().shouldRedirectStdOut ) {
|
||||||
StreamRedirect coutRedir( Catch::cout(), redirectedCout );
|
StreamRedirect coutRedir( Catch::cout(), redirectedCout );
|
||||||
StreamRedirect cerrRedir( Catch::cerr(), redirectedCerr );
|
StdErrRedirect errRedir( redirectedCerr );
|
||||||
invokeActiveTestCase();
|
invokeActiveTestCase();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -332,9 +374,9 @@ namespace Catch {
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
ResultBuilder makeUnexpectedResultBuilder() const {
|
ResultBuilder makeUnexpectedResultBuilder() const {
|
||||||
return ResultBuilder( m_lastAssertionInfo.macroName.c_str(),
|
return ResultBuilder( m_lastAssertionInfo.macroName,
|
||||||
m_lastAssertionInfo.lineInfo,
|
m_lastAssertionInfo.lineInfo,
|
||||||
m_lastAssertionInfo.capturedExpression.c_str(),
|
m_lastAssertionInfo.capturedExpression,
|
||||||
m_lastAssertionInfo.resultDisposition );
|
m_lastAssertionInfo.resultDisposition );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -364,6 +406,7 @@ namespace Catch {
|
|||||||
std::vector<SectionEndInfo> m_unfinishedSections;
|
std::vector<SectionEndInfo> m_unfinishedSections;
|
||||||
std::vector<ITracker*> m_activeSections;
|
std::vector<ITracker*> m_activeSections;
|
||||||
TrackerContext m_trackerContext;
|
TrackerContext m_trackerContext;
|
||||||
|
size_t m_prevPassed;
|
||||||
bool m_shouldReportUnexpected;
|
bool m_shouldReportUnexpected;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -21,6 +21,7 @@ namespace Catch {
|
|||||||
|
|
||||||
std::ostream& cout();
|
std::ostream& cout();
|
||||||
std::ostream& cerr();
|
std::ostream& cerr();
|
||||||
|
std::ostream& clog();
|
||||||
|
|
||||||
|
|
||||||
struct IStream {
|
struct IStream {
|
||||||
|
@@ -103,6 +103,9 @@ namespace Catch {
|
|||||||
std::ostream& cerr() {
|
std::ostream& cerr() {
|
||||||
return std::cerr;
|
return std::cerr;
|
||||||
}
|
}
|
||||||
|
std::ostream& clog() {
|
||||||
|
return std::clog;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -88,7 +88,7 @@ void registerTestCaseFunction
|
|||||||
#define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \
|
#define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \
|
||||||
static void TestName(); \
|
static void TestName(); \
|
||||||
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
||||||
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); } \
|
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); } /* NOLINT */ \
|
||||||
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
|
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
|
||||||
static void TestName()
|
static void TestName()
|
||||||
#define INTERNAL_CATCH_TESTCASE( ... ) \
|
#define INTERNAL_CATCH_TESTCASE( ... ) \
|
||||||
@@ -97,7 +97,7 @@ void registerTestCaseFunction
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \
|
#define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \
|
||||||
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
||||||
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 )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); } /* NOLINT */ \
|
||||||
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
|
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -107,7 +107,7 @@ void registerTestCaseFunction
|
|||||||
struct TestName : ClassName{ \
|
struct TestName : ClassName{ \
|
||||||
void test(); \
|
void test(); \
|
||||||
}; \
|
}; \
|
||||||
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestName::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \
|
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestName::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); /* NOLINT */ \
|
||||||
} \
|
} \
|
||||||
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
|
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
|
||||||
void TestName::test()
|
void TestName::test()
|
||||||
@@ -117,7 +117,7 @@ void registerTestCaseFunction
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \
|
#define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \
|
||||||
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
||||||
Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); \
|
Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); /* NOLINT */ \
|
||||||
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
|
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
|
||||||
|
|
||||||
#else
|
#else
|
||||||
@@ -125,7 +125,7 @@ void registerTestCaseFunction
|
|||||||
#define INTERNAL_CATCH_TESTCASE2( TestName, Name, Desc ) \
|
#define INTERNAL_CATCH_TESTCASE2( TestName, Name, Desc ) \
|
||||||
static void TestName(); \
|
static void TestName(); \
|
||||||
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
||||||
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\
|
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); } /* NOLINT */ \
|
||||||
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
|
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
|
||||||
static void TestName()
|
static void TestName()
|
||||||
#define INTERNAL_CATCH_TESTCASE( Name, Desc ) \
|
#define INTERNAL_CATCH_TESTCASE( Name, Desc ) \
|
||||||
@@ -134,7 +134,7 @@ void registerTestCaseFunction
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \
|
#define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \
|
||||||
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
||||||
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } \
|
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } /* NOLINT */ \
|
||||||
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
|
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -144,7 +144,7 @@ void registerTestCaseFunction
|
|||||||
struct TestCaseName : ClassName{ \
|
struct TestCaseName : ClassName{ \
|
||||||
void test(); \
|
void test(); \
|
||||||
}; \
|
}; \
|
||||||
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestCaseName::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \
|
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestCaseName::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); /* NOLINT */ \
|
||||||
} \
|
} \
|
||||||
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
|
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
|
||||||
void TestCaseName::test()
|
void TestCaseName::test()
|
||||||
@@ -154,7 +154,7 @@ void registerTestCaseFunction
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_REGISTER_TESTCASE( Function, Name, Desc ) \
|
#define INTERNAL_CATCH_REGISTER_TESTCASE( Function, Name, Desc ) \
|
||||||
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
||||||
Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); \
|
Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); /* NOLINT */ \
|
||||||
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
|
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -30,7 +30,7 @@ namespace Catch {
|
|||||||
ITagAliasRegistry const* m_tagAliases;
|
ITagAliasRegistry const* m_tagAliases;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {}
|
TestSpecParser( ITagAliasRegistry const& tagAliases ) :m_mode(None), m_exclusion(false), m_start(0), m_pos(0), m_tagAliases( &tagAliases ) {}
|
||||||
|
|
||||||
TestSpecParser& parse( std::string const& arg ) {
|
TestSpecParser& parse( std::string const& arg ) {
|
||||||
m_mode = None;
|
m_mode = None;
|
||||||
|
@@ -153,7 +153,7 @@ namespace Detail {
|
|||||||
std::string rawMemoryToString( const void *object, std::size_t size );
|
std::string rawMemoryToString( const void *object, std::size_t size );
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline std::string rawMemoryToString( const T& object ) {
|
std::string rawMemoryToString( const T& object ) {
|
||||||
return rawMemoryToString( &object, sizeof(object) );
|
return rawMemoryToString( &object, sizeof(object) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -38,7 +38,7 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline Version libraryVersion() {
|
inline Version libraryVersion() {
|
||||||
static Version version( 1, 9, 5, "", 0 );
|
static Version version( 1, 9, 7, "", 0 );
|
||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -137,7 +137,8 @@ namespace Catch {
|
|||||||
BySectionInfo( SectionInfo const& other ) : m_other( other ) {}
|
BySectionInfo( SectionInfo const& other ) : m_other( other ) {}
|
||||||
BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {}
|
BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {}
|
||||||
bool operator() ( Ptr<SectionNode> const& node ) const {
|
bool operator() ( Ptr<SectionNode> const& node ) const {
|
||||||
return node->stats.sectionInfo.lineInfo == m_other.lineInfo;
|
return ((node->stats.sectionInfo.name == m_other.name) &&
|
||||||
|
(node->stats.sectionInfo.lineInfo == m_other.lineInfo));
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
void operator=( BySectionInfo const& );
|
void operator=( BySectionInfo const& );
|
||||||
|
@@ -52,6 +52,7 @@ namespace Catch {
|
|||||||
JunitReporter( ReporterConfig const& _config )
|
JunitReporter( ReporterConfig const& _config )
|
||||||
: CumulativeReporterBase( _config ),
|
: CumulativeReporterBase( _config ),
|
||||||
xml( _config.stream() ),
|
xml( _config.stream() ),
|
||||||
|
unexpectedExceptions( 0 ),
|
||||||
m_okToFail( false )
|
m_okToFail( false )
|
||||||
{
|
{
|
||||||
m_reporterPrefs.shouldRedirectStdOut = true;
|
m_reporterPrefs.shouldRedirectStdOut = true;
|
||||||
|
@@ -622,6 +622,9 @@ with messages:
|
|||||||
|
|
||||||
A string sent directly to stdout
|
A string sent directly to stdout
|
||||||
A string sent directly to stderr
|
A string sent directly to stderr
|
||||||
|
Write to std::cerr
|
||||||
|
Write to std::clog
|
||||||
|
Interleaved writes to error streams
|
||||||
Message from section one
|
Message from section one
|
||||||
Message from section two
|
Message from section two
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
@@ -953,6 +956,6 @@ with expansion:
|
|||||||
"first" == "second"
|
"first" == "second"
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
test cases: 168 | 119 passed | 45 failed | 4 failed as expected
|
test cases: 170 | 121 passed | 45 failed | 4 failed as expected
|
||||||
assertions: 968 | 859 passed | 88 failed | 21 failed as expected
|
assertions: 973 | 864 passed | 88 failed | 21 failed as expected
|
||||||
|
|
||||||
|
@@ -123,6 +123,66 @@ PASSED:
|
|||||||
with expansion:
|
with expansion:
|
||||||
1 == 1
|
1 == 1
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
#961 -- Dynamically created sections should all be reported
|
||||||
|
Looped section 0
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
MiscTests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
MiscTests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
with message:
|
||||||
|
Everything is OK
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
#961 -- Dynamically created sections should all be reported
|
||||||
|
Looped section 1
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
MiscTests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
MiscTests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
with message:
|
||||||
|
Everything is OK
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
#961 -- Dynamically created sections should all be reported
|
||||||
|
Looped section 2
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
MiscTests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
MiscTests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
with message:
|
||||||
|
Everything is OK
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
#961 -- Dynamically created sections should all be reported
|
||||||
|
Looped section 3
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
MiscTests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
MiscTests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
with message:
|
||||||
|
Everything is OK
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
#961 -- Dynamically created sections should all be reported
|
||||||
|
Looped section 4
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
MiscTests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
MiscTests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
with message:
|
||||||
|
Everything is OK
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
'Not' checks that should fail
|
'Not' checks that should fail
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
@@ -6786,6 +6846,39 @@ PASSED:
|
|||||||
with expansion:
|
with expansion:
|
||||||
Approx( 1.23 ) != 1.24
|
Approx( 1.23 ) != 1.24
|
||||||
|
|
||||||
|
Write to std::cerr
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Standard error is reported and redirected
|
||||||
|
std::cerr
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
MessageTests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
|
||||||
|
No assertions in section 'std::cerr'
|
||||||
|
|
||||||
|
Write to std::clog
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Standard error is reported and redirected
|
||||||
|
std::clog
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
MessageTests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
|
||||||
|
No assertions in section 'std::clog'
|
||||||
|
|
||||||
|
Interleaved writes to error streams
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Standard error is reported and redirected
|
||||||
|
Interleaved writes to cerr and clog
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
MessageTests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
|
||||||
|
No assertions in section 'Interleaved writes to cerr and clog'
|
||||||
|
|
||||||
Message from section one
|
Message from section one
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Standard output from all sections is reported
|
Standard output from all sections is reported
|
||||||
@@ -9483,6 +9576,6 @@ MiscTests.cpp:<line number>:
|
|||||||
PASSED:
|
PASSED:
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
test cases: 168 | 118 passed | 46 failed | 4 failed as expected
|
test cases: 170 | 119 passed | 47 failed | 4 failed as expected
|
||||||
assertions: 970 | 859 passed | 90 failed | 21 failed as expected
|
assertions: 978 | 864 passed | 93 failed | 21 failed as expected
|
||||||
|
|
||||||
|
@@ -123,6 +123,66 @@ PASSED:
|
|||||||
with expansion:
|
with expansion:
|
||||||
1 == 1
|
1 == 1
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
#961 -- Dynamically created sections should all be reported
|
||||||
|
Looped section 0
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
MiscTests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
MiscTests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
with message:
|
||||||
|
Everything is OK
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
#961 -- Dynamically created sections should all be reported
|
||||||
|
Looped section 1
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
MiscTests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
MiscTests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
with message:
|
||||||
|
Everything is OK
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
#961 -- Dynamically created sections should all be reported
|
||||||
|
Looped section 2
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
MiscTests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
MiscTests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
with message:
|
||||||
|
Everything is OK
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
#961 -- Dynamically created sections should all be reported
|
||||||
|
Looped section 3
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
MiscTests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
MiscTests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
with message:
|
||||||
|
Everything is OK
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
#961 -- Dynamically created sections should all be reported
|
||||||
|
Looped section 4
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
MiscTests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
MiscTests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
with message:
|
||||||
|
Everything is OK
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
'Not' checks that should fail
|
'Not' checks that should fail
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
@@ -144,6 +204,6 @@ ConditionTests.cpp:<line number>: FAILED:
|
|||||||
CHECK_FALSE( true )
|
CHECK_FALSE( true )
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
test cases: 6 | 3 passed | 1 failed | 2 failed as expected
|
test cases: 7 | 4 passed | 1 failed | 2 failed as expected
|
||||||
assertions: 18 | 11 passed | 4 failed | 3 failed as expected
|
assertions: 23 | 16 passed | 4 failed | 3 failed as expected
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<testsuitesspanner>
|
<testsuitesspanner>
|
||||||
<testsuite name="<exe-name>" errors="13" failures="78" tests="971" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
|
<testsuite name="<exe-name>" errors="13" failures="81" tests="979" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
|
||||||
<testcase classname="global" name="# A test name that starts with a #" time="{duration}"/>
|
<testcase classname="global" name="# A test name that starts with a #" time="{duration}"/>
|
||||||
<testcase classname="#748 - captures with unexpected exceptions" name="outside assertions" time="{duration}">
|
<testcase classname="#748 - captures with unexpected exceptions" name="outside assertions" time="{duration}">
|
||||||
<error type="TEST_CASE">
|
<error type="TEST_CASE">
|
||||||
@@ -24,6 +24,11 @@ ExceptionTests.cpp:<line number>
|
|||||||
MiscTests.cpp:<line number>
|
MiscTests.cpp:<line number>
|
||||||
</failure>
|
</failure>
|
||||||
</testcase>
|
</testcase>
|
||||||
|
<testcase classname="#961 -- Dynamically created sections should all be reported" name="Looped section 0" time="{duration}"/>
|
||||||
|
<testcase classname="#961 -- Dynamically created sections should all be reported" name="Looped section 1" time="{duration}"/>
|
||||||
|
<testcase classname="#961 -- Dynamically created sections should all be reported" name="Looped section 2" time="{duration}"/>
|
||||||
|
<testcase classname="#961 -- Dynamically created sections should all be reported" name="Looped section 3" time="{duration}"/>
|
||||||
|
<testcase classname="#961 -- Dynamically created sections should all be reported" name="Looped section 4" time="{duration}"/>
|
||||||
<testcase classname="global" name="'Not' checks that should fail" time="{duration}">
|
<testcase classname="global" name="'Not' checks that should fail" time="{duration}">
|
||||||
<failure message="false != false" type="CHECK">
|
<failure message="false != false" type="CHECK">
|
||||||
ConditionTests.cpp:<line number>
|
ConditionTests.cpp:<line number>
|
||||||
@@ -475,6 +480,13 @@ A string sent directly to stderr
|
|||||||
</system-err>
|
</system-err>
|
||||||
</testcase>
|
</testcase>
|
||||||
<testcase classname="global" name="Some simple comparisons between doubles" time="{duration}"/>
|
<testcase classname="global" name="Some simple comparisons between doubles" time="{duration}"/>
|
||||||
|
<testcase classname="Standard error is reported and redirected" name="Interleaved writes to cerr and clog" time="{duration}">
|
||||||
|
<system-err>
|
||||||
|
Write to std::cerr
|
||||||
|
Write to std::clog
|
||||||
|
Interleaved writes to error streams
|
||||||
|
</system-err>
|
||||||
|
</testcase>
|
||||||
<testcase classname="Standard output from all sections is reported" name="two" time="{duration}">
|
<testcase classname="Standard output from all sections is reported" name="two" time="{duration}">
|
||||||
<system-out>
|
<system-out>
|
||||||
Message from section one
|
Message from section one
|
||||||
@@ -750,6 +762,9 @@ hello
|
|||||||
</system-out>
|
</system-out>
|
||||||
<system-err>
|
<system-err>
|
||||||
A string sent directly to stderr
|
A string sent directly to stderr
|
||||||
|
Write to std::cerr
|
||||||
|
Write to std::clog
|
||||||
|
Interleaved writes to error streams
|
||||||
</system-err>
|
</system-err>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
</testsuites>
|
</testsuites>
|
||||||
|
@@ -136,6 +136,24 @@
|
|||||||
</Expression>
|
</Expression>
|
||||||
<OverallResult success="true"/>
|
<OverallResult success="true"/>
|
||||||
</TestCase>
|
</TestCase>
|
||||||
|
<TestCase name="#961 -- Dynamically created sections should all be reported" tags="[.][hide]" filename="projects/<exe-name>/MiscTests.cpp" >
|
||||||
|
<Section name="Looped section 0" filename="projects/<exe-name>/MiscTests.cpp" >
|
||||||
|
<OverallResults successes="1" failures="0" expectedFailures="0"/>
|
||||||
|
</Section>
|
||||||
|
<Section name="Looped section 1" filename="projects/<exe-name>/MiscTests.cpp" >
|
||||||
|
<OverallResults successes="1" failures="0" expectedFailures="0"/>
|
||||||
|
</Section>
|
||||||
|
<Section name="Looped section 2" filename="projects/<exe-name>/MiscTests.cpp" >
|
||||||
|
<OverallResults successes="1" failures="0" expectedFailures="0"/>
|
||||||
|
</Section>
|
||||||
|
<Section name="Looped section 3" filename="projects/<exe-name>/MiscTests.cpp" >
|
||||||
|
<OverallResults successes="1" failures="0" expectedFailures="0"/>
|
||||||
|
</Section>
|
||||||
|
<Section name="Looped section 4" filename="projects/<exe-name>/MiscTests.cpp" >
|
||||||
|
<OverallResults successes="1" failures="0" expectedFailures="0"/>
|
||||||
|
</Section>
|
||||||
|
<OverallResult success="true"/>
|
||||||
|
</TestCase>
|
||||||
<TestCase name="'Not' checks that should fail" tags="[.][failing][hide]" filename="projects/<exe-name>/ConditionTests.cpp" >
|
<TestCase name="'Not' checks that should fail" tags="[.][failing][hide]" filename="projects/<exe-name>/ConditionTests.cpp" >
|
||||||
<Expression success="false" type="CHECK" filename="projects/<exe-name>/ConditionTests.cpp" >
|
<Expression success="false" type="CHECK" filename="projects/<exe-name>/ConditionTests.cpp" >
|
||||||
<Original>
|
<Original>
|
||||||
@@ -7309,6 +7327,24 @@ A string sent directly to stderr
|
|||||||
</Expression>
|
</Expression>
|
||||||
<OverallResult success="true"/>
|
<OverallResult success="true"/>
|
||||||
</TestCase>
|
</TestCase>
|
||||||
|
<TestCase name="Standard error is reported and redirected" tags="[.][hide][messages]" filename="projects/<exe-name>/MessageTests.cpp" >
|
||||||
|
<Section name="std::cerr" filename="projects/<exe-name>/MessageTests.cpp" >
|
||||||
|
<OverallResults successes="0" failures="1" expectedFailures="0"/>
|
||||||
|
</Section>
|
||||||
|
<Section name="std::clog" filename="projects/<exe-name>/MessageTests.cpp" >
|
||||||
|
<OverallResults successes="0" failures="1" expectedFailures="0"/>
|
||||||
|
</Section>
|
||||||
|
<Section name="Interleaved writes to cerr and clog" filename="projects/<exe-name>/MessageTests.cpp" >
|
||||||
|
<OverallResults successes="0" failures="1" expectedFailures="0"/>
|
||||||
|
</Section>
|
||||||
|
<OverallResult success="false">
|
||||||
|
<StdErr>
|
||||||
|
Write to std::cerr
|
||||||
|
Write to std::clog
|
||||||
|
Interleaved writes to error streams
|
||||||
|
</StdErr>
|
||||||
|
</OverallResult>
|
||||||
|
</TestCase>
|
||||||
<TestCase name="Standard output from all sections is reported" tags="[.][hide][messages]" filename="projects/<exe-name>/MessageTests.cpp" >
|
<TestCase name="Standard output from all sections is reported" tags="[.][hide][messages]" filename="projects/<exe-name>/MessageTests.cpp" >
|
||||||
<Section name="one" filename="projects/<exe-name>/MessageTests.cpp" >
|
<Section name="one" filename="projects/<exe-name>/MessageTests.cpp" >
|
||||||
<OverallResults successes="0" failures="1" expectedFailures="0"/>
|
<OverallResults successes="0" failures="1" expectedFailures="0"/>
|
||||||
@@ -10143,7 +10179,7 @@ spanner <OverallResult success="true"/>
|
|||||||
</Section>
|
</Section>
|
||||||
<OverallResult success="true"/>
|
<OverallResult success="true"/>
|
||||||
</TestCase>
|
</TestCase>
|
||||||
<OverallResults successes="859" failures="91" expectedFailures="21"/>
|
<OverallResults successes="864" failures="94" expectedFailures="21"/>
|
||||||
</Group>
|
</Group>
|
||||||
<OverallResults successes="859" failures="90" expectedFailures="21"/>
|
<OverallResults successes="864" failures="93" expectedFailures="21"/>
|
||||||
</Catch>
|
</Catch>
|
||||||
|
@@ -99,6 +99,23 @@ TEST_CASE( "Standard output from all sections is reported", "[messages][.]" )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE( "Standard error is reported and redirected", "[messages][.]" ) {
|
||||||
|
SECTION( "std::cerr" ) {
|
||||||
|
std::cerr << "Write to std::cerr" << std::endl;
|
||||||
|
}
|
||||||
|
SECTION( "std::clog" ) {
|
||||||
|
std::clog << "Write to std::clog" << std::endl;
|
||||||
|
}
|
||||||
|
SECTION( "Interleaved writes to cerr and clog" ) {
|
||||||
|
std::cerr << "Inter";
|
||||||
|
std::clog << "leaved";
|
||||||
|
std::cerr << ' ';
|
||||||
|
std::clog << "writes";
|
||||||
|
std::cerr << " to error";
|
||||||
|
std::clog << " streams\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE( "SCOPED_INFO is reset for each loop", "[messages][failing][.]" )
|
TEST_CASE( "SCOPED_INFO is reset for each loop", "[messages][failing][.]" )
|
||||||
{
|
{
|
||||||
for( int i=0; i<100; i++ )
|
for( int i=0; i<100; i++ )
|
||||||
|
@@ -405,3 +405,11 @@ TEST_CASE( "#835 -- errno should not be touched by Catch", "[!shouldfail]" ) {
|
|||||||
CHECK(f() == 0);
|
CHECK(f() == 0);
|
||||||
REQUIRE(errno == 1); // Check that f() doesn't touch errno.
|
REQUIRE(errno == 1); // Check that f() doesn't touch errno.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE( "#961 -- Dynamically created sections should all be reported", "[.]" ) {
|
||||||
|
for (char i = '0'; i < '5'; ++i) {
|
||||||
|
SECTION(std::string("Looped section ") + i) {
|
||||||
|
SUCCEED( "Everything is OK" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -407,3 +407,9 @@ TEST_CASE( "has printf", "" ) {
|
|||||||
// This can cause problems as, currently, stdout itself is not redirect - only the cout (and cerr) buffer
|
// This can cause problems as, currently, stdout itself is not redirect - only the cout (and cerr) buffer
|
||||||
printf( "spanner" );
|
printf( "spanner" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE( "null deref", "[.][failing][!nonportable]" ) {
|
||||||
|
CHECK( false );
|
||||||
|
int *x = NULL;
|
||||||
|
*x = 1;
|
||||||
|
}
|
||||||
|
@@ -7,5 +7,7 @@ v = Version()
|
|||||||
v.incrementBuildNumber()
|
v.incrementBuildNumber()
|
||||||
v.updateVersionFile()
|
v.updateVersionFile()
|
||||||
v.updateReadmeFile()
|
v.updateReadmeFile()
|
||||||
|
v.updateConanFile()
|
||||||
|
v.updateConanTestFile()
|
||||||
|
|
||||||
print( "Updated Version.hpp and README to v{0}".format( v.getVersionString() ) )
|
print( "Updated Version.hpp, README and Conan to v{0}".format( v.getVersionString() ) )
|
||||||
|
@@ -7,5 +7,7 @@ v = Version()
|
|||||||
v.incrementMajorVersion()
|
v.incrementMajorVersion()
|
||||||
v.updateVersionFile()
|
v.updateVersionFile()
|
||||||
v.updateReadmeFile()
|
v.updateReadmeFile()
|
||||||
|
v.updateConanFile()
|
||||||
|
v.updateConanTestFile()
|
||||||
|
|
||||||
print( "Updated Version.hpp and README to v{0}".format( v.getVersionString() ) )
|
print( "Updated Version.hpp, README and Conan to v{0}".format( v.getVersionString() ) )
|
||||||
|
@@ -7,5 +7,7 @@ v = Version()
|
|||||||
v.incrementMinorVersion()
|
v.incrementMinorVersion()
|
||||||
v.updateVersionFile()
|
v.updateVersionFile()
|
||||||
v.updateReadmeFile()
|
v.updateReadmeFile()
|
||||||
|
v.updateConanFile()
|
||||||
|
v.updateConanTestFile()
|
||||||
|
|
||||||
print( "Updated Version.hpp and README to v{0}".format( v.getVersionString() ) )
|
print( "Updated Version.hpp, README and Conan to v{0}".format( v.getVersionString() ) )
|
||||||
|
@@ -7,5 +7,7 @@ v = Version()
|
|||||||
v.incrementPatchNumber()
|
v.incrementPatchNumber()
|
||||||
v.updateVersionFile()
|
v.updateVersionFile()
|
||||||
v.updateReadmeFile()
|
v.updateReadmeFile()
|
||||||
|
v.updateConanFile()
|
||||||
|
v.updateConanTestFile()
|
||||||
|
|
||||||
print( "Updated Version.hpp and README to v{0}".format( v.getVersionString() ) )
|
print( "Updated Version.hpp, README and Conan to v{0}".format( v.getVersionString() ) )
|
||||||
|
@@ -11,6 +11,8 @@ versionParser = re.compile( r'(\s*static\sVersion\sversion)\s*\(\s*(.*)\s*,\s*(.
|
|||||||
rootPath = os.path.join( catchPath, 'include/' )
|
rootPath = os.path.join( catchPath, 'include/' )
|
||||||
versionPath = os.path.join( rootPath, "internal/catch_version.hpp" )
|
versionPath = os.path.join( rootPath, "internal/catch_version.hpp" )
|
||||||
readmePath = os.path.join( catchPath, "README.md" )
|
readmePath = os.path.join( catchPath, "README.md" )
|
||||||
|
conanPath = os.path.join(catchPath, 'conanfile.py')
|
||||||
|
conanTestPath = os.path.join(catchPath, 'test_package', 'conanfile.py')
|
||||||
|
|
||||||
class Version:
|
class Version:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -86,3 +88,32 @@ class Version:
|
|||||||
line = downloadParser.sub( r'<a href="https://github.com/philsquared/Catch/releases/download/v{0}/catch.hpp">'.format(self.getVersionString()) , line)
|
line = downloadParser.sub( r'<a href="https://github.com/philsquared/Catch/releases/download/v{0}/catch.hpp">'.format(self.getVersionString()) , line)
|
||||||
f.write( line + "\n" )
|
f.write( line + "\n" )
|
||||||
|
|
||||||
|
def updateConanFile(self):
|
||||||
|
conanParser = re.compile( r' version = "\d+\.\d+\.\d+.*"')
|
||||||
|
f = open( conanPath, 'r' )
|
||||||
|
lines = []
|
||||||
|
for line in f:
|
||||||
|
m = conanParser.match( line )
|
||||||
|
if m:
|
||||||
|
lines.append( ' version = "{0}"'.format(format(self.getVersionString())) )
|
||||||
|
else:
|
||||||
|
lines.append( line.rstrip() )
|
||||||
|
f.close()
|
||||||
|
f = open( conanPath, 'w' )
|
||||||
|
for line in lines:
|
||||||
|
f.write( line + "\n" )
|
||||||
|
|
||||||
|
def updateConanTestFile(self):
|
||||||
|
conanParser = re.compile( r' requires = \"Catch\/\d+\.\d+\.\d+.*@%s\/%s\" % \(username, channel\)')
|
||||||
|
f = open( conanTestPath, 'r' )
|
||||||
|
lines = []
|
||||||
|
for line in f:
|
||||||
|
m = conanParser.match( line )
|
||||||
|
if m:
|
||||||
|
lines.append( ' requires = "Catch/{0}@%s/%s" % (username, channel)'.format(format(self.getVersionString())) )
|
||||||
|
else:
|
||||||
|
lines.append( line.rstrip() )
|
||||||
|
f.close()
|
||||||
|
f = open( conanTestPath, 'w' )
|
||||||
|
for line in lines:
|
||||||
|
f.write( line + "\n" )
|
||||||
|
@@ -57,24 +57,21 @@ def update_portfile(path, header_hash, licence_hash):
|
|||||||
for line in f:
|
for line in f:
|
||||||
lines.append(line)
|
lines.append(line)
|
||||||
with open(portfile_path, 'w') as f:
|
with open(portfile_path, 'w') as f:
|
||||||
# Two things we need to change/update
|
# There are three things we need to change/update
|
||||||
# 1) Link and hash of releaseCommon
|
# 1) CATCH_VERSION cmake variable
|
||||||
# 2) Link and hash of licence
|
# 2) Hash of header
|
||||||
|
# 3) Hash of licence
|
||||||
# We could assume licence never changes, but where is the fun in that?
|
# We could assume licence never changes, but where is the fun in that?
|
||||||
first_hash = True
|
|
||||||
for line in lines:
|
for line in lines:
|
||||||
# Check what we are updating
|
# Update the version
|
||||||
|
if 'set(CATCH_VERSION' in line:
|
||||||
|
line = 'set(CATCH_VERSION v{})'.format(v.getVersionString())
|
||||||
|
|
||||||
|
# Determine which file we are updating
|
||||||
if 'vcpkg_download_distfile' in line:
|
if 'vcpkg_download_distfile' in line:
|
||||||
kind = line.split('(')[-1].strip()
|
kind = line.split('(')[-1].strip()
|
||||||
print(kind)
|
|
||||||
|
|
||||||
# Deal with URLS
|
# Update the hashes
|
||||||
if 'URLS' in line and kind == 'HEADER':
|
|
||||||
line = ' URLS "https://github.com/philsquared/Catch/releases/download/v{}/catch.hpp"\n'.format(v.getVersionString())
|
|
||||||
if 'URLS' in line and kind == 'LICENSE':
|
|
||||||
line = ' URLS "https://raw.githubusercontent.com/philsquared/Catch/v{}/LICENSE.txt"\n'.format(v.getVersionString())
|
|
||||||
|
|
||||||
# Deal with hashes
|
|
||||||
if 'SHA512' in line and kind == 'HEADER':
|
if 'SHA512' in line and kind == 'HEADER':
|
||||||
line = ' SHA512 {}\n'.format(header_hash)
|
line = ' SHA512 {}\n'.format(header_hash)
|
||||||
if 'SHA512' in line and kind == 'LICENSE':
|
if 'SHA512' in line and kind == 'LICENSE':
|
||||||
@@ -86,8 +83,6 @@ def git_push(path_to_repo):
|
|||||||
v = Version()
|
v = Version()
|
||||||
ver_string = v.getVersionString()
|
ver_string = v.getVersionString()
|
||||||
|
|
||||||
# Move to the repo dir
|
|
||||||
old_path = os.getcwd()
|
|
||||||
os.chdir(path_to_repo)
|
os.chdir(path_to_repo)
|
||||||
|
|
||||||
# Work with git
|
# Work with git
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Catch v1.9.5
|
* Catch v1.9.7
|
||||||
* Generated: 2017-06-15 12:03:23.301505
|
* Generated: 2017-08-10 23:49:15.233907
|
||||||
* ----------------------------------------------------------
|
* ----------------------------------------------------------
|
||||||
* This file has been merged from multiple headers. Please don't edit it directly
|
* This file has been merged from multiple headers. Please don't edit it directly
|
||||||
* Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved.
|
* Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved.
|
||||||
@@ -145,6 +145,11 @@
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __OS400__
|
||||||
|
# define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS
|
||||||
|
# define CATCH_CONFIG_COLOUR_NONE
|
||||||
|
#endif
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Cygwin
|
// Cygwin
|
||||||
#ifdef __CYGWIN__
|
#ifdef __CYGWIN__
|
||||||
@@ -414,14 +419,14 @@ namespace Catch {
|
|||||||
};
|
};
|
||||||
|
|
||||||
template<typename ContainerT>
|
template<typename ContainerT>
|
||||||
inline void deleteAll( ContainerT& container ) {
|
void deleteAll( ContainerT& container ) {
|
||||||
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 ) {
|
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 )
|
||||||
@@ -501,7 +506,6 @@ namespace Catch {
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
NotImplementedException( SourceLineInfo const& lineInfo );
|
NotImplementedException( SourceLineInfo const& lineInfo );
|
||||||
NotImplementedException( NotImplementedException const& ) {}
|
|
||||||
|
|
||||||
virtual ~NotImplementedException() CATCH_NOEXCEPT {}
|
virtual ~NotImplementedException() CATCH_NOEXCEPT {}
|
||||||
|
|
||||||
@@ -771,7 +775,7 @@ void registerTestCaseFunction
|
|||||||
#define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \
|
#define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \
|
||||||
static void TestName(); \
|
static void TestName(); \
|
||||||
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
||||||
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); } \
|
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); } /* NOLINT */ \
|
||||||
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
|
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
|
||||||
static void TestName()
|
static void TestName()
|
||||||
#define INTERNAL_CATCH_TESTCASE( ... ) \
|
#define INTERNAL_CATCH_TESTCASE( ... ) \
|
||||||
@@ -780,7 +784,7 @@ void registerTestCaseFunction
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \
|
#define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \
|
||||||
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
||||||
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 )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); } /* NOLINT */ \
|
||||||
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
|
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -790,7 +794,7 @@ void registerTestCaseFunction
|
|||||||
struct TestName : ClassName{ \
|
struct TestName : ClassName{ \
|
||||||
void test(); \
|
void test(); \
|
||||||
}; \
|
}; \
|
||||||
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestName::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \
|
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestName::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); /* NOLINT */ \
|
||||||
} \
|
} \
|
||||||
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
|
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
|
||||||
void TestName::test()
|
void TestName::test()
|
||||||
@@ -800,7 +804,7 @@ void registerTestCaseFunction
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \
|
#define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \
|
||||||
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
||||||
Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); \
|
Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); /* NOLINT */ \
|
||||||
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
|
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
|
||||||
|
|
||||||
#else
|
#else
|
||||||
@@ -808,7 +812,7 @@ void registerTestCaseFunction
|
|||||||
#define INTERNAL_CATCH_TESTCASE2( TestName, Name, Desc ) \
|
#define INTERNAL_CATCH_TESTCASE2( TestName, Name, Desc ) \
|
||||||
static void TestName(); \
|
static void TestName(); \
|
||||||
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
||||||
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\
|
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); } /* NOLINT */ \
|
||||||
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
|
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
|
||||||
static void TestName()
|
static void TestName()
|
||||||
#define INTERNAL_CATCH_TESTCASE( Name, Desc ) \
|
#define INTERNAL_CATCH_TESTCASE( Name, Desc ) \
|
||||||
@@ -817,7 +821,7 @@ void registerTestCaseFunction
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \
|
#define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \
|
||||||
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
||||||
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } \
|
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); } /* NOLINT */ \
|
||||||
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
|
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -827,7 +831,7 @@ void registerTestCaseFunction
|
|||||||
struct TestCaseName : ClassName{ \
|
struct TestCaseName : ClassName{ \
|
||||||
void test(); \
|
void test(); \
|
||||||
}; \
|
}; \
|
||||||
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestCaseName::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \
|
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestCaseName::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); /* NOLINT */ \
|
||||||
} \
|
} \
|
||||||
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
|
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS \
|
||||||
void TestCaseName::test()
|
void TestCaseName::test()
|
||||||
@@ -837,7 +841,7 @@ void registerTestCaseFunction
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_REGISTER_TESTCASE( Function, Name, Desc ) \
|
#define INTERNAL_CATCH_REGISTER_TESTCASE( Function, Name, Desc ) \
|
||||||
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
CATCH_INTERNAL_SUPPRESS_ETD_WARNINGS \
|
||||||
Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); \
|
Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); /* NOLINT */ \
|
||||||
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
|
CATCH_INTERNAL_UNSUPPRESS_ETD_WARNINGS
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -933,16 +937,18 @@ namespace Catch {
|
|||||||
|
|
||||||
struct AssertionInfo
|
struct AssertionInfo
|
||||||
{
|
{
|
||||||
AssertionInfo() {}
|
AssertionInfo();
|
||||||
AssertionInfo( std::string const& _macroName,
|
AssertionInfo( char const * _macroName,
|
||||||
SourceLineInfo const& _lineInfo,
|
SourceLineInfo const& _lineInfo,
|
||||||
std::string const& _capturedExpression,
|
char const * _capturedExpression,
|
||||||
ResultDisposition::Flags _resultDisposition );
|
ResultDisposition::Flags _resultDisposition,
|
||||||
|
char const * _secondArg = "");
|
||||||
|
|
||||||
std::string macroName;
|
char const * macroName;
|
||||||
SourceLineInfo lineInfo;
|
SourceLineInfo lineInfo;
|
||||||
std::string capturedExpression;
|
char const * capturedExpression;
|
||||||
ResultDisposition::Flags resultDisposition;
|
ResultDisposition::Flags resultDisposition;
|
||||||
|
char const * secondArg;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct AssertionResultData
|
struct AssertionResultData
|
||||||
@@ -1156,23 +1162,23 @@ namespace Matchers {
|
|||||||
// This allows the types to be inferred
|
// This allows the types to be inferred
|
||||||
// - deprecated: prefer ||, && and !
|
// - deprecated: prefer ||, && and !
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline Impl::MatchNotOf<T> Not( Impl::MatcherBase<T> const& underlyingMatcher ) {
|
Impl::MatchNotOf<T> Not( Impl::MatcherBase<T> const& underlyingMatcher ) {
|
||||||
return Impl::MatchNotOf<T>( underlyingMatcher );
|
return Impl::MatchNotOf<T>( underlyingMatcher );
|
||||||
}
|
}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline Impl::MatchAllOf<T> AllOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2 ) {
|
Impl::MatchAllOf<T> AllOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2 ) {
|
||||||
return Impl::MatchAllOf<T>() && m1 && m2;
|
return Impl::MatchAllOf<T>() && m1 && m2;
|
||||||
}
|
}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline Impl::MatchAllOf<T> AllOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2, Impl::MatcherBase<T> const& m3 ) {
|
Impl::MatchAllOf<T> AllOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2, Impl::MatcherBase<T> const& m3 ) {
|
||||||
return Impl::MatchAllOf<T>() && m1 && m2 && m3;
|
return Impl::MatchAllOf<T>() && m1 && m2 && m3;
|
||||||
}
|
}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline Impl::MatchAnyOf<T> AnyOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2 ) {
|
Impl::MatchAnyOf<T> AnyOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2 ) {
|
||||||
return Impl::MatchAnyOf<T>() || m1 || m2;
|
return Impl::MatchAnyOf<T>() || m1 || m2;
|
||||||
}
|
}
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline Impl::MatchAnyOf<T> AnyOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2, Impl::MatcherBase<T> const& m3 ) {
|
Impl::MatchAnyOf<T> AnyOf( Impl::MatcherBase<T> const& m1, Impl::MatcherBase<T> const& m2, Impl::MatcherBase<T> const& m3 ) {
|
||||||
return Impl::MatchAnyOf<T>() || m1 || m2 || m3;
|
return Impl::MatchAnyOf<T>() || m1 || m2 || m3;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1217,7 +1223,7 @@ namespace Catch {
|
|||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
ResultBuilder& operator << ( T const& value ) {
|
ResultBuilder& operator << ( T const& value ) {
|
||||||
m_stream.oss << value;
|
stream().oss << value;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1250,11 +1256,27 @@ namespace Catch {
|
|||||||
private:
|
private:
|
||||||
AssertionInfo m_assertionInfo;
|
AssertionInfo m_assertionInfo;
|
||||||
AssertionResultData m_data;
|
AssertionResultData m_data;
|
||||||
CopyableStream m_stream;
|
|
||||||
|
CopyableStream &stream()
|
||||||
|
{
|
||||||
|
if(!m_usedStream)
|
||||||
|
{
|
||||||
|
m_usedStream = true;
|
||||||
|
m_stream().oss.str("");
|
||||||
|
}
|
||||||
|
return m_stream();
|
||||||
|
}
|
||||||
|
|
||||||
|
static CopyableStream &m_stream()
|
||||||
|
{
|
||||||
|
static CopyableStream s;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
bool m_shouldDebugBreak;
|
bool m_shouldDebugBreak;
|
||||||
bool m_shouldThrow;
|
bool m_shouldThrow;
|
||||||
bool m_guardException;
|
bool m_guardException;
|
||||||
|
bool m_usedStream;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Catch
|
} // namespace Catch
|
||||||
@@ -1295,7 +1317,7 @@ namespace Internal {
|
|||||||
template<> struct OperatorTraits<IsGreaterThanOrEqualTo>{ static const char* getName(){ return ">="; } };
|
template<> struct OperatorTraits<IsGreaterThanOrEqualTo>{ static const char* getName(){ return ">="; } };
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline T& opCast(T const& t) { return const_cast<T&>(t); }
|
T& opCast(T const& t) { return const_cast<T&>(t); }
|
||||||
|
|
||||||
// nullptr_t support based on pull request #154 from Konstantin Baumann
|
// nullptr_t support based on pull request #154 from Konstantin Baumann
|
||||||
#ifdef CATCH_CONFIG_CPP11_NULLPTR
|
#ifdef CATCH_CONFIG_CPP11_NULLPTR
|
||||||
@@ -1305,7 +1327,7 @@ namespace Internal {
|
|||||||
// 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>
|
||||||
class Evaluator{};
|
struct Evaluator{};
|
||||||
|
|
||||||
template<typename T1, typename T2>
|
template<typename T1, typename T2>
|
||||||
struct Evaluator<T1, T2, IsEqualTo> {
|
struct Evaluator<T1, T2, IsEqualTo> {
|
||||||
@@ -1660,7 +1682,7 @@ namespace Detail {
|
|||||||
std::string rawMemoryToString( const void *object, std::size_t size );
|
std::string rawMemoryToString( const void *object, std::size_t size );
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline std::string rawMemoryToString( const T& object ) {
|
std::string rawMemoryToString( const T& object ) {
|
||||||
return rawMemoryToString( &object, sizeof(object) );
|
return rawMemoryToString( &object, sizeof(object) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1949,7 +1971,7 @@ private:
|
|||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline ExpressionLhs<T const&> ResultBuilder::operator <= ( T const& operand ) {
|
ExpressionLhs<T const&> ResultBuilder::operator <= ( T const& operand ) {
|
||||||
return ExpressionLhs<T const&>( *this, operand );
|
return ExpressionLhs<T const&>( *this, operand );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1958,7 +1980,7 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename ArgT, typename MatcherT>
|
template<typename ArgT, typename MatcherT>
|
||||||
inline void ResultBuilder::captureMatch( ArgT const& arg, MatcherT const& matcher,
|
void ResultBuilder::captureMatch( ArgT const& arg, MatcherT const& matcher,
|
||||||
char const* matcherString ) {
|
char const* matcherString ) {
|
||||||
MatchExpression<ArgT const&, MatcherT const&> expr( arg, matcher, matcherString );
|
MatchExpression<ArgT const&, MatcherT const&> expr( arg, matcher, matcherString );
|
||||||
setResultType( matcher.match( arg ) );
|
setResultType( matcher.match( arg ) );
|
||||||
@@ -2057,6 +2079,10 @@ namespace Catch {
|
|||||||
virtual void exceptionEarlyReported() = 0;
|
virtual void exceptionEarlyReported() = 0;
|
||||||
|
|
||||||
virtual void handleFatalErrorCondition( std::string const& message ) = 0;
|
virtual void handleFatalErrorCondition( std::string const& message ) = 0;
|
||||||
|
|
||||||
|
virtual bool lastAssertionPassed() = 0;
|
||||||
|
virtual void assertionPassed() = 0;
|
||||||
|
virtual void assertionRun() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
IResultCapture& getResultCapture();
|
IResultCapture& getResultCapture();
|
||||||
@@ -2099,9 +2125,9 @@ namespace Catch{
|
|||||||
#if defined(__ppc64__) || defined(__ppc__)
|
#if defined(__ppc64__) || defined(__ppc__)
|
||||||
#define CATCH_TRAP() \
|
#define CATCH_TRAP() \
|
||||||
__asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \
|
__asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \
|
||||||
: : : "memory","r0","r3","r4" )
|
: : : "memory","r0","r3","r4" ) /* NOLINT */
|
||||||
#else
|
#else
|
||||||
#define CATCH_TRAP() __asm__("int $3\n" : : )
|
#define CATCH_TRAP() __asm__("int $3\n" : : /* NOLINT */ )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#elif defined(CATCH_PLATFORM_LINUX)
|
#elif defined(CATCH_PLATFORM_LINUX)
|
||||||
@@ -2109,7 +2135,7 @@ namespace Catch{
|
|||||||
// directly at the location of the failing check instead of breaking inside
|
// directly at the location of the failing check instead of breaking inside
|
||||||
// raise() called from it, i.e. one stack frame below.
|
// raise() called from it, i.e. one stack frame below.
|
||||||
#if defined(__GNUC__) && (defined(__i386) || defined(__x86_64))
|
#if defined(__GNUC__) && (defined(__i386) || defined(__x86_64))
|
||||||
#define CATCH_TRAP() asm volatile ("int $3")
|
#define CATCH_TRAP() asm volatile ("int $3") /* NOLINT */
|
||||||
#else // Fall back to the generic way.
|
#else // Fall back to the generic way.
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
@@ -2204,12 +2230,12 @@ namespace Catch {
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_IF( macroName, resultDisposition, expr ) \
|
#define INTERNAL_CATCH_IF( macroName, resultDisposition, expr ) \
|
||||||
INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ); \
|
INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ); \
|
||||||
if( Catch::getResultCapture().getLastResult()->succeeded() )
|
if( Catch::getResultCapture().lastAssertionPassed() )
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_ELSE( macroName, resultDisposition, expr ) \
|
#define INTERNAL_CATCH_ELSE( macroName, resultDisposition, expr ) \
|
||||||
INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ); \
|
INTERNAL_CATCH_TEST( macroName, resultDisposition, expr ); \
|
||||||
if( !Catch::getResultCapture().getLastResult()->succeeded() )
|
if( !Catch::getResultCapture().lastAssertionPassed() )
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_NO_THROW( macroName, resultDisposition, expr ) \
|
#define INTERNAL_CATCH_NO_THROW( macroName, resultDisposition, expr ) \
|
||||||
@@ -2769,13 +2795,6 @@ namespace Detail {
|
|||||||
m_value( value )
|
m_value( value )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
Approx( Approx const& other )
|
|
||||||
: m_epsilon( other.m_epsilon ),
|
|
||||||
m_margin( other.m_margin ),
|
|
||||||
m_scale( other.m_scale ),
|
|
||||||
m_value( other.m_value )
|
|
||||||
{}
|
|
||||||
|
|
||||||
static Approx custom() {
|
static Approx custom() {
|
||||||
return Approx( 0 );
|
return Approx( 0 );
|
||||||
}
|
}
|
||||||
@@ -3699,7 +3718,7 @@ namespace Catch {
|
|||||||
ITagAliasRegistry const* m_tagAliases;
|
ITagAliasRegistry const* m_tagAliases;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {}
|
TestSpecParser( ITagAliasRegistry const& tagAliases ) :m_mode(None), m_exclusion(false), m_start(0), m_pos(0), m_tagAliases( &tagAliases ) {}
|
||||||
|
|
||||||
TestSpecParser& parse( std::string const& arg ) {
|
TestSpecParser& parse( std::string const& arg ) {
|
||||||
m_mode = None;
|
m_mode = None;
|
||||||
@@ -3883,6 +3902,7 @@ namespace Catch {
|
|||||||
|
|
||||||
std::ostream& cout();
|
std::ostream& cout();
|
||||||
std::ostream& cerr();
|
std::ostream& cerr();
|
||||||
|
std::ostream& clog();
|
||||||
|
|
||||||
struct IStream {
|
struct IStream {
|
||||||
virtual ~IStream() CATCH_NOEXCEPT;
|
virtual ~IStream() CATCH_NOEXCEPT;
|
||||||
@@ -3938,6 +3958,7 @@ namespace Catch {
|
|||||||
listTags( false ),
|
listTags( false ),
|
||||||
listReporters( false ),
|
listReporters( false ),
|
||||||
listTestNamesOnly( false ),
|
listTestNamesOnly( false ),
|
||||||
|
listExtraInfo( false ),
|
||||||
showSuccessfulTests( false ),
|
showSuccessfulTests( false ),
|
||||||
shouldDebugBreak( false ),
|
shouldDebugBreak( false ),
|
||||||
noThrow( false ),
|
noThrow( false ),
|
||||||
@@ -3957,6 +3978,7 @@ namespace Catch {
|
|||||||
bool listTags;
|
bool listTags;
|
||||||
bool listReporters;
|
bool listReporters;
|
||||||
bool listTestNamesOnly;
|
bool listTestNamesOnly;
|
||||||
|
bool listExtraInfo;
|
||||||
|
|
||||||
bool showSuccessfulTests;
|
bool showSuccessfulTests;
|
||||||
bool shouldDebugBreak;
|
bool shouldDebugBreak;
|
||||||
@@ -4015,6 +4037,7 @@ namespace Catch {
|
|||||||
bool listTestNamesOnly() const { return m_data.listTestNamesOnly; }
|
bool listTestNamesOnly() const { return m_data.listTestNamesOnly; }
|
||||||
bool listTags() const { return m_data.listTags; }
|
bool listTags() const { return m_data.listTags; }
|
||||||
bool listReporters() const { return m_data.listReporters; }
|
bool listReporters() const { return m_data.listReporters; }
|
||||||
|
bool listExtraInfo() const { return m_data.listExtraInfo; }
|
||||||
|
|
||||||
std::string getProcessName() const { return m_data.processName; }
|
std::string getProcessName() const { return m_data.processName; }
|
||||||
|
|
||||||
@@ -4212,7 +4235,7 @@ namespace Tbc {
|
|||||||
return oss.str();
|
return oss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) {
|
friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) {
|
||||||
for( Text::const_iterator it = _text.begin(), itEnd = _text.end();
|
for( Text::const_iterator it = _text.begin(), itEnd = _text.end();
|
||||||
it != itEnd; ++it ) {
|
it != itEnd; ++it ) {
|
||||||
if( it != _text.begin() )
|
if( it != _text.begin() )
|
||||||
@@ -5276,6 +5299,10 @@ namespace Catch {
|
|||||||
.describe( "list all/matching test cases names only" )
|
.describe( "list all/matching test cases names only" )
|
||||||
.bind( &ConfigData::listTestNamesOnly );
|
.bind( &ConfigData::listTestNamesOnly );
|
||||||
|
|
||||||
|
cli["--list-extra-info"]
|
||||||
|
.describe( "list all/matching test cases with more info" )
|
||||||
|
.bind( &ConfigData::listExtraInfo );
|
||||||
|
|
||||||
cli["--list-reporters"]
|
cli["--list-reporters"]
|
||||||
.describe( "list all reporters" )
|
.describe( "list all reporters" )
|
||||||
.bind( &ConfigData::listReporters );
|
.bind( &ConfigData::listReporters );
|
||||||
@@ -5804,8 +5831,9 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::size_t matchedTests = 0;
|
std::size_t matchedTests = 0;
|
||||||
TextAttributes nameAttr, tagsAttr;
|
TextAttributes nameAttr, descAttr, tagsAttr;
|
||||||
nameAttr.setInitialIndent( 2 ).setIndent( 4 );
|
nameAttr.setInitialIndent( 2 ).setIndent( 4 );
|
||||||
|
descAttr.setIndent( 4 );
|
||||||
tagsAttr.setIndent( 6 );
|
tagsAttr.setIndent( 6 );
|
||||||
|
|
||||||
std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );
|
std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );
|
||||||
@@ -5820,6 +5848,13 @@ namespace Catch {
|
|||||||
Colour colourGuard( colour );
|
Colour colourGuard( colour );
|
||||||
|
|
||||||
Catch::cout() << Text( testCaseInfo.name, nameAttr ) << std::endl;
|
Catch::cout() << Text( testCaseInfo.name, nameAttr ) << std::endl;
|
||||||
|
if( config.listExtraInfo() ) {
|
||||||
|
Catch::cout() << " " << testCaseInfo.lineInfo << std::endl;
|
||||||
|
std::string description = testCaseInfo.description;
|
||||||
|
if( description.empty() )
|
||||||
|
description = "(NO DESCRIPTION)";
|
||||||
|
Catch::cout() << Text( description, descAttr ) << std::endl;
|
||||||
|
}
|
||||||
if( !testCaseInfo.tags.empty() )
|
if( !testCaseInfo.tags.empty() )
|
||||||
Catch::cout() << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl;
|
Catch::cout() << Text( testCaseInfo.tagsAsString, tagsAttr ) << std::endl;
|
||||||
}
|
}
|
||||||
@@ -5843,9 +5878,12 @@ namespace Catch {
|
|||||||
matchedTests++;
|
matchedTests++;
|
||||||
TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();
|
TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();
|
||||||
if( startsWith( testCaseInfo.name, '#' ) )
|
if( startsWith( testCaseInfo.name, '#' ) )
|
||||||
Catch::cout() << '"' << testCaseInfo.name << '"' << std::endl;
|
Catch::cout() << '"' << testCaseInfo.name << '"';
|
||||||
else
|
else
|
||||||
Catch::cout() << testCaseInfo.name << std::endl;
|
Catch::cout() << testCaseInfo.name;
|
||||||
|
if ( config.listExtraInfo() )
|
||||||
|
Catch::cout() << "\t@" << testCaseInfo.lineInfo;
|
||||||
|
Catch::cout() << std::endl;
|
||||||
}
|
}
|
||||||
return matchedTests;
|
return matchedTests;
|
||||||
}
|
}
|
||||||
@@ -5937,7 +5975,7 @@ namespace Catch {
|
|||||||
|
|
||||||
inline Option<std::size_t> list( Config const& config ) {
|
inline Option<std::size_t> list( Config const& config ) {
|
||||||
Option<std::size_t> listedCount;
|
Option<std::size_t> listedCount;
|
||||||
if( config.listTests() )
|
if( config.listTests() || ( config.listExtraInfo() && !config.listTestNamesOnly() ) )
|
||||||
listedCount = listedCount.valueOr(0) + listTests( config );
|
listedCount = listedCount.valueOr(0) + listTests( config );
|
||||||
if( config.listTestNamesOnly() )
|
if( config.listTestNamesOnly() )
|
||||||
listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config );
|
listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config );
|
||||||
@@ -6549,6 +6587,29 @@ namespace Catch {
|
|||||||
std::string& m_targetString;
|
std::string& m_targetString;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// StdErr has two constituent streams in C++, std::cerr and std::clog
|
||||||
|
// This means that we need to redirect 2 streams into 1 to keep proper
|
||||||
|
// order of writes and cannot use StreamRedirect on its own
|
||||||
|
class StdErrRedirect {
|
||||||
|
public:
|
||||||
|
StdErrRedirect(std::string& targetString)
|
||||||
|
:m_cerrBuf( cerr().rdbuf() ), m_clogBuf(clog().rdbuf()),
|
||||||
|
m_targetString(targetString){
|
||||||
|
cerr().rdbuf(m_oss.rdbuf());
|
||||||
|
clog().rdbuf(m_oss.rdbuf());
|
||||||
|
}
|
||||||
|
~StdErrRedirect() {
|
||||||
|
m_targetString += m_oss.str();
|
||||||
|
cerr().rdbuf(m_cerrBuf);
|
||||||
|
clog().rdbuf(m_clogBuf);
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
std::streambuf* m_cerrBuf;
|
||||||
|
std::streambuf* m_clogBuf;
|
||||||
|
std::ostringstream m_oss;
|
||||||
|
std::string& m_targetString;
|
||||||
|
};
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
class RunContext : public IResultCapture, public IRunner {
|
class RunContext : public IResultCapture, public IRunner {
|
||||||
@@ -6647,10 +6708,27 @@ namespace Catch {
|
|||||||
static_cast<void>(m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals)));
|
static_cast<void>(m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals)));
|
||||||
|
|
||||||
// Reset working state
|
// Reset working state
|
||||||
m_lastAssertionInfo = AssertionInfo( std::string(), m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition );
|
m_lastAssertionInfo = AssertionInfo( "", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition );
|
||||||
m_lastResult = result;
|
m_lastResult = result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual bool lastAssertionPassed()
|
||||||
|
{
|
||||||
|
return m_totals.assertions.passed == (m_prevPassed + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void assertionPassed()
|
||||||
|
{
|
||||||
|
m_totals.assertions.passed++;
|
||||||
|
m_lastAssertionInfo.capturedExpression = "{Unknown expression after the reported line}";
|
||||||
|
m_lastAssertionInfo.macroName = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void assertionRun()
|
||||||
|
{
|
||||||
|
m_prevPassed = m_totals.assertions.passed;
|
||||||
|
}
|
||||||
|
|
||||||
virtual bool sectionStarted (
|
virtual bool sectionStarted (
|
||||||
SectionInfo const& sectionInfo,
|
SectionInfo const& sectionInfo,
|
||||||
Counts& assertions
|
Counts& assertions
|
||||||
@@ -6751,6 +6829,7 @@ namespace Catch {
|
|||||||
|
|
||||||
Totals deltaTotals;
|
Totals deltaTotals;
|
||||||
deltaTotals.testCases.failed = 1;
|
deltaTotals.testCases.failed = 1;
|
||||||
|
deltaTotals.assertions.failed = 1;
|
||||||
m_reporter->testCaseEnded( TestCaseStats( testInfo,
|
m_reporter->testCaseEnded( TestCaseStats( testInfo,
|
||||||
deltaTotals,
|
deltaTotals,
|
||||||
std::string(),
|
std::string(),
|
||||||
@@ -6777,7 +6856,7 @@ namespace Catch {
|
|||||||
double duration = 0;
|
double duration = 0;
|
||||||
m_shouldReportUnexpected = true;
|
m_shouldReportUnexpected = true;
|
||||||
try {
|
try {
|
||||||
m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, std::string(), ResultDisposition::Normal );
|
m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal );
|
||||||
|
|
||||||
seedRng( *m_config );
|
seedRng( *m_config );
|
||||||
|
|
||||||
@@ -6785,7 +6864,7 @@ namespace Catch {
|
|||||||
timer.start();
|
timer.start();
|
||||||
if( m_reporter->getPreferences().shouldRedirectStdOut ) {
|
if( m_reporter->getPreferences().shouldRedirectStdOut ) {
|
||||||
StreamRedirect coutRedir( Catch::cout(), redirectedCout );
|
StreamRedirect coutRedir( Catch::cout(), redirectedCout );
|
||||||
StreamRedirect cerrRedir( Catch::cerr(), redirectedCerr );
|
StdErrRedirect errRedir( redirectedCerr );
|
||||||
invokeActiveTestCase();
|
invokeActiveTestCase();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -6829,9 +6908,9 @@ namespace Catch {
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
ResultBuilder makeUnexpectedResultBuilder() const {
|
ResultBuilder makeUnexpectedResultBuilder() const {
|
||||||
return ResultBuilder( m_lastAssertionInfo.macroName.c_str(),
|
return ResultBuilder( m_lastAssertionInfo.macroName,
|
||||||
m_lastAssertionInfo.lineInfo,
|
m_lastAssertionInfo.lineInfo,
|
||||||
m_lastAssertionInfo.capturedExpression.c_str(),
|
m_lastAssertionInfo.capturedExpression,
|
||||||
m_lastAssertionInfo.resultDisposition );
|
m_lastAssertionInfo.resultDisposition );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6861,6 +6940,7 @@ namespace Catch {
|
|||||||
std::vector<SectionEndInfo> m_unfinishedSections;
|
std::vector<SectionEndInfo> m_unfinishedSections;
|
||||||
std::vector<ITracker*> m_activeSections;
|
std::vector<ITracker*> m_activeSections;
|
||||||
TrackerContext m_trackerContext;
|
TrackerContext m_trackerContext;
|
||||||
|
size_t m_prevPassed;
|
||||||
bool m_shouldReportUnexpected;
|
bool m_shouldReportUnexpected;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -6919,10 +6999,14 @@ namespace Catch {
|
|||||||
return reporter;
|
return reporter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined(CATCH_CONFIG_DEFAULT_REPORTER)
|
||||||
|
#define CATCH_CONFIG_DEFAULT_REPORTER "console"
|
||||||
|
#endif
|
||||||
|
|
||||||
Ptr<IStreamingReporter> makeReporter( Ptr<Config> const& config ) {
|
Ptr<IStreamingReporter> makeReporter( Ptr<Config> const& config ) {
|
||||||
std::vector<std::string> reporters = config->getReporterNames();
|
std::vector<std::string> reporters = config->getReporterNames();
|
||||||
if( reporters.empty() )
|
if( reporters.empty() )
|
||||||
reporters.push_back( "console" );
|
reporters.push_back( CATCH_CONFIG_DEFAULT_REPORTER );
|
||||||
|
|
||||||
Ptr<IStreamingReporter> reporter;
|
Ptr<IStreamingReporter> reporter;
|
||||||
for( std::vector<std::string>::const_iterator it = reporters.begin(), itEnd = reporters.end();
|
for( std::vector<std::string>::const_iterator it = reporters.begin(), itEnd = reporters.end();
|
||||||
@@ -6982,11 +7066,11 @@ namespace Catch {
|
|||||||
if( lastSlash != std::string::npos )
|
if( lastSlash != std::string::npos )
|
||||||
filename = filename.substr( lastSlash+1 );
|
filename = filename.substr( lastSlash+1 );
|
||||||
|
|
||||||
std::string::size_type lastDot = filename.find_last_of( "." );
|
std::string::size_type lastDot = filename.find_last_of( '.' );
|
||||||
if( lastDot != std::string::npos )
|
if( lastDot != std::string::npos )
|
||||||
filename = filename.substr( 0, lastDot );
|
filename = filename.substr( 0, lastDot );
|
||||||
|
|
||||||
tags.insert( "#" + filename );
|
tags.insert( '#' + filename );
|
||||||
setTags( test, tags );
|
setTags( test, tags );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7638,6 +7722,9 @@ namespace Catch {
|
|||||||
std::ostream& cerr() {
|
std::ostream& cerr() {
|
||||||
return std::cerr;
|
return std::cerr;
|
||||||
}
|
}
|
||||||
|
std::ostream& clog() {
|
||||||
|
return std::clog;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8008,14 +8095,18 @@ namespace Catch {
|
|||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
AssertionInfo::AssertionInfo( std::string const& _macroName,
|
AssertionInfo::AssertionInfo():macroName(""), capturedExpression(""), resultDisposition(ResultDisposition::Normal), secondArg(""){}
|
||||||
|
|
||||||
|
AssertionInfo::AssertionInfo( char const * _macroName,
|
||||||
SourceLineInfo const& _lineInfo,
|
SourceLineInfo const& _lineInfo,
|
||||||
std::string const& _capturedExpression,
|
char const * _capturedExpression,
|
||||||
ResultDisposition::Flags _resultDisposition )
|
ResultDisposition::Flags _resultDisposition,
|
||||||
|
char const * _secondArg)
|
||||||
: macroName( _macroName ),
|
: macroName( _macroName ),
|
||||||
lineInfo( _lineInfo ),
|
lineInfo( _lineInfo ),
|
||||||
capturedExpression( _capturedExpression ),
|
capturedExpression( _capturedExpression ),
|
||||||
resultDisposition( _resultDisposition )
|
resultDisposition( _resultDisposition ),
|
||||||
|
secondArg( _secondArg )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
AssertionResult::AssertionResult() {}
|
AssertionResult::AssertionResult() {}
|
||||||
@@ -8042,24 +8133,30 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool AssertionResult::hasExpression() const {
|
bool AssertionResult::hasExpression() const {
|
||||||
return !m_info.capturedExpression.empty();
|
return m_info.capturedExpression[0] != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AssertionResult::hasMessage() const {
|
bool AssertionResult::hasMessage() const {
|
||||||
return !m_resultData.message.empty();
|
return !m_resultData.message.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string capturedExpressionWithSecondArgument( char const * capturedExpression, char const * secondArg ) {
|
||||||
|
return (secondArg[0] == 0 || secondArg[0] == '"' && secondArg[1] == '"')
|
||||||
|
? capturedExpression
|
||||||
|
: std::string(capturedExpression) + ", " + secondArg;
|
||||||
|
}
|
||||||
|
|
||||||
std::string AssertionResult::getExpression() const {
|
std::string AssertionResult::getExpression() const {
|
||||||
if( isFalseTest( m_info.resultDisposition ) )
|
if( isFalseTest( m_info.resultDisposition ) )
|
||||||
return '!' + m_info.capturedExpression;
|
return '!' + capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg);
|
||||||
else
|
else
|
||||||
return m_info.capturedExpression;
|
return capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg);
|
||||||
}
|
}
|
||||||
std::string AssertionResult::getExpressionInMacro() const {
|
std::string AssertionResult::getExpressionInMacro() const {
|
||||||
if( m_info.macroName.empty() )
|
if( m_info.macroName[0] == 0 )
|
||||||
return m_info.capturedExpression;
|
return capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg);
|
||||||
else
|
else
|
||||||
return m_info.macroName + "( " + m_info.capturedExpression + " )";
|
return std::string(m_info.macroName) + "( " + capturedExpressionWithSecondArgument(m_info.capturedExpression, m_info.secondArg) + " )";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AssertionResult::hasExpandedExpression() const {
|
bool AssertionResult::hasExpandedExpression() const {
|
||||||
@@ -8309,7 +8406,7 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline Version libraryVersion() {
|
inline Version libraryVersion() {
|
||||||
static Version version( 1, 9, 5, "", 0 );
|
static Version version( 1, 9, 7, "", 0 );
|
||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -9009,26 +9106,22 @@ std::string toString( std::nullptr_t ) {
|
|||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
std::string capturedExpressionWithSecondArgument( std::string const& capturedExpression, std::string const& secondArg ) {
|
|
||||||
return secondArg.empty() || secondArg == "\"\""
|
|
||||||
? capturedExpression
|
|
||||||
: capturedExpression + ", " + secondArg;
|
|
||||||
}
|
|
||||||
ResultBuilder::ResultBuilder( char const* macroName,
|
ResultBuilder::ResultBuilder( char const* macroName,
|
||||||
SourceLineInfo const& lineInfo,
|
SourceLineInfo const& lineInfo,
|
||||||
char const* capturedExpression,
|
char const* capturedExpression,
|
||||||
ResultDisposition::Flags resultDisposition,
|
ResultDisposition::Flags resultDisposition,
|
||||||
char const* secondArg )
|
char const* secondArg )
|
||||||
: m_assertionInfo( macroName, lineInfo, capturedExpressionWithSecondArgument( capturedExpression, secondArg ), resultDisposition ),
|
: m_assertionInfo( macroName, lineInfo, capturedExpression, resultDisposition, secondArg ),
|
||||||
m_shouldDebugBreak( false ),
|
m_shouldDebugBreak( false ),
|
||||||
m_shouldThrow( false ),
|
m_shouldThrow( false ),
|
||||||
m_guardException( false )
|
m_guardException( false ),
|
||||||
|
m_usedStream( false )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
ResultBuilder::~ResultBuilder() {
|
ResultBuilder::~ResultBuilder() {
|
||||||
#if defined(CATCH_CONFIG_FAST_COMPILE)
|
#if defined(CATCH_CONFIG_FAST_COMPILE)
|
||||||
if ( m_guardException ) {
|
if ( m_guardException ) {
|
||||||
m_stream.oss << "Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE";
|
stream().oss << "Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE";
|
||||||
captureResult( ResultWas::ThrewException );
|
captureResult( ResultWas::ThrewException );
|
||||||
getCurrentContext().getResultCapture()->exceptionEarlyReported();
|
getCurrentContext().getResultCapture()->exceptionEarlyReported();
|
||||||
}
|
}
|
||||||
@@ -9045,13 +9138,25 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ResultBuilder::endExpression( DecomposedExpression const& expr ) {
|
void ResultBuilder::endExpression( DecomposedExpression const& expr ) {
|
||||||
|
// Flip bool results if FalseTest flag is set
|
||||||
|
if( isFalseTest( m_assertionInfo.resultDisposition ) ) {
|
||||||
|
m_data.negate( expr.isBinaryExpression() );
|
||||||
|
}
|
||||||
|
|
||||||
|
getResultCapture().assertionRun();
|
||||||
|
|
||||||
|
if(getCurrentContext().getConfig()->includeSuccessfulResults() || m_data.resultType != ResultWas::Ok)
|
||||||
|
{
|
||||||
AssertionResult result = build( expr );
|
AssertionResult result = build( expr );
|
||||||
handleResult( result );
|
handleResult( result );
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
getResultCapture().assertionPassed();
|
||||||
|
}
|
||||||
|
|
||||||
void ResultBuilder::useActiveException( ResultDisposition::Flags resultDisposition ) {
|
void ResultBuilder::useActiveException( ResultDisposition::Flags resultDisposition ) {
|
||||||
m_assertionInfo.resultDisposition = resultDisposition;
|
m_assertionInfo.resultDisposition = resultDisposition;
|
||||||
m_stream.oss << Catch::translateActiveException();
|
stream().oss << Catch::translateActiveException();
|
||||||
captureResult( ResultWas::ThrewException );
|
captureResult( ResultWas::ThrewException );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -9072,7 +9177,7 @@ namespace Catch {
|
|||||||
assert( !isFalseTest( m_assertionInfo.resultDisposition ) );
|
assert( !isFalseTest( m_assertionInfo.resultDisposition ) );
|
||||||
AssertionResultData data = m_data;
|
AssertionResultData data = m_data;
|
||||||
data.resultType = ResultWas::Ok;
|
data.resultType = ResultWas::Ok;
|
||||||
data.reconstructedExpression = m_assertionInfo.capturedExpression;
|
data.reconstructedExpression = capturedExpressionWithSecondArgument(m_assertionInfo.capturedExpression, m_assertionInfo.secondArg);
|
||||||
|
|
||||||
std::string actualMessage = Catch::translateActiveException();
|
std::string actualMessage = Catch::translateActiveException();
|
||||||
if( !matcher.match( actualMessage ) ) {
|
if( !matcher.match( actualMessage ) ) {
|
||||||
@@ -9133,18 +9238,14 @@ namespace Catch {
|
|||||||
assert( m_data.resultType != ResultWas::Unknown );
|
assert( m_data.resultType != ResultWas::Unknown );
|
||||||
AssertionResultData data = m_data;
|
AssertionResultData data = m_data;
|
||||||
|
|
||||||
// Flip bool results if FalseTest flag is set
|
if(m_usedStream)
|
||||||
if( isFalseTest( m_assertionInfo.resultDisposition ) ) {
|
data.message = m_stream().oss.str();
|
||||||
data.negate( expr.isBinaryExpression() );
|
|
||||||
}
|
|
||||||
|
|
||||||
data.message = m_stream.oss.str();
|
|
||||||
data.decomposedExpression = &expr; // for lazy reconstruction
|
data.decomposedExpression = &expr; // for lazy reconstruction
|
||||||
return AssertionResult( m_assertionInfo, data );
|
return AssertionResult( m_assertionInfo, data );
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResultBuilder::reconstructExpression( std::string& dest ) const {
|
void ResultBuilder::reconstructExpression( std::string& dest ) const {
|
||||||
dest = m_assertionInfo.capturedExpression;
|
dest = capturedExpressionWithSecondArgument(m_assertionInfo.capturedExpression, m_assertionInfo.secondArg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResultBuilder::setExceptionGuard() {
|
void ResultBuilder::setExceptionGuard() {
|
||||||
@@ -9567,7 +9668,8 @@ namespace Catch {
|
|||||||
BySectionInfo( SectionInfo const& other ) : m_other( other ) {}
|
BySectionInfo( SectionInfo const& other ) : m_other( other ) {}
|
||||||
BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {}
|
BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {}
|
||||||
bool operator() ( Ptr<SectionNode> const& node ) const {
|
bool operator() ( Ptr<SectionNode> const& node ) const {
|
||||||
return node->stats.sectionInfo.lineInfo == m_other.lineInfo;
|
return ((node->stats.sectionInfo.name == m_other.name) &&
|
||||||
|
(node->stats.sectionInfo.lineInfo == m_other.lineInfo));
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
void operator=( BySectionInfo const& );
|
void operator=( BySectionInfo const& );
|
||||||
@@ -10289,6 +10391,7 @@ namespace Catch {
|
|||||||
JunitReporter( ReporterConfig const& _config )
|
JunitReporter( ReporterConfig const& _config )
|
||||||
: CumulativeReporterBase( _config ),
|
: CumulativeReporterBase( _config ),
|
||||||
xml( _config.stream() ),
|
xml( _config.stream() ),
|
||||||
|
unexpectedExceptions( 0 ),
|
||||||
m_okToFail( false )
|
m_okToFail( false )
|
||||||
{
|
{
|
||||||
m_reporterPrefs.shouldRedirectStdOut = true;
|
m_reporterPrefs.shouldRedirectStdOut = true;
|
||||||
|
7
test_package/CMakeLists.txt
Normal file
7
test_package/CMakeLists.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.0)
|
||||||
|
project(CatchTest CXX)
|
||||||
|
|
||||||
|
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
|
||||||
|
conan_basic_setup()
|
||||||
|
|
||||||
|
add_executable(${CMAKE_PROJECT_NAME} MainTest.cpp)
|
21
test_package/MainTest.cpp
Normal file
21
test_package/MainTest.cpp
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* 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)
|
||||||
|
*/
|
||||||
|
#define CATCH_CONFIG_MAIN
|
||||||
|
#include "catch.hpp"
|
||||||
|
|
||||||
|
unsigned int Factorial( unsigned int number ) {
|
||||||
|
return number > 1 ? Factorial(number-1)*number : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 );
|
||||||
|
}
|
21
test_package/conanfile.py
Normal file
21
test_package/conanfile.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
from os import getenv
|
||||||
|
from os import path
|
||||||
|
from conans import ConanFile
|
||||||
|
from conans import CMake
|
||||||
|
|
||||||
|
|
||||||
|
class CatchConanTest(ConanFile):
|
||||||
|
generators = "cmake"
|
||||||
|
settings = "os", "compiler", "arch", "build_type"
|
||||||
|
username = getenv("CONAN_USERNAME", "philsquared")
|
||||||
|
channel = getenv("CONAN_CHANNEL", "testing")
|
||||||
|
requires = "Catch/1.9.7@%s/%s" % (username, channel)
|
||||||
|
|
||||||
|
def build(self):
|
||||||
|
cmake = CMake(self)
|
||||||
|
cmake.configure(build_dir="./")
|
||||||
|
cmake.build()
|
||||||
|
|
||||||
|
def test(self):
|
||||||
|
self.run(path.join("bin", "CatchTest"))
|
Reference in New Issue
Block a user