blob: 224b9302681fdb23611850dfa6015fc037edc3a7 [file] [log] [blame]
onqtam8126b562016-05-27 17:01:15 +03001<!DOCTYPE html>
2<html>
3<title>features</title>
4<xmp theme="united" style="display:none;">
5
6## Features and design goals
7
onqtam4aff18c2017-05-17 04:10:03 +03008**doctest** has been designed from the start to be as **light** and **unintrusive** as possible. These key features should be kept.
onqtam1435c012016-09-21 15:29:11 +03009
onqtam8126b562016-05-27 17:01:15 +030010## Unintrusive (transparent):
11
onqtam1435c012016-09-21 15:29:11 +030012- everything testing-related can be removed from the binary executable by defining the [**```DOCTEST_CONFIG_DISABLE```**](configuration.html#doctest_config_disable) identifier
onqtame34600e2016-11-15 02:16:56 +020013- very small and easy to integrate - single header
onqtamb8220c52017-05-16 00:21:15 +030014- **Extremely** low footprint on compile times - [**around 25ms**](benchmarks.html#cost-of-including-the-header) of compile time overhead for including the header in a file
onqtame34600e2016-11-15 02:16:56 +020015- The [**fastest possible**](benchmarks.html#cost-of-an-assertion-macro) assertion macros - 50k asserts can compile for under 30 seconds (even under 10 sec)
onqtam8126b562016-05-27 17:01:15 +030016- doesn't drag any headers when included (except for in the translation unit where the library gets implemented)
17- everything is in the ```doctest``` namespace (and the implementation details are in a nested ```detail``` namespace)
18- all macros have prefixes - some by default have unprefixed versions as well but that is optional - see [**configuration**](configuration.html)
19- 0 warnings even with the most aggresive flags (on all tested compilers!!!)
20 - ```-Weverything -pedantic``` for **clang**
onqtam4aff18c2017-05-17 04:10:03 +030021 - ```-Wall -Wextra -pedantic``` and **>> over 35 <<** other warnings **not** covered by these flags for **GCC**!!! - see [**here**](../../scripts/cmake/common.cmake#L84)
onqtam8126b562016-05-27 17:01:15 +030022 - ```/W4``` for **MSVC** (```/Wall``` is too much there - even their own headers produce **thousands** of warnings with that option)
23- doesn't error on unrecognized [**command line**](commandline.html) options and supports prefixes for interop with client command line parsing
24- can set options [**procedurally**](main.html) and not deal with passing ```argc```/```argv``` from the command line
25- doesn't leave warnings disabled after itself
26
27## Extremely portable:
28
29- Standards compliant **C++98** code - should work with any **C++98** compiler
onqtam4aff18c2017-05-17 04:10:03 +030030- tested with **GCC**: **4.4**, **4.5**, **4.6**, **4.7**, **4.8**, **4.9**, **5**, **6**, **7**
onqtam6ff3d352017-09-11 14:35:06 +030031- tested with **Clang**: **3.5**, **3.6**, **3.7**, **3.8**, **3.9**, **4**, **5**
onqtamb8220c52017-05-16 00:21:15 +030032- tested with **MSVC**: **2008**, **2010**, **2012**, **2013**, **2015**, **2017**
onqtam8126b562016-05-27 17:01:15 +030033- per-commit tested on **travis** and **appveyor** CI services
onqtam375568c2017-05-17 04:19:58 +030034 - warnings as errors even on the most aggressive warning levels - see [**here**](../../scripts/cmake/common.cmake#L84)
onqtam0c65bef2017-09-11 15:34:43 +030035 - statically analyzed on the CI - [**Cppcheck**](http://cppcheck.sourceforge.net/) / [**Clang-Tidy**](http://oclint.org/) / [**Coverity Scan**](https://scan.coverity.com/) / [**OCLint**](https://scan.coverity.com/) / [**Visual Studio Analyzer**](https://docs.microsoft.com/en-us/visualstudio/code-quality/analyzing-c-cpp-code-quality-by-using-code-analysis)
onqtam8126b562016-05-27 17:01:15 +030036 - all tests have their output compared to reference output of a previous known good run
37 - all tests built and ran in **Debug**/**Release** and also in **32**/**64** bit modes
38 - all tests ran through **valgrind** under **Linux**/**OSX**
39 - all tests ran through **address** and **UB** sanitizers under **Linux**/**OSX**
onqtam6ff3d352017-09-11 14:35:06 +030040 - tests are ran in more than **330** different configurations on UNIX (Linux + OSX) on **travis** CI
onqtamb8220c52017-05-16 00:21:15 +030041 - tests are ran in a total of **24** different configurations on Windows on **appveyor** CI
onqtam8126b562016-05-27 17:01:15 +030042
43## Other features:
44
45- really easy to get started - it's just 1 header file - see the [**tutorial**](tutorial.html)
46- **very** light, unintrusive and portable - see the sections above - and also the [**benchmarks**](benchmarks.html)
onqtam1435c012016-09-21 15:29:11 +030047- offers a way to remove **everything** testing-related from the binary with the [**```DOCTEST_CONFIG_DISABLE```**](configuration.html#doctest_config_disable) macro
onqtam8126b562016-05-27 17:01:15 +030048- tests are registered automatically - no need to add them to a collection manually
onqtamb8220c52017-05-16 00:21:15 +030049- [**Subcases**](tutorial.html#test-cases-and-subcases) - an intuitive way to share common setup and teardown code for test cases (alternative to [**test fixtures**](testcases.html#test-fixtures) which are also supported)
50- [**templated test cases**](parameterized-tests.html#templated-test-cases---parameterized-by-type) - parameterized by type
51- supports [**logging macros**](logging.html) for capturing local variables and strings - as a message for when an assert fails - with lazy stringification and no allocations when possible!
52- crash handling support - uses signals for UNIX and SEH for Windows
onqtam8126b562016-05-27 17:01:15 +030053- output from all compilers on all platforms is the same - byte by byte
onqtamb8220c52017-05-16 00:21:15 +030054- binaries (exe/dll) can use the test runner of another binary - so tests end up in a single registry - [**example**](../../examples/executable_dll_and_plugin/)
onqtam8126b562016-05-27 17:01:15 +030055- supports [**BDD style**](testcases.html) tests
onqtamb8220c52017-05-16 00:21:15 +030056- one core [**assertion macro**](assertions.html) for comparisons - standard C++ operators are used for the comparison (less than, equal, greater than...) - yet the full expression is decomposed and left and right values of the expression are logged
onqtam8126b562016-05-27 17:01:15 +030057- assertion macros for [**exceptions**](assertions.html) - if something should or shouldn't throw
58- floating point comparison support - see the [**```Approx()```**](assertions.html#floating-point-comparisons) helper
onqtamb8220c52017-05-16 00:21:15 +030059- powerful mechanism for [**stringification**](stringification.html) of user types - including [**exceptions**](stringification.html#translating-exceptions)!
60- tests can be grouped in [**test suites**](testcases.html#test-suites)
61- test case [**decorators**](testcases.html#decorators) such as ```description``` / ```skip``` / ```may_fail``` / ```should_fail``` / ```expected_failures``` / ```timeout```
62- can be used without exceptions and rtti - checkout [**```DOCTEST_CONFIG_NO_EXCEPTIONS```**](configuration.html#doctest_config_no_exceptions)
onqtam8126b562016-05-27 17:01:15 +030063- powerful [**command line**](commandline.html) with lots of options
onqtamb8220c52017-05-16 00:21:15 +030064- can report the duration of test cases
onqtam8126b562016-05-27 17:01:15 +030065- tests can be [**filtered**](commandline.html) based on their name/file/test suite using wildcards
onqtamb8220c52017-05-16 00:21:15 +030066- can [**filter**](commandline.html) subcases using wildcards and by specifying the nesting levels for which those filters should work
onqtam8126b562016-05-27 17:01:15 +030067- failures can (optionally) break into the debugger on Windows and Mac
68- integration with the output window of Visual Studio for failing tests
onqtam1435c012016-09-21 15:29:11 +030069- a ```main()``` can be provided when implementing the library with the [**```DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN```**](main.html#doctest_config_implement_with_main) identifier
onqtam8126b562016-05-27 17:01:15 +030070- can write tests in headers - they will still be registered only once in the executable/shared object
onqtamb8220c52017-05-16 00:21:15 +030071- [**range-based**](commandline.html) execution of tests - see the [**example python script**](../../examples/range_based_execution.py)
onqtam8126b562016-05-27 17:01:15 +030072- colored output in the console
73- controlling the order of test execution
onqtamb8220c52017-05-16 00:21:15 +030074- different ```doctest::Context```s can be created and ran many times within a single execution of the program
75- ability to query if code is currently being ran in a test - ```doctest::isRunningInTest()```
onqtam8126b562016-05-27 17:01:15 +030076
77There is a list of planned features which are all important and big - see the [**roadmap**](roadmap.html).
78
79---------------
80
81[Home](readme.html#reference)
82
83
84</xmp>
85<script src="strapdown.js/strapdown.js"></script>
86</html>