[osrm] 13/22: Imported Upstream version 5.0.2+ds0
Sebastiaan Couwenberg
sebastic at moszumanska.debian.org
Fri Apr 29 22:44:15 UTC 2016
This is an automated email from the git hooks/post-receive script.
sebastic pushed a commit to branch master
in repository osrm.
commit 7a004d15e190d205020b0acd2ed1f0c85ff04537
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date: Fri Apr 29 23:52:32 2016 +0200
Imported Upstream version 5.0.2+ds0
---
third_party/variant/.clang-format | 89 -
third_party/variant/.gitignore | 8 -
third_party/variant/.travis.yml | 127 -
third_party/variant/.ycm_extra_conf.py | 40 -
third_party/variant/Jamroot | 73 -
third_party/variant/LICENSE | 25 -
third_party/variant/LICENSE_1_0.txt | 23 -
third_party/variant/Makefile | 110 -
third_party/variant/README.md | 111 -
third_party/variant/appveyor.yml | 17 -
third_party/variant/common.gypi | 143 -
third_party/variant/doc/other_implementations.md | 15 -
third_party/variant/doc/standards_effort.md | 28 -
third_party/variant/optional.hpp | 74 -
third_party/variant/recursive_wrapper.hpp | 122 -
third_party/variant/scripts/build-appveyor.bat | 32 -
third_party/variant/scripts/build-local.bat | 7 -
.../scripts/run_compilation_failure_tests.sh | 50 -
third_party/variant/test/bench_variant.cpp | 185 -
third_party/variant/test/binary_visitor_test.cpp | 138 -
.../variant/test/boost_variant_hello_world.cpp | 20 -
.../compilation_failure/default_constructor.cpp | 22 -
.../test/compilation_failure/empty_typelist.cpp | 11 -
.../variant/test/compilation_failure/equality.cpp | 11 -
.../variant/test/compilation_failure/get_type.cpp | 10 -
.../variant/test/compilation_failure/is_type.cpp | 10 -
.../mutating_visitor_on_const.cpp | 24 -
.../test/compilation_failure/no-reference.cpp | 9 -
third_party/variant/test/include/catch.hpp | 11613 -------------------
.../variant/test/our_variant_hello_world.cpp | 20 -
.../variant/test/recursive_wrapper_test.cpp | 125 -
.../variant/test/reference_wrapper_test.cpp | 76 -
third_party/variant/test/t/binary_visitor_1.cpp | 7 -
third_party/variant/test/t/binary_visitor_2.cpp | 7 -
third_party/variant/test/t/binary_visitor_3.cpp | 7 -
third_party/variant/test/t/binary_visitor_4.cpp | 7 -
third_party/variant/test/t/binary_visitor_5.cpp | 7 -
third_party/variant/test/t/binary_visitor_6.cpp | 7 -
third_party/variant/test/t/binary_visitor_impl.hpp | 204 -
third_party/variant/test/t/issue21.cpp | 48 -
third_party/variant/test/t/mutating_visitor.cpp | 36 -
third_party/variant/test/t/optional.cpp | 102 -
third_party/variant/test/t/recursive_wrapper.cpp | 158 -
third_party/variant/test/t/sizeof.cpp | 52 -
third_party/variant/test/t/unary_visitor.cpp | 127 -
third_party/variant/test/t/variant.cpp | 570 -
third_party/variant/test/unique_ptr_test.cpp | 126 -
third_party/variant/test/unit.cpp | 2 -
third_party/variant/variant.gyp | 35 -
third_party/variant/variant.hpp | 901 --
third_party/variant/variant_io.hpp | 45 -
51 files changed, 15816 deletions(-)
diff --git a/third_party/variant/.clang-format b/third_party/variant/.clang-format
deleted file mode 100644
index c1aca2a..0000000
--- a/third_party/variant/.clang-format
+++ /dev/null
@@ -1,89 +0,0 @@
----
-# Mapbox.Variant C/C+ style
-Language: Cpp
-AccessModifierOffset: -2
-AlignAfterOpenBracket: Align
-AlignConsecutiveAssignments: false
-AlignConsecutiveDeclarations: false
-AlignEscapedNewlinesLeft: false
-AlignOperands: true
-AlignTrailingComments: true
-AllowAllParametersOfDeclarationOnNextLine: true
-AllowShortBlocksOnASingleLine: false
-AllowShortCaseLabelsOnASingleLine: false
-AllowShortFunctionsOnASingleLine: All
-AllowShortIfStatementsOnASingleLine: true
-AllowShortLoopsOnASingleLine: true
-AlwaysBreakAfterDefinitionReturnType: None
-AlwaysBreakAfterReturnType: None
-AlwaysBreakBeforeMultilineStrings: false
-AlwaysBreakTemplateDeclarations: true
-BinPackArguments: true
-BinPackParameters: true
-BraceWrapping:
- AfterClass: true
- AfterControlStatement: true
- AfterEnum: true
- AfterFunction: true
- AfterNamespace: false
- AfterObjCDeclaration: true
- AfterStruct: true
- AfterUnion: true
- BeforeCatch: true
- BeforeElse: true
- IndentBraces: false
-BreakBeforeBinaryOperators: None
-BreakBeforeBraces: Custom
-BreakBeforeTernaryOperators: true
-BreakConstructorInitializersBeforeComma: false
-ColumnLimit: 0
-CommentPragmas: '^ IWYU pragma:'
-ConstructorInitializerAllOnOneLineOrOnePerLine: true
-ConstructorInitializerIndentWidth: 4
-ContinuationIndentWidth: 4
-Cpp11BracedListStyle: true
-DerivePointerAlignment: false
-DisableFormat: false
-ExperimentalAutoDetectBinPacking: false
-ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
-IncludeCategories:
- - Regex: '^"(llvm|llvm-c|clang|clang-c)/'
- Priority: 2
- - Regex: '^(<|"(gtest|isl|json)/)'
- Priority: 3
- - Regex: '.*'
- Priority: 1
-IndentCaseLabels: false
-IndentWidth: 4
-IndentWrappedFunctionNames: false
-KeepEmptyLinesAtTheStartOfBlocks: true
-MacroBlockBegin: ''
-MacroBlockEnd: ''
-MaxEmptyLinesToKeep: 1
-NamespaceIndentation: None
-ObjCBlockIndentWidth: 2
-ObjCSpaceAfterProperty: false
-ObjCSpaceBeforeProtocolList: true
-PenaltyBreakBeforeFirstCallParameter: 19
-PenaltyBreakComment: 300
-PenaltyBreakFirstLessLess: 120
-PenaltyBreakString: 1000
-PenaltyExcessCharacter: 1000000
-PenaltyReturnTypeOnItsOwnLine: 60
-PointerAlignment: Left
-ReflowComments: true
-SortIncludes: true
-SpaceAfterCStyleCast: false
-SpaceBeforeAssignmentOperators: true
-SpaceBeforeParens: ControlStatements
-SpaceInEmptyParentheses: false
-SpacesBeforeTrailingComments: 1
-SpacesInAngles: false
-SpacesInContainerLiterals: true
-SpacesInCStyleCastParentheses: false
-SpacesInParentheses: false
-SpacesInSquareBrackets: false
-Standard: Cpp11
-TabWidth: 4
-UseTab: Never
-...
diff --git a/third_party/variant/.gitignore b/third_party/variant/.gitignore
deleted file mode 100644
index a9bc860..0000000
--- a/third_party/variant/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.DS_Store
-out
-profiling
-build
-deps
-*.gcda
-*.gcno
-.ycm_extra_conf.pyc
diff --git a/third_party/variant/.travis.yml b/third_party/variant/.travis.yml
deleted file mode 100644
index 99d0b48..0000000
--- a/third_party/variant/.travis.yml
+++ /dev/null
@@ -1,127 +0,0 @@
-language: c
-
-sudo: false
-
-# Save common build configurations as shortcuts, so we can reference them later.
-addons_shortcuts:
- addons_clang35: &clang35
- apt:
- sources: [ 'ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.5', 'boost-latest' ]
- packages: [ 'clang-3.5', 'libboost1.55-all-dev' ]
- addons_clang36: &clang36
- apt:
- sources: [ 'ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.6', 'boost-latest' ]
- packages: [ 'clang-3.6', 'libboost1.55-all-dev' ]
- addons_clang37: &clang37
- apt:
- sources: [ 'ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.7', 'boost-latest' ]
- packages: [ 'clang-3.7', 'libboost1.55-all-dev' ]
- addons_clang38: &clang38
- apt:
- sources: [ 'ubuntu-toolchain-r-test', 'llvm-toolchain-precise', 'boost-latest' ]
- packages: [ 'clang-3.8', 'libboost1.55-all-dev']
- addons_gcc47: &gcc47
- apt:
- sources: [ 'ubuntu-toolchain-r-test', 'boost-latest' ]
- packages: [ 'g++-4.7', 'libboost1.55-all-dev' ]
- addons_gcc48: &gcc48
- apt:
- sources: [ 'ubuntu-toolchain-r-test', 'boost-latest' ]
- packages: [ 'g++-4.8', 'libboost1.55-all-dev' ]
- addons_gcc49: &gcc49
- apt:
- sources: [ 'ubuntu-toolchain-r-test', 'boost-latest' ]
- packages: [ 'g++-4.9', 'libboost1.55-all-dev' ]
- addons_gcc5: &gcc5
- apt:
- sources: [ 'ubuntu-toolchain-r-test', 'boost-latest' ]
- packages: [ 'g++-5', 'libboost1.55-all-dev' ]
-
-matrix:
- include:
- - os: osx
- osx_image: xcode6
- compiler: clang
- - os: osx
- osx_image: xcode7
- env: TEST_GYP_BUILD=True
- compiler: clang
- - os: linux
- compiler: "clang35"
- env: CXX=clang++-3.5
- addons: *clang35
- - os: linux
- compiler: "clang36"
- env: CXX=clang++-3.6
- addons: *clang36
- - os: linux
- compiler: "clang37"
- env: CXX=clang++-3.7 COVERAGE=True
- addons: *clang37
- - os: linux
- compiler: "clang38"
- env: CXX=clang++-3.8
- addons: *clang38
- - os: linux
- compiler: "clang38"
- env: CXX=clang++-3.8 CXX_STD=c++14
- addons: *clang38
- - os: linux
- compiler: "gcc47"
- env: CXX=g++-4.7
- addons: *gcc47
- - os: linux
- compiler: "gcc48"
- env: CXX=g++-4.8
- addons: *gcc48
- - os: linux
- compiler: "gcc49"
- env: CXX=g++-4.9
- addons: *gcc49
- - os: linux
- compiler: "gcc49"
- env: CXX=g++-4.9 CXX_STD=c++14
- addons: *gcc49
- - os: linux
- compiler: "gcc5"
- env: CXX=g++-5 CXXFLAGS="-D_GLIBCXX_USE_CXX11_ABI=0"
- addons: *gcc5
- - os: linux
- compiler: "gcc5"
- env: CXX=g++-5 CXXFLAGS="-D_GLIBCXX_USE_CXX11_ABI=1"
- addons: *gcc5
-
-before_install:
- - echo ${CXX}
- - if [[ $(uname -s) == 'Linux' ]]; then
- export PYTHONPATH=$(pwd)/.local/lib/python2.7/site-packages;
- else
- brew install boost;
- export PYTHONPATH=$(pwd)/.local/lib/python/site-packages;
- fi
- - if [[ ${COVERAGE:-0} == 'True' ]]; then
- PYTHONUSERBASE=$(pwd)/.local pip install --user cpp-coveralls;
- fi
-
-install:
- - make test
- - make bench
- - if [[ $(uname -s) == 'Linux' ]]; then
- make sizes /usr/include/boost/variant.hpp;
- else
- make sizes `brew --prefix`/include/boost/variant.hpp;
- fi
- - scripts/run_compilation_failure_tests.sh
- - if [[ ${TEST_GYP_BUILD:-0} == 'True' ]]; then
- make clean;
- make gyp;
- fi
-
-script:
- - if [[ ${COVERAGE:-0} == 'True' ]]; then
- make clean;
- make coverage;
- ./out/cov-test;
- cp unit*gc* test/;
- ./.local/bin/cpp-coveralls -i optional.hpp -i recursive_wrapper.hpp -i variant.hpp -i variant_io.hpp --gcov-options '\-lp';
- fi
diff --git a/third_party/variant/.ycm_extra_conf.py b/third_party/variant/.ycm_extra_conf.py
deleted file mode 100644
index ba74668..0000000
--- a/third_party/variant/.ycm_extra_conf.py
+++ /dev/null
@@ -1,40 +0,0 @@
-#-----------------------------------------------------------------------------
-#
-# Configuration for YouCompleteMe Vim plugin
-#
-# http://valloric.github.io/YouCompleteMe/
-#
-#-----------------------------------------------------------------------------
-
-from os.path import realpath, dirname
-
-basedir = dirname(realpath(__file__))
-
-# some default flags
-# for more information install clang-3.2-doc package and
-# check UsersManual.html
-flags = [
-'-Werror',
-'-Wall',
-'-Wextra',
-'-pedantic',
-
-'-std=c++11',
-
-# '-x' and 'c++' also required
-# use 'c' for C projects
-'-x',
-'c++',
-
-# include third party libraries
-'-I.',
-]
-
-# youcompleteme is calling this function to get flags
-# You can also set database for flags. Check: JSONCompilationDatabase.html in
-# clang-3.2-doc package
-def FlagsForFile( filename ):
- return {
- 'flags': flags,
- 'do_cache': True
- }
diff --git a/third_party/variant/Jamroot b/third_party/variant/Jamroot
deleted file mode 100644
index 1e98cf5..0000000
--- a/third_party/variant/Jamroot
+++ /dev/null
@@ -1,73 +0,0 @@
-# Inofficial and incomplete build file using Boost build system.
-# You should use make unless you know what you are doing.
-
-local BOOST_DIR = "/usr/local" ;
-
-#using clang : : ;
-
-lib system : : <name>boost_system <search>$(BOOST_DIR)/lib ;
-lib timer : chrono : <name>boost_timer <search>$(BOOST_DIR)/lib ;
-lib chrono : system : <name>boost_chrono <search>$(BOOST_DIR)/lib ;
-
-exe variant-test
- :
- test/bench_variant.cpp
- .//system
- .//timer
- .//chrono
- :
- <include>$(BOOST_DIR)/include
- <include>./
- #<define>SINGLE_THREADED
- <variant>release:<cxxflags>-march=native
- ;
-
-
-exe binary-visitor-test
- :
- test/binary_visitor_test.cpp
- .//system
- .//timer
- .//chrono
- :
- <include>$(BOOST_DIR)/include
- <include>./
- <variant>release:<cxxflags>-march=native
- ;
-
-exe recursive-wrapper-test
- :
- test/recursive_wrapper_test.cpp
- .//system
- .//timer
- .//chrono
- :
- <include>$(BOOST_DIR)/include
- <include>./
- <variant>release:<cxxflags>-march=native
- ;
-
-exe unique-ptr-test
- :
- test/unique_ptr_test.cpp
- .//system
- .//timer
- .//chrono
- :
- <include>$(BOOST_DIR)/include
- <include>./
- <variant>release:<cxxflags>-march=native
- ;
-
-
-exe reference_wrapper_test
- :
- test/reference_wrapper_test.cpp
- .//system
- .//timer
- .//chrono
- :
- <include>$(BOOST_DIR)/include
- <include>./
- <variant>release:<cxxflags>-march=native
- ;
diff --git a/third_party/variant/LICENSE b/third_party/variant/LICENSE
deleted file mode 100644
index 6c4ce40..0000000
--- a/third_party/variant/LICENSE
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) MapBox
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-- Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-- Redistributions in binary form must reproduce the above copyright notice, this
- list of conditions and the following disclaimer in the documentation and/or
- other materials provided with the distribution.
-- Neither the name "MapBox" nor the names of its contributors may be
- used to endorse or promote products derived from this software without
- specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/third_party/variant/LICENSE_1_0.txt b/third_party/variant/LICENSE_1_0.txt
deleted file mode 100644
index 36b7cd9..0000000
--- a/third_party/variant/LICENSE_1_0.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
diff --git a/third_party/variant/Makefile b/third_party/variant/Makefile
deleted file mode 100644
index 3665251..0000000
--- a/third_party/variant/Makefile
+++ /dev/null
@@ -1,110 +0,0 @@
-
-CXX := $(CXX)
-CXX_STD ?= c++11
-
-BOOST_LIBS = -lboost_timer -lboost_system -lboost_chrono
-RELEASE_FLAGS = -O3 -DNDEBUG -march=native -DSINGLE_THREADED -fvisibility-inlines-hidden
-DEBUG_FLAGS = -O0 -g -DDEBUG -fno-inline-functions
-COMMON_FLAGS = -Wall -pedantic -Wextra -Wsign-compare -Wsign-conversion -Wshadow -Wunused-parameter -std=$(CXX_STD)
-CXXFLAGS := $(CXXFLAGS)
-LDFLAGS := $(LDFLAGS)
-
-OS:=$(shell uname -s)
-ifeq ($(OS),Darwin)
- CXXFLAGS += -stdlib=libc++
- LDFLAGS += -stdlib=libc++ -F/ -framework CoreFoundation
-else
- BOOST_LIBS += -lrt
-endif
-
-ifeq (sizes,$(firstword $(MAKECMDGOALS)))
- RUN_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
- $(eval $(RUN_ARGS):;@:)
- ifndef RUN_ARGS
- $(error sizes target requires you pass full path to boost variant.hpp)
- endif
- .PHONY: $(RUN_ARGS)
-endif
-
-all: out/bench-variant out/unique_ptr_test out/unique_ptr_test out/recursive_wrapper_test out/binary_visitor_test
-
-./deps/gyp:
- git clone --depth 1 https://chromium.googlesource.com/external/gyp.git ./deps/gyp
-
-gyp: ./deps/gyp
- deps/gyp/gyp --depth=. -Goutput_dir=./ --generator-output=./out -f make
- make V=1 -C ./out tests
- ./out/Release/tests
-
-out/bench-variant-debug: Makefile test/bench_variant.cpp variant.hpp recursive_wrapper.hpp
- mkdir -p ./out
- $(CXX) -o out/bench-variant-debug test/bench_variant.cpp -I./ -pthreads $(DEBUG_FLAGS) $(COMMON_FLAGS) $(CXXFLAGS) $(LDFLAGS) $(BOOST_LIBS)
-
-out/bench-variant: Makefile test/bench_variant.cpp variant.hpp recursive_wrapper.hpp
- mkdir -p ./out
- $(CXX) -o out/bench-variant test/bench_variant.cpp -I./ $(RELEASE_FLAGS) $(COMMON_FLAGS) $(CXXFLAGS) $(LDFLAGS) $(BOOST_LIBS)
-
-out/unique_ptr_test: Makefile test/unique_ptr_test.cpp variant.hpp recursive_wrapper.hpp
- mkdir -p ./out
- $(CXX) -o out/unique_ptr_test test/unique_ptr_test.cpp -I./ $(RELEASE_FLAGS) $(COMMON_FLAGS) $(CXXFLAGS) $(LDFLAGS) $(BOOST_LIBS)
-
-out/recursive_wrapper_test: Makefile test/recursive_wrapper_test.cpp variant.hpp recursive_wrapper.hpp
- mkdir -p ./out
- $(CXX) -o out/recursive_wrapper_test test/recursive_wrapper_test.cpp -I./ $(RELEASE_FLAGS) $(COMMON_FLAGS) $(CXXFLAGS) $(LDFLAGS) $(BOOST_LIBS)
-
-out/binary_visitor_test: Makefile test/binary_visitor_test.cpp variant.hpp variant_io.hpp recursive_wrapper.hpp
- mkdir -p ./out
- $(CXX) -o out/binary_visitor_test test/binary_visitor_test.cpp -I./ $(RELEASE_FLAGS) $(COMMON_FLAGS) $(CXXFLAGS) $(LDFLAGS) $(BOOST_LIBS)
-
-bench: out/bench-variant out/unique_ptr_test out/unique_ptr_test out/recursive_wrapper_test out/binary_visitor_test
- ./out/bench-variant 100000
- ./out/unique_ptr_test 100000
- ./out/recursive_wrapper_test 100000
- ./out/binary_visitor_test 100000
-
-out/unit.o: Makefile test/unit.cpp
- mkdir -p ./out
- $(CXX) -c -o $@ test/unit.cpp -Itest/include $(DEBUG_FLAGS) $(COMMON_FLAGS) $(CXXFLAGS)
-
-out/%.o: test/t/%.cpp Makefile optional.hpp recursive_wrapper.hpp variant.hpp variant_io.hpp
- mkdir -p ./out
- $(CXX) -c -o $@ $< -I. -Itest/include $(DEBUG_FLAGS) $(COMMON_FLAGS) $(CXXFLAGS)
-
-out/unit: out/unit.o out/binary_visitor_1.o out/binary_visitor_2.o out/binary_visitor_3.o out/binary_visitor_4.o out/binary_visitor_5.o out/binary_visitor_6.o out/issue21.o out/mutating_visitor.o out/optional.o out/recursive_wrapper.o out/sizeof.o out/unary_visitor.o out/variant.o
- mkdir -p ./out
- $(CXX) -o $@ $^ $(LDFLAGS)
-
-test: out/unit
- ./out/unit
-
-coverage:
- mkdir -p ./out
- $(CXX) -o out/cov-test --coverage test/unit.cpp test/t/*.cpp -I./ -Itest/include $(DEBUG_FLAGS) $(COMMON_FLAGS) $(CXXFLAGS) $(LDFLAGS)
-
-sizes: Makefile variant.hpp recursive_wrapper.hpp
- mkdir -p ./out
- @$(CXX) -o ./out/our_variant_hello_world.out variant.hpp $(RELEASE_FLAGS) $(COMMON_FLAGS) $(CXXFLAGS) && du -h ./out/our_variant_hello_world.out
- @$(CXX) -o ./out/boost_variant_hello_world.out $(RUN_ARGS) $(RELEASE_FLAGS) $(COMMON_FLAGS) $(CXXFLAGS) && du -h ./out/boost_variant_hello_world.out
- @$(CXX) -o ./out/our_variant_hello_world ./test/our_variant_hello_world.cpp -I./ $(RELEASE_FLAGS) $(COMMON_FLAGS) $(CXXFLAGS) && du -h ./out/our_variant_hello_world
- @$(CXX) -o ./out/boost_variant_hello_world ./test/boost_variant_hello_world.cpp -I./ $(RELEASE_FLAGS) $(COMMON_FLAGS) $(CXXFLAGS) && du -h ./out/boost_variant_hello_world
-
-profile: out/bench-variant-debug
- mkdir -p profiling/
- rm -rf profiling/*
- iprofiler -timeprofiler -d profiling/ ./out/bench-variant-debug 500000
-
-clean:
- rm -rf ./out
- rm -rf *.dSYM
- rm -f unit.gc*
- rm -f *gcov
- rm -f test/unit.gc*
- rm -f test/*gcov
- rm -f *.gcda *.gcno
-
-pgo: out Makefile variant.hpp recursive_wrapper.hpp
- $(CXX) -o out/bench-variant test/bench_variant.cpp -I./ $(RELEASE_FLAGS) $(COMMON_FLAGS) $(CXXFLAGS) $(LDFLAGS) $(BOOST_LIBS) -pg -fprofile-generate
- ./test-variant 500000 >/dev/null 2>/dev/null
- $(CXX) -o out/bench-variant test/bench_variant.cpp -I./ $(RELEASE_FLAGS) $(COMMON_FLAGS) $(CXXFLAGS) $(LDFLAGS) $(BOOST_LIBS) -fprofile-use
-
-.PHONY: sizes test
diff --git a/third_party/variant/README.md b/third_party/variant/README.md
deleted file mode 100644
index 24cdb57..0000000
--- a/third_party/variant/README.md
+++ /dev/null
@@ -1,111 +0,0 @@
-# Mapbox Variant
-
-An alternative to `boost::variant` for C++11.
-
-[![Build Status](https://secure.travis-ci.org/mapbox/variant.svg)](https://travis-ci.org/mapbox/variant)
-[![Build status](https://ci.appveyor.com/api/projects/status/v9tatx21j1k0fcgy)](https://ci.appveyor.com/project/Mapbox/variant)
-[![Coverage Status](https://coveralls.io/repos/mapbox/variant/badge.svg?branch=master&service=github)](https://coveralls.io/r/mapbox/variant?branch=master)
-
-
-## Why use Mapbox Variant?
-
-Mapbox variant has the same speedy performance of `boost::variant` but is
-faster to compile, results in smaller binaries, and has no dependencies.
-
-For example on OS X 10.9 with clang++ and libc++:
-
-Test | Mapbox Variant | Boost Variant
----- | -------------- | -------------
-Size of pre-compiled header (release / debug) | 2.8/2.8 MB | 12/15 MB
-Size of simple program linking variant (release / debug) | 8/24 K | 12/40 K
-Time to compile header | 185 ms | 675 ms
-
-(Numbers from an older version of Mapbox variant.)
-
-
-## Goals
-
-Mapbox `variant` has been a very valuable, lightweight alternative for apps
-that can use c++11 or c++14 but that do not want a boost dependency.
-Mapbox `variant` has also been useful in apps that do depend on boost, like
-mapnik, to help (slightly) with compile times and to majorly lessen dependence
-on boost in core headers. The original goal and near term goal is to maintain
-external API compatibility with `boost::variant` such that Mapbox `variant`
-can be a "drop in". At the same time the goal is to stay minimal: Only
-implement the features that are actually needed in existing software. So being
-an "incomplete" implementation is just fine.
-
-Currently Mapbox variant doesn't try to be API compatible with the upcoming
-variant standard, because the standard is not finished and it would be too much
-work. But we'll revisit this decision in the future if needed.
-
-If Mapbox variant is not for you, have a look at [these other
-implementations](doc/other_implementations.md).
-
-Want to know more about the upcoming standard? Have a look at our
-[overview](doc/standards_effort.md).
-
-
-## Depends
-
- - Compiler supporting `-std=c++11` or `-std=c++14`
-
-Tested with:
-
- - g++-4.7
- - g++-4.8
- - g++-4.9
- - g++-5
- - clang++-3.5
- - clang++-3.6
- - clang++-3.7
- - clang++-3.8
- - Visual Studio 2015
-
-## Usage
-
-There is nothing to build, just include `variant.hpp` and
-`recursive_wrapper.hpp` in your project. Include `variant_io.hpp` if you need
-the `operator<<` overload for variant.
-
-
-## Unit Tests
-
-On Unix systems compile and run the unit tests with `make test`.
-
-On Windows run `scripts/build-local.bat`.
-
-
-## Limitations
-
-* The `variant` can not hold references (something like `variant<int&>` is
- not possible). You might want to try `std::reference_wrapper` instead.
-
-
-## Deprecations
-
-* The included implementation of `optional` is deprecated and will be removed
- in a future version. See https://github.com/mapbox/variant/issues/64.
-* Old versions of the code needed visitors to derive from `static_visitor`.
- This is not needed any more and marked as deprecated. The `static_visitor`
- class will be removed in future versions.
-
-
-## Benchmarks
-
-The benchmarks depend on:
-
- - Boost headers (for benchmarking against `boost::variant`)
- - Boost built with `--with-timer` (used for benchmark timing)
-
-On Unix systems set your boost includes and libs locations and run `make test`:
-
- export LDFLAGS='-L/opt/boost/lib'
- export CXXFLAGS='-I/opt/boost/include'
- make bench
-
-
-## Check object sizes
-
- make sizes /path/to/boost/variant.hpp
-
diff --git a/third_party/variant/appveyor.yml b/third_party/variant/appveyor.yml
deleted file mode 100644
index 050ad25..0000000
--- a/third_party/variant/appveyor.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-platform:
- - x64
- - x86
-
-configuration:
- - Debug
- - Release
-
-os: Visual Studio 2015
-
-install:
- - CALL scripts\build-appveyor.bat
-
-build: off
-test: off
-deploy: off
diff --git a/third_party/variant/common.gypi b/third_party/variant/common.gypi
deleted file mode 100644
index d4f09f8..0000000
--- a/third_party/variant/common.gypi
+++ /dev/null
@@ -1,143 +0,0 @@
-{
- "conditions": [
- ["OS=='win'", {
- "target_defaults": {
- "default_configuration": "Release_x64",
- "msbuild_toolset":"v140",
- "msvs_settings": {
- "VCCLCompilerTool": {
- "ExceptionHandling": 1, # /EHsc
- "RuntimeTypeInfo": "true" # /GR
- }
- },
- "configurations": {
- "Debug_Win32": {
- "msvs_configuration_platform": "Win32",
- "defines": [ "DEBUG","_DEBUG"],
- "msvs_settings": {
- "VCCLCompilerTool": {
- "RuntimeLibrary": "1", # static debug /MTd
- "Optimization": 0, # /Od, no optimization
- "MinimalRebuild": "false",
- "OmitFramePointers": "false",
- "BasicRuntimeChecks": 3 # /RTC1
- }
- }
- },
- "Debug_x64": {
- "msvs_configuration_platform": "x64",
- "defines": [ "DEBUG","_DEBUG"],
- "msvs_settings": {
- "VCCLCompilerTool": {
- "RuntimeLibrary": "1", # static debug /MTd
- "Optimization": 0, # /Od, no optimization
- "MinimalRebuild": "false",
- "OmitFramePointers": "false",
- "BasicRuntimeChecks": 3 # /RTC1
- }
- }
- },
- "Release_Win32": {
- "msvs_configuration_platform": "Win32",
- "defines": [ "NDEBUG"],
- "msvs_settings": {
- "VCCLCompilerTool": {
- "RuntimeLibrary": 0, # static release
- "Optimization": 3, # /Ox, full optimization
- "FavorSizeOrSpeed": 1, # /Ot, favour speed over size
- "InlineFunctionExpansion": 2, # /Ob2, inline anything eligible
- "WholeProgramOptimization": "true", # /GL, whole program optimization, needed for LTCG
- "OmitFramePointers": "true",
- "EnableFunctionLevelLinking": "true",
- "EnableIntrinsicFunctions": "true",
- "AdditionalOptions": [
- "/MP", # compile across multiple CPUs
- ],
- "DebugInformationFormat": "0"
- },
- "VCLibrarianTool": {
- "AdditionalOptions": [
- "/LTCG" # link time code generation
- ],
- },
- "VCLinkerTool": {
- "LinkTimeCodeGeneration": 1, # link-time code generation
- "OptimizeReferences": 2, # /OPT:REF
- "EnableCOMDATFolding": 2, # /OPT:ICF
- "LinkIncremental": 1, # disable incremental linking
- "GenerateDebugInformation": "false"
- }
- }
- },
- "Release_x64": {
- "msvs_configuration_platform": "x64",
- "defines": [ "NDEBUG"],
- "msvs_settings": {
- "VCCLCompilerTool": {
- "RuntimeLibrary": 0, # static release
- "Optimization": 3, # /Ox, full optimization
- "FavorSizeOrSpeed": 1, # /Ot, favour speed over size
- "InlineFunctionExpansion": 2, # /Ob2, inline anything eligible
- "WholeProgramOptimization": "true", # /GL, whole program optimization, needed for LTCG
- "OmitFramePointers": "true",
- "EnableFunctionLevelLinking": "true",
- "EnableIntrinsicFunctions": "true",
- "AdditionalOptions": [
- "/MP", # compile across multiple CPUs
- ],
- "DebugInformationFormat": "0"
- },
- "VCLibrarianTool": {
- "AdditionalOptions": [
- "/LTCG" # link time code generation
- ],
- },
- "VCLinkerTool": {
- "LinkTimeCodeGeneration": 1, # link-time code generation
- "OptimizeReferences": 2, # /OPT:REF
- "EnableCOMDATFolding": 2, # /OPT:ICF
- "LinkIncremental": 1, # disable incremental linking
- "GenerateDebugInformation": "false"
- }
- }
- }
- }
- }
- }, {
- "target_defaults": {
- "default_configuration": "Release",
- "xcode_settings": {
- "CLANG_CXX_LIBRARY": "libc++",
- "CLANG_CXX_LANGUAGE_STANDARD":"c++11",
- "GCC_VERSION": "com.apple.compilers.llvm.clang.1_0",
- },
- "cflags_cc": ["-std=c++11"],
- "configurations": {
- "Debug": {
- "defines": [
- "DEBUG"
- ],
- "xcode_settings": {
- "GCC_OPTIMIZATION_LEVEL": "0",
- "GCC_GENERATE_DEBUGGING_SYMBOLS": "YES",
- "OTHER_CPLUSPLUSFLAGS": [ "-Wall", "-Wextra", "-pedantic", "-g", "-O0" ]
- }
- },
- "Release": {
- "defines": [
- "NDEBUG"
- ],
- "xcode_settings": {
- "GCC_OPTIMIZATION_LEVEL": "3",
- "GCC_GENERATE_DEBUGGING_SYMBOLS": "NO",
- "DEAD_CODE_STRIPPING": "YES",
- "GCC_INLINES_ARE_PRIVATE_EXTERN": "YES",
- "OTHER_CPLUSPLUSFLAGS": [ "-Wall", "-Wextra", "-pedantic", "-O3" ]
- }
- }
- }
- }
- }]
- ]
-}
-
diff --git a/third_party/variant/doc/other_implementations.md b/third_party/variant/doc/other_implementations.md
deleted file mode 100644
index a0d8b9b..0000000
--- a/third_party/variant/doc/other_implementations.md
+++ /dev/null
@@ -1,15 +0,0 @@
-
-# Other implementations of variant and optional
-
-These are some other implementations of `variant` and/or `optional` types.
-They are not necessarily compatible with this implementation. This is an
-incomplete list.
-
-* [Boost Variant](http://www.boost.org/doc/libs/1_59_0/doc/html/variant.html) and [Boost Optional](http://www.boost.org/doc/libs/1_59_0/libs/optional/doc/html/index.html)
-* [Eggs Variant](http://eggs-cpp.github.io/variant/) by [Agustín Bergé](http://talesofcpp.fusionfenix.com/)
-* [anthonyw/variant](https://bitbucket.org/anthonyw/variant) (implementation of P0110R0)
-* [JasonL9000/cppcon14](https://github.com/JasonL9000/cppcon14)
-* [tomilov/variant](https://github.com/tomilov/variant)
-* [akrzemi1/Optional](https://github.com/akrzemi1/Optional)
-* [mpark/variant](https://github.com/mpark/variant)
-
diff --git a/third_party/variant/doc/standards_effort.md b/third_party/variant/doc/standards_effort.md
deleted file mode 100644
index d2df488..0000000
--- a/third_party/variant/doc/standards_effort.md
+++ /dev/null
@@ -1,28 +0,0 @@
-
-# Standards efforts
-
-A `variant` type is on planned for inclusion in the C++ Standard, probably in
-C++17. Current working papers are (list extracted from [2015 working group
-papers](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/)):
-
-* 2015-09-28: Variant design review. [P0086R0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0086r0.pdf)
-* 2015-09-28: Variant: a type-safe union without undefined behavior (v2) [P0087R0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0087r0.pdf)
-* 2015-09-27: Variant: a type-safe union that is rarely invalid (v5) [P0088R0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0088r0.pdf)
-* 2015-09-24: Simply a Strong Variant [P0093R0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0093r0.html)
-* 2015-09-24: Simply a Basic Variant [P0094R0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0094r0.html)
-* 2015-09-24: The Case for a Language Based Variant [P0096R0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0095r0.html)
-* 2015-09-25: Implementing the strong guarantee for variant<> assignment [P0110R0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0110r0.html)
-* 2015-09-24: Homogeneous interface for variant, any and optional (Revision 1) [P0032R1](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0032r1.pdf)
-
-Last state can be seen from
-[The Variant Saga: A happy ending?](https://isocpp.org/blog/2015/11/the-variant-saga-a-happy-ending).
-
-The `optional` type is also on the way into the standard. The papers are:
-* 2013-10-03: A proposal to add a utility class to represent optional objects (Revision 5) [N3793](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3793.html)
-* 2014-01-18: Working Draft, Technical Specification on C++ Extensions for Library Fundamentals [N3848](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3848.html)
-
-## Older Papers
-
-* Older working drafts are: N4218 (rev 1), N4516 (rev 2), N4450 (rev 3), and [N4542](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4542.pdf) (rev 4). They have been split into P0086 (general design discussions) and P0087 and P0088 (containing two competing? specs).
-* 2015-07-28: Variant: Discriminated Union with Value Semantics [P0080R0](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0080r0.pdf) An alternative proposal to N4542.
-
diff --git a/third_party/variant/optional.hpp b/third_party/variant/optional.hpp
deleted file mode 100644
index 1185894..0000000
--- a/third_party/variant/optional.hpp
+++ /dev/null
@@ -1,74 +0,0 @@
-#ifndef MAPBOX_UTIL_OPTIONAL_HPP
-#define MAPBOX_UTIL_OPTIONAL_HPP
-
-#pragma message("This implementation of optional is deprecated. See https://github.com/mapbox/variant/issues/64.")
-
-#include <type_traits>
-#include <utility>
-
-#include "variant.hpp"
-
-namespace mapbox {
-namespace util {
-
-template <typename T>
-class optional
-{
- static_assert(!std::is_reference<T>::value, "optional doesn't support references");
-
- struct none_type
- {
- };
-
- variant<none_type, T> variant_;
-
- public:
- optional() = default;
-
- optional(optional const& rhs)
- {
- if (this != &rhs)
- { // protect against invalid self-assignment
- variant_ = rhs.variant_;
- }
- }
-
- optional(T const& v) { variant_ = v; }
-
- explicit operator bool() const noexcept { return variant_.template is<T>(); }
-
- T const& get() const { return variant_.template get<T>(); }
- T& get() { return variant_.template get<T>(); }
-
- T const& operator*() const { return this->get(); }
- T operator*() { return this->get(); }
-
- optional& operator=(T const& v)
- {
- variant_ = v;
- return *this;
- }
-
- optional& operator=(optional const& rhs)
- {
- if (this != &rhs)
- {
- variant_ = rhs.variant_;
- }
- return *this;
- }
-
- template <typename... Args>
- void emplace(Args&&... args)
- {
- variant_ = T{std::forward<Args>(args)...};
- }
-
- void reset() { variant_ = none_type{}; }
-
-}; // class optional
-
-} // namespace util
-} // namespace mapbox
-
-#endif // MAPBOX_UTIL_OPTIONAL_HPP
diff --git a/third_party/variant/recursive_wrapper.hpp b/third_party/variant/recursive_wrapper.hpp
deleted file mode 100644
index 4becdd6..0000000
--- a/third_party/variant/recursive_wrapper.hpp
+++ /dev/null
@@ -1,122 +0,0 @@
-#ifndef MAPBOX_UTIL_RECURSIVE_WRAPPER_HPP
-#define MAPBOX_UTIL_RECURSIVE_WRAPPER_HPP
-
-// Based on variant/recursive_wrapper.hpp from boost.
-//
-// Original license:
-//
-// Copyright (c) 2002-2003
-// Eric Friedman, Itay Maman
-//
-// Distributed under the Boost Software License, Version 1.0. (See
-// accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#include <cassert>
-#include <utility>
-
-namespace mapbox {
-namespace util {
-
-template <typename T>
-class recursive_wrapper
-{
-
- T* p_;
-
- void assign(T const& rhs)
- {
- this->get() = rhs;
- }
-
- public:
- using type = T;
-
- /**
- * Default constructor default initializes the internally stored value.
- * For POD types this means nothing is done and the storage is
- * uninitialized.
- *
- * @throws std::bad_alloc if there is insufficient memory for an object
- * of type T.
- * @throws any exception thrown by the default constructur of T.
- */
- recursive_wrapper()
- : p_(new T){};
-
- ~recursive_wrapper() noexcept { delete p_; };
-
- recursive_wrapper(recursive_wrapper const& operand)
- : p_(new T(operand.get())) {}
-
- recursive_wrapper(T const& operand)
- : p_(new T(operand)) {}
-
- recursive_wrapper(recursive_wrapper&& operand)
- : p_(new T(std::move(operand.get()))) {}
-
- recursive_wrapper(T&& operand)
- : p_(new T(std::move(operand))) {}
-
- inline recursive_wrapper& operator=(recursive_wrapper const& rhs)
- {
- assign(rhs.get());
- return *this;
- }
-
- inline recursive_wrapper& operator=(T const& rhs)
- {
- assign(rhs);
- return *this;
- }
-
- inline void swap(recursive_wrapper& operand) noexcept
- {
- T* temp = operand.p_;
- operand.p_ = p_;
- p_ = temp;
- }
-
- recursive_wrapper& operator=(recursive_wrapper&& rhs) noexcept
- {
- swap(rhs);
- return *this;
- }
-
- recursive_wrapper& operator=(T&& rhs)
- {
- get() = std::move(rhs);
- return *this;
- }
-
- T& get()
- {
- assert(p_);
- return *get_pointer();
- }
-
- T const& get() const
- {
- assert(p_);
- return *get_pointer();
- }
-
- T* get_pointer() { return p_; }
-
- const T* get_pointer() const { return p_; }
-
- operator T const&() const { return this->get(); }
-
- operator T&() { return this->get(); }
-
-}; // class recursive_wrapper
-
-template <typename T>
-inline void swap(recursive_wrapper<T>& lhs, recursive_wrapper<T>& rhs) noexcept
-{
- lhs.swap(rhs);
-}
-} // namespace util
-} // namespace mapbox
-
-#endif // MAPBOX_UTIL_RECURSIVE_WRAPPER_HPP
diff --git a/third_party/variant/scripts/build-appveyor.bat b/third_party/variant/scripts/build-appveyor.bat
deleted file mode 100644
index bdee7ea..0000000
--- a/third_party/variant/scripts/build-appveyor.bat
+++ /dev/null
@@ -1,32 +0,0 @@
- at ECHO OFF
-SETLOCAL
-
-SET PATH=c:\python27;%PATH%
-
-ECHO activating VS command prompt
-IF /I "%PLATFORM"=="x64" (
- CALL "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64
-) ELSE (
- CALL "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86
-)
-
-IF NOT EXIST deps\gyp git clone --quiet --depth 1 https://chromium.googlesource.com/external/gyp.git deps/gyp
-
-CALL deps\gyp\gyp.bat variant.gyp --depth=. ^
--f msvs ^
--G msvs_version=2015 ^
---generator-output=build
-
-SET MSBUILD_PLATFORM=%platform%
-IF /I "%MSBUILD_PLATFORM%" == "x86" SET MSBUILD_PLATFORM=Win32
-
-
-msbuild ^
-build\variant.sln ^
-/nologo ^
-/toolsversion:14.0 ^
-/p:PlatformToolset=v140 ^
-/p:Configuration=%configuration% ^
-/p:Platform=%MSBUILD_PLATFORM%
-
-build\"%configuration%"\tests.exe
diff --git a/third_party/variant/scripts/build-local.bat b/third_party/variant/scripts/build-local.bat
deleted file mode 100644
index 34a2e61..0000000
--- a/third_party/variant/scripts/build-local.bat
+++ /dev/null
@@ -1,7 +0,0 @@
- at ECHO OFF
-SETLOCAL
-
-SET platform=x64
-SET configuration=Release
-
-CALL scripts\build-appveyor.bat
\ No newline at end of file
diff --git a/third_party/variant/scripts/run_compilation_failure_tests.sh b/third_party/variant/scripts/run_compilation_failure_tests.sh
deleted file mode 100755
index c2608fe..0000000
--- a/third_party/variant/scripts/run_compilation_failure_tests.sh
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/bin/sh
-#
-# Try to compile all programs in the test/compilation_failure directory.
-# Compilation must fail and the error message must match the pattern in the
-# corresponding .pattern file.
-#
-
-DIR="test/compilation_failure"
-CXX=${CXX:-clang++}
-
-if [ `uname -s` = "Darwin" ]; then
- CXXFLAGS="$CXXFLAGS -stdlib=libc++"
-fi
-
-error_msg() {
- if [ ! -z "$1" ]; then
- printf 'output was:\n=======\n%s\n=======\n' "$1"
- fi
-}
-
-exit_code=0
-for test_code in $DIR/*.cpp; do
- name=`basename $test_code .cpp`
-
- result=`${CXX} -std=c++11 -c -o /dev/null -I. ${CXXFLAGS} ${test_code} 2>&1`
- status=$?
-
- if [ $status = 1 ]; then
- expected=`sed -n -e '/@EXPECTED/s/.*: \+//p' ${test_code}`
- if echo $result | grep -q "$expected"; then
- echo "$name [OK]"
- else
- echo "$name [FAILED - wrong error message]"
- echo "Expected error message: $expected"
- error_msg "$result"
- exit_code=1
- fi
- elif [ $status = 0 ]; then
- echo "$name [FAILED - compile was successful]"
- error_msg "$result"
- exit_code=1
- else
- echo "$name [FAILED - unknown error in compile]"
- error_msg "$result"
- exit_code=1
- fi
-done
-
-exit ${exit_code}
-
diff --git a/third_party/variant/test/bench_variant.cpp b/third_party/variant/test/bench_variant.cpp
deleted file mode 100644
index 700dac7..0000000
--- a/third_party/variant/test/bench_variant.cpp
+++ /dev/null
@@ -1,185 +0,0 @@
-
-#include <algorithm>
-#include <cstdlib>
-#include <iostream>
-#include <memory>
-#include <string>
-#include <thread>
-#include <utility>
-#include <vector>
-
-#include <boost/timer/timer.hpp>
-#include <boost/variant.hpp>
-
-#include "variant.hpp"
-
-#define TEXT_SHORT "Test"
-#define TEXT_LONG "Testing various variant implementations with a longish string ........................................."
-#define NUM_SAMPLES 3
-//#define BOOST_VARIANT_MINIMIZE_SIZE
-
-using namespace mapbox;
-
-namespace test {
-
-template <typename V>
-struct Holder
-{
- typedef V value_type;
- std::vector<value_type> data;
-
- template <typename T>
- void append_move(T&& obj)
- {
- data.emplace_back(std::forward<T>(obj));
- }
-
- template <typename T>
- void append(T const& obj)
- {
- data.push_back(obj);
- }
-};
-
-} // namespace test
-
-struct print
-{
- template <typename T>
- void operator()(T const& val) const
- {
- std::cerr << val << ":" << typeid(T).name() << std::endl;
- }
-};
-
-template <typename V>
-struct dummy : boost::static_visitor<>
-{
- dummy(V& v)
- : v_(v) {}
-
- template <typename T>
- void operator()(T&& val) const
- {
- v_ = std::move(val);
- }
- V& v_;
-};
-
-template <typename V>
-struct dummy2
-{
- dummy2(V& v)
- : v_(v) {}
-
- template <typename T>
- void operator()(T&& val) const
- {
- v_ = std::move(val);
- }
- V& v_;
-};
-
-void run_boost_test(std::size_t runs)
-{
- test::Holder<boost::variant<int, double, std::string>> h;
- h.data.reserve(runs);
- for (std::size_t i = 0; i < runs; ++i)
- {
- h.append_move(std::string(TEXT_SHORT));
- h.append_move(std::string(TEXT_LONG));
- h.append_move(123);
- h.append_move(3.14159);
- }
-
- boost::variant<int, double, std::string> v;
- for (auto const& v2 : h.data)
- {
- dummy<boost::variant<int, double, std::string>> d(v);
- boost::apply_visitor(d, v2);
- }
-}
-
-void run_variant_test(std::size_t runs)
-{
- test::Holder<util::variant<int, double, std::string>> h;
- h.data.reserve(runs);
- for (std::size_t i = 0; i < runs; ++i)
- {
- h.append_move(std::string(TEXT_SHORT));
- h.append_move(std::string(TEXT_LONG));
- h.append_move(123);
- h.append_move(3.14159);
- }
-
- util::variant<int, double, std::string> v;
- for (auto const& v2 : h.data)
- {
- dummy2<util::variant<int, double, std::string>> d(v);
- util::apply_visitor(d, v2);
- }
-}
-
-int main(int argc, char** argv)
-{
- if (argc != 2)
- {
- std::cerr << "Usage:" << argv[0] << " <num-runs>" << std::endl;
- return 1;
- }
-
-#ifndef SINGLE_THREADED
- const std::size_t THREADS = 4;
-#endif
- const std::size_t NUM_RUNS = static_cast<std::size_t>(std::stol(argv[1]));
-
-#ifdef SINGLE_THREADED
-
- for (std::size_t j = 0; j < NUM_SAMPLES; ++j)
- {
-
- {
- std::cerr << "custom variant: ";
- boost::timer::auto_cpu_timer t;
- run_variant_test(NUM_RUNS);
- }
- {
- std::cerr << "boost variant: ";
- boost::timer::auto_cpu_timer t;
- run_boost_test(NUM_RUNS);
- }
- }
-
-#else
- for (std::size_t j = 0; j < NUM_SAMPLES; ++j)
- {
- {
- typedef std::vector<std::unique_ptr<std::thread>> thread_group;
- typedef thread_group::value_type value_type;
- thread_group tg;
- std::cerr << "custom variant: ";
- boost::timer::auto_cpu_timer timer;
- for (std::size_t i = 0; i < THREADS; ++i)
- {
- tg.emplace_back(new std::thread(run_variant_test, NUM_RUNS));
- }
- std::for_each(tg.begin(), tg.end(), [](value_type& t) {if (t->joinable()) t->join(); });
- }
-
- {
- typedef std::vector<std::unique_ptr<std::thread>> thread_group;
- typedef thread_group::value_type value_type;
- thread_group tg;
- std::cerr << "boost variant: ";
- boost::timer::auto_cpu_timer timer;
- for (std::size_t i = 0; i < THREADS; ++i)
- {
- tg.emplace_back(new std::thread(run_boost_test, NUM_RUNS));
- }
- std::for_each(tg.begin(), tg.end(), [](value_type& t) {if (t->joinable()) t->join(); });
- }
- }
-#endif
-
- return EXIT_SUCCESS;
-}
diff --git a/third_party/variant/test/binary_visitor_test.cpp b/third_party/variant/test/binary_visitor_test.cpp
deleted file mode 100644
index fa0f2ea..0000000
--- a/third_party/variant/test/binary_visitor_test.cpp
+++ /dev/null
@@ -1,138 +0,0 @@
-
-#include <algorithm>
-#include <cstdint>
-#include <cstdlib>
-#include <iostream>
-#include <sstream>
-#include <string>
-#include <type_traits>
-#include <utility>
-#include <vector>
-
-#include "variant.hpp"
-#include "variant_io.hpp"
-
-using namespace mapbox;
-
-namespace test {
-
-template <typename T>
-struct string_to_number
-{
-};
-
-template <>
-struct string_to_number<double>
-{
- double operator()(std::string const& str) const
- {
- return std::stod(str);
- }
-};
-
-template <>
-struct string_to_number<std::int64_t>
-{
- std::int64_t operator()(std::string const& str) const
- {
- return std::stoll(str);
- }
-};
-
-template <>
-struct string_to_number<std::uint64_t>
-{
- std::uint64_t operator()(std::string const& str) const
- {
- return std::stoull(str);
- }
-};
-
-template <>
-struct string_to_number<bool>
-{
- bool operator()(std::string const& str) const
- {
- bool result;
- std::istringstream(str) >> std::boolalpha >> result;
- return result;
- }
-};
-
-struct javascript_equal_visitor
-{
- template <typename T>
- bool operator()(T lhs, T rhs) const
- {
- return lhs == rhs;
- }
-
- template <typename T, class = typename std::enable_if<std::is_arithmetic<T>::value>::type>
- bool operator()(T lhs, std::string const& rhs) const
- {
- return lhs == string_to_number<T>()(rhs);
- }
-
- template <typename T, class = typename std::enable_if<std::is_arithmetic<T>::value>::type>
- bool operator()(std::string const& lhs, T rhs) const
- {
- return string_to_number<T>()(lhs) == rhs;
- }
-
- template <typename T0, typename T1>
- bool operator()(T0 lhs, T1 rhs) const
- {
- return lhs == static_cast<T0>(rhs);
- }
-};
-
-template <typename T>
-struct javascript_equal
-{
- javascript_equal(T const& lhs)
- : lhs_(lhs) {}
-
- bool operator()(T const& rhs) const
- {
- return util::apply_visitor(test::javascript_equal_visitor(), lhs_, rhs);
- }
- T const& lhs_;
-};
-
-} // namespace test
-
-int main()
-{
- typedef util::variant<bool, std::int64_t, std::uint64_t, double, std::string> variant_type;
- variant_type v0(3.14159);
- variant_type v1(std::string("3.14159"));
- variant_type v2(std::uint64_t(1));
-
- std::cerr << v0 << " == " << v1 << " -> "
- << std::boolalpha << util::apply_visitor(test::javascript_equal_visitor(), v0, v1) << std::endl;
-
- std::vector<variant_type> vec;
-
- vec.emplace_back(std::string("1"));
- vec.push_back(variant_type(std::uint64_t(2)));
- vec.push_back(variant_type(std::uint64_t(3)));
- vec.push_back(std::string("3.14159"));
- vec.emplace_back(3.14159);
-
- //auto itr = std::find_if(vec.begin(), vec.end(), [&v0](variant_type const& val) {
- // return util::apply_visitor(test::javascript_equal_visitor(), v0, val);
- // });
-
- auto itr = std::find_if(vec.begin(), vec.end(), test::javascript_equal<variant_type>(v2));
-
- if (itr != std::end(vec))
- {
- std::cout << "found " << *itr << std::endl;
- }
- else
- {
- std::cout << "can't find " << v2 << '\n';
- }
-
- return EXIT_SUCCESS;
-}
diff --git a/third_party/variant/test/boost_variant_hello_world.cpp b/third_party/variant/test/boost_variant_hello_world.cpp
deleted file mode 100644
index fdb200e..0000000
--- a/third_party/variant/test/boost_variant_hello_world.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <boost/variant.hpp>
-
-#include <stdexcept>
-
-struct check : boost::static_visitor<>
-{
- template <typename T>
- void operator()(T const& val) const
- {
- if (val != 0) throw std::runtime_error("invalid");
- }
-};
-
-int main()
-{
- typedef boost::variant<bool, int, double> variant_type;
- variant_type v(0);
- boost::apply_visitor(check(), v);
- return 0;
-}
diff --git a/third_party/variant/test/compilation_failure/default_constructor.cpp b/third_party/variant/test/compilation_failure/default_constructor.cpp
deleted file mode 100644
index c75a8c1..0000000
--- a/third_party/variant/test/compilation_failure/default_constructor.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-
-// @EXPECTED: First type in variant must be default constructible to allow default construction of variant
-
-#include <variant.hpp>
-
-// Checks that the first type in a variant must be default constructible to
-// make the variant default constructible.
-
-struct no_def_constructor
-{
-
- int value;
-
- no_def_constructor() = delete;
-
- no_def_constructor(int v) : value(v) {}
-};
-
-int main()
-{
- mapbox::util::variant<no_def_constructor> x;
-}
diff --git a/third_party/variant/test/compilation_failure/empty_typelist.cpp b/third_party/variant/test/compilation_failure/empty_typelist.cpp
deleted file mode 100644
index 69a631c..0000000
--- a/third_party/variant/test/compilation_failure/empty_typelist.cpp
+++ /dev/null
@@ -1,11 +0,0 @@
-
-// @EXPECTED: Template parameter type list of variant can not be empty
-
-#include <variant.hpp>
-
-// Empty type list should not work.
-
-int main()
-{
- mapbox::util::variant<> x;
-}
diff --git a/third_party/variant/test/compilation_failure/equality.cpp b/third_party/variant/test/compilation_failure/equality.cpp
deleted file mode 100644
index b99a308..0000000
--- a/third_party/variant/test/compilation_failure/equality.cpp
+++ /dev/null
@@ -1,11 +0,0 @@
-
-// @EXPECTED:
-
-#include <variant.hpp>
-
-int main()
-{
- mapbox::util::variant<int> x;
- mapbox::util::variant<double> y;
- x == y;
-}
diff --git a/third_party/variant/test/compilation_failure/get_type.cpp b/third_party/variant/test/compilation_failure/get_type.cpp
deleted file mode 100644
index 5123eb1..0000000
--- a/third_party/variant/test/compilation_failure/get_type.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-
-// @EXPECTED: enable_if
-
-#include <variant.hpp>
-
-int main()
-{
- mapbox::util::variant<int, double> x;
- x.get<std::string>();
-}
diff --git a/third_party/variant/test/compilation_failure/is_type.cpp b/third_party/variant/test/compilation_failure/is_type.cpp
deleted file mode 100644
index a79638e..0000000
--- a/third_party/variant/test/compilation_failure/is_type.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-
-// @EXPECTED: invalid type in T in `is<T>()` for this variant
-
-#include <variant.hpp>
-
-int main()
-{
- mapbox::util::variant<int, double> x;
- x.is<std::string>();
-}
diff --git a/third_party/variant/test/compilation_failure/mutating_visitor_on_const.cpp b/third_party/variant/test/compilation_failure/mutating_visitor_on_const.cpp
deleted file mode 100644
index ee77b56..0000000
--- a/third_party/variant/test/compilation_failure/mutating_visitor_on_const.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-
-// @EXPECTED: const int
-
-#include <variant.hpp>
-
-struct mutating_visitor
-{
- mutating_visitor(int val)
- : val_(val) {}
-
- void operator()(int& val) const
- {
- val = val_;
- }
-
- int val_;
-};
-
-int main()
-{
- const mapbox::util::variant<int> var(123);
- const mutating_visitor visitor(456);
- mapbox::util::apply_visitor(visitor, var);
-}
diff --git a/third_party/variant/test/compilation_failure/no-reference.cpp b/third_party/variant/test/compilation_failure/no-reference.cpp
deleted file mode 100644
index 17123ce..0000000
--- a/third_party/variant/test/compilation_failure/no-reference.cpp
+++ /dev/null
@@ -1,9 +0,0 @@
-
-// @EXPECTED: Variant can not hold reference types
-
-#include <variant.hpp>
-
-int main()
-{
- mapbox::util::variant<double, int&, long> x{mapbox::util::no_init()};
-}
diff --git a/third_party/variant/test/include/catch.hpp b/third_party/variant/test/include/catch.hpp
deleted file mode 100644
index dd6e3ed..0000000
--- a/third_party/variant/test/include/catch.hpp
+++ /dev/null
@@ -1,11613 +0,0 @@
-/*
- * Catch v1.3.2
- * Generated: 2015-12-28 15:07:07.166291
- * ----------------------------------------------------------
- * This file has been merged from multiple headers. Please don't edit it directly
- * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved.
- *
- * Distributed under the Boost Software License, Version 1.0. (See accompanying
- * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- */
-#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
-#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
-
-#define TWOBLUECUBES_CATCH_HPP_INCLUDED
-
-#ifdef __clang__
-#pragma clang system_header
-#elif defined __GNUC__
-#pragma GCC system_header
-#endif
-
-// #included from: internal/catch_suppress_warnings.h
-
-#ifdef __clang__
-#ifdef __ICC // icpc defines the __clang__ macro
-#pragma warning(push)
-#pragma warning(disable : 161 1682)
-#else // __ICC
-#pragma clang diagnostic ignored "-Wglobal-constructors"
-#pragma clang diagnostic ignored "-Wvariadic-macros"
-#pragma clang diagnostic ignored "-Wc99-extensions"
-#pragma clang diagnostic ignored "-Wunused-variable"
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wpadded"
-#pragma clang diagnostic ignored "-Wc++98-compat"
-#pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
-#pragma clang diagnostic ignored "-Wswitch-enum"
-#pragma clang diagnostic ignored "-Wcovered-switch-default"
-#endif
-#elif defined __GNUC__
-#pragma GCC diagnostic ignored "-Wvariadic-macros"
-#pragma GCC diagnostic ignored "-Wunused-variable"
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wpadded"
-#endif
-#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER)
-#define CATCH_IMPL
-#endif
-
-#ifdef CATCH_IMPL
-#ifndef CLARA_CONFIG_MAIN
-#define CLARA_CONFIG_MAIN_NOT_DEFINED
-#define CLARA_CONFIG_MAIN
-#endif
-#endif
-
-// #included from: internal/catch_notimplemented_exception.h
-#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_H_INCLUDED
-
-// #included from: catch_common.h
-#define TWOBLUECUBES_CATCH_COMMON_H_INCLUDED
-
-#define INTERNAL_CATCH_UNIQUE_NAME_LINE2(name, line) name##line
-#define INTERNAL_CATCH_UNIQUE_NAME_LINE(name, line) INTERNAL_CATCH_UNIQUE_NAME_LINE2(name, line)
-#define INTERNAL_CATCH_UNIQUE_NAME(name) INTERNAL_CATCH_UNIQUE_NAME_LINE(name, __LINE__)
-
-#define INTERNAL_CATCH_STRINGIFY2(expr) #expr
-#define INTERNAL_CATCH_STRINGIFY(expr) INTERNAL_CATCH_STRINGIFY2(expr)
-
-#include <algorithm>
-#include <sstream>
-#include <stdexcept>
-
-// #included from: catch_compiler_capabilities.h
-#define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED
-
-// Detect a number of compiler features - mostly C++11/14 conformance - by compiler
-// The following features are defined:
-//
-// CATCH_CONFIG_CPP11_NULLPTR : is nullptr supported?
-// CATCH_CONFIG_CPP11_NOEXCEPT : is noexcept supported?
-// CATCH_CONFIG_CPP11_GENERATED_METHODS : The delete and default keywords for compiler generated methods
-// CATCH_CONFIG_CPP11_IS_ENUM : std::is_enum is supported?
-// CATCH_CONFIG_CPP11_TUPLE : std::tuple is supported
-// CATCH_CONFIG_CPP11_LONG_LONG : is long long supported?
-// CATCH_CONFIG_CPP11_OVERRIDE : is override supported?
-// CATCH_CONFIG_CPP11_UNIQUE_PTR : is unique_ptr supported (otherwise use auto_ptr)
-
-// CATCH_CONFIG_CPP11_OR_GREATER : Is C++11 supported?
-
-// CATCH_CONFIG_VARIADIC_MACROS : are variadic macros supported?
-
-// ****************
-// Note to maintainers: if new toggles are added please document them
-// in configuration.md, too
-// ****************
-
-// In general each macro has a _NO_<feature name> form
-// (e.g. CATCH_CONFIG_CPP11_NO_NULLPTR) which disables the feature.
-// Many features, at point of detection, define an _INTERNAL_ macro, so they
-// can be combined, en-mass, with the _NO_ forms later.
-
-// All the C++11 features can be disabled with CATCH_CONFIG_NO_CPP11
-
-#ifdef __clang__
-
-#if __has_feature(cxx_nullptr)
-#define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR
-#endif
-
-#if __has_feature(cxx_noexcept)
-#define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT
-#endif
-
-#endif // __clang__
-
-////////////////////////////////////////////////////////////////////////////////
-// Borland
-#ifdef __BORLANDC__
-
-#endif // __BORLANDC__
-
-////////////////////////////////////////////////////////////////////////////////
-// EDG
-#ifdef __EDG_VERSION__
-
-#endif // __EDG_VERSION__
-
-////////////////////////////////////////////////////////////////////////////////
-// Digital Mars
-#ifdef __DMC__
-
-#endif // __DMC__
-
-////////////////////////////////////////////////////////////////////////////////
-// GCC
-#ifdef __GNUC__
-
-#if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__)
-#define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR
-#endif
-
-// - otherwise more recent versions define __cplusplus >= 201103L
-// and will get picked up below
-
-#endif // __GNUC__
-
-////////////////////////////////////////////////////////////////////////////////
-// Visual C++
-#ifdef _MSC_VER
-
-#if (_MSC_VER >= 1600)
-#define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR
-#define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR
-#endif
-
-#if (_MSC_VER >= 1900) // (VC++ 13 (VS2015))
-#define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT
-#define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS
-#endif
-
-#endif // _MSC_VER
-
-////////////////////////////////////////////////////////////////////////////////
-
-// Use variadic macros if the compiler supports them
-#if (defined _MSC_VER && _MSC_VER > 1400 && !defined __EDGE__) || \
- (defined __WAVE__ && __WAVE_HAS_VARIADICS) || \
- (defined __GNUC__ && __GNUC__ >= 3) || \
- (!defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L)
-
-#define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS
-
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-// C++ language feature support
-
-// catch all support for C++11
-#if defined(__cplusplus) && __cplusplus >= 201103L
-
-#define CATCH_CPP11_OR_GREATER
-
-#if !defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR)
-#define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR
-#endif
-
-#ifndef CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT
-#define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT
-#endif
-
-#ifndef CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS
-#define CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS
-#endif
-
-#ifndef CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM
-#define CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM
-#endif
-
-#ifndef CATCH_INTERNAL_CONFIG_CPP11_TUPLE
-#define CATCH_INTERNAL_CONFIG_CPP11_TUPLE
-#endif
-
-#ifndef CATCH_INTERNAL_CONFIG_VARIADIC_MACROS
-#define CATCH_INTERNAL_CONFIG_VARIADIC_MACROS
-#endif
-
-#if !defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG)
-#define CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG
-#endif
-
-#if !defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE)
-#define CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE
-#endif
-#if !defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR)
-#define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR
-#endif
-
-#endif // __cplusplus >= 201103L
-
-// Now set the actual defines based on the above + anything the user has configured
-#if defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NO_NULLPTR) && !defined(CATCH_CONFIG_CPP11_NULLPTR) && !defined(CATCH_CONFIG_NO_CPP11)
-#define CATCH_CONFIG_CPP11_NULLPTR
-#endif
-#if defined(CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NO_NOEXCEPT) && !defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_CONFIG_NO_CPP11)
-#define CATCH_CONFIG_CPP11_NOEXCEPT
-#endif
-#if defined(CATCH_INTERNAL_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_NO_GENERATED_METHODS) && !defined(CATCH_CONFIG_CPP11_GENERATED_METHODS) && !defined(CATCH_CONFIG_NO_CPP11)
-#define CATCH_CONFIG_CPP11_GENERATED_METHODS
-#endif
-#if defined(CATCH_INTERNAL_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_NO_IS_ENUM) && !defined(CATCH_CONFIG_CPP11_IS_ENUM) && !defined(CATCH_CONFIG_NO_CPP11)
-#define CATCH_CONFIG_CPP11_IS_ENUM
-#endif
-#if defined(CATCH_INTERNAL_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_CPP11_NO_TUPLE) && !defined(CATCH_CONFIG_CPP11_TUPLE) && !defined(CATCH_CONFIG_NO_CPP11)
-#define CATCH_CONFIG_CPP11_TUPLE
-#endif
-#if defined(CATCH_INTERNAL_CONFIG_VARIADIC_MACROS) && !defined(CATCH_CONFIG_NO_VARIADIC_MACROS) && !defined(CATCH_CONFIG_VARIADIC_MACROS)
-#define CATCH_CONFIG_VARIADIC_MACROS
-#endif
-#if defined(CATCH_INTERNAL_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_NO_LONG_LONG) && !defined(CATCH_CONFIG_CPP11_LONG_LONG) && !defined(CATCH_CONFIG_NO_CPP11)
-#define CATCH_CONFIG_CPP11_LONG_LONG
-#endif
-#if defined(CATCH_INTERNAL_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_NO_OVERRIDE) && !defined(CATCH_CONFIG_CPP11_OVERRIDE) && !defined(CATCH_CONFIG_NO_CPP11)
-#define CATCH_CONFIG_CPP11_OVERRIDE
-#endif
-#if defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_CPP11)
-#define CATCH_CONFIG_CPP11_UNIQUE_PTR
-#endif
-
-// noexcept support:
-#if defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_NOEXCEPT)
-#define CATCH_NOEXCEPT noexcept
-#define CATCH_NOEXCEPT_IS(x) noexcept(x)
-#else
-#define CATCH_NOEXCEPT throw()
-#define CATCH_NOEXCEPT_IS(x)
-#endif
-
-// nullptr support
-#ifdef CATCH_CONFIG_CPP11_NULLPTR
-#define CATCH_NULL nullptr
-#else
-#define CATCH_NULL NULL
-#endif
-
-// override support
-#ifdef CATCH_CONFIG_CPP11_OVERRIDE
-#define CATCH_OVERRIDE override
-#else
-#define CATCH_OVERRIDE
-#endif
-
-// unique_ptr support
-#ifdef CATCH_CONFIG_CPP11_UNIQUE_PTR
-#define CATCH_AUTO_PTR(T) std::unique_ptr<T>
-#else
-#define CATCH_AUTO_PTR(T) std::auto_ptr<T>
-#endif
-
-namespace Catch {
-
-struct IConfig;
-
-struct CaseSensitive
-{
- enum Choice
- {
- Yes,
- No
- };
-};
-
-class NonCopyable
-{
-#ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
- NonCopyable(NonCopyable const&) = delete;
- NonCopyable(NonCopyable&&) = delete;
- NonCopyable& operator=(NonCopyable const&) = delete;
- NonCopyable& operator=(NonCopyable&&) = delete;
-#else
- NonCopyable(NonCopyable const& info);
- NonCopyable& operator=(NonCopyable const&);
-#endif
-
- protected:
- NonCopyable() {}
- virtual ~NonCopyable();
-};
-
-class SafeBool
-{
- public:
- typedef void (SafeBool::*type)() const;
-
- static type makeSafe(bool value)
- {
- return value ? &SafeBool::trueValue : 0;
- }
-
- private:
- void trueValue() const {}
-};
-
-template <typename ContainerT>
-inline void deleteAll(ContainerT& container)
-{
- typename ContainerT::const_iterator it = container.begin();
- typename ContainerT::const_iterator itEnd = container.end();
- for (; it != itEnd; ++it)
- delete *it;
-}
-template <typename AssociativeContainerT>
-inline void deleteAllValues(AssociativeContainerT& container)
-{
- typename AssociativeContainerT::const_iterator it = container.begin();
- typename AssociativeContainerT::const_iterator itEnd = container.end();
- for (; it != itEnd; ++it)
- delete it->second;
-}
-
-bool startsWith(std::string const& s, std::string const& prefix);
-bool endsWith(std::string const& s, std::string const& suffix);
-bool contains(std::string const& s, std::string const& infix);
-void toLowerInPlace(std::string& s);
-std::string toLower(std::string const& s);
-std::string trim(std::string const& str);
-bool replaceInPlace(std::string& str, std::string const& replaceThis, std::string const& withThis);
-
-struct pluralise
-{
- pluralise(std::size_t count, std::string const& label);
-
- friend std::ostream& operator<<(std::ostream& os, pluralise const& pluraliser);
-
- std::size_t m_count;
- std::string m_label;
-};
-
-struct SourceLineInfo
-{
-
- SourceLineInfo();
- SourceLineInfo(char const* _file, std::size_t _line);
- SourceLineInfo(SourceLineInfo const& other);
-#ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
- SourceLineInfo(SourceLineInfo&&) = default;
- SourceLineInfo& operator=(SourceLineInfo const&) = default;
- SourceLineInfo& operator=(SourceLineInfo&&) = default;
-#endif
- bool empty() const;
- bool operator==(SourceLineInfo const& other) const;
- bool operator<(SourceLineInfo const& other) const;
-
- std::string file;
- std::size_t line;
-};
-
-std::ostream& operator<<(std::ostream& os, SourceLineInfo const& info);
-
-// This is just here to avoid compiler warnings with macro constants and boolean literals
-inline bool isTrue(bool value) { return value; }
-inline bool alwaysTrue() { return true; }
-inline bool alwaysFalse() { return false; }
-
-void throwLogicError(std::string const& message, SourceLineInfo const& locationInfo);
-
-void seedRng(IConfig const& config);
-unsigned int rngSeed();
-
-// Use this in variadic streaming macros to allow
-// >> +StreamEndStop
-// as well as
-// >> stuff +StreamEndStop
-struct StreamEndStop
-{
- std::string operator+()
- {
- return std::string();
- }
-};
-template <typename T>
-T const& operator+(T const& value, StreamEndStop)
-{
- return value;
-}
-}
-
-#define CATCH_INTERNAL_LINEINFO ::Catch::SourceLineInfo(__FILE__, static_cast<std::size_t>(__LINE__))
-#define CATCH_INTERNAL_ERROR(msg) ::Catch::throwLogicError(msg, CATCH_INTERNAL_LINEINFO);
-
-#include <ostream>
-
-namespace Catch {
-
-class NotImplementedException : public std::exception
-{
- public:
- NotImplementedException(SourceLineInfo const& lineInfo);
- NotImplementedException(NotImplementedException const&) {}
-
- virtual ~NotImplementedException() CATCH_NOEXCEPT {}
-
- virtual const char* what() const CATCH_NOEXCEPT;
-
- private:
- std::string m_what;
- SourceLineInfo m_lineInfo;
-};
-
-} // end namespace Catch
-
-///////////////////////////////////////////////////////////////////////////////
-#define CATCH_NOT_IMPLEMENTED throw Catch::NotImplementedException(CATCH_INTERNAL_LINEINFO)
-
-// #included from: internal/catch_context.h
-#define TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED
-
-// #included from: catch_interfaces_generators.h
-#define TWOBLUECUBES_CATCH_INTERFACES_GENERATORS_H_INCLUDED
-
-#include <string>
-
-namespace Catch {
-
-struct IGeneratorInfo
-{
- virtual ~IGeneratorInfo();
- virtual bool moveNext() = 0;
- virtual std::size_t getCurrentIndex() const = 0;
-};
-
-struct IGeneratorsForTest
-{
- virtual ~IGeneratorsForTest();
-
- virtual IGeneratorInfo& getGeneratorInfo(std::string const& fileInfo, std::size_t size) = 0;
- virtual bool moveNext() = 0;
-};
-
-IGeneratorsForTest* createGeneratorsForTest();
-
-} // end namespace Catch
-
-// #included from: catch_ptr.hpp
-#define TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED
-
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wpadded"
-#endif
-
-namespace Catch {
-
-// An intrusive reference counting smart pointer.
-// T must implement addRef() and release() methods
-// typically implementing the IShared interface
-template <typename T>
-class Ptr
-{
- public:
- Ptr() : m_p(CATCH_NULL) {}
- Ptr(T* p) : m_p(p)
- {
- if (m_p)
- m_p->addRef();
- }
- Ptr(Ptr const& other) : m_p(other.m_p)
- {
- if (m_p)
- m_p->addRef();
- }
- ~Ptr()
- {
- if (m_p)
- m_p->release();
- }
- void reset()
- {
- if (m_p)
- m_p->release();
- m_p = CATCH_NULL;
- }
- Ptr& operator=(T* p)
- {
- Ptr temp(p);
- swap(temp);
- return *this;
- }
- Ptr& operator=(Ptr const& other)
- {
- Ptr temp(other);
- swap(temp);
- return *this;
- }
- void swap(Ptr& other) { std::swap(m_p, other.m_p); }
- T* get() const { return m_p; }
- T& operator*() const { return *m_p; }
- T* operator->() const { return m_p; }
- bool operator!() const { return m_p == CATCH_NULL; }
- operator SafeBool::type() const { return SafeBool::makeSafe(m_p != CATCH_NULL); }
-
- private:
- T* m_p;
-};
-
-struct IShared : NonCopyable
-{
- virtual ~IShared();
- virtual void addRef() const = 0;
- virtual void release() const = 0;
-};
-
-template <typename T = IShared>
-struct SharedImpl : T
-{
-
- SharedImpl() : m_rc(0) {}
-
- virtual void addRef() const
- {
- ++m_rc;
- }
- virtual void release() const
- {
- if (--m_rc == 0)
- delete this;
- }
-
- mutable unsigned int m_rc;
-};
-
-} // end namespace Catch
-
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
-
-#include <memory>
-#include <stdlib.h>
-#include <vector>
-
-namespace Catch {
-
-class TestCase;
-class Stream;
-struct IResultCapture;
-struct IRunner;
-struct IGeneratorsForTest;
-struct IConfig;
-
-struct IContext
-{
- virtual ~IContext();
-
- virtual IResultCapture* getResultCapture() = 0;
- virtual IRunner* getRunner() = 0;
- virtual size_t getGeneratorIndex(std::string const& fileInfo, size_t totalSize) = 0;
- virtual bool advanceGeneratorsForCurrentTest() = 0;
- virtual Ptr<IConfig const> getConfig() const = 0;
-};
-
-struct IMutableContext : IContext
-{
- virtual ~IMutableContext();
- virtual void setResultCapture(IResultCapture* resultCapture) = 0;
- virtual void setRunner(IRunner* runner) = 0;
- virtual void setConfig(Ptr<IConfig const> const& config) = 0;
-};
-
-IContext& getCurrentContext();
-IMutableContext& getCurrentMutableContext();
-void cleanUpContext();
-Stream createStream(std::string const& streamName);
-}
-
-// #included from: internal/catch_test_registry.hpp
-#define TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED
-
-// #included from: catch_interfaces_testcase.h
-#define TWOBLUECUBES_CATCH_INTERFACES_TESTCASE_H_INCLUDED
-
-#include <vector>
-
-namespace Catch {
-
-class TestSpec;
-
-struct ITestCase : IShared
-{
- virtual void invoke() const = 0;
-
- protected:
- virtual ~ITestCase();
-};
-
-class TestCase;
-struct IConfig;
-
-struct ITestCaseRegistry
-{
- virtual ~ITestCaseRegistry();
- virtual std::vector<TestCase> const& getAllTests() const = 0;
- virtual std::vector<TestCase> const& getAllTestsSorted(IConfig const& config) const = 0;
-};
-
-bool matchTest(TestCase const& testCase, TestSpec const& testSpec, IConfig const& config);
-std::vector<TestCase> filterTests(std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config);
-std::vector<TestCase> const& getAllTestCasesSorted(IConfig const& config);
-}
-
-namespace Catch {
-
-template <typename C>
-class MethodTestCase : public SharedImpl<ITestCase>
-{
-
- public:
- MethodTestCase(void (C::*method)()) : m_method(method) {}
-
- virtual void invoke() const
- {
- C obj;
- (obj.*m_method)();
- }
-
- private:
- virtual ~MethodTestCase() {}
-
- void (C::*m_method)();
-};
-
-typedef void (*TestFunction)();
-
-struct NameAndDesc
-{
- NameAndDesc(const char* _name = "", const char* _description = "")
- : name(_name), description(_description)
- {
- }
-
- const char* name;
- const char* description;
-};
-
-void registerTestCase(ITestCase* testCase,
- char const* className,
- NameAndDesc const& nameAndDesc,
- SourceLineInfo const& lineInfo);
-
-struct AutoReg
-{
-
- AutoReg(TestFunction function,
- SourceLineInfo const& lineInfo,
- NameAndDesc const& nameAndDesc);
-
- template <typename C>
- AutoReg(void (C::*method)(),
- char const* className,
- NameAndDesc const& nameAndDesc,
- SourceLineInfo const& lineInfo)
- {
-
- registerTestCase(new MethodTestCase<C>(method),
- className,
- nameAndDesc,
- lineInfo);
- }
-
- ~AutoReg();
-
- private:
- AutoReg(AutoReg const&);
- void operator=(AutoReg const&);
-};
-
-void registerTestCaseFunction(TestFunction function,
- SourceLineInfo const& lineInfo,
- NameAndDesc const& nameAndDesc);
-
-} // end namespace Catch
-
-#ifdef CATCH_CONFIG_VARIADIC_MACROS
-///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CATCH_TESTCASE(...) \
- static void INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____)(); \
- namespace { \
- Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME(autoRegistrar)(&INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc(__VA_ARGS__)); \
- } \
- static void INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____)()
-
-///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CATCH_METHOD_AS_TEST_CASE(QualifiedMethod, ...) \
- namespace { \
- Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME(autoRegistrar)(&QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc(__VA_ARGS__), CATCH_INTERNAL_LINEINFO); \
- }
-
-///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CATCH_TEST_CASE_METHOD(ClassName, ...) \
- namespace { \
- struct INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____) : ClassName \
- { \
- void test(); \
- }; \
- Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME(autoRegistrar)(&INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____)::test, #ClassName, Catch::NameAndDesc(__VA_ARGS__), CATCH_INTERNAL_LINEINFO); \
- } \
- void INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____)::test()
-
-///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CATCH_REGISTER_TESTCASE(Function, ...) \
- Catch::AutoReg(Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc(__VA_ARGS__));
-
-#else
-///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CATCH_TESTCASE(Name, Desc) \
- static void INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____)(); \
- namespace { \
- Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME(autoRegistrar)(&INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc(Name, Desc)); \
- } \
- static void INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____)()
-
-///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CATCH_METHOD_AS_TEST_CASE(QualifiedMethod, Name, Desc) \
- namespace { \
- Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME(autoRegistrar)(&QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc(Name, Desc), CATCH_INTERNAL_LINEINFO); \
- }
-
-///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CATCH_TEST_CASE_METHOD(ClassName, TestName, Desc) \
- namespace { \
- struct INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____) : ClassName \
- { \
- void test(); \
- }; \
- Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME(autoRegistrar)(&INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____)::test, #ClassName, Catch::NameAndDesc(TestName, Desc), CATCH_INTERNAL_LINEINFO); \
- } \
- void INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____)::test()
-
-///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CATCH_REGISTER_TESTCASE(Function, Name, Desc) \
- Catch::AutoReg(Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc(Name, Desc));
-#endif
-
-// #included from: internal/catch_capture.hpp
-#define TWOBLUECUBES_CATCH_CAPTURE_HPP_INCLUDED
-
-// #included from: catch_result_builder.h
-#define TWOBLUECUBES_CATCH_RESULT_BUILDER_H_INCLUDED
-
-// #included from: catch_result_type.h
-#define TWOBLUECUBES_CATCH_RESULT_TYPE_H_INCLUDED
-
-namespace Catch {
-
-// ResultWas::OfType enum
-struct ResultWas
-{
- enum OfType
- {
- Unknown = -1,
- Ok = 0,
- Info = 1,
- Warning = 2,
-
- FailureBit = 0x10,
-
- ExpressionFailed = FailureBit | 1,
- ExplicitFailure = FailureBit | 2,
-
- Exception = 0x100 | FailureBit,
-
- ThrewException = Exception | 1,
- DidntThrowException = Exception | 2,
-
- FatalErrorCondition = 0x200 | FailureBit
-
- };
-};
-
-inline bool isOk(ResultWas::OfType resultType)
-{
- return (resultType & ResultWas::FailureBit) == 0;
-}
-inline bool isJustInfo(int flags)
-{
- return flags == ResultWas::Info;
-}
-
-// ResultDisposition::Flags enum
-struct ResultDisposition
-{
- enum Flags
- {
- Normal = 0x01,
-
- ContinueOnFailure = 0x02, // Failures fail test, but execution continues
- FalseTest = 0x04, // Prefix expression with !
- SuppressFail = 0x08 // Failures are reported but do not fail the test
- };
-};
-
-inline ResultDisposition::Flags operator|(ResultDisposition::Flags lhs, ResultDisposition::Flags rhs)
-{
- return static_cast<ResultDisposition::Flags>(static_cast<int>(lhs) | static_cast<int>(rhs));
-}
-
-inline bool shouldContinueOnFailure(int flags) { return (flags & ResultDisposition::ContinueOnFailure) != 0; }
-inline bool isFalseTest(int flags) { return (flags & ResultDisposition::FalseTest) != 0; }
-inline bool shouldSuppressFailure(int flags) { return (flags & ResultDisposition::SuppressFail) != 0; }
-
-} // end namespace Catch
-
-// #included from: catch_assertionresult.h
-#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_H_INCLUDED
-
-#include <string>
-
-namespace Catch {
-
-struct AssertionInfo
-{
- AssertionInfo() {}
- AssertionInfo(std::string const& _macroName,
- SourceLineInfo const& _lineInfo,
- std::string const& _capturedExpression,
- ResultDisposition::Flags _resultDisposition);
-
- std::string macroName;
- SourceLineInfo lineInfo;
- std::string capturedExpression;
- ResultDisposition::Flags resultDisposition;
-};
-
-struct AssertionResultData
-{
- AssertionResultData() : resultType(ResultWas::Unknown) {}
-
- std::string reconstructedExpression;
- std::string message;
- ResultWas::OfType resultType;
-};
-
-class AssertionResult
-{
- public:
- AssertionResult();
- AssertionResult(AssertionInfo const& info, AssertionResultData const& data);
- ~AssertionResult();
-#ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
- AssertionResult(AssertionResult const&) = default;
- AssertionResult(AssertionResult&&) = default;
- AssertionResult& operator=(AssertionResult const&) = default;
- AssertionResult& operator=(AssertionResult&&) = default;
-#endif
-
- bool isOk() const;
- bool succeeded() const;
- ResultWas::OfType getResultType() const;
- bool hasExpression() const;
- bool hasMessage() const;
- std::string getExpression() const;
- std::string getExpressionInMacro() const;
- bool hasExpandedExpression() const;
- std::string getExpandedExpression() const;
- std::string getMessage() const;
- SourceLineInfo getSourceInfo() const;
- std::string getTestMacroName() const;
-
- protected:
- AssertionInfo m_info;
- AssertionResultData m_resultData;
-};
-
-} // end namespace Catch
-
-// #included from: catch_matchers.hpp
-#define TWOBLUECUBES_CATCH_MATCHERS_HPP_INCLUDED
-
-namespace Catch {
-namespace Matchers {
-namespace Impl {
-
-namespace Generic {
-template <typename ExpressionT>
-class AllOf;
-template <typename ExpressionT>
-class AnyOf;
-template <typename ExpressionT>
-class Not;
-}
-
-template <typename ExpressionT>
-struct Matcher : SharedImpl<IShared>
-{
- typedef ExpressionT ExpressionType;
-
- virtual ~Matcher() {}
- virtual Ptr<Matcher> clone() const = 0;
- virtual bool match(ExpressionT const& expr) const = 0;
- virtual std::string toString() const = 0;
-
- Generic::AllOf<ExpressionT> operator&&(Matcher<ExpressionT> const& other) const;
- Generic::AnyOf<ExpressionT> operator||(Matcher<ExpressionT> const& other) const;
- Generic::Not<ExpressionT> operator!() const;
-};
-
-template <typename DerivedT, typename ExpressionT>
-struct MatcherImpl : Matcher<ExpressionT>
-{
-
- virtual Ptr<Matcher<ExpressionT>> clone() const
- {
- return Ptr<Matcher<ExpressionT>>(new DerivedT(static_cast<DerivedT const&>(*this)));
- }
-};
-
-namespace Generic {
-template <typename ExpressionT>
-class Not : public MatcherImpl<Not<ExpressionT>, ExpressionT>
-{
- public:
- explicit Not(Matcher<ExpressionT> const& matcher) : m_matcher(matcher.clone()) {}
- Not(Not const& other) : m_matcher(other.m_matcher) {}
-
- virtual bool match(ExpressionT const& expr) const CATCH_OVERRIDE
- {
- return !m_matcher->match(expr);
- }
-
- virtual std::string toString() const CATCH_OVERRIDE
- {
- return "not " + m_matcher->toString();
- }
-
- private:
- Ptr<Matcher<ExpressionT>> m_matcher;
-};
-
-template <typename ExpressionT>
-class AllOf : public MatcherImpl<AllOf<ExpressionT>, ExpressionT>
-{
- public:
- AllOf() {}
- AllOf(AllOf const& other) : m_matchers(other.m_matchers) {}
-
- AllOf& add(Matcher<ExpressionT> const& matcher)
- {
- m_matchers.push_back(matcher.clone());
- return *this;
- }
- virtual bool match(ExpressionT const& expr) const
- {
- for (std::size_t i = 0; i < m_matchers.size(); ++i)
- if (!m_matchers[i]->match(expr))
- return false;
- return true;
- }
- virtual std::string toString() const
- {
- std::ostringstream oss;
- oss << "( ";
- for (std::size_t i = 0; i < m_matchers.size(); ++i)
- {
- if (i != 0)
- oss << " and ";
- oss << m_matchers[i]->toString();
- }
- oss << " )";
- return oss.str();
- }
-
- AllOf operator&&(Matcher<ExpressionT> const& other) const
- {
- AllOf allOfExpr(*this);
- allOfExpr.add(other);
- return allOfExpr;
- }
-
- private:
- std::vector<Ptr<Matcher<ExpressionT>>> m_matchers;
-};
-
-template <typename ExpressionT>
-class AnyOf : public MatcherImpl<AnyOf<ExpressionT>, ExpressionT>
-{
- public:
- AnyOf() {}
- AnyOf(AnyOf const& other) : m_matchers(other.m_matchers) {}
-
- AnyOf& add(Matcher<ExpressionT> const& matcher)
- {
- m_matchers.push_back(matcher.clone());
- return *this;
- }
- virtual bool match(ExpressionT const& expr) const
- {
- for (std::size_t i = 0; i < m_matchers.size(); ++i)
- if (m_matchers[i]->match(expr))
- return true;
- return false;
- }
- virtual std::string toString() const
- {
- std::ostringstream oss;
- oss << "( ";
- for (std::size_t i = 0; i < m_matchers.size(); ++i)
- {
- if (i != 0)
- oss << " or ";
- oss << m_matchers[i]->toString();
- }
- oss << " )";
- return oss.str();
- }
-
- AnyOf operator||(Matcher<ExpressionT> const& other) const
- {
- AnyOf anyOfExpr(*this);
- anyOfExpr.add(other);
- return anyOfExpr;
- }
-
- private:
- std::vector<Ptr<Matcher<ExpressionT>>> m_matchers;
-};
-
-} // namespace Generic
-
-template <typename ExpressionT>
-Generic::AllOf<ExpressionT> Matcher<ExpressionT>::operator&&(Matcher<ExpressionT> const& other) const
-{
- Generic::AllOf<ExpressionT> allOfExpr;
- allOfExpr.add(*this);
- allOfExpr.add(other);
- return allOfExpr;
-}
-
-template <typename ExpressionT>
-Generic::AnyOf<ExpressionT> Matcher<ExpressionT>::operator||(Matcher<ExpressionT> const& other) const
-{
- Generic::AnyOf<ExpressionT> anyOfExpr;
- anyOfExpr.add(*this);
- anyOfExpr.add(other);
- return anyOfExpr;
-}
-
-template <typename ExpressionT>
-Generic::Not<ExpressionT> Matcher<ExpressionT>::operator!() const
-{
- return Generic::Not<ExpressionT>(*this);
-}
-
-namespace StdString {
-
-inline std::string makeString(std::string const& str) { return str; }
-inline std::string makeString(const char* str) { return str ? std::string(str) : std::string(); }
-
-struct CasedString
-{
- CasedString(std::string const& str, CaseSensitive::Choice caseSensitivity)
- : m_caseSensitivity(caseSensitivity),
- m_str(adjustString(str))
- {
- }
- std::string adjustString(std::string const& str) const
- {
- return m_caseSensitivity == CaseSensitive::No
- ? toLower(str)
- : str;
- }
- std::string toStringSuffix() const
- {
- return m_caseSensitivity == CaseSensitive::No
- ? " (case insensitive)"
- : "";
- }
- CaseSensitive::Choice m_caseSensitivity;
- std::string m_str;
-};
-
-struct Equals : MatcherImpl<Equals, std::string>
-{
- Equals(std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes)
- : m_data(str, caseSensitivity)
- {
- }
- Equals(Equals const& other) : m_data(other.m_data) {}
-
- virtual ~Equals();
-
- virtual bool match(std::string const& expr) const
- {
- return m_data.m_str == m_data.adjustString(expr);
- ;
- }
- virtual std::string toString() const
- {
- return "equals: \"" + m_data.m_str + "\"" + m_data.toStringSuffix();
- }
-
- CasedString m_data;
-};
-
-struct Contains : MatcherImpl<Contains, std::string>
-{
- Contains(std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes)
- : m_data(substr, caseSensitivity) {}
- Contains(Contains const& other) : m_data(other.m_data) {}
-
- virtual ~Contains();
-
- virtual bool match(std::string const& expr) const
- {
- return m_data.adjustString(expr).find(m_data.m_str) != std::string::npos;
- }
- virtual std::string toString() const
- {
- return "contains: \"" + m_data.m_str + "\"" + m_data.toStringSuffix();
- }
-
- CasedString m_data;
-};
-
-struct StartsWith : MatcherImpl<StartsWith, std::string>
-{
- StartsWith(std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes)
- : m_data(substr, caseSensitivity) {}
-
- StartsWith(StartsWith const& other) : m_data(other.m_data) {}
-
- virtual ~StartsWith();
-
- virtual bool match(std::string const& expr) const
- {
- return m_data.adjustString(expr).find(m_data.m_str) == 0;
- }
- virtual std::string toString() const
- {
- return "starts with: \"" + m_data.m_str + "\"" + m_data.toStringSuffix();
- }
-
- CasedString m_data;
-};
-
-struct EndsWith : MatcherImpl<EndsWith, std::string>
-{
- EndsWith(std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes)
- : m_data(substr, caseSensitivity) {}
- EndsWith(EndsWith const& other) : m_data(other.m_data) {}
-
- virtual ~EndsWith();
-
- virtual bool match(std::string const& expr) const
- {
- return m_data.adjustString(expr).find(m_data.m_str) == expr.size() - m_data.m_str.size();
- }
- virtual std::string toString() const
- {
- return "ends with: \"" + m_data.m_str + "\"" + m_data.toStringSuffix();
- }
-
- CasedString m_data;
-};
-} // namespace StdString
-} // namespace Impl
-
-// The following functions create the actual matcher objects.
-// This allows the types to be inferred
-template <typename ExpressionT>
-inline Impl::Generic::Not<ExpressionT> Not(Impl::Matcher<ExpressionT> const& m)
-{
- return Impl::Generic::Not<ExpressionT>(m);
-}
-
-template <typename ExpressionT>
-inline Impl::Generic::AllOf<ExpressionT> AllOf(Impl::Matcher<ExpressionT> const& m1,
- Impl::Matcher<ExpressionT> const& m2)
-{
- return Impl::Generic::AllOf<ExpressionT>().add(m1).add(m2);
-}
-template <typename ExpressionT>
-inline Impl::Generic::AllOf<ExpressionT> AllOf(Impl::Matcher<ExpressionT> const& m1,
- Impl::Matcher<ExpressionT> const& m2,
- Impl::Matcher<ExpressionT> const& m3)
-{
- return Impl::Generic::AllOf<ExpressionT>().add(m1).add(m2).add(m3);
-}
-template <typename ExpressionT>
-inline Impl::Generic::AnyOf<ExpressionT> AnyOf(Impl::Matcher<ExpressionT> const& m1,
- Impl::Matcher<ExpressionT> const& m2)
-{
- return Impl::Generic::AnyOf<ExpressionT>().add(m1).add(m2);
-}
-template <typename ExpressionT>
-inline Impl::Generic::AnyOf<ExpressionT> AnyOf(Impl::Matcher<ExpressionT> const& m1,
- Impl::Matcher<ExpressionT> const& m2,
- Impl::Matcher<ExpressionT> const& m3)
-{
- return Impl::Generic::AnyOf<ExpressionT>().add(m1).add(m2).add(m3);
-}
-
-inline Impl::StdString::Equals Equals(std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes)
-{
- return Impl::StdString::Equals(str, caseSensitivity);
-}
-inline Impl::StdString::Equals Equals(const char* str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes)
-{
- return Impl::StdString::Equals(Impl::StdString::makeString(str), caseSensitivity);
-}
-inline Impl::StdString::Contains Contains(std::string const& substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes)
-{
- return Impl::StdString::Contains(substr, caseSensitivity);
-}
-inline Impl::StdString::Contains Contains(const char* substr, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes)
-{
- return Impl::StdString::Contains(Impl::StdString::makeString(substr), caseSensitivity);
-}
-inline Impl::StdString::StartsWith StartsWith(std::string const& substr)
-{
- return Impl::StdString::StartsWith(substr);
-}
-inline Impl::StdString::StartsWith StartsWith(const char* substr)
-{
- return Impl::StdString::StartsWith(Impl::StdString::makeString(substr));
-}
-inline Impl::StdString::EndsWith EndsWith(std::string const& substr)
-{
- return Impl::StdString::EndsWith(substr);
-}
-inline Impl::StdString::EndsWith EndsWith(const char* substr)
-{
- return Impl::StdString::EndsWith(Impl::StdString::makeString(substr));
-}
-
-} // namespace Matchers
-
-using namespace Matchers;
-
-} // namespace Catch
-
-namespace Catch {
-
-struct TestFailureException
-{
-};
-
-template <typename T>
-class ExpressionLhs;
-
-struct STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison;
-
-struct CopyableStream
-{
- CopyableStream() {}
- CopyableStream(CopyableStream const& other)
- {
- oss << other.oss.str();
- }
- CopyableStream& operator=(CopyableStream const& other)
- {
- oss.str("");
- oss << other.oss.str();
- return *this;
- }
- std::ostringstream oss;
-};
-
-class ResultBuilder
-{
- public:
- ResultBuilder(char const* macroName,
- SourceLineInfo const& lineInfo,
- char const* capturedExpression,
- ResultDisposition::Flags resultDisposition,
- char const* secondArg = "");
-
- template <typename T>
- ExpressionLhs<T const&> operator<=(T const& operand);
- ExpressionLhs<bool> operator<=(bool value);
-
- template <typename T>
- ResultBuilder& operator<<(T const& value)
- {
- m_stream.oss << value;
- return *this;
- }
-
- template <typename RhsT>
- STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator&&(RhsT const&);
- template <typename RhsT>
- STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator||(RhsT const&);
-
- ResultBuilder& setResultType(ResultWas::OfType result);
- ResultBuilder& setResultType(bool result);
- ResultBuilder& setLhs(std::string const& lhs);
- ResultBuilder& setRhs(std::string const& rhs);
- ResultBuilder& setOp(std::string const& op);
-
- void endExpression();
-
- std::string reconstructExpression() const;
- AssertionResult build() const;
-
- void useActiveException(ResultDisposition::Flags resultDisposition = ResultDisposition::Normal);
- void captureResult(ResultWas::OfType resultType);
- void captureExpression();
- void captureExpectedException(std::string const& expectedMessage);
- void captureExpectedException(Matchers::Impl::Matcher<std::string> const& matcher);
- void handleResult(AssertionResult const& result);
- void react();
- bool shouldDebugBreak() const;
- bool allowThrows() const;
-
- private:
- AssertionInfo m_assertionInfo;
- AssertionResultData m_data;
- struct ExprComponents
- {
- ExprComponents() : testFalse(false) {}
- bool testFalse;
- std::string lhs, rhs, op;
- } m_exprComponents;
- CopyableStream m_stream;
-
- bool m_shouldDebugBreak;
- bool m_shouldThrow;
-};
-
-} // namespace Catch
-
-// Include after due to circular dependency:
-// #included from: catch_expression_lhs.hpp
-#define TWOBLUECUBES_CATCH_EXPRESSION_LHS_HPP_INCLUDED
-
-// #included from: catch_evaluate.hpp
-#define TWOBLUECUBES_CATCH_EVALUATE_HPP_INCLUDED
-
-#ifdef _MSC_VER
-#pragma warning(push)
-#pragma warning(disable : 4389) // '==' : signed/unsigned mismatch
-#endif
-
-#include <cstddef>
-
-namespace Catch {
-namespace Internal {
-
-enum Operator
-{
- IsEqualTo,
- IsNotEqualTo,
- IsLessThan,
- IsGreaterThan,
- IsLessThanOrEqualTo,
- IsGreaterThanOrEqualTo
-};
-
-template <Operator Op>
-struct OperatorTraits
-{
- static const char* getName() { return "*error*"; }
-};
-template <>
-struct OperatorTraits<IsEqualTo>
-{
- static const char* getName() { return "=="; }
-};
-template <>
-struct OperatorTraits<IsNotEqualTo>
-{
- static const char* getName() { return "!="; }
-};
-template <>
-struct OperatorTraits<IsLessThan>
-{
- static const char* getName() { return "<"; }
-};
-template <>
-struct OperatorTraits<IsGreaterThan>
-{
- static const char* getName() { return ">"; }
-};
-template <>
-struct OperatorTraits<IsLessThanOrEqualTo>
-{
- static const char* getName() { return "<="; }
-};
-template <>
-struct OperatorTraits<IsGreaterThanOrEqualTo>
-{
- static const char* getName() { return ">="; }
-};
-
-template <typename T>
-inline T& opCast(T const& t)
-{
- return const_cast<T&>(t);
-}
-
-// nullptr_t support based on pull request #154 from Konstantin Baumann
-#ifdef CATCH_CONFIG_CPP11_NULLPTR
-inline std::nullptr_t opCast(std::nullptr_t)
-{
- return nullptr;
-}
-#endif // CATCH_CONFIG_CPP11_NULLPTR
-
-// So the compare overloads can be operator agnostic we convey the operator as a template
-// enum, which is used to specialise an Evaluator for doing the comparison.
-template <typename T1, typename T2, Operator Op>
-class Evaluator
-{
-};
-
-template <typename T1, typename T2>
-struct Evaluator<T1, T2, IsEqualTo>
-{
- static bool evaluate(T1 const& lhs, T2 const& rhs)
- {
- return opCast(lhs) == opCast(rhs);
- }
-};
-template <typename T1, typename T2>
-struct Evaluator<T1, T2, IsNotEqualTo>
-{
- static bool evaluate(T1 const& lhs, T2 const& rhs)
- {
- return opCast(lhs) != opCast(rhs);
- }
-};
-template <typename T1, typename T2>
-struct Evaluator<T1, T2, IsLessThan>
-{
- static bool evaluate(T1 const& lhs, T2 const& rhs)
- {
- return opCast(lhs) < opCast(rhs);
- }
-};
-template <typename T1, typename T2>
-struct Evaluator<T1, T2, IsGreaterThan>
-{
- static bool evaluate(T1 const& lhs, T2 const& rhs)
- {
- return opCast(lhs) > opCast(rhs);
- }
-};
-template <typename T1, typename T2>
-struct Evaluator<T1, T2, IsGreaterThanOrEqualTo>
-{
- static bool evaluate(T1 const& lhs, T2 const& rhs)
- {
- return opCast(lhs) >= opCast(rhs);
- }
-};
-template <typename T1, typename T2>
-struct Evaluator<T1, T2, IsLessThanOrEqualTo>
-{
- static bool evaluate(T1 const& lhs, T2 const& rhs)
- {
- return opCast(lhs) <= opCast(rhs);
- }
-};
-
-template <Operator Op, typename T1, typename T2>
-bool applyEvaluator(T1 const& lhs, T2 const& rhs)
-{
- return Evaluator<T1, T2, Op>::evaluate(lhs, rhs);
-}
-
-// This level of indirection allows us to specialise for integer types
-// to avoid signed/ unsigned warnings
-
-// "base" overload
-template <Operator Op, typename T1, typename T2>
-bool compare(T1 const& lhs, T2 const& rhs)
-{
- return Evaluator<T1, T2, Op>::evaluate(lhs, rhs);
-}
-
-// unsigned X to int
-template <Operator Op>
-bool compare(unsigned int lhs, int rhs)
-{
- return applyEvaluator<Op>(lhs, static_cast<unsigned int>(rhs));
-}
-template <Operator Op>
-bool compare(unsigned long lhs, int rhs)
-{
- return applyEvaluator<Op>(lhs, static_cast<unsigned int>(rhs));
-}
-template <Operator Op>
-bool compare(unsigned char lhs, int rhs)
-{
- return applyEvaluator<Op>(lhs, static_cast<unsigned int>(rhs));
-}
-
-// unsigned X to long
-template <Operator Op>
-bool compare(unsigned int lhs, long rhs)
-{
- return applyEvaluator<Op>(lhs, static_cast<unsigned long>(rhs));
-}
-template <Operator Op>
-bool compare(unsigned long lhs, long rhs)
-{
- return applyEvaluator<Op>(lhs, static_cast<unsigned long>(rhs));
-}
-template <Operator Op>
-bool compare(unsigned char lhs, long rhs)
-{
- return applyEvaluator<Op>(lhs, static_cast<unsigned long>(rhs));
-}
-
-// int to unsigned X
-template <Operator Op>
-bool compare(int lhs, unsigned int rhs)
-{
- return applyEvaluator<Op>(static_cast<unsigned int>(lhs), rhs);
-}
-template <Operator Op>
-bool compare(int lhs, unsigned long rhs)
-{
- return applyEvaluator<Op>(static_cast<unsigned int>(lhs), rhs);
-}
-template <Operator Op>
-bool compare(int lhs, unsigned char rhs)
-{
- return applyEvaluator<Op>(static_cast<unsigned int>(lhs), rhs);
-}
-
-// long to unsigned X
-template <Operator Op>
-bool compare(long lhs, unsigned int rhs)
-{
- return applyEvaluator<Op>(static_cast<unsigned long>(lhs), rhs);
-}
-template <Operator Op>
-bool compare(long lhs, unsigned long rhs)
-{
- return applyEvaluator<Op>(static_cast<unsigned long>(lhs), rhs);
-}
-template <Operator Op>
-bool compare(long lhs, unsigned char rhs)
-{
- return applyEvaluator<Op>(static_cast<unsigned long>(lhs), rhs);
-}
-
-// pointer to long (when comparing against NULL)
-template <Operator Op, typename T>
-bool compare(long lhs, T* rhs)
-{
- return Evaluator<T*, T*, Op>::evaluate(reinterpret_cast<T*>(lhs), rhs);
-}
-template <Operator Op, typename T>
-bool compare(T* lhs, long rhs)
-{
- return Evaluator<T*, T*, Op>::evaluate(lhs, reinterpret_cast<T*>(rhs));
-}
-
-// pointer to int (when comparing against NULL)
-template <Operator Op, typename T>
-bool compare(int lhs, T* rhs)
-{
- return Evaluator<T*, T*, Op>::evaluate(reinterpret_cast<T*>(lhs), rhs);
-}
-template <Operator Op, typename T>
-bool compare(T* lhs, int rhs)
-{
- return Evaluator<T*, T*, Op>::evaluate(lhs, reinterpret_cast<T*>(rhs));
-}
-
-#ifdef CATCH_CONFIG_CPP11_LONG_LONG
-// long long to unsigned X
-template <Operator Op>
-bool compare(long long lhs, unsigned int rhs)
-{
- return applyEvaluator<Op>(static_cast<unsigned long>(lhs), rhs);
-}
-template <Operator Op>
-bool compare(long long lhs, unsigned long rhs)
-{
- return applyEvaluator<Op>(static_cast<unsigned long>(lhs), rhs);
-}
-template <Operator Op>
-bool compare(long long lhs, unsigned long long rhs)
-{
- return applyEvaluator<Op>(static_cast<unsigned long>(lhs), rhs);
-}
-template <Operator Op>
-bool compare(long long lhs, unsigned char rhs)
-{
- return applyEvaluator<Op>(static_cast<unsigned long>(lhs), rhs);
-}
-
-// unsigned long long to X
-template <Operator Op>
-bool compare(unsigned long long lhs, int rhs)
-{
- return applyEvaluator<Op>(static_cast<long>(lhs), rhs);
-}
-template <Operator Op>
-bool compare(unsigned long long lhs, long rhs)
-{
- return applyEvaluator<Op>(static_cast<long>(lhs), rhs);
-}
-template <Operator Op>
-bool compare(unsigned long long lhs, long long rhs)
-{
- return applyEvaluator<Op>(static_cast<long>(lhs), rhs);
-}
-template <Operator Op>
-bool compare(unsigned long long lhs, char rhs)
-{
- return applyEvaluator<Op>(static_cast<long>(lhs), rhs);
-}
-
-// pointer to long long (when comparing against NULL)
-template <Operator Op, typename T>
-bool compare(long long lhs, T* rhs)
-{
- return Evaluator<T*, T*, Op>::evaluate(reinterpret_cast<T*>(lhs), rhs);
-}
-template <Operator Op, typename T>
-bool compare(T* lhs, long long rhs)
-{
- return Evaluator<T*, T*, Op>::evaluate(lhs, reinterpret_cast<T*>(rhs));
-}
-#endif // CATCH_CONFIG_CPP11_LONG_LONG
-
-#ifdef CATCH_CONFIG_CPP11_NULLPTR
-// pointer to nullptr_t (when comparing against nullptr)
-template <Operator Op, typename T>
-bool compare(std::nullptr_t, T* rhs)
-{
- return Evaluator<T*, T*, Op>::evaluate(nullptr, rhs);
-}
-template <Operator Op, typename T>
-bool compare(T* lhs, std::nullptr_t)
-{
- return Evaluator<T*, T*, Op>::evaluate(lhs, nullptr);
-}
-#endif // CATCH_CONFIG_CPP11_NULLPTR
-
-} // end of namespace Internal
-} // end of namespace Catch
-
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
-
-// #included from: catch_tostring.h
-#define TWOBLUECUBES_CATCH_TOSTRING_H_INCLUDED
-
-#include <cstddef>
-#include <iomanip>
-#include <limits>
-#include <sstream>
-#include <vector>
-
-#ifdef __OBJC__
-// #included from: catch_objc_arc.hpp
-#define TWOBLUECUBES_CATCH_OBJC_ARC_HPP_INCLUDED
-
-#import <Foundation/Foundation.h>
-
-#ifdef __has_feature
-#define CATCH_ARC_ENABLED __has_feature(objc_arc)
-#else
-#define CATCH_ARC_ENABLED 0
-#endif
-
-void arcSafeRelease(NSObject* obj);
-id performOptionalSelector(id obj, SEL sel);
-
-#if !CATCH_ARC_ENABLED
-inline void arcSafeRelease(NSObject* obj)
-{
- [obj release];
-}
-inline id performOptionalSelector(id obj, SEL sel)
-{
- if ([obj respondsToSelector:sel])
- return [obj performSelector:sel];
- return nil;
-}
-#define CATCH_UNSAFE_UNRETAINED
-#define CATCH_ARC_STRONG
-#else
-inline void arcSafeRelease(NSObject*)
-{
-}
-inline id performOptionalSelector(id obj, SEL sel)
-{
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
-#endif
- if ([obj respondsToSelector:sel])
- return [obj performSelector:sel];
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
- return nil;
-}
-#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained
-#define CATCH_ARC_STRONG __strong
-#endif
-
-#endif
-
-#ifdef CATCH_CONFIG_CPP11_TUPLE
-#include <tuple>
-#endif
-
-#ifdef CATCH_CONFIG_CPP11_IS_ENUM
-#include <type_traits>
-#endif
-
-namespace Catch {
-
-// Why we're here.
-template <typename T>
-std::string toString(T const& value);
-
-// Built in overloads
-
-std::string toString(std::string const& value);
-std::string toString(std::wstring const& value);
-std::string toString(const char* const value);
-std::string toString(char* const value);
-std::string toString(const wchar_t* const value);
-std::string toString(wchar_t* const value);
-std::string toString(int value);
-std::string toString(unsigned long value);
-std::string toString(unsigned int value);
-std::string toString(const double value);
-std::string toString(const float value);
-std::string toString(bool value);
-std::string toString(char value);
-std::string toString(signed char value);
-std::string toString(unsigned char value);
-
-#ifdef CATCH_CONFIG_CPP11_LONG_LONG
-std::string toString(long long value);
-std::string toString(unsigned long long value);
-#endif
-
-#ifdef CATCH_CONFIG_CPP11_NULLPTR
-std::string toString(std::nullptr_t);
-#endif
-
-#ifdef __OBJC__
-std::string toString(NSString const* const& nsstring);
-std::string toString(NSString* CATCH_ARC_STRONG const& nsstring);
-std::string toString(NSObject* const& nsObject);
-#endif
-
-namespace Detail {
-
-extern const std::string unprintableString;
-
-struct BorgType
-{
- template <typename T>
- BorgType(T const&);
-};
-
-struct TrueType
-{
- char sizer[1];
-};
-struct FalseType
-{
- char sizer[2];
-};
-
-TrueType& testStreamable(std::ostream&);
-FalseType testStreamable(FalseType);
-
-FalseType operator<<(std::ostream const&, BorgType const&);
-
-template <typename T>
-struct IsStreamInsertable
-{
- static std::ostream& s;
- static T const& t;
- enum
- {
- value = sizeof(testStreamable(s << t)) == sizeof(TrueType)
- };
-};
-
-#if defined(CATCH_CONFIG_CPP11_IS_ENUM)
-template <typename T,
- bool IsEnum = std::is_enum<T>::value>
-struct EnumStringMaker
-{
- static std::string convert(T const&) { return unprintableString; }
-};
-
-template <typename T>
-struct EnumStringMaker<T, true>
-{
- static std::string convert(T const& v)
- {
- return ::Catch::toString(
- static_cast<typename std::underlying_type<T>::type>(v));
- }
-};
-#endif
-template <bool C>
-struct StringMakerBase
-{
-#if defined(CATCH_CONFIG_CPP11_IS_ENUM)
- template <typename T>
- static std::string convert(T const& v)
- {
- return EnumStringMaker<T>::convert(v);
- }
-#else
- template <typename T>
- static std::string convert(T const&)
- {
- return unprintableString;
- }
-#endif
-};
-
-template <>
-struct StringMakerBase<true>
-{
- template <typename T>
- static std::string convert(T const& _value)
- {
- std::ostringstream oss;
- oss << _value;
- return oss.str();
- }
-};
-
-std::string rawMemoryToString(const void* object, std::size_t size);
-
-template <typename T>
-inline std::string rawMemoryToString(const T& object)
-{
- return rawMemoryToString(&object, sizeof(object));
-}
-
-} // end namespace Detail
-
-template <typename T>
-struct StringMaker : Detail::StringMakerBase<Detail::IsStreamInsertable<T>::value>
-{
-};
-
-template <typename T>
-struct StringMaker<T*>
-{
- template <typename U>
- static std::string convert(U* p)
- {
- if (!p)
- return "NULL";
- else
- return Detail::rawMemoryToString(p);
- }
-};
-
-template <typename R, typename C>
-struct StringMaker<R C::*>
-{
- static std::string convert(R C::*p)
- {
- if (!p)
- return "NULL";
- else
- return Detail::rawMemoryToString(p);
- }
-};
-
-namespace Detail {
-template <typename InputIterator>
-std::string rangeToString(InputIterator first, InputIterator last);
-}
-
-//template<typename T, typename Allocator>
-//struct StringMaker<std::vector<T, Allocator> > {
-// static std::string convert( std::vector<T,Allocator> const& v ) {
-// return Detail::rangeToString( v.begin(), v.end() );
-// }
-//};
-
-template <typename T, typename Allocator>
-std::string toString(std::vector<T, Allocator> const& v)
-{
- return Detail::rangeToString(v.begin(), v.end());
-}
-
-#ifdef CATCH_CONFIG_CPP11_TUPLE
-
-// toString for tuples
-namespace TupleDetail {
-template <
- typename Tuple,
- std::size_t N = 0,
- bool = (N < std::tuple_size<Tuple>::value)>
-struct ElementPrinter
-{
- static void print(const Tuple& tuple, std::ostream& os)
- {
- os << (N ? ", " : " ")
- << Catch::toString(std::get<N>(tuple));
- ElementPrinter<Tuple, N + 1>::print(tuple, os);
- }
-};
-
-template <
- typename Tuple,
- std::size_t N>
-struct ElementPrinter<Tuple, N, false>
-{
- static void print(const Tuple&, std::ostream&) {}
-};
-}
-
-template <typename... Types>
-struct StringMaker<std::tuple<Types...>>
-{
-
- static std::string convert(const std::tuple<Types...>& tuple)
- {
- std::ostringstream os;
- os << '{';
- TupleDetail::ElementPrinter<std::tuple<Types...>>::print(tuple, os);
- os << " }";
- return os.str();
- }
-};
-#endif // CATCH_CONFIG_CPP11_TUPLE
-
-namespace Detail {
-template <typename T>
-std::string makeString(T const& value)
-{
- return StringMaker<T>::convert(value);
-}
-} // end namespace Detail
-
-/// \brief converts any type to a string
-///
-/// The default template forwards on to ostringstream - except when an
-/// ostringstream overload does not exist - in which case it attempts to detect
-/// that and writes {?}.
-/// Overload (not specialise) this template for custom typs that you don't want
-/// to provide an ostream overload for.
-template <typename T>
-std::string toString(T const& value)
-{
- return StringMaker<T>::convert(value);
-}
-
-namespace Detail {
-template <typename InputIterator>
-std::string rangeToString(InputIterator first, InputIterator last)
-{
- std::ostringstream oss;
- oss << "{ ";
- if (first != last)
- {
- oss << Catch::toString(*first);
- for (++first; first != last; ++first)
- oss << ", " << Catch::toString(*first);
- }
- oss << " }";
- return oss.str();
-}
-}
-
-} // end namespace Catch
-
-namespace Catch {
-
-// Wraps the LHS of an expression and captures the operator and RHS (if any) -
-// wrapping them all in a ResultBuilder object
-template <typename T>
-class ExpressionLhs
-{
- ExpressionLhs& operator=(ExpressionLhs const&);
-#ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
- ExpressionLhs& operator=(ExpressionLhs&&) = delete;
-#endif
-
- public:
- ExpressionLhs(ResultBuilder& rb, T lhs) : m_rb(rb), m_lhs(lhs) {}
-#ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
- ExpressionLhs(ExpressionLhs const&) = default;
- ExpressionLhs(ExpressionLhs&&) = default;
-#endif
-
- template <typename RhsT>
- ResultBuilder& operator==(RhsT const& rhs)
- {
- return captureExpression<Internal::IsEqualTo>(rhs);
- }
-
- template <typename RhsT>
- ResultBuilder& operator!=(RhsT const& rhs)
- {
- return captureExpression<Internal::IsNotEqualTo>(rhs);
- }
-
- template <typename RhsT>
- ResultBuilder& operator<(RhsT const& rhs)
- {
- return captureExpression<Internal::IsLessThan>(rhs);
- }
-
- template <typename RhsT>
- ResultBuilder& operator>(RhsT const& rhs)
- {
- return captureExpression<Internal::IsGreaterThan>(rhs);
- }
-
- template <typename RhsT>
- ResultBuilder& operator<=(RhsT const& rhs)
- {
- return captureExpression<Internal::IsLessThanOrEqualTo>(rhs);
- }
-
- template <typename RhsT>
- ResultBuilder& operator>=(RhsT const& rhs)
- {
- return captureExpression<Internal::IsGreaterThanOrEqualTo>(rhs);
- }
-
- ResultBuilder& operator==(bool rhs)
- {
- return captureExpression<Internal::IsEqualTo>(rhs);
- }
-
- ResultBuilder& operator!=(bool rhs)
- {
- return captureExpression<Internal::IsNotEqualTo>(rhs);
- }
-
- void endExpression()
- {
- bool value = m_lhs ? true : false;
- m_rb
- .setLhs(Catch::toString(value))
- .setResultType(value)
- .endExpression();
- }
-
- // Only simple binary expressions are allowed on the LHS.
- // If more complex compositions are required then place the sub expression in parentheses
- template <typename RhsT>
- STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator+(RhsT const&);
- template <typename RhsT>
- STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator-(RhsT const&);
- template <typename RhsT>
- STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator/(RhsT const&);
- template <typename RhsT>
- STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator*(RhsT const&);
- template <typename RhsT>
- STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator&&(RhsT const&);
- template <typename RhsT>
- STATIC_ASSERT_Expression_Too_Complex_Please_Rewrite_As_Binary_Comparison& operator||(RhsT const&);
-
- private:
- template <Internal::Operator Op, typename RhsT>
- ResultBuilder& captureExpression(RhsT const& rhs)
- {
- return m_rb
- .setResultType(Internal::compare<Op>(m_lhs, rhs))
- .setLhs(Catch::toString(m_lhs))
- .setRhs(Catch::toString(rhs))
- .setOp(Internal::OperatorTraits<Op>::getName());
- }
-
- private:
- ResultBuilder& m_rb;
- T m_lhs;
-};
-
-} // end namespace Catch
-
-namespace Catch {
-
-template <typename T>
-inline ExpressionLhs<T const&> ResultBuilder::operator<=(T const& operand)
-{
- return ExpressionLhs<T const&>(*this, operand);
-}
-
-inline ExpressionLhs<bool> ResultBuilder::operator<=(bool value)
-{
- return ExpressionLhs<bool>(*this, value);
-}
-
-} // namespace Catch
-
-// #included from: catch_message.h
-#define TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED
-
-#include <string>
-
-namespace Catch {
-
-struct MessageInfo
-{
- MessageInfo(std::string const& _macroName,
- SourceLineInfo const& _lineInfo,
- ResultWas::OfType _type);
-
- std::string macroName;
- SourceLineInfo lineInfo;
- ResultWas::OfType type;
- std::string message;
- unsigned int sequence;
-
- bool operator==(MessageInfo const& other) const
- {
- return sequence == other.sequence;
- }
- bool operator<(MessageInfo const& other) const
- {
- return sequence < other.sequence;
- }
-
- private:
- static unsigned int globalCount;
-};
-
-struct MessageBuilder
-{
- MessageBuilder(std::string const& macroName,
- SourceLineInfo const& lineInfo,
- ResultWas::OfType type)
- : m_info(macroName, lineInfo, type)
- {
- }
-
- template <typename T>
- MessageBuilder& operator<<(T const& value)
- {
- m_stream << value;
- return *this;
- }
-
- MessageInfo m_info;
- std::ostringstream m_stream;
-};
-
-class ScopedMessage
-{
- public:
- ScopedMessage(MessageBuilder const& builder);
- ScopedMessage(ScopedMessage const& other);
- ~ScopedMessage();
-
- MessageInfo m_info;
-};
-
-} // end namespace Catch
-
-// #included from: catch_interfaces_capture.h
-#define TWOBLUECUBES_CATCH_INTERFACES_CAPTURE_H_INCLUDED
-
-#include <string>
-
-namespace Catch {
-
-class TestCase;
-class AssertionResult;
-struct AssertionInfo;
-struct SectionInfo;
-struct SectionEndInfo;
-struct MessageInfo;
-class ScopedMessageBuilder;
-struct Counts;
-
-struct IResultCapture
-{
-
- virtual ~IResultCapture();
-
- virtual void assertionEnded(AssertionResult const& result) = 0;
- virtual bool sectionStarted(SectionInfo const& sectionInfo,
- Counts& assertions) = 0;
- virtual void sectionEnded(SectionEndInfo const& endInfo) = 0;
- virtual void sectionEndedEarly(SectionEndInfo const& endInfo) = 0;
- virtual void pushScopedMessage(MessageInfo const& message) = 0;
- virtual void popScopedMessage(MessageInfo const& message) = 0;
-
- virtual std::string getCurrentTestName() const = 0;
- virtual const AssertionResult* getLastResult() const = 0;
-
- virtual void handleFatalErrorCondition(std::string const& message) = 0;
-};
-
-IResultCapture& getResultCapture();
-}
-
-// #included from: catch_debugger.h
-#define TWOBLUECUBES_CATCH_DEBUGGER_H_INCLUDED
-
-// #included from: catch_platform.h
-#define TWOBLUECUBES_CATCH_PLATFORM_H_INCLUDED
-
-#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED)
-#define CATCH_PLATFORM_MAC
-#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
-#define CATCH_PLATFORM_IPHONE
-#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER)
-#define CATCH_PLATFORM_WINDOWS
-#endif
-
-#include <string>
-
-namespace Catch {
-
-bool isDebuggerActive();
-void writeToDebugConsole(std::string const& text);
-}
-
-#ifdef CATCH_PLATFORM_MAC
-
-// The following code snippet based on:
-// http://cocoawithlove.com/2008/03/break-into-debugger.html
-#ifdef DEBUG
-#if defined(__ppc64__) || defined(__ppc__)
-#define CATCH_BREAK_INTO_DEBUGGER() \
- if (Catch::isDebuggerActive()) \
- { \
- __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \
- : \
- : \
- : "memory", "r0", "r3", "r4"); \
- }
-#else
-#define CATCH_BREAK_INTO_DEBUGGER() \
- if (Catch::isDebuggerActive()) \
- { \
- __asm__("int $3\n" \
- : \
- :); \
- }
-#endif
-#endif
-
-#elif defined(_MSC_VER)
-#define CATCH_BREAK_INTO_DEBUGGER() \
- if (Catch::isDebuggerActive()) \
- { \
- __debugbreak(); \
- }
-#elif defined(__MINGW32__)
-extern "C" __declspec(dllimport) void __stdcall DebugBreak();
-#define CATCH_BREAK_INTO_DEBUGGER() \
- if (Catch::isDebuggerActive()) \
- { \
- DebugBreak(); \
- }
-#endif
-
-#ifndef CATCH_BREAK_INTO_DEBUGGER
-#define CATCH_BREAK_INTO_DEBUGGER() Catch::alwaysTrue();
-#endif
-
-// #included from: catch_interfaces_runner.h
-#define TWOBLUECUBES_CATCH_INTERFACES_RUNNER_H_INCLUDED
-
-namespace Catch {
-class TestCase;
-
-struct IRunner
-{
- virtual ~IRunner();
- virtual bool aborting() const = 0;
-};
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// In the event of a failure works out if the debugger needs to be invoked
-// and/or an exception thrown and takes appropriate action.
-// This needs to be done as a macro so the debugger will stop in the user
-// source code rather than in Catch library code
-#define INTERNAL_CATCH_REACT(resultBuilder) \
- if (resultBuilder.shouldDebugBreak()) CATCH_BREAK_INTO_DEBUGGER(); \
- resultBuilder.react();
-
-///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CATCH_TEST(expr, resultDisposition, macroName) \
- do \
- { \
- Catch::ResultBuilder __catchResult(macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition); \
- try \
- { \
- (__catchResult <= expr).endExpression(); \
- } \
- catch (...) \
- { \
- __catchResult.useActiveException(Catch::ResultDisposition::Normal); \
- } \
- INTERNAL_CATCH_REACT(__catchResult) \
- } while (Catch::isTrue(false && (expr))) // expr here is never evaluated at runtime but it forces the compiler to give it a look
-
-///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CATCH_IF(expr, resultDisposition, macroName) \
- INTERNAL_CATCH_TEST(expr, resultDisposition, macroName); \
- if (Catch::getResultCapture().getLastResult()->succeeded())
-
-///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CATCH_ELSE(expr, resultDisposition, macroName) \
- INTERNAL_CATCH_TEST(expr, resultDisposition, macroName); \
- if (!Catch::getResultCapture().getLastResult()->succeeded())
-
-///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CATCH_NO_THROW(expr, resultDisposition, macroName) \
- do \
- { \
- Catch::ResultBuilder __catchResult(macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition); \
- try \
- { \
- expr; \
- __catchResult.captureResult(Catch::ResultWas::Ok); \
- } \
- catch (...) \
- { \
- __catchResult.useActiveException(resultDisposition); \
- } \
- INTERNAL_CATCH_REACT(__catchResult) \
- } while (Catch::alwaysFalse())
-
-///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CATCH_THROWS(expr, resultDisposition, matcher, macroName) \
- do \
- { \
- Catch::ResultBuilder __catchResult(macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition, #matcher); \
- if (__catchResult.allowThrows()) \
- try \
- { \
- expr; \
- __catchResult.captureResult(Catch::ResultWas::DidntThrowException); \
- } \
- catch (...) \
- { \
- __catchResult.captureExpectedException(matcher); \
- } \
- else \
- __catchResult.captureResult(Catch::ResultWas::Ok); \
- INTERNAL_CATCH_REACT(__catchResult) \
- } while (Catch::alwaysFalse())
-
-///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CATCH_THROWS_AS(expr, exceptionType, resultDisposition, macroName) \
- do \
- { \
- Catch::ResultBuilder __catchResult(macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition); \
- if (__catchResult.allowThrows()) \
- try \
- { \
- expr; \
- __catchResult.captureResult(Catch::ResultWas::DidntThrowException); \
- } \
- catch (exceptionType) \
- { \
- __catchResult.captureResult(Catch::ResultWas::Ok); \
- } \
- catch (...) \
- { \
- __catchResult.useActiveException(resultDisposition); \
- } \
- else \
- __catchResult.captureResult(Catch::ResultWas::Ok); \
- INTERNAL_CATCH_REACT(__catchResult) \
- } while (Catch::alwaysFalse())
-
-///////////////////////////////////////////////////////////////////////////////
-#ifdef CATCH_CONFIG_VARIADIC_MACROS
-#define INTERNAL_CATCH_MSG(messageType, resultDisposition, macroName, ...) \
- do \
- { \
- Catch::ResultBuilder __catchResult(macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition); \
- __catchResult << __VA_ARGS__ + ::Catch::StreamEndStop(); \
- __catchResult.captureResult(messageType); \
- INTERNAL_CATCH_REACT(__catchResult) \
- } while (Catch::alwaysFalse())
-#else
-#define INTERNAL_CATCH_MSG(messageType, resultDisposition, macroName, log) \
- do \
- { \
- Catch::ResultBuilder __catchResult(macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition); \
- __catchResult << log + ::Catch::StreamEndStop(); \
- __catchResult.captureResult(messageType); \
- INTERNAL_CATCH_REACT(__catchResult) \
- } while (Catch::alwaysFalse())
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CATCH_INFO(log, macroName) \
- Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME(scopedMessage) = Catch::MessageBuilder(macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info) << log;
-
-///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CHECK_THAT(arg, matcher, resultDisposition, macroName) \
- do \
- { \
- Catch::ResultBuilder __catchResult(macroName, CATCH_INTERNAL_LINEINFO, #arg ", " #matcher, resultDisposition); \
- try \
- { \
- std::string matcherAsString = (matcher).toString(); \
- __catchResult \
- .setLhs(Catch::toString(arg)) \
- .setRhs(matcherAsString == Catch::Detail::unprintableString ? #matcher : matcherAsString) \
- .setOp("matches") \
- .setResultType((matcher).match(arg)); \
- __catchResult.captureExpression(); \
- } \
- catch (...) \
- { \
- __catchResult.useActiveException(resultDisposition | Catch::ResultDisposition::ContinueOnFailure); \
- } \
- INTERNAL_CATCH_REACT(__catchResult) \
- } while (Catch::alwaysFalse())
-
-// #included from: internal/catch_section.h
-#define TWOBLUECUBES_CATCH_SECTION_H_INCLUDED
-
-// #included from: catch_section_info.h
-#define TWOBLUECUBES_CATCH_SECTION_INFO_H_INCLUDED
-
-// #included from: catch_totals.hpp
-#define TWOBLUECUBES_CATCH_TOTALS_HPP_INCLUDED
-
-#include <cstddef>
-
-namespace Catch {
-
-struct Counts
-{
- Counts() : passed(0), failed(0), failedButOk(0) {}
-
- Counts operator-(Counts const& other) const
- {
- Counts diff;
- diff.passed = passed - other.passed;
- diff.failed = failed - other.failed;
- diff.failedButOk = failedButOk - other.failedButOk;
- return diff;
- }
- Counts& operator+=(Counts const& other)
- {
- passed += other.passed;
- failed += other.failed;
- failedButOk += other.failedButOk;
- return *this;
- }
-
- std::size_t total() const
- {
- return passed + failed + failedButOk;
- }
- bool allPassed() const
- {
- return failed == 0 && failedButOk == 0;
- }
- bool allOk() const
- {
- return failed == 0;
- }
-
- std::size_t passed;
- std::size_t failed;
- std::size_t failedButOk;
-};
-
-struct Totals
-{
-
- Totals operator-(Totals const& other) const
- {
- Totals diff;
- diff.assertions = assertions - other.assertions;
- diff.testCases = testCases - other.testCases;
- return diff;
- }
-
- Totals delta(Totals const& prevTotals) const
- {
- Totals diff = *this - prevTotals;
- if (diff.assertions.failed > 0)
- ++diff.testCases.failed;
- else if (diff.assertions.failedButOk > 0)
- ++diff.testCases.failedButOk;
- else
- ++diff.testCases.passed;
- return diff;
- }
-
- Totals& operator+=(Totals const& other)
- {
- assertions += other.assertions;
- testCases += other.testCases;
- return *this;
- }
-
- Counts assertions;
- Counts testCases;
-};
-}
-
-namespace Catch {
-
-struct SectionInfo
-{
- SectionInfo(SourceLineInfo const& _lineInfo,
- std::string const& _name,
- std::string const& _description = std::string());
-
- std::string name;
- std::string description;
- SourceLineInfo lineInfo;
-};
-
-struct SectionEndInfo
-{
- SectionEndInfo(SectionInfo const& _sectionInfo, Counts const& _prevAssertions, double _durationInSeconds)
- : sectionInfo(_sectionInfo), prevAssertions(_prevAssertions), durationInSeconds(_durationInSeconds)
- {
- }
-
- SectionInfo sectionInfo;
- Counts prevAssertions;
- double durationInSeconds;
-};
-
-} // end namespace Catch
-
-// #included from: catch_timer.h
-#define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED
-
-#ifdef CATCH_PLATFORM_WINDOWS
-typedef unsigned long long uint64_t;
-#else
-#include <stdint.h>
-#endif
-
-namespace Catch {
-
-class Timer
-{
- public:
- Timer() : m_ticks(0) {}
- void start();
- unsigned int getElapsedMicroseconds() const;
- unsigned int getElapsedMilliseconds() const;
- double getElapsedSeconds() const;
-
- private:
- uint64_t m_ticks;
-};
-
-} // namespace Catch
-
-#include <string>
-
-namespace Catch {
-
-class Section : NonCopyable
-{
- public:
- Section(SectionInfo const& info);
- ~Section();
-
- // This indicates whether the section should be executed or not
- operator bool() const;
-
- private:
- SectionInfo m_info;
-
- std::string m_name;
- Counts m_assertions;
- bool m_sectionIncluded;
- Timer m_timer;
-};
-
-} // end namespace Catch
-
-#ifdef CATCH_CONFIG_VARIADIC_MACROS
-#define INTERNAL_CATCH_SECTION(...) \
- if (Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME(catch_internal_Section) = Catch::SectionInfo(CATCH_INTERNAL_LINEINFO, __VA_ARGS__))
-#else
-#define INTERNAL_CATCH_SECTION(name, desc) \
- if (Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME(catch_internal_Section) = Catch::SectionInfo(CATCH_INTERNAL_LINEINFO, name, desc))
-#endif
-
-// #included from: internal/catch_generators.hpp
-#define TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED
-
-#include <iterator>
-#include <stdlib.h>
-#include <string>
-#include <vector>
-
-namespace Catch {
-
-template <typename T>
-struct IGenerator
-{
- virtual ~IGenerator() {}
- virtual T getValue(std::size_t index) const = 0;
- virtual std::size_t size() const = 0;
-};
-
-template <typename T>
-class BetweenGenerator : public IGenerator<T>
-{
- public:
- BetweenGenerator(T from, T to) : m_from(from), m_to(to) {}
-
- virtual T getValue(std::size_t index) const
- {
- return m_from + static_cast<int>(index);
- }
-
- virtual std::size_t size() const
- {
- return static_cast<std::size_t>(1 + m_to - m_from);
- }
-
- private:
- T m_from;
- T m_to;
-};
-
-template <typename T>
-class ValuesGenerator : public IGenerator<T>
-{
- public:
- ValuesGenerator() {}
-
- void add(T value)
- {
- m_values.push_back(value);
- }
-
- virtual T getValue(std::size_t index) const
- {
- return m_values[index];
- }
-
- virtual std::size_t size() const
- {
- return m_values.size();
- }
-
- private:
- std::vector<T> m_values;
-};
-
-template <typename T>
-class CompositeGenerator
-{
- public:
- CompositeGenerator() : m_totalSize(0) {}
-
- // *** Move semantics, similar to auto_ptr ***
- CompositeGenerator(CompositeGenerator& other)
- : m_fileInfo(other.m_fileInfo),
- m_totalSize(0)
- {
- move(other);
- }
-
- CompositeGenerator& setFileInfo(const char* fileInfo)
- {
- m_fileInfo = fileInfo;
- return *this;
- }
-
- ~CompositeGenerator()
- {
- deleteAll(m_composed);
- }
-
- operator T() const
- {
- size_t overallIndex = getCurrentContext().getGeneratorIndex(m_fileInfo, m_totalSize);
-
- typename std::vector<const IGenerator<T>*>::const_iterator it = m_composed.begin();
- typename std::vector<const IGenerator<T>*>::const_iterator itEnd = m_composed.end();
- for (size_t index = 0; it != itEnd; ++it)
- {
- const IGenerator<T>* generator = *it;
- if (overallIndex >= index && overallIndex < index + generator->size())
- {
- return generator->getValue(overallIndex - index);
- }
- index += generator->size();
- }
- CATCH_INTERNAL_ERROR("Indexed past end of generated range");
- return T(); // Suppress spurious "not all control paths return a value" warning in Visual Studio - if you know how to fix this please do so
- }
-
- void add(const IGenerator<T>* generator)
- {
- m_totalSize += generator->size();
- m_composed.push_back(generator);
- }
-
- CompositeGenerator& then(CompositeGenerator& other)
- {
- move(other);
- return *this;
- }
-
- CompositeGenerator& then(T value)
- {
- ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();
- valuesGen->add(value);
- add(valuesGen);
- return *this;
- }
-
- private:
- void move(CompositeGenerator& other)
- {
- std::copy(other.m_composed.begin(), other.m_composed.end(), std::back_inserter(m_composed));
- m_totalSize += other.m_totalSize;
- other.m_composed.clear();
- }
-
- std::vector<const IGenerator<T>*> m_composed;
- std::string m_fileInfo;
- size_t m_totalSize;
-};
-
-namespace Generators {
-template <typename T>
-CompositeGenerator<T> between(T from, T to)
-{
- CompositeGenerator<T> generators;
- generators.add(new BetweenGenerator<T>(from, to));
- return generators;
-}
-
-template <typename T>
-CompositeGenerator<T> values(T val1, T val2)
-{
- CompositeGenerator<T> generators;
- ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();
- valuesGen->add(val1);
- valuesGen->add(val2);
- generators.add(valuesGen);
- return generators;
-}
-
-template <typename T>
-CompositeGenerator<T> values(T val1, T val2, T val3)
-{
- CompositeGenerator<T> generators;
- ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();
- valuesGen->add(val1);
- valuesGen->add(val2);
- valuesGen->add(val3);
- generators.add(valuesGen);
- return generators;
-}
-
-template <typename T>
-CompositeGenerator<T> values(T val1, T val2, T val3, T val4)
-{
- CompositeGenerator<T> generators;
- ValuesGenerator<T>* valuesGen = new ValuesGenerator<T>();
- valuesGen->add(val1);
- valuesGen->add(val2);
- valuesGen->add(val3);
- valuesGen->add(val4);
- generators.add(valuesGen);
- return generators;
-}
-
-} // end namespace Generators
-
-using namespace Generators;
-
-} // end namespace Catch
-
-#define INTERNAL_CATCH_LINESTR2(line) #line
-#define INTERNAL_CATCH_LINESTR(line) INTERNAL_CATCH_LINESTR2(line)
-
-#define INTERNAL_CATCH_GENERATE(expr) expr.setFileInfo(__FILE__ "(" INTERNAL_CATCH_LINESTR(__LINE__) ")")
-
-// #included from: internal/catch_interfaces_exception.h
-#define TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED
-
-#include <string>
-#include <vector>
-
-// #included from: catch_interfaces_registry_hub.h
-#define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED
-
-#include <string>
-
-namespace Catch {
-
-class TestCase;
-struct ITestCaseRegistry;
-struct IExceptionTranslatorRegistry;
-struct IExceptionTranslator;
-struct IReporterRegistry;
-struct IReporterFactory;
-
-struct IRegistryHub
-{
- virtual ~IRegistryHub();
-
- virtual IReporterRegistry const& getReporterRegistry() const = 0;
- virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0;
- virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0;
-};
-
-struct IMutableRegistryHub
-{
- virtual ~IMutableRegistryHub();
- virtual void registerReporter(std::string const& name, Ptr<IReporterFactory> const& factory) = 0;
- virtual void registerListener(Ptr<IReporterFactory> const& factory) = 0;
- virtual void registerTest(TestCase const& testInfo) = 0;
- virtual void registerTranslator(const IExceptionTranslator* translator) = 0;
-};
-
-IRegistryHub& getRegistryHub();
-IMutableRegistryHub& getMutableRegistryHub();
-void cleanUp();
-std::string translateActiveException();
-}
-
-namespace Catch {
-
-typedef std::string (*exceptionTranslateFunction)();
-
-struct IExceptionTranslator;
-typedef std::vector<const IExceptionTranslator*> ExceptionTranslators;
-
-struct IExceptionTranslator
-{
- virtual ~IExceptionTranslator();
- virtual std::string translate(ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd) const = 0;
-};
-
-struct IExceptionTranslatorRegistry
-{
- virtual ~IExceptionTranslatorRegistry();
-
- virtual std::string translateActiveException() const = 0;
-};
-
-class ExceptionTranslatorRegistrar
-{
- template <typename T>
- class ExceptionTranslator : public IExceptionTranslator
- {
- public:
- ExceptionTranslator(std::string (*translateFunction)(T&))
- : m_translateFunction(translateFunction)
- {
- }
-
- virtual std::string translate(ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd) const CATCH_OVERRIDE
- {
- try
- {
- if (it == itEnd)
- throw;
- else
- return (*it)->translate(it + 1, itEnd);
- }
- catch (T& ex)
- {
- return m_translateFunction(ex);
- }
- }
-
- protected:
- std::string (*m_translateFunction)(T&);
- };
-
- public:
- template <typename T>
- ExceptionTranslatorRegistrar(std::string (*translateFunction)(T&))
- {
- getMutableRegistryHub().registerTranslator(new ExceptionTranslator<T>(translateFunction));
- }
-};
-}
-
-///////////////////////////////////////////////////////////////////////////////
-#define INTERNAL_CATCH_TRANSLATE_EXCEPTION(signature) \
- static std::string INTERNAL_CATCH_UNIQUE_NAME(catch_internal_ExceptionTranslator)(signature); \
- namespace { \
- Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME(catch_internal_ExceptionRegistrar)(&INTERNAL_CATCH_UNIQUE_NAME(catch_internal_ExceptionTranslator)); \
- } \
- static std::string INTERNAL_CATCH_UNIQUE_NAME(catch_internal_ExceptionTranslator)(signature)
-
-// #included from: internal/catch_approx.hpp
-#define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED
-
-#include <cmath>
-#include <limits>
-
-namespace Catch {
-namespace Detail {
-
-class Approx
-{
- public:
- explicit Approx(double value)
- : m_epsilon(std::numeric_limits<float>::epsilon() * 100),
- m_scale(1.0),
- m_value(value)
- {
- }
-
- Approx(Approx const& other)
- : m_epsilon(other.m_epsilon),
- m_scale(other.m_scale),
- m_value(other.m_value)
- {
- }
-
- static Approx custom()
- {
- return Approx(0);
- }
-
- Approx operator()(double value)
- {
- Approx approx(value);
- approx.epsilon(m_epsilon);
- approx.scale(m_scale);
- return approx;
- }
-
- friend bool operator==(double lhs, Approx const& rhs)
- {
- // Thanks to Richard Harris for his help refining this formula
- return fabs(lhs - rhs.m_value) < rhs.m_epsilon * (rhs.m_scale + (std::max)(fabs(lhs), fabs(rhs.m_value)));
- }
-
- friend bool operator==(Approx const& lhs, double rhs)
- {
- return operator==(rhs, lhs);
- }
-
- friend bool operator!=(double lhs, Approx const& rhs)
- {
- return !operator==(lhs, rhs);
- }
-
- friend bool operator!=(Approx const& lhs, double rhs)
- {
- return !operator==(rhs, lhs);
- }
-
- Approx& epsilon(double newEpsilon)
- {
- m_epsilon = newEpsilon;
- return *this;
- }
-
- Approx& scale(double newScale)
- {
- m_scale = newScale;
- return *this;
- }
-
- std::string toString() const
- {
- std::ostringstream oss;
- oss << "Approx( " << Catch::toString(m_value) << " )";
- return oss.str();
- }
-
- private:
- double m_epsilon;
- double m_scale;
- double m_value;
-};
-}
-
-template <>
-inline std::string toString<Detail::Approx>(Detail::Approx const& value)
-{
- return value.toString();
-}
-
-} // end namespace Catch
-
-// #included from: internal/catch_interfaces_tag_alias_registry.h
-#define TWOBLUECUBES_CATCH_INTERFACES_TAG_ALIAS_REGISTRY_H_INCLUDED
-
-// #included from: catch_tag_alias.h
-#define TWOBLUECUBES_CATCH_TAG_ALIAS_H_INCLUDED
-
-#include <string>
-
-namespace Catch {
-
-struct TagAlias
-{
- TagAlias(std::string _tag, SourceLineInfo _lineInfo) : tag(_tag), lineInfo(_lineInfo) {}
-
- std::string tag;
- SourceLineInfo lineInfo;
-};
-
-struct RegistrarForTagAliases
-{
- RegistrarForTagAliases(char const* alias, char const* tag, SourceLineInfo const& lineInfo);
-};
-
-} // end namespace Catch
-
-#define CATCH_REGISTER_TAG_ALIAS(alias, spec) \
- namespace { \
- Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME(AutoRegisterTagAlias)(alias, spec, CATCH_INTERNAL_LINEINFO); \
- }
-// #included from: catch_option.hpp
-#define TWOBLUECUBES_CATCH_OPTION_HPP_INCLUDED
-
-namespace Catch {
-
-// An optional type
-template <typename T>
-class Option
-{
- public:
- Option() : nullableValue(CATCH_NULL) {}
- Option(T const& _value)
- : nullableValue(new (storage) T(_value))
- {
- }
- Option(Option const& _other)
- : nullableValue(_other ? new (storage) T(*_other) : CATCH_NULL)
- {
- }
-
- ~Option()
- {
- reset();
- }
-
- Option& operator=(Option const& _other)
- {
- if (&_other != this)
- {
- reset();
- if (_other)
- nullableValue = new (storage) T(*_other);
- }
- return *this;
- }
- Option& operator=(T const& _value)
- {
- reset();
- nullableValue = new (storage) T(_value);
- return *this;
- }
-
- void reset()
- {
- if (nullableValue)
- nullableValue->~T();
- nullableValue = CATCH_NULL;
- }
-
- T& operator*() { return *nullableValue; }
- T const& operator*() const { return *nullableValue; }
- T* operator->() { return nullableValue; }
- const T* operator->() const { return nullableValue; }
-
- T valueOr(T const& defaultValue) const
- {
- return nullableValue ? *nullableValue : defaultValue;
- }
-
- bool some() const { return nullableValue != CATCH_NULL; }
- bool none() const { return nullableValue == CATCH_NULL; }
-
- bool operator!() const { return nullableValue == CATCH_NULL; }
- operator SafeBool::type() const
- {
- return SafeBool::makeSafe(some());
- }
-
- private:
- T* nullableValue;
- char storage[sizeof(T)];
-};
-
-} // end namespace Catch
-
-namespace Catch {
-
-struct ITagAliasRegistry
-{
- virtual ~ITagAliasRegistry();
- virtual Option<TagAlias> find(std::string const& alias) const = 0;
- virtual std::string expandAliases(std::string const& unexpandedTestSpec) const = 0;
-
- static ITagAliasRegistry const& get();
-};
-
-} // end namespace Catch
-
-// These files are included here so the single_include script doesn't put them
-// in the conditionally compiled sections
-// #included from: internal/catch_test_case_info.h
-#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_H_INCLUDED
-
-#include <set>
-#include <string>
-
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wpadded"
-#endif
-
-namespace Catch {
-
-struct ITestCase;
-
-struct TestCaseInfo
-{
- enum SpecialProperties
- {
- None = 0,
- IsHidden = 1 << 1,
- ShouldFail = 1 << 2,
- MayFail = 1 << 3,
- Throws = 1 << 4
- };
-
- TestCaseInfo(std::string const& _name,
- std::string const& _className,
- std::string const& _description,
- std::set<std::string> const& _tags,
- SourceLineInfo const& _lineInfo);
-
- TestCaseInfo(TestCaseInfo const& other);
-
- friend void setTags(TestCaseInfo& testCaseInfo, std::set<std::string> const& tags);
-
- bool isHidden() const;
- bool throws() const;
- bool okToFail() const;
- bool expectedToFail() const;
-
- std::string name;
- std::string className;
- std::string description;
- std::set<std::string> tags;
- std::set<std::string> lcaseTags;
- std::string tagsAsString;
- SourceLineInfo lineInfo;
- SpecialProperties properties;
-};
-
-class TestCase : public TestCaseInfo
-{
- public:
- TestCase(ITestCase* testCase, TestCaseInfo const& info);
- TestCase(TestCase const& other);
-
- TestCase withName(std::string const& _newName) const;
-
- void invoke() const;
-
- TestCaseInfo const& getTestCaseInfo() const;
-
- void swap(TestCase& other);
- bool operator==(TestCase const& other) const;
- bool operator<(TestCase const& other) const;
- TestCase& operator=(TestCase const& other);
-
- private:
- Ptr<ITestCase> test;
-};
-
-TestCase makeTestCase(ITestCase* testCase,
- std::string const& className,
- std::string const& name,
- std::string const& description,
- SourceLineInfo const& lineInfo);
-}
-
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
-
-#ifdef __OBJC__
-// #included from: internal/catch_objc.hpp
-#define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED
-
-#import <objc/runtime.h>
-
-#include <string>
-
-// NB. Any general catch headers included here must be included
-// in catch.hpp first to make sure they are included by the single
-// header for non obj-usage
-
-///////////////////////////////////////////////////////////////////////////////
-// This protocol is really only here for (self) documenting purposes, since
-// all its methods are optional.
- at protocol OcFixture
-
- at optional
-
-- (void)setUp;
-- (void)tearDown;
-
- at end
-
-namespace Catch {
-
-class OcMethod : public SharedImpl<ITestCase>
-{
-
- public:
- OcMethod(Class cls, SEL sel) : m_cls(cls), m_sel(sel) {}
-
- virtual void invoke() const
- {
- id obj = [[m_cls alloc] init];
-
- performOptionalSelector(obj, @selector(setUp));
- performOptionalSelector(obj, m_sel);
- performOptionalSelector(obj, @selector(tearDown));
-
- arcSafeRelease(obj);
- }
-
- private:
- virtual ~OcMethod() {}
-
- Class m_cls;
- SEL m_sel;
-};
-
-namespace Detail {
-
-inline std::string getAnnotation(Class cls,
- std::string const& annotationName,
- std::string const& testCaseName)
-{
- NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()];
- SEL sel = NSSelectorFromString(selStr);
- arcSafeRelease(selStr);
- id value = performOptionalSelector(cls, sel);
- if (value)
- return [(NSString*)value UTF8String];
- return "";
-}
-}
-
-inline size_t registerTestMethods()
-{
- size_t noTestMethods = 0;
- int noClasses = objc_getClassList(CATCH_NULL, 0);
-
- Class* classes = (CATCH_UNSAFE_UNRETAINED Class*)malloc(sizeof(Class) * noClasses);
- objc_getClassList(classes, noClasses);
-
- for (int c = 0; c < noClasses; c++)
- {
- Class cls = classes[c];
- {
- u_int count;
- Method* methods = class_copyMethodList(cls, &count);
- for (u_int m = 0; m < count; m++)
- {
- SEL selector = method_getName(methods[m]);
- std::string methodName = sel_getName(selector);
- if (startsWith(methodName, "Catch_TestCase_"))
- {
- std::string testCaseName = methodName.substr(15);
- std::string name = Detail::getAnnotation(cls, "Name", testCaseName);
- std::string desc = Detail::getAnnotation(cls, "Description", testCaseName);
- const char* className = class_getName(cls);
-
- getMutableRegistryHub().registerTest(makeTestCase(new OcMethod(cls, selector), className, name.c_str(), desc.c_str(), SourceLineInfo()));
- noTestMethods++;
- }
- }
- free(methods);
- }
- }
- return noTestMethods;
-}
-
-namespace Matchers {
-namespace Impl {
-namespace NSStringMatchers {
-
-template <typename MatcherT>
-struct StringHolder : MatcherImpl<MatcherT, NSString*>
-{
- StringHolder(NSString* substr) : m_substr([substr copy]) {}
- StringHolder(StringHolder const& other) : m_substr([other.m_substr copy]) {}
- StringHolder()
- {
- arcSafeRelease(m_substr);
- }
-
- NSString* m_substr;
-};
-
-struct Equals : StringHolder<Equals>
-{
- Equals(NSString* substr) : StringHolder(substr) {}
-
- virtual bool match(ExpressionType const& str) const
- {
- return (str != nil || m_substr == nil) &&
- [str isEqualToString:m_substr];
- }
-
- virtual std::string toString() const
- {
- return "equals string: " + Catch::toString(m_substr);
- }
-};
-
-struct Contains : StringHolder<Contains>
-{
- Contains(NSString* substr) : StringHolder(substr) {}
-
- virtual bool match(ExpressionType const& str) const
- {
- return (str != nil || m_substr == nil) &&
- [str rangeOfString:m_substr].location != NSNotFound;
- }
-
- virtual std::string toString() const
- {
- return "contains string: " + Catch::toString(m_substr);
- }
-};
-
-struct StartsWith : StringHolder<StartsWith>
-{
- StartsWith(NSString* substr) : StringHolder(substr) {}
-
- virtual bool match(ExpressionType const& str) const
- {
- return (str != nil || m_substr == nil) &&
- [str rangeOfString:m_substr].location == 0;
- }
-
- virtual std::string toString() const
- {
- return "starts with: " + Catch::toString(m_substr);
- }
-};
-struct EndsWith : StringHolder<EndsWith>
-{
- EndsWith(NSString* substr) : StringHolder(substr) {}
-
- virtual bool match(ExpressionType const& str) const
- {
- return (str != nil || m_substr == nil) &&
- [str rangeOfString:m_substr].location == [str length] - [m_substr length];
- }
-
- virtual std::string toString() const
- {
- return "ends with: " + Catch::toString(m_substr);
- }
-};
-
-} // namespace NSStringMatchers
-} // namespace Impl
-
-inline Impl::NSStringMatchers::Equals
-Equals(NSString* substr) { return Impl::NSStringMatchers::Equals(substr); }
-
-inline Impl::NSStringMatchers::Contains
-Contains(NSString* substr) { return Impl::NSStringMatchers::Contains(substr); }
-
-inline Impl::NSStringMatchers::StartsWith
-StartsWith(NSString* substr) { return Impl::NSStringMatchers::StartsWith(substr); }
-
-inline Impl::NSStringMatchers::EndsWith
-EndsWith(NSString* substr) { return Impl::NSStringMatchers::EndsWith(substr); }
-
-} // namespace Matchers
-
-using namespace Matchers;
-
-} // namespace Catch
-
-///////////////////////////////////////////////////////////////////////////////
-#define OC_TEST_CASE(name, desc) \
- +(NSString*)INTERNAL_CATCH_UNIQUE_NAME(Catch_Name_test) \
- { \
- return @name; \
- } \
- +(NSString*)INTERNAL_CATCH_UNIQUE_NAME(Catch_Description_test) \
- { \
- return @desc; \
- } \
- -(void)INTERNAL_CATCH_UNIQUE_NAME(Catch_TestCase_test)
-
-#endif
-
-#ifdef CATCH_IMPL
-// #included from: internal/catch_impl.hpp
-#define TWOBLUECUBES_CATCH_IMPL_HPP_INCLUDED
-
-// Collect all the implementation files together here
-// These are the equivalent of what would usually be cpp files
-
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wweak-vtables"
-#endif
-
-// #included from: ../catch_session.hpp
-#define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED
-
-// #included from: internal/catch_commandline.hpp
-#define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED
-
-// #included from: catch_config.hpp
-#define TWOBLUECUBES_CATCH_CONFIG_HPP_INCLUDED
-
-// #included from: catch_test_spec_parser.hpp
-#define TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED
-
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wpadded"
-#endif
-
-// #included from: catch_test_spec.hpp
-#define TWOBLUECUBES_CATCH_TEST_SPEC_HPP_INCLUDED
-
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wpadded"
-#endif
-
-// #included from: catch_wildcard_pattern.hpp
-#define TWOBLUECUBES_CATCH_WILDCARD_PATTERN_HPP_INCLUDED
-
-namespace Catch {
-class WildcardPattern
-{
- enum WildcardPosition
- {
- NoWildcard = 0,
- WildcardAtStart = 1,
- WildcardAtEnd = 2,
- WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd
- };
-
- public:
- WildcardPattern(std::string const& pattern, CaseSensitive::Choice caseSensitivity)
- : m_caseSensitivity(caseSensitivity),
- m_wildcard(NoWildcard),
- m_pattern(adjustCase(pattern))
- {
- if (startsWith(m_pattern, "*"))
- {
- m_pattern = m_pattern.substr(1);
- m_wildcard = WildcardAtStart;
- }
- if (endsWith(m_pattern, "*"))
- {
- m_pattern = m_pattern.substr(0, m_pattern.size() - 1);
- m_wildcard = static_cast<WildcardPosition>(m_wildcard | WildcardAtEnd);
- }
- }
- virtual ~WildcardPattern();
- virtual bool matches(std::string const& str) const
- {
- switch (m_wildcard)
- {
- case NoWildcard:
- return m_pattern == adjustCase(str);
- case WildcardAtStart:
- return endsWith(adjustCase(str), m_pattern);
- case WildcardAtEnd:
- return startsWith(adjustCase(str), m_pattern);
- case WildcardAtBothEnds:
- return contains(adjustCase(str), m_pattern);
- }
-
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wunreachable-code"
-#endif
- throw std::logic_error("Unknown enum");
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
- }
-
- private:
- std::string adjustCase(std::string const& str) const
- {
- return m_caseSensitivity == CaseSensitive::No ? toLower(str) : str;
- }
- CaseSensitive::Choice m_caseSensitivity;
- WildcardPosition m_wildcard;
- std::string m_pattern;
-};
-}
-
-#include <string>
-#include <vector>
-
-namespace Catch {
-
-class TestSpec
-{
- struct Pattern : SharedImpl<>
- {
- virtual ~Pattern();
- virtual bool matches(TestCaseInfo const& testCase) const = 0;
- };
- class NamePattern : public Pattern
- {
- public:
- NamePattern(std::string const& name)
- : m_wildcardPattern(toLower(name), CaseSensitive::No)
- {
- }
- virtual ~NamePattern();
- virtual bool matches(TestCaseInfo const& testCase) const
- {
- return m_wildcardPattern.matches(toLower(testCase.name));
- }
-
- private:
- WildcardPattern m_wildcardPattern;
- };
-
- class TagPattern : public Pattern
- {
- public:
- TagPattern(std::string const& tag) : m_tag(toLower(tag)) {}
- virtual ~TagPattern();
- virtual bool matches(TestCaseInfo const& testCase) const
- {
- return testCase.lcaseTags.find(m_tag) != testCase.lcaseTags.end();
- }
-
- private:
- std::string m_tag;
- };
-
- class ExcludedPattern : public Pattern
- {
- public:
- ExcludedPattern(Ptr<Pattern> const& underlyingPattern) : m_underlyingPattern(underlyingPattern) {}
- virtual ~ExcludedPattern();
- virtual bool matches(TestCaseInfo const& testCase) const { return !m_underlyingPattern->matches(testCase); }
- private:
- Ptr<Pattern> m_underlyingPattern;
- };
-
- struct Filter
- {
- std::vector<Ptr<Pattern>> m_patterns;
-
- bool matches(TestCaseInfo const& testCase) const
- {
- // All patterns in a filter must match for the filter to be a match
- for (std::vector<Ptr<Pattern>>::const_iterator it = m_patterns.begin(), itEnd = m_patterns.end(); it != itEnd; ++it)
- if (!(*it)->matches(testCase))
- return false;
- return true;
- }
- };
-
- public:
- bool hasFilters() const
- {
- return !m_filters.empty();
- }
- bool matches(TestCaseInfo const& testCase) const
- {
- // A TestSpec matches if any filter matches
- for (std::vector<Filter>::const_iterator it = m_filters.begin(), itEnd = m_filters.end(); it != itEnd; ++it)
- if (it->matches(testCase))
- return true;
- return false;
- }
-
- private:
- std::vector<Filter> m_filters;
-
- friend class TestSpecParser;
-};
-}
-
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
-
-namespace Catch {
-
-class TestSpecParser
-{
- enum Mode
- {
- None,
- Name,
- QuotedName,
- Tag
- };
- Mode m_mode;
- bool m_exclusion;
- std::size_t m_start, m_pos;
- std::string m_arg;
- TestSpec::Filter m_currentFilter;
- TestSpec m_testSpec;
- ITagAliasRegistry const* m_tagAliases;
-
- public:
- TestSpecParser(ITagAliasRegistry const& tagAliases) : m_tagAliases(&tagAliases) {}
-
- TestSpecParser& parse(std::string const& arg)
- {
- m_mode = None;
- m_exclusion = false;
- m_start = std::string::npos;
- m_arg = m_tagAliases->expandAliases(arg);
- for (m_pos = 0; m_pos < m_arg.size(); ++m_pos)
- visitChar(m_arg[m_pos]);
- if (m_mode == Name)
- addPattern<TestSpec::NamePattern>();
- return *this;
- }
- TestSpec testSpec()
- {
- addFilter();
- return m_testSpec;
- }
-
- private:
- void visitChar(char c)
- {
- if (m_mode == None)
- {
- switch (c)
- {
- case ' ':
- return;
- case '~':
- m_exclusion = true;
- return;
- case '[':
- return startNewMode(Tag, ++m_pos);
- case '"':
- return startNewMode(QuotedName, ++m_pos);
- default:
- startNewMode(Name, m_pos);
- break;
- }
- }
- if (m_mode == Name)
- {
- if (c == ',')
- {
- addPattern<TestSpec::NamePattern>();
- addFilter();
- }
- else if (c == '[')
- {
- if (subString() == "exclude:")
- m_exclusion = true;
- else
- addPattern<TestSpec::NamePattern>();
- startNewMode(Tag, ++m_pos);
- }
- }
- else if (m_mode == QuotedName && c == '"')
- addPattern<TestSpec::NamePattern>();
- else if (m_mode == Tag && c == ']')
- addPattern<TestSpec::TagPattern>();
- }
- void startNewMode(Mode mode, std::size_t start)
- {
- m_mode = mode;
- m_start = start;
- }
- std::string subString() const { return m_arg.substr(m_start, m_pos - m_start); }
- template <typename T>
- void addPattern()
- {
- std::string token = subString();
- if (startsWith(token, "exclude:"))
- {
- m_exclusion = true;
- token = token.substr(8);
- }
- if (!token.empty())
- {
- Ptr<TestSpec::Pattern> pattern = new T(token);
- if (m_exclusion)
- pattern = new TestSpec::ExcludedPattern(pattern);
- m_currentFilter.m_patterns.push_back(pattern);
- }
- m_exclusion = false;
- m_mode = None;
- }
- void addFilter()
- {
- if (!m_currentFilter.m_patterns.empty())
- {
- m_testSpec.m_filters.push_back(m_currentFilter);
- m_currentFilter = TestSpec::Filter();
- }
- }
-};
-inline TestSpec parseTestSpec(std::string const& arg)
-{
- return TestSpecParser(ITagAliasRegistry::get()).parse(arg).testSpec();
-}
-
-} // namespace Catch
-
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
-
-// #included from: catch_interfaces_config.h
-#define TWOBLUECUBES_CATCH_INTERFACES_CONFIG_H_INCLUDED
-
-#include <iostream>
-#include <string>
-#include <vector>
-
-namespace Catch {
-
-struct Verbosity
-{
- enum Level
- {
- NoOutput = 0,
- Quiet,
- Normal
- };
-};
-
-struct WarnAbout
-{
- enum What
- {
- Nothing = 0x00,
- NoAssertions = 0x01
- };
-};
-
-struct ShowDurations
-{
- enum OrNot
- {
- DefaultForReporter,
- Always,
- Never
- };
-};
-struct RunTests
-{
- enum InWhatOrder
- {
- InDeclarationOrder,
- InLexicographicalOrder,
- InRandomOrder
- };
-};
-
-class TestSpec;
-
-struct IConfig : IShared
-{
-
- virtual ~IConfig();
-
- virtual bool allowThrows() const = 0;
- virtual std::ostream& stream() const = 0;
- virtual std::string name() const = 0;
- virtual bool includeSuccessfulResults() const = 0;
- virtual bool shouldDebugBreak() const = 0;
- virtual bool warnAboutMissingAssertions() const = 0;
- virtual int abortAfter() const = 0;
- virtual bool showInvisibles() const = 0;
- virtual ShowDurations::OrNot showDurations() const = 0;
- virtual TestSpec const& testSpec() const = 0;
- virtual RunTests::InWhatOrder runOrder() const = 0;
- virtual unsigned int rngSeed() const = 0;
- virtual bool forceColour() const = 0;
-};
-}
-
-// #included from: catch_stream.h
-#define TWOBLUECUBES_CATCH_STREAM_H_INCLUDED
-
-// #included from: catch_streambuf.h
-#define TWOBLUECUBES_CATCH_STREAMBUF_H_INCLUDED
-
-#include <streambuf>
-
-namespace Catch {
-
-class StreamBufBase : public std::streambuf
-{
- public:
- virtual ~StreamBufBase() CATCH_NOEXCEPT;
-};
-}
-
-#include <fstream>
-#include <ostream>
-#include <streambuf>
-
-namespace Catch {
-
-std::ostream& cout();
-std::ostream& cerr();
-
-struct IStream
-{
- virtual ~IStream() CATCH_NOEXCEPT;
- virtual std::ostream& stream() const = 0;
-};
-
-class FileStream : public IStream
-{
- mutable std::ofstream m_ofs;
-
- public:
- FileStream(std::string const& filename);
- virtual ~FileStream() CATCH_NOEXCEPT;
-
- public: // IStream
- virtual std::ostream& stream() const CATCH_OVERRIDE;
-};
-
-class CoutStream : public IStream
-{
- mutable std::ostream m_os;
-
- public:
- CoutStream();
- virtual ~CoutStream() CATCH_NOEXCEPT;
-
- public: // IStream
- virtual std::ostream& stream() const CATCH_OVERRIDE;
-};
-
-class DebugOutStream : public IStream
-{
- std::auto_ptr<StreamBufBase> m_streamBuf;
- mutable std::ostream m_os;
-
- public:
- DebugOutStream();
- virtual ~DebugOutStream() CATCH_NOEXCEPT;
-
- public: // IStream
- virtual std::ostream& stream() const CATCH_OVERRIDE;
-};
-}
-
-#include <ctime>
-#include <iostream>
-#include <memory>
-#include <string>
-#include <vector>
-
-#ifndef CATCH_CONFIG_CONSOLE_WIDTH
-#define CATCH_CONFIG_CONSOLE_WIDTH 80
-#endif
-
-namespace Catch {
-
-struct ConfigData
-{
-
- ConfigData()
- : listTests(false),
- listTags(false),
- listReporters(false),
- listTestNamesOnly(false),
- showSuccessfulTests(false),
- shouldDebugBreak(false),
- noThrow(false),
- showHelp(false),
- showInvisibles(false),
- forceColour(false),
- filenamesAsTags(false),
- abortAfter(-1),
- rngSeed(0),
- verbosity(Verbosity::Normal),
- warnings(WarnAbout::Nothing),
- showDurations(ShowDurations::DefaultForReporter),
- runOrder(RunTests::InDeclarationOrder)
- {
- }
-
- bool listTests;
- bool listTags;
- bool listReporters;
- bool listTestNamesOnly;
-
- bool showSuccessfulTests;
- bool shouldDebugBreak;
- bool noThrow;
- bool showHelp;
- bool showInvisibles;
- bool forceColour;
- bool filenamesAsTags;
-
- int abortAfter;
- unsigned int rngSeed;
-
- Verbosity::Level verbosity;
- WarnAbout::What warnings;
- ShowDurations::OrNot showDurations;
- RunTests::InWhatOrder runOrder;
-
- std::string outputFilename;
- std::string name;
- std::string processName;
-
- std::vector<std::string> reporterNames;
- std::vector<std::string> testsOrTags;
-};
-
-class Config : public SharedImpl<IConfig>
-{
- private:
- Config(Config const& other);
- Config& operator=(Config const& other);
- virtual void dummy();
-
- public:
- Config()
- {
- }
-
- Config(ConfigData const& data)
- : m_data(data),
- m_stream(openStream())
- {
- if (!data.testsOrTags.empty())
- {
- TestSpecParser parser(ITagAliasRegistry::get());
- for (std::size_t i = 0; i < data.testsOrTags.size(); ++i)
- parser.parse(data.testsOrTags[i]);
- m_testSpec = parser.testSpec();
- }
- }
-
- virtual ~Config()
- {
- }
-
- std::string const& getFilename() const
- {
- return m_data.outputFilename;
- }
-
- bool listTests() const { return m_data.listTests; }
- bool listTestNamesOnly() const { return m_data.listTestNamesOnly; }
- bool listTags() const { return m_data.listTags; }
- bool listReporters() const { return m_data.listReporters; }
-
- std::string getProcessName() const { return m_data.processName; }
-
- bool shouldDebugBreak() const { return m_data.shouldDebugBreak; }
-
- std::vector<std::string> getReporterNames() const { return m_data.reporterNames; }
-
- int abortAfter() const { return m_data.abortAfter; }
-
- TestSpec const& testSpec() const { return m_testSpec; }
-
- bool showHelp() const { return m_data.showHelp; }
- bool showInvisibles() const { return m_data.showInvisibles; }
-
- // IConfig interface
- virtual bool allowThrows() const { return !m_data.noThrow; }
- virtual std::ostream& stream() const { return m_stream->stream(); }
- virtual std::string name() const { return m_data.name.empty() ? m_data.processName : m_data.name; }
- virtual bool includeSuccessfulResults() const { return m_data.showSuccessfulTests; }
- virtual bool warnAboutMissingAssertions() const { return m_data.warnings & WarnAbout::NoAssertions; }
- virtual ShowDurations::OrNot showDurations() const { return m_data.showDurations; }
- virtual RunTests::InWhatOrder runOrder() const { return m_data.runOrder; }
- virtual unsigned int rngSeed() const { return m_data.rngSeed; }
- virtual bool forceColour() const { return m_data.forceColour; }
-
- private:
- IStream const* openStream()
- {
- if (m_data.outputFilename.empty())
- return new CoutStream();
- else if (m_data.outputFilename[0] == '%')
- {
- if (m_data.outputFilename == "%debug")
- return new DebugOutStream();
- else
- throw std::domain_error("Unrecognised stream: " + m_data.outputFilename);
- }
- else
- return new FileStream(m_data.outputFilename);
- }
- ConfigData m_data;
-
- std::auto_ptr<IStream const> m_stream;
- TestSpec m_testSpec;
-};
-
-} // end namespace Catch
-
-// #included from: catch_clara.h
-#define TWOBLUECUBES_CATCH_CLARA_H_INCLUDED
-
-// Use Catch's value for console width (store Clara's off to the side, if present)
-#ifdef CLARA_CONFIG_CONSOLE_WIDTH
-#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CLARA_CONFIG_CONSOLE_WIDTH
-#undef CLARA_CONFIG_CONSOLE_WIDTH
-#endif
-#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH
-
-// Declare Clara inside the Catch namespace
-#define STITCH_CLARA_OPEN_NAMESPACE namespace Catch {
-// #included from: ../external/clara.h
-
-// Only use header guard if we are not using an outer namespace
-#if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE)
-
-#ifndef STITCH_CLARA_OPEN_NAMESPACE
-#define TWOBLUECUBES_CLARA_H_INCLUDED
-#define STITCH_CLARA_OPEN_NAMESPACE
-#define STITCH_CLARA_CLOSE_NAMESPACE
-#else
-#define STITCH_CLARA_CLOSE_NAMESPACE }
-#endif
-
-#define STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE STITCH_CLARA_OPEN_NAMESPACE
-
-// ----------- #included from tbc_text_format.h -----------
-
-// Only use header guard if we are not using an outer namespace
-#if !defined(TBC_TEXT_FORMAT_H_INCLUDED) || defined(STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE)
-#ifndef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE
-#define TBC_TEXT_FORMAT_H_INCLUDED
-#endif
-
-#include <sstream>
-#include <string>
-#include <vector>
-
-// Use optional outer namespace
-#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE
-namespace STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE {
-#endif
-
-namespace Tbc {
-
-#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH
-const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH;
-#else
-const unsigned int consoleWidth = 80;
-#endif
-
-struct TextAttributes
-{
- TextAttributes()
- : initialIndent(std::string::npos),
- indent(0),
- width(consoleWidth - 1),
- tabChar('\t')
- {
- }
-
- TextAttributes& setInitialIndent(std::size_t _value)
- {
- initialIndent = _value;
- return *this;
- }
- TextAttributes& setIndent(std::size_t _value)
- {
- indent = _value;
- return *this;
- }
- TextAttributes& setWidth(std::size_t _value)
- {
- width = _value;
- return *this;
- }
- TextAttributes& setTabChar(char _value)
- {
- tabChar = _value;
- return *this;
- }
-
- std::size_t initialIndent; // indent of first line, or npos
- std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos
- std::size_t width; // maximum width of text, including indent. Longer text will wrap
- char tabChar; // If this char is seen the indent is changed to current pos
-};
-
-class Text
-{
- public:
- Text(std::string const& _str, TextAttributes const& _attr = TextAttributes())
- : attr(_attr)
- {
- std::string wrappableChars = " [({.,/|\\-";
- std::size_t indent = _attr.initialIndent != std::string::npos
- ? _attr.initialIndent
- : _attr.indent;
- std::string remainder = _str;
-
- while (!remainder.empty())
- {
- if (lines.size() >= 1000)
- {
- lines.push_back("... message truncated due to excessive size");
- return;
- }
- std::size_t tabPos = std::string::npos;
- std::size_t width = (std::min)(remainder.size(), _attr.width - indent);
- std::size_t pos = remainder.find_first_of('\n');
- if (pos <= width)
- {
- width = pos;
- }
- pos = remainder.find_last_of(_attr.tabChar, width);
- if (pos != std::string::npos)
- {
- tabPos = pos;
- if (remainder[width] == '\n')
- width--;
- remainder = remainder.substr(0, tabPos) + remainder.substr(tabPos + 1);
- }
-
- if (width == remainder.size())
- {
- spliceLine(indent, remainder, width);
- }
- else if (remainder[width] == '\n')
- {
- spliceLine(indent, remainder, width);
- if (width <= 1 || remainder.size() != 1)
- remainder = remainder.substr(1);
- indent = _attr.indent;
- }
- else
- {
- pos = remainder.find_last_of(wrappableChars, width);
- if (pos != std::string::npos && pos > 0)
- {
- spliceLine(indent, remainder, pos);
- if (remainder[0] == ' ')
- remainder = remainder.substr(1);
- }
- else
- {
- spliceLine(indent, remainder, width - 1);
- lines.back() += "-";
- }
- if (lines.size() == 1)
- indent = _attr.indent;
- if (tabPos != std::string::npos)
- indent += tabPos;
- }
- }
- }
-
- void spliceLine(std::size_t _indent, std::string& _remainder, std::size_t _pos)
- {
- lines.push_back(std::string(_indent, ' ') + _remainder.substr(0, _pos));
- _remainder = _remainder.substr(_pos);
- }
-
- typedef std::vector<std::string>::const_iterator const_iterator;
-
- const_iterator begin() const { return lines.begin(); }
- const_iterator end() const { return lines.end(); }
- std::string const& last() const { return lines.back(); }
- std::size_t size() const { return lines.size(); }
- std::string const& operator[](std::size_t _index) const { return lines[_index]; }
- std::string toString() const
- {
- std::ostringstream oss;
- oss << *this;
- return oss.str();
- }
-
- inline friend std::ostream& operator<<(std::ostream& _stream, Text const& _text)
- {
- for (Text::const_iterator it = _text.begin(), itEnd = _text.end();
- it != itEnd; ++it)
- {
- if (it != _text.begin())
- _stream << "\n";
- _stream << *it;
- }
- return _stream;
- }
-
- private:
- std::string str;
- TextAttributes attr;
- std::vector<std::string> lines;
-};
-
-} // end namespace Tbc
-
-#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE
-} // end outer namespace
-#endif
-
-#endif // TBC_TEXT_FORMAT_H_INCLUDED
-
-// ----------- end of #include from tbc_text_format.h -----------
-// ........... back in /Users/philnash/Dev/OSS/Clara/srcs/clara.h
-
-#undef STITCH_TBC_TEXT_FORMAT_OPEN_NAMESPACE
-
-#include <algorithm>
-#include <map>
-#include <memory>
-#include <stdexcept>
-
-// Use optional outer namespace
-#ifdef STITCH_CLARA_OPEN_NAMESPACE
-STITCH_CLARA_OPEN_NAMESPACE
-#endif
-
-namespace Clara {
-
-struct UnpositionalTag
-{
-};
-
-extern UnpositionalTag _;
-
-#ifdef CLARA_CONFIG_MAIN
-UnpositionalTag _;
-#endif
-
-namespace Detail {
-
-#ifdef CLARA_CONSOLE_WIDTH
-const unsigned int consoleWidth = CLARA_CONFIG_CONSOLE_WIDTH;
-#else
-const unsigned int consoleWidth = 80;
-#endif
-
-using namespace Tbc;
-
-inline bool startsWith(std::string const& str, std::string const& prefix)
-{
- return str.size() >= prefix.size() && str.substr(0, prefix.size()) == prefix;
-}
-
-template <typename T>
-struct RemoveConstRef
-{
- typedef T type;
-};
-template <typename T>
-struct RemoveConstRef<T&>
-{
- typedef T type;
-};
-template <typename T>
-struct RemoveConstRef<T const&>
-{
- typedef T type;
-};
-template <typename T>
-struct RemoveConstRef<T const>
-{
- typedef T type;
-};
-
-template <typename T>
-struct IsBool
-{
- static const bool value = false;
-};
-template <>
-struct IsBool<bool>
-{
- static const bool value = true;
-};
-
-template <typename T>
-void convertInto(std::string const& _source, T& _dest)
-{
- std::stringstream ss;
- ss << _source;
- ss >> _dest;
- if (ss.fail())
- throw std::runtime_error("Unable to convert " + _source + " to destination type");
-}
-inline void convertInto(std::string const& _source, std::string& _dest)
-{
- _dest = _source;
-}
-inline void convertInto(std::string const& _source, bool& _dest)
-{
- std::string sourceLC = _source;
- std::transform(sourceLC.begin(), sourceLC.end(), sourceLC.begin(), ::tolower);
- if (sourceLC == "y" || sourceLC == "1" || sourceLC == "true" || sourceLC == "yes" || sourceLC == "on")
- _dest = true;
- else if (sourceLC == "n" || sourceLC == "0" || sourceLC == "false" || sourceLC == "no" || sourceLC == "off")
- _dest = false;
- else
- throw std::runtime_error("Expected a boolean value but did not recognise:\n '" + _source + "'");
-}
-inline void convertInto(bool _source, bool& _dest)
-{
- _dest = _source;
-}
-template <typename T>
-inline void convertInto(bool, T&)
-{
- throw std::runtime_error("Invalid conversion");
-}
-
-template <typename ConfigT>
-struct IArgFunction
-{
- virtual ~IArgFunction() {}
-#ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
- IArgFunction() = default;
- IArgFunction(IArgFunction const&) = default;
-#endif
- virtual void set(ConfigT& config, std::string const& value) const = 0;
- virtual void setFlag(ConfigT& config) const = 0;
- virtual bool takesArg() const = 0;
- virtual IArgFunction* clone() const = 0;
-};
-
-template <typename ConfigT>
-class BoundArgFunction
-{
- public:
- BoundArgFunction() : functionObj(CATCH_NULL) {}
- BoundArgFunction(IArgFunction<ConfigT>* _functionObj) : functionObj(_functionObj) {}
- BoundArgFunction(BoundArgFunction const& other) : functionObj(other.functionObj ? other.functionObj->clone() : CATCH_NULL) {}
- BoundArgFunction& operator=(BoundArgFunction const& other)
- {
- IArgFunction<ConfigT>* newFunctionObj = other.functionObj ? other.functionObj->clone() : CATCH_NULL;
- delete functionObj;
- functionObj = newFunctionObj;
- return *this;
- }
- ~BoundArgFunction() { delete functionObj; }
-
- void set(ConfigT& config, std::string const& value) const
- {
- functionObj->set(config, value);
- }
- void setFlag(ConfigT& config) const
- {
- functionObj->setFlag(config);
- }
- bool takesArg() const { return functionObj->takesArg(); }
-
- bool isSet() const
- {
- return functionObj != CATCH_NULL;
- }
-
- private:
- IArgFunction<ConfigT>* functionObj;
-};
-
-template <typename C>
-struct NullBinder : IArgFunction<C>
-{
- virtual void set(C&, std::string const&) const {}
- virtual void setFlag(C&) const {}
- virtual bool takesArg() const { return true; }
- virtual IArgFunction<C>* clone() const { return new NullBinder(*this); }
-};
-
-template <typename C, typename M>
-struct BoundDataMember : IArgFunction<C>
-{
- BoundDataMember(M C::*_member) : member(_member) {}
- virtual void set(C& p, std::string const& stringValue) const
- {
- convertInto(stringValue, p.*member);
- }
- virtual void setFlag(C& p) const
- {
- convertInto(true, p.*member);
- }
- virtual bool takesArg() const { return !IsBool<M>::value; }
- virtual IArgFunction<C>* clone() const { return new BoundDataMember(*this); }
- M C::*member;
-};
-template <typename C, typename M>
-struct BoundUnaryMethod : IArgFunction<C>
-{
- BoundUnaryMethod(void (C::*_member)(M)) : member(_member) {}
- virtual void set(C& p, std::string const& stringValue) const
- {
- typename RemoveConstRef<M>::type value;
- convertInto(stringValue, value);
- (p.*member)(value);
- }
- virtual void setFlag(C& p) const
- {
- typename RemoveConstRef<M>::type value;
- convertInto(true, value);
- (p.*member)(value);
- }
- virtual bool takesArg() const { return !IsBool<M>::value; }
- virtual IArgFunction<C>* clone() const { return new BoundUnaryMethod(*this); }
- void (C::*member)(M);
-};
-template <typename C>
-struct BoundNullaryMethod : IArgFunction<C>
-{
- BoundNullaryMethod(void (C::*_member)()) : member(_member) {}
- virtual void set(C& p, std::string const& stringValue) const
- {
- bool value;
- convertInto(stringValue, value);
- if (value)
- (p.*member)();
- }
- virtual void setFlag(C& p) const
- {
- (p.*member)();
- }
- virtual bool takesArg() const { return false; }
- virtual IArgFunction<C>* clone() const { return new BoundNullaryMethod(*this); }
- void (C::*member)();
-};
-
-template <typename C>
-struct BoundUnaryFunction : IArgFunction<C>
-{
- BoundUnaryFunction(void (*_function)(C&)) : function(_function) {}
- virtual void set(C& obj, std::string const& stringValue) const
- {
- bool value;
- convertInto(stringValue, value);
- if (value)
- function(obj);
- }
- virtual void setFlag(C& p) const
- {
- function(p);
- }
- virtual bool takesArg() const { return false; }
- virtual IArgFunction<C>* clone() const { return new BoundUnaryFunction(*this); }
- void (*function)(C&);
-};
-
-template <typename C, typename T>
-struct BoundBinaryFunction : IArgFunction<C>
-{
- BoundBinaryFunction(void (*_function)(C&, T)) : function(_function) {}
- virtual void set(C& obj, std::string const& stringValue) const
- {
- typename RemoveConstRef<T>::type value;
- convertInto(stringValue, value);
- function(obj, value);
- }
- virtual void setFlag(C& obj) const
- {
- typename RemoveConstRef<T>::type value;
- convertInto(true, value);
- function(obj, value);
- }
- virtual bool takesArg() const { return !IsBool<T>::value; }
- virtual IArgFunction<C>* clone() const { return new BoundBinaryFunction(*this); }
- void (*function)(C&, T);
-};
-
-} // namespace Detail
-
-struct Parser
-{
- Parser() : separators(" \t=:") {}
-
- struct Token
- {
- enum Type
- {
- Positional,
- ShortOpt,
- LongOpt
- };
- Token(Type _type, std::string const& _data) : type(_type), data(_data) {}
- Type type;
- std::string data;
- };
-
- void parseIntoTokens(int argc, char const* const* argv, std::vector<Parser::Token>& tokens) const
- {
- const std::string doubleDash = "--";
- for (int i = 1; i < argc && argv[i] != doubleDash; ++i)
- parseIntoTokens(argv[i], tokens);
- }
- void parseIntoTokens(std::string arg, std::vector<Parser::Token>& tokens) const
- {
- while (!arg.empty())
- {
- Parser::Token token(Parser::Token::Positional, arg);
- arg = "";
- if (token.data[0] == '-')
- {
- if (token.data.size() > 1 && token.data[1] == '-')
- {
- token = Parser::Token(Parser::Token::LongOpt, token.data.substr(2));
- }
- else
- {
- token = Parser::Token(Parser::Token::ShortOpt, token.data.substr(1));
- if (token.data.size() > 1 && separators.find(token.data[1]) == std::string::npos)
- {
- arg = "-" + token.data.substr(1);
- token.data = token.data.substr(0, 1);
- }
- }
- }
- if (token.type != Parser::Token::Positional)
- {
- std::size_t pos = token.data.find_first_of(separators);
- if (pos != std::string::npos)
- {
- arg = token.data.substr(pos + 1);
- token.data = token.data.substr(0, pos);
- }
- }
- tokens.push_back(token);
- }
- }
- std::string separators;
-};
-
-template <typename ConfigT>
-struct CommonArgProperties
-{
- CommonArgProperties() {}
- CommonArgProperties(Detail::BoundArgFunction<ConfigT> const& _boundField) : boundField(_boundField) {}
-
- Detail::BoundArgFunction<ConfigT> boundField;
- std::string description;
- std::string detail;
- std::string placeholder; // Only value if boundField takes an arg
-
- bool takesArg() const
- {
- return !placeholder.empty();
- }
- void validate() const
- {
- if (!boundField.isSet())
- throw std::logic_error("option not bound");
- }
-};
-struct OptionArgProperties
-{
- std::vector<std::string> shortNames;
- std::string longName;
-
- bool hasShortName(std::string const& shortName) const
- {
- return std::find(shortNames.begin(), shortNames.end(), shortName) != shortNames.end();
- }
- bool hasLongName(std::string const& _longName) const
- {
- return _longName == longName;
- }
-};
-struct PositionalArgProperties
-{
- PositionalArgProperties() : position(-1) {}
- int position; // -1 means non-positional (floating)
-
- bool isFixedPositional() const
- {
- return position != -1;
- }
-};
-
-template <typename ConfigT>
-class CommandLine
-{
-
- struct Arg : CommonArgProperties<ConfigT>, OptionArgProperties, PositionalArgProperties
- {
- Arg() {}
- Arg(Detail::BoundArgFunction<ConfigT> const& _boundField) : CommonArgProperties<ConfigT>(_boundField) {}
-
- using CommonArgProperties<ConfigT>::placeholder; // !TBD
-
- std::string dbgName() const
- {
- if (!longName.empty())
- return "--" + longName;
- if (!shortNames.empty())
- return "-" + shortNames[0];
- return "positional args";
- }
- std::string commands() const
- {
- std::ostringstream oss;
- bool first = true;
- std::vector<std::string>::const_iterator it = shortNames.begin(), itEnd = shortNames.end();
- for (; it != itEnd; ++it)
- {
- if (first)
- first = false;
- else
- oss << ", ";
- oss << "-" << *it;
- }
- if (!longName.empty())
- {
- if (!first)
- oss << ", ";
- oss << "--" << longName;
- }
- if (!placeholder.empty())
- oss << " <" << placeholder << ">";
- return oss.str();
- }
- };
-
- typedef CATCH_AUTO_PTR(Arg) ArgAutoPtr;
-
- friend void addOptName(Arg& arg, std::string const& optName)
- {
- if (optName.empty())
- return;
- if (Detail::startsWith(optName, "--"))
- {
- if (!arg.longName.empty())
- throw std::logic_error("Only one long opt may be specified. '" + arg.longName + "' already specified, now attempting to add '" + optName + "'");
- arg.longName = optName.substr(2);
- }
- else if (Detail::startsWith(optName, "-"))
- arg.shortNames.push_back(optName.substr(1));
- else
- throw std::logic_error("option must begin with - or --. Option was: '" + optName + "'");
- }
- friend void setPositionalArg(Arg& arg, int position)
- {
- arg.position = position;
- }
-
- class ArgBuilder
- {
- public:
- ArgBuilder(Arg* arg) : m_arg(arg) {}
-
- // Bind a non-boolean data member (requires placeholder string)
- template <typename C, typename M>
- void bind(M C::*field, std::string const& placeholder)
- {
- m_arg->boundField = new Detail::BoundDataMember<C, M>(field);
- m_arg->placeholder = placeholder;
- }
- // Bind a boolean data member (no placeholder required)
- template <typename C>
- void bind(bool C::*field)
- {
- m_arg->boundField = new Detail::BoundDataMember<C, bool>(field);
- }
-
- // Bind a method taking a single, non-boolean argument (requires a placeholder string)
- template <typename C, typename M>
- void bind(void (C::*unaryMethod)(M), std::string const& placeholder)
- {
- m_arg->boundField = new Detail::BoundUnaryMethod<C, M>(unaryMethod);
- m_arg->placeholder = placeholder;
- }
-
- // Bind a method taking a single, boolean argument (no placeholder string required)
- template <typename C>
- void bind(void (C::*unaryMethod)(bool))
- {
- m_arg->boundField = new Detail::BoundUnaryMethod<C, bool>(unaryMethod);
- }
-
- // Bind a method that takes no arguments (will be called if opt is present)
- template <typename C>
- void bind(void (C::*nullaryMethod)())
- {
- m_arg->boundField = new Detail::BoundNullaryMethod<C>(nullaryMethod);
- }
-
- // Bind a free function taking a single argument - the object to operate on (no placeholder string required)
- template <typename C>
- void bind(void (*unaryFunction)(C&))
- {
- m_arg->boundField = new Detail::BoundUnaryFunction<C>(unaryFunction);
- }
-
- // Bind a free function taking a single argument - the object to operate on (requires a placeholder string)
- template <typename C, typename T>
- void bind(void (*binaryFunction)(C&, T), std::string const& placeholder)
- {
- m_arg->boundField = new Detail::BoundBinaryFunction<C, T>(binaryFunction);
- m_arg->placeholder = placeholder;
- }
-
- ArgBuilder& describe(std::string const& description)
- {
- m_arg->description = description;
- return *this;
- }
- ArgBuilder& detail(std::string const& _detail)
- {
- m_arg->detail = _detail;
- return *this;
- }
-
- protected:
- Arg* m_arg;
- };
-
- class OptBuilder : public ArgBuilder
- {
- public:
- OptBuilder(Arg* arg) : ArgBuilder(arg) {}
- OptBuilder(OptBuilder& other) : ArgBuilder(other) {}
-
- OptBuilder& operator[](std::string const& optName)
- {
- addOptName(*ArgBuilder::m_arg, optName);
- return *this;
- }
- };
-
- public:
- CommandLine()
- : m_boundProcessName(new Detail::NullBinder<ConfigT>()),
- m_highestSpecifiedArgPosition(0),
- m_throwOnUnrecognisedTokens(false)
- {
- }
- CommandLine(CommandLine const& other)
- : m_boundProcessName(other.m_boundProcessName),
- m_options(other.m_options),
- m_positionalArgs(other.m_positionalArgs),
- m_highestSpecifiedArgPosition(other.m_highestSpecifiedArgPosition),
- m_throwOnUnrecognisedTokens(other.m_throwOnUnrecognisedTokens)
- {
- if (other.m_floatingArg.get())
- m_floatingArg.reset(new Arg(*other.m_floatingArg));
- }
-
- CommandLine& setThrowOnUnrecognisedTokens(bool shouldThrow = true)
- {
- m_throwOnUnrecognisedTokens = shouldThrow;
- return *this;
- }
-
- OptBuilder operator[](std::string const& optName)
- {
- m_options.push_back(Arg());
- addOptName(m_options.back(), optName);
- OptBuilder builder(&m_options.back());
- return builder;
- }
-
- ArgBuilder operator[](int position)
- {
- m_positionalArgs.insert(std::make_pair(position, Arg()));
- if (position > m_highestSpecifiedArgPosition)
- m_highestSpecifiedArgPosition = position;
- setPositionalArg(m_positionalArgs[position], position);
- ArgBuilder builder(&m_positionalArgs[position]);
- return builder;
- }
-
- // Invoke this with the _ instance
- ArgBuilder operator[](UnpositionalTag)
- {
- if (m_floatingArg.get())
- throw std::logic_error("Only one unpositional argument can be added");
- m_floatingArg.reset(new Arg());
- ArgBuilder builder(m_floatingArg.get());
- return builder;
- }
-
- template <typename C, typename M>
- void bindProcessName(M C::*field)
- {
- m_boundProcessName = new Detail::BoundDataMember<C, M>(field);
- }
- template <typename C, typename M>
- void bindProcessName(void (C::*_unaryMethod)(M))
- {
- m_boundProcessName = new Detail::BoundUnaryMethod<C, M>(_unaryMethod);
- }
-
- void optUsage(std::ostream& os, std::size_t indent = 0, std::size_t width = Detail::consoleWidth) const
- {
- typename std::vector<Arg>::const_iterator itBegin = m_options.begin(), itEnd = m_options.end(), it;
- std::size_t maxWidth = 0;
- for (it = itBegin; it != itEnd; ++it)
- maxWidth = (std::max)(maxWidth, it->commands().size());
-
- for (it = itBegin; it != itEnd; ++it)
- {
- Detail::Text usageText(it->commands(), Detail::TextAttributes()
- .setWidth(maxWidth + indent)
- .setIndent(indent));
- Detail::Text desc(it->description, Detail::TextAttributes()
- .setWidth(width - maxWidth - 3));
-
- for (std::size_t i = 0; i < (std::max)(usageText.size(), desc.size()); ++i)
- {
- std::string usageCol = i < usageText.size() ? usageText[i] : "";
- os << usageCol;
-
- if (i < desc.size() && !desc[i].empty())
- os << std::string(indent + 2 + maxWidth - usageCol.size(), ' ')
- << desc[i];
- os << "\n";
- }
- }
- }
- std::string optUsage() const
- {
- std::ostringstream oss;
- optUsage(oss);
- return oss.str();
- }
-
- void argSynopsis(std::ostream& os) const
- {
- for (int i = 1; i <= m_highestSpecifiedArgPosition; ++i)
- {
- if (i > 1)
- os << " ";
- typename std::map<int, Arg>::const_iterator it = m_positionalArgs.find(i);
- if (it != m_positionalArgs.end())
- os << "<" << it->second.placeholder << ">";
- else if (m_floatingArg.get())
- os << "<" << m_floatingArg->placeholder << ">";
- else
- throw std::logic_error("non consecutive positional arguments with no floating args");
- }
- // !TBD No indication of mandatory args
- if (m_floatingArg.get())
- {
- if (m_highestSpecifiedArgPosition > 1)
- os << " ";
- os << "[<" << m_floatingArg->placeholder << "> ...]";
- }
- }
- std::string argSynopsis() const
- {
- std::ostringstream oss;
- argSynopsis(oss);
- return oss.str();
- }
-
- void usage(std::ostream& os, std::string const& procName) const
- {
- validate();
- os << "usage:\n " << procName << " ";
- argSynopsis(os);
- if (!m_options.empty())
- {
- os << " [options]\n\nwhere options are: \n";
- optUsage(os, 2);
- }
- os << "\n";
- }
- std::string usage(std::string const& procName) const
- {
- std::ostringstream oss;
- usage(oss, procName);
- return oss.str();
- }
-
- ConfigT parse(int argc, char const* const* argv) const
- {
- ConfigT config;
- parseInto(argc, argv, config);
- return config;
- }
-
- std::vector<Parser::Token> parseInto(int argc, char const* const* argv, ConfigT& config) const
- {
- std::string processName = argv[0];
- std::size_t lastSlash = processName.find_last_of("/\\");
- if (lastSlash != std::string::npos)
- processName = processName.substr(lastSlash + 1);
- m_boundProcessName.set(config, processName);
- std::vector<Parser::Token> tokens;
- Parser parser;
- parser.parseIntoTokens(argc, argv, tokens);
- return populate(tokens, config);
- }
-
- std::vector<Parser::Token> populate(std::vector<Parser::Token> const& tokens, ConfigT& config) const
- {
- validate();
- std::vector<Parser::Token> unusedTokens = populateOptions(tokens, config);
- unusedTokens = populateFixedArgs(unusedTokens, config);
- unusedTokens = populateFloatingArgs(unusedTokens, config);
- return unusedTokens;
- }
-
- std::vector<Parser::Token> populateOptions(std::vector<Parser::Token> const& tokens, ConfigT& config) const
- {
- std::vector<Parser::Token> unusedTokens;
- std::vector<std::string> errors;
- for (std::size_t i = 0; i < tokens.size(); ++i)
- {
- Parser::Token const& token = tokens[i];
- typename std::vector<Arg>::const_iterator it = m_options.begin(), itEnd = m_options.end();
- for (; it != itEnd; ++it)
- {
- Arg const& arg = *it;
-
- try
- {
- if ((token.type == Parser::Token::ShortOpt && arg.hasShortName(token.data)) ||
- (token.type == Parser::Token::LongOpt && arg.hasLongName(token.data)))
- {
- if (arg.takesArg())
- {
- if (i == tokens.size() - 1 || tokens[i + 1].type != Parser::Token::Positional)
- errors.push_back("Expected argument to option: " + token.data);
- else
- arg.boundField.set(config, tokens[++i].data);
- }
- else
- {
- arg.boundField.setFlag(config);
- }
- break;
- }
- }
- catch (std::exception& ex)
- {
- errors.push_back(std::string(ex.what()) + "\n- while parsing: (" + arg.commands() + ")");
- }
- }
- if (it == itEnd)
- {
- if (token.type == Parser::Token::Positional || !m_throwOnUnrecognisedTokens)
- unusedTokens.push_back(token);
- else if (errors.empty() && m_throwOnUnrecognisedTokens)
- errors.push_back("unrecognised option: " + token.data);
- }
- }
- if (!errors.empty())
- {
- std::ostringstream oss;
- for (std::vector<std::string>::const_iterator it = errors.begin(), itEnd = errors.end();
- it != itEnd;
- ++it)
- {
- if (it != errors.begin())
- oss << "\n";
- oss << *it;
- }
- throw std::runtime_error(oss.str());
- }
- return unusedTokens;
- }
- std::vector<Parser::Token> populateFixedArgs(std::vector<Parser::Token> const& tokens, ConfigT& config) const
- {
- std::vector<Parser::Token> unusedTokens;
- int position = 1;
- for (std::size_t i = 0; i < tokens.size(); ++i)
- {
- Parser::Token const& token = tokens[i];
- typename std::map<int, Arg>::const_iterator it = m_positionalArgs.find(position);
- if (it != m_positionalArgs.end())
- it->second.boundField.set(config, token.data);
- else
- unusedTokens.push_back(token);
- if (token.type == Parser::Token::Positional)
- position++;
- }
- return unusedTokens;
- }
- std::vector<Parser::Token> populateFloatingArgs(std::vector<Parser::Token> const& tokens, ConfigT& config) const
- {
- if (!m_floatingArg.get())
- return tokens;
- std::vector<Parser::Token> unusedTokens;
- for (std::size_t i = 0; i < tokens.size(); ++i)
- {
- Parser::Token const& token = tokens[i];
- if (token.type == Parser::Token::Positional)
- m_floatingArg->boundField.set(config, token.data);
- else
- unusedTokens.push_back(token);
- }
- return unusedTokens;
- }
-
- void validate() const
- {
- if (m_options.empty() && m_positionalArgs.empty() && !m_floatingArg.get())
- throw std::logic_error("No options or arguments specified");
-
- for (typename std::vector<Arg>::const_iterator it = m_options.begin(),
- itEnd = m_options.end();
- it != itEnd; ++it)
- it->validate();
- }
-
- private:
- Detail::BoundArgFunction<ConfigT> m_boundProcessName;
- std::vector<Arg> m_options;
- std::map<int, Arg> m_positionalArgs;
- ArgAutoPtr m_floatingArg;
- int m_highestSpecifiedArgPosition;
- bool m_throwOnUnrecognisedTokens;
-};
-
-} // end namespace Clara
-
-STITCH_CLARA_CLOSE_NAMESPACE
-#undef STITCH_CLARA_OPEN_NAMESPACE
-#undef STITCH_CLARA_CLOSE_NAMESPACE
-
-#endif // TWOBLUECUBES_CLARA_H_INCLUDED
-#undef STITCH_CLARA_OPEN_NAMESPACE
-
-// Restore Clara's value for console width, if present
-#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
-#define CLARA_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
-#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
-#endif
-
-#include <fstream>
-
-namespace Catch {
-
-inline void abortAfterFirst(ConfigData& config) { config.abortAfter = 1; }
-inline void abortAfterX(ConfigData& config, int x)
-{
- if (x < 1)
- throw std::runtime_error("Value after -x or --abortAfter must be greater than zero");
- config.abortAfter = x;
-}
-inline void addTestOrTags(ConfigData& config, std::string const& _testSpec) { config.testsOrTags.push_back(_testSpec); }
-inline void addReporterName(ConfigData& config, std::string const& _reporterName) { config.reporterNames.push_back(_reporterName); }
-
-inline void addWarning(ConfigData& config, std::string const& _warning)
-{
- if (_warning == "NoAssertions")
- config.warnings = static_cast<WarnAbout::What>(config.warnings | WarnAbout::NoAssertions);
- else
- throw std::runtime_error("Unrecognised warning: '" + _warning + "'");
-}
-inline void setOrder(ConfigData& config, std::string const& order)
-{
- if (startsWith("declared", order))
- config.runOrder = RunTests::InDeclarationOrder;
- else if (startsWith("lexical", order))
- config.runOrder = RunTests::InLexicographicalOrder;
- else if (startsWith("random", order))
- config.runOrder = RunTests::InRandomOrder;
- else
- throw std::runtime_error("Unrecognised ordering: '" + order + "'");
-}
-inline void setRngSeed(ConfigData& config, std::string const& seed)
-{
- if (seed == "time")
- {
- config.rngSeed = static_cast<unsigned int>(std::time(0));
- }
- else
- {
- std::stringstream ss;
- ss << seed;
- ss >> config.rngSeed;
- if (ss.fail())
- throw std::runtime_error("Argment to --rng-seed should be the word 'time' or a number");
- }
-}
-inline void setVerbosity(ConfigData& config, int level)
-{
- // !TBD: accept strings?
- config.verbosity = static_cast<Verbosity::Level>(level);
-}
-inline void setShowDurations(ConfigData& config, bool _showDurations)
-{
- config.showDurations = _showDurations
- ? ShowDurations::Always
- : ShowDurations::Never;
-}
-inline void loadTestNamesFromFile(ConfigData& config, std::string const& _filename)
-{
- std::ifstream f(_filename.c_str());
- if (!f.is_open())
- throw std::domain_error("Unable to load input file: " + _filename);
-
- std::string line;
- while (std::getline(f, line))
- {
- line = trim(line);
- if (!line.empty() && !startsWith(line, "#"))
- addTestOrTags(config, "\"" + line + "\",");
- }
-}
-
-inline Clara::CommandLine<ConfigData> makeCommandLineParser()
-{
-
- using namespace Clara;
- CommandLine<ConfigData> cli;
-
- cli.bindProcessName(&ConfigData::processName);
-
- cli["-?"]["-h"]["--help"]
- .describe("display usage information")
- .bind(&ConfigData::showHelp);
-
- cli["-l"]["--list-tests"]
- .describe("list all/matching test cases")
- .bind(&ConfigData::listTests);
-
- cli["-t"]["--list-tags"]
- .describe("list all/matching tags")
- .bind(&ConfigData::listTags);
-
- cli["-s"]["--success"]
- .describe("include successful tests in output")
- .bind(&ConfigData::showSuccessfulTests);
-
- cli["-b"]["--break"]
- .describe("break into debugger on failure")
- .bind(&ConfigData::shouldDebugBreak);
-
- cli["-e"]["--nothrow"]
- .describe("skip exception tests")
- .bind(&ConfigData::noThrow);
-
- cli["-i"]["--invisibles"]
- .describe("show invisibles (tabs, newlines)")
- .bind(&ConfigData::showInvisibles);
-
- cli["-o"]["--out"]
- .describe("output filename")
- .bind(&ConfigData::outputFilename, "filename");
-
- cli["-r"]["--reporter"]
- // .placeholder( "name[:filename]" )
- .describe("reporter to use (defaults to console)")
- .bind(&addReporterName, "name");
-
- cli["-n"]["--name"]
- .describe("suite name")
- .bind(&ConfigData::name, "name");
-
- cli["-a"]["--abort"]
- .describe("abort at first failure")
- .bind(&abortAfterFirst);
-
- cli["-x"]["--abortx"]
- .describe("abort after x failures")
- .bind(&abortAfterX, "no. failures");
-
- cli["-w"]["--warn"]
- .describe("enable warnings")
- .bind(&addWarning, "warning name");
-
- // - needs updating if reinstated
- // cli.into( &setVerbosity )
- // .describe( "level of verbosity (0=no output)" )
- // .shortOpt( "v")
- // .longOpt( "verbosity" )
- // .placeholder( "level" );
-
- cli[_]
- .describe("which test or tests to use")
- .bind(&addTestOrTags, "test name, pattern or tags");
-
- cli["-d"]["--durations"]
- .describe("show test durations")
- .bind(&setShowDurations, "yes/no");
-
- cli["-f"]["--input-file"]
- .describe("load test names to run from a file")
- .bind(&loadTestNamesFromFile, "filename");
-
- cli["-#"]["--filenames-as-tags"]
- .describe("adds a tag for the filename")
- .bind(&ConfigData::filenamesAsTags);
-
- // Less common commands which don't have a short form
- cli["--list-test-names-only"]
- .describe("list all/matching test cases names only")
- .bind(&ConfigData::listTestNamesOnly);
-
- cli["--list-reporters"]
- .describe("list all reporters")
- .bind(&ConfigData::listReporters);
-
- cli["--order"]
- .describe("test case order (defaults to decl)")
- .bind(&setOrder, "decl|lex|rand");
-
- cli["--rng-seed"]
- .describe("set a specific seed for random numbers")
- .bind(&setRngSeed, "'time'|number");
-
- cli["--force-colour"]
- .describe("force colourised output")
- .bind(&ConfigData::forceColour);
-
- return cli;
-}
-
-} // end namespace Catch
-
-// #included from: internal/catch_list.hpp
-#define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED
-
-// #included from: catch_text.h
-#define TWOBLUECUBES_CATCH_TEXT_H_INCLUDED
-
-#define TBC_TEXT_FORMAT_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH
-
-#define CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE Catch
-// #included from: ../external/tbc_text_format.h
-// Only use header guard if we are not using an outer namespace
-#ifndef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE
-#ifdef TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED
-#ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED
-#define TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED
-#endif
-#else
-#define TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED
-#endif
-#endif
-#ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED
-#include <sstream>
-#include <string>
-#include <vector>
-
-// Use optional outer namespace
-#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE
-namespace CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE {
-#endif
-
-namespace Tbc {
-
-#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH
-const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH;
-#else
-const unsigned int consoleWidth = 80;
-#endif
-
-struct TextAttributes
-{
- TextAttributes()
- : initialIndent(std::string::npos),
- indent(0),
- width(consoleWidth - 1),
- tabChar('\t')
- {
- }
-
- TextAttributes& setInitialIndent(std::size_t _value)
- {
- initialIndent = _value;
- return *this;
- }
- TextAttributes& setIndent(std::size_t _value)
- {
- indent = _value;
- return *this;
- }
- TextAttributes& setWidth(std::size_t _value)
- {
- width = _value;
- return *this;
- }
- TextAttributes& setTabChar(char _value)
- {
- tabChar = _value;
- return *this;
- }
-
- std::size_t initialIndent; // indent of first line, or npos
- std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos
- std::size_t width; // maximum width of text, including indent. Longer text will wrap
- char tabChar; // If this char is seen the indent is changed to current pos
-};
-
-class Text
-{
- public:
- Text(std::string const& _str, TextAttributes const& _attr = TextAttributes())
- : attr(_attr)
- {
- std::string wrappableChars = " [({.,/|\\-";
- std::size_t indent = _attr.initialIndent != std::string::npos
- ? _attr.initialIndent
- : _attr.indent;
- std::string remainder = _str;
-
- while (!remainder.empty())
- {
- if (lines.size() >= 1000)
- {
- lines.push_back("... message truncated due to excessive size");
- return;
- }
- std::size_t tabPos = std::string::npos;
- std::size_t width = (std::min)(remainder.size(), _attr.width - indent);
- std::size_t pos = remainder.find_first_of('\n');
- if (pos <= width)
- {
- width = pos;
- }
- pos = remainder.find_last_of(_attr.tabChar, width);
- if (pos != std::string::npos)
- {
- tabPos = pos;
- if (remainder[width] == '\n')
- width--;
- remainder = remainder.substr(0, tabPos) + remainder.substr(tabPos + 1);
- }
-
- if (width == remainder.size())
- {
- spliceLine(indent, remainder, width);
- }
- else if (remainder[width] == '\n')
- {
- spliceLine(indent, remainder, width);
- if (width <= 1 || remainder.size() != 1)
- remainder = remainder.substr(1);
- indent = _attr.indent;
- }
- else
- {
- pos = remainder.find_last_of(wrappableChars, width);
- if (pos != std::string::npos && pos > 0)
- {
- spliceLine(indent, remainder, pos);
- if (remainder[0] == ' ')
- remainder = remainder.substr(1);
- }
- else
- {
- spliceLine(indent, remainder, width - 1);
- lines.back() += "-";
- }
- if (lines.size() == 1)
- indent = _attr.indent;
- if (tabPos != std::string::npos)
- indent += tabPos;
- }
- }
- }
-
- void spliceLine(std::size_t _indent, std::string& _remainder, std::size_t _pos)
- {
- lines.push_back(std::string(_indent, ' ') + _remainder.substr(0, _pos));
- _remainder = _remainder.substr(_pos);
- }
-
- typedef std::vector<std::string>::const_iterator const_iterator;
-
- const_iterator begin() const { return lines.begin(); }
- const_iterator end() const { return lines.end(); }
- std::string const& last() const { return lines.back(); }
- std::size_t size() const { return lines.size(); }
- std::string const& operator[](std::size_t _index) const { return lines[_index]; }
- std::string toString() const
- {
- std::ostringstream oss;
- oss << *this;
- return oss.str();
- }
-
- inline friend std::ostream& operator<<(std::ostream& _stream, Text const& _text)
- {
- for (Text::const_iterator it = _text.begin(), itEnd = _text.end();
- it != itEnd; ++it)
- {
- if (it != _text.begin())
- _stream << "\n";
- _stream << *it;
- }
- return _stream;
- }
-
- private:
- std::string str;
- TextAttributes attr;
- std::vector<std::string> lines;
-};
-
-} // end namespace Tbc
-
-#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE
-} // end outer namespace
-#endif
-
-#endif // TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED
-#undef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE
-
-namespace Catch {
-using Tbc::Text;
-using Tbc::TextAttributes;
-}
-
-// #included from: catch_console_colour.hpp
-#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_HPP_INCLUDED
-
-namespace Catch {
-
-struct Colour
-{
- enum Code
- {
- None = 0,
-
- White,
- Red,
- Green,
- Blue,
- Cyan,
- Yellow,
- Grey,
-
- Bright = 0x10,
-
- BrightRed = Bright | Red,
- BrightGreen = Bright | Green,
- LightGrey = Bright | Grey,
- BrightWhite = Bright | White,
-
- // By intention
- FileName = LightGrey,
- Warning = Yellow,
- ResultError = BrightRed,
- ResultSuccess = BrightGreen,
- ResultExpectedFailure = Warning,
-
- Error = BrightRed,
- Success = Green,
-
- OriginalExpression = Cyan,
- ReconstructedExpression = Yellow,
-
- SecondaryText = LightGrey,
- Headers = White
- };
-
- // Use constructed object for RAII guard
- Colour(Code _colourCode);
- Colour(Colour const& other);
- ~Colour();
-
- // Use static method for one-shot changes
- static void use(Code _colourCode);
-
- private:
- bool m_moved;
-};
-
-inline std::ostream& operator<<(std::ostream& os, Colour const&) { return os; }
-
-} // end namespace Catch
-
-// #included from: catch_interfaces_reporter.h
-#define TWOBLUECUBES_CATCH_INTERFACES_REPORTER_H_INCLUDED
-
-#include <assert.h>
-#include <map>
-#include <ostream>
-#include <string>
-
-namespace Catch {
-struct ReporterConfig
-{
- explicit ReporterConfig(Ptr<IConfig const> const& _fullConfig)
- : m_stream(&_fullConfig->stream()), m_fullConfig(_fullConfig) {}
-
- ReporterConfig(Ptr<IConfig const> const& _fullConfig, std::ostream& _stream)
- : m_stream(&_stream), m_fullConfig(_fullConfig) {}
-
- std::ostream& stream() const { return *m_stream; }
- Ptr<IConfig const> fullConfig() const { return m_fullConfig; }
-
- private:
- std::ostream* m_stream;
- Ptr<IConfig const> m_fullConfig;
-};
-
-struct ReporterPreferences
-{
- ReporterPreferences()
- : shouldRedirectStdOut(false)
- {
- }
-
- bool shouldRedirectStdOut;
-};
-
-template <typename T>
-struct LazyStat : Option<T>
-{
- LazyStat() : used(false) {}
- LazyStat& operator=(T const& _value)
- {
- Option<T>::operator=(_value);
- used = false;
- return *this;
- }
- void reset()
- {
- Option<T>::reset();
- used = false;
- }
- bool used;
-};
-
-struct TestRunInfo
-{
- TestRunInfo(std::string const& _name) : name(_name) {}
- std::string name;
-};
-struct GroupInfo
-{
- GroupInfo(std::string const& _name,
- std::size_t _groupIndex,
- std::size_t _groupsCount)
- : name(_name),
- groupIndex(_groupIndex),
- groupsCounts(_groupsCount)
- {
- }
-
- std::string name;
- std::size_t groupIndex;
- std::size_t groupsCounts;
-};
-
-struct AssertionStats
-{
- AssertionStats(AssertionResult const& _assertionResult,
- std::vector<MessageInfo> const& _infoMessages,
- Totals const& _totals)
- : assertionResult(_assertionResult),
- infoMessages(_infoMessages),
- totals(_totals)
- {
- if (assertionResult.hasMessage())
- {
- // Copy message into messages list.
- // !TBD This should have been done earlier, somewhere
- MessageBuilder builder(assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType());
- builder << assertionResult.getMessage();
- builder.m_info.message = builder.m_stream.str();
-
- infoMessages.push_back(builder.m_info);
- }
- }
- virtual ~AssertionStats();
-
-#ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
- AssertionStats(AssertionStats const&) = default;
- AssertionStats(AssertionStats&&) = default;
- AssertionStats& operator=(AssertionStats const&) = default;
- AssertionStats& operator=(AssertionStats&&) = default;
-#endif
-
- AssertionResult assertionResult;
- std::vector<MessageInfo> infoMessages;
- Totals totals;
-};
-
-struct SectionStats
-{
- SectionStats(SectionInfo const& _sectionInfo,
- Counts const& _assertions,
- double _durationInSeconds,
- bool _missingAssertions)
- : sectionInfo(_sectionInfo),
- assertions(_assertions),
- durationInSeconds(_durationInSeconds),
- missingAssertions(_missingAssertions)
- {
- }
- virtual ~SectionStats();
-#ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
- SectionStats(SectionStats const&) = default;
- SectionStats(SectionStats&&) = default;
- SectionStats& operator=(SectionStats const&) = default;
- SectionStats& operator=(SectionStats&&) = default;
-#endif
-
- SectionInfo sectionInfo;
- Counts assertions;
- double durationInSeconds;
- bool missingAssertions;
-};
-
-struct TestCaseStats
-{
- TestCaseStats(TestCaseInfo const& _testInfo,
- Totals const& _totals,
- std::string const& _stdOut,
- std::string const& _stdErr,
- bool _aborting)
- : testInfo(_testInfo),
- totals(_totals),
- stdOut(_stdOut),
- stdErr(_stdErr),
- aborting(_aborting)
- {
- }
- virtual ~TestCaseStats();
-
-#ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
- TestCaseStats(TestCaseStats const&) = default;
- TestCaseStats(TestCaseStats&&) = default;
- TestCaseStats& operator=(TestCaseStats const&) = default;
- TestCaseStats& operator=(TestCaseStats&&) = default;
-#endif
-
- TestCaseInfo testInfo;
- Totals totals;
- std::string stdOut;
- std::string stdErr;
- bool aborting;
-};
-
-struct TestGroupStats
-{
- TestGroupStats(GroupInfo const& _groupInfo,
- Totals const& _totals,
- bool _aborting)
- : groupInfo(_groupInfo),
- totals(_totals),
- aborting(_aborting)
- {
- }
- TestGroupStats(GroupInfo const& _groupInfo)
- : groupInfo(_groupInfo),
- aborting(false)
- {
- }
- virtual ~TestGroupStats();
-
-#ifdef CATCH_CONFIG_CPP11_GENERATED_METHODS
- TestGroupStats(TestGroupStats const&) = default;
- TestGroupStats(TestGroupStats&&) = default;
- TestGroupStats& operator=(TestGroupStats const&) = default;
- TestGroupStats& operator=(TestGroupStats&&) = default;
-#endif
-
- GroupInfo groupInfo;
- Totals totals;
- bool aborting;
-};
-
-struct TestRunStats
-{
- TestRunStats(TestRunInfo const& _runInfo,
- Totals const& _totals,
- bool _aborting)
- : runInfo(_runInfo),
- totals(_totals),
- aborting(_aborting)
- {
- }
- virtual ~TestRunStats();
-
-#ifndef CATCH_CONFIG_CPP11_GENERATED_METHODS
- TestRunStats(TestRunStats const& _other)
- : runInfo(_other.runInfo),
- totals(_other.totals),
- aborting(_other.aborting)
- {
- }
-#else
- TestRunStats(TestRunStats const&) = default;
- TestRunStats(TestRunStats&&) = default;
- TestRunStats& operator=(TestRunStats const&) = default;
- TestRunStats& operator=(TestRunStats&&) = default;
-#endif
-
- TestRunInfo runInfo;
- Totals totals;
- bool aborting;
-};
-
-struct IStreamingReporter : IShared
-{
- virtual ~IStreamingReporter();
-
- // Implementing class must also provide the following static method:
- // static std::string getDescription();
-
- virtual ReporterPreferences getPreferences() const = 0;
-
- virtual void noMatchingTestCases(std::string const& spec) = 0;
-
- virtual void testRunStarting(TestRunInfo const& testRunInfo) = 0;
- virtual void testGroupStarting(GroupInfo const& groupInfo) = 0;
-
- virtual void testCaseStarting(TestCaseInfo const& testInfo) = 0;
- virtual void sectionStarting(SectionInfo const& sectionInfo) = 0;
-
- virtual void assertionStarting(AssertionInfo const& assertionInfo) = 0;
-
- // The return value indicates if the messages buffer should be cleared:
- virtual bool assertionEnded(AssertionStats const& assertionStats) = 0;
-
- virtual void sectionEnded(SectionStats const& sectionStats) = 0;
- virtual void testCaseEnded(TestCaseStats const& testCaseStats) = 0;
- virtual void testGroupEnded(TestGroupStats const& testGroupStats) = 0;
- virtual void testRunEnded(TestRunStats const& testRunStats) = 0;
-
- virtual void skipTest(TestCaseInfo const& testInfo) = 0;
-};
-
-struct IReporterFactory : IShared
-{
- virtual ~IReporterFactory();
- virtual IStreamingReporter* create(ReporterConfig const& config) const = 0;
- virtual std::string getDescription() const = 0;
-};
-
-struct IReporterRegistry
-{
- typedef std::map<std::string, Ptr<IReporterFactory>> FactoryMap;
- typedef std::vector<Ptr<IReporterFactory>> Listeners;
-
- virtual ~IReporterRegistry();
- virtual IStreamingReporter* create(std::string const& name, Ptr<IConfig const> const& config) const = 0;
- virtual FactoryMap const& getFactories() const = 0;
- virtual Listeners const& getListeners() const = 0;
-};
-
-Ptr<IStreamingReporter> addReporter(Ptr<IStreamingReporter> const& existingReporter, Ptr<IStreamingReporter> const& additionalReporter);
-}
-
-#include <algorithm>
-#include <limits>
-
-namespace Catch {
-
-inline std::size_t listTests(Config const& config)
-{
-
- TestSpec testSpec = config.testSpec();
- if (config.testSpec().hasFilters())
- Catch::cout() << "Matching test cases:\n";
- else
- {
- Catch::cout() << "All available test cases:\n";
- testSpec = TestSpecParser(ITagAliasRegistry::get()).parse("*").testSpec();
- }
-
- std::size_t matchedTests = 0;
- TextAttributes nameAttr, tagsAttr;
- nameAttr.setInitialIndent(2).setIndent(4);
- tagsAttr.setIndent(6);
-
- std::vector<TestCase> matchedTestCases = filterTests(getAllTestCasesSorted(config), testSpec, config);
- for (std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();
- it != itEnd;
- ++it)
- {
- matchedTests++;
- TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();
- Colour::Code colour = testCaseInfo.isHidden()
- ? Colour::SecondaryText
- : Colour::None;
- Colour colourGuard(colour);
-
- Catch::cout() << Text(testCaseInfo.name, nameAttr) << std::endl;
- if (!testCaseInfo.tags.empty())
- Catch::cout() << Text(testCaseInfo.tagsAsString, tagsAttr) << std::endl;
- }
-
- if (!config.testSpec().hasFilters())
- Catch::cout() << pluralise(matchedTests, "test case") << "\n"
- << std::endl;
- else
- Catch::cout() << pluralise(matchedTests, "matching test case") << "\n"
- << std::endl;
- return matchedTests;
-}
-
-inline std::size_t listTestsNamesOnly(Config const& config)
-{
- TestSpec testSpec = config.testSpec();
- if (!config.testSpec().hasFilters())
- testSpec = TestSpecParser(ITagAliasRegistry::get()).parse("*").testSpec();
- std::size_t matchedTests = 0;
- std::vector<TestCase> matchedTestCases = filterTests(getAllTestCasesSorted(config), testSpec, config);
- for (std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();
- it != itEnd;
- ++it)
- {
- matchedTests++;
- TestCaseInfo const& testCaseInfo = it->getTestCaseInfo();
- Catch::cout() << testCaseInfo.name << std::endl;
- }
- return matchedTests;
-}
-
-struct TagInfo
-{
- TagInfo() : count(0) {}
- void add(std::string const& spelling)
- {
- ++count;
- spellings.insert(spelling);
- }
- std::string all() const
- {
- std::string out;
- for (std::set<std::string>::const_iterator it = spellings.begin(), itEnd = spellings.end();
- it != itEnd;
- ++it)
- out += "[" + *it + "]";
- return out;
- }
- std::set<std::string> spellings;
- std::size_t count;
-};
-
-inline std::size_t listTags(Config const& config)
-{
- TestSpec testSpec = config.testSpec();
- if (config.testSpec().hasFilters())
- Catch::cout() << "Tags for matching test cases:\n";
- else
- {
- Catch::cout() << "All available tags:\n";
- testSpec = TestSpecParser(ITagAliasRegistry::get()).parse("*").testSpec();
- }
-
- std::map<std::string, TagInfo> tagCounts;
-
- std::vector<TestCase> matchedTestCases = filterTests(getAllTestCasesSorted(config), testSpec, config);
- for (std::vector<TestCase>::const_iterator it = matchedTestCases.begin(), itEnd = matchedTestCases.end();
- it != itEnd;
- ++it)
- {
- for (std::set<std::string>::const_iterator tagIt = it->getTestCaseInfo().tags.begin(),
- tagItEnd = it->getTestCaseInfo().tags.end();
- tagIt != tagItEnd;
- ++tagIt)
- {
- std::string tagName = *tagIt;
- std::string lcaseTagName = toLower(tagName);
- std::map<std::string, TagInfo>::iterator countIt = tagCounts.find(lcaseTagName);
- if (countIt == tagCounts.end())
- countIt = tagCounts.insert(std::make_pair(lcaseTagName, TagInfo())).first;
- countIt->second.add(tagName);
- }
- }
-
- for (std::map<std::string, TagInfo>::const_iterator countIt = tagCounts.begin(),
- countItEnd = tagCounts.end();
- countIt != countItEnd;
- ++countIt)
- {
- std::ostringstream oss;
- oss << " " << std::setw(2) << countIt->second.count << " ";
- Text wrapper(countIt->second.all(), TextAttributes()
- .setInitialIndent(0)
- .setIndent(oss.str().size())
- .setWidth(CATCH_CONFIG_CONSOLE_WIDTH - 10));
- Catch::cout() << oss.str() << wrapper << "\n";
- }
- Catch::cout() << pluralise(tagCounts.size(), "tag") << "\n"
- << std::endl;
- return tagCounts.size();
-}
-
-inline std::size_t listReporters(Config const& /*config*/)
-{
- Catch::cout() << "Available reporters:\n";
- IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories();
- IReporterRegistry::FactoryMap::const_iterator itBegin = factories.begin(), itEnd = factories.end(), it;
- std::size_t maxNameLen = 0;
- for (it = itBegin; it != itEnd; ++it)
- maxNameLen = (std::max)(maxNameLen, it->first.size());
-
- for (it = itBegin; it != itEnd; ++it)
- {
- Text wrapper(it->second->getDescription(), TextAttributes()
- .setInitialIndent(0)
- .setIndent(7 + maxNameLen)
- .setWidth(CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen - 8));
- Catch::cout() << " "
- << it->first
- << ":"
- << std::string(maxNameLen - it->first.size() + 2, ' ')
- << wrapper << "\n";
- }
- Catch::cout() << std::endl;
- return factories.size();
-}
-
-inline Option<std::size_t> list(Config const& config)
-{
- Option<std::size_t> listedCount;
- if (config.listTests())
- listedCount = listedCount.valueOr(0) + listTests(config);
- if (config.listTestNamesOnly())
- listedCount = listedCount.valueOr(0) + listTestsNamesOnly(config);
- if (config.listTags())
- listedCount = listedCount.valueOr(0) + listTags(config);
- if (config.listReporters())
- listedCount = listedCount.valueOr(0) + listReporters(config);
- return listedCount;
-}
-
-} // end namespace Catch
-
-// #included from: internal/catch_run_context.hpp
-#define TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED
-
-// #included from: catch_test_case_tracker.hpp
-#define TWOBLUECUBES_CATCH_TEST_CASE_TRACKER_HPP_INCLUDED
-
-#include <assert.h>
-#include <map>
-#include <string>
-#include <vector>
-
-namespace Catch {
-namespace TestCaseTracking {
-
-struct ITracker : SharedImpl<>
-{
- virtual ~ITracker();
-
- // static queries
- virtual std::string name() const = 0;
-
- // dynamic queries
- virtual bool isComplete() const = 0; // Successfully completed or failed
- virtual bool isSuccessfullyCompleted() const = 0;
- virtual bool isOpen() const = 0; // Started but not complete
- virtual bool hasChildren() const = 0;
-
- virtual ITracker& parent() = 0;
-
- // actions
- virtual void close() = 0; // Successfully complete
- virtual void fail() = 0;
- virtual void markAsNeedingAnotherRun() = 0;
-
- virtual void addChild(Ptr<ITracker> const& child) = 0;
- virtual ITracker* findChild(std::string const& name) = 0;
- virtual void openChild() = 0;
-};
-
-class TrackerContext
-{
-
- enum RunState
- {
- NotStarted,
- Executing,
- CompletedCycle
- };
-
- Ptr<ITracker> m_rootTracker;
- ITracker* m_currentTracker;
- RunState m_runState;
-
- public:
- static TrackerContext& instance()
- {
- static TrackerContext s_instance;
- return s_instance;
- }
-
- TrackerContext()
- : m_currentTracker(CATCH_NULL),
- m_runState(NotStarted)
- {
- }
-
- ITracker& startRun();
-
- void endRun()
- {
- m_rootTracker.reset();
- m_currentTracker = CATCH_NULL;
- m_runState = NotStarted;
- }
-
- void startCycle()
- {
- m_currentTracker = m_rootTracker.get();
- m_runState = Executing;
- }
- void completeCycle()
- {
- m_runState = CompletedCycle;
- }
-
- bool completedCycle() const
- {
- return m_runState == CompletedCycle;
- }
- ITracker& currentTracker()
- {
- return *m_currentTracker;
- }
- void setCurrentTracker(ITracker* tracker)
- {
- m_currentTracker = tracker;
- }
-};
-
-class TrackerBase : public ITracker
-{
- protected:
- enum CycleState
- {
- NotStarted,
- Executing,
- ExecutingChildren,
- NeedsAnotherRun,
- CompletedSuccessfully,
- Failed
- };
- class TrackerHasName
- {
- std::string m_name;
-
- public:
- TrackerHasName(std::string const& name) : m_name(name) {}
- bool operator()(Ptr<ITracker> const& tracker)
- {
- return tracker->name() == m_name;
- }
- };
- typedef std::vector<Ptr<ITracker>> Children;
- std::string m_name;
- TrackerContext& m_ctx;
- ITracker* m_parent;
- Children m_children;
- CycleState m_runState;
-
- public:
- TrackerBase(std::string const& name, TrackerContext& ctx, ITracker* parent)
- : m_name(name),
- m_ctx(ctx),
- m_parent(parent),
- m_runState(NotStarted)
- {
- }
- virtual ~TrackerBase();
-
- virtual std::string name() const CATCH_OVERRIDE
- {
- return m_name;
- }
- virtual bool isComplete() const CATCH_OVERRIDE
- {
- return m_runState == CompletedSuccessfully || m_runState == Failed;
- }
- virtual bool isSuccessfullyCompleted() const CATCH_OVERRIDE
- {
- return m_runState == CompletedSuccessfully;
- }
- virtual bool isOpen() const CATCH_OVERRIDE
- {
- return m_runState != NotStarted && !isComplete();
- }
- virtual bool hasChildren() const CATCH_OVERRIDE
- {
- return !m_children.empty();
- }
-
- virtual void addChild(Ptr<ITracker> const& child) CATCH_OVERRIDE
- {
- m_children.push_back(child);
- }
-
- virtual ITracker* findChild(std::string const& name) CATCH_OVERRIDE
- {
- Children::const_iterator it = std::find_if(m_children.begin(), m_children.end(), TrackerHasName(name));
- return (it != m_children.end())
- ? it->get()
- : CATCH_NULL;
- }
- virtual ITracker& parent() CATCH_OVERRIDE
- {
- assert(m_parent); // Should always be non-null except for root
- return *m_parent;
- }
-
- virtual void openChild() CATCH_OVERRIDE
- {
- if (m_runState != ExecutingChildren)
- {
- m_runState = ExecutingChildren;
- if (m_parent)
- m_parent->openChild();
- }
- }
- void open()
- {
- m_runState = Executing;
- moveToThis();
- if (m_parent)
- m_parent->openChild();
- }
-
- virtual void close() CATCH_OVERRIDE
- {
-
- // Close any still open children (e.g. generators)
- while (&m_ctx.currentTracker() != this)
- m_ctx.currentTracker().close();
-
- switch (m_runState)
- {
- case NotStarted:
- case CompletedSuccessfully:
- case Failed:
- throw std::logic_error("Illogical state");
-
- case NeedsAnotherRun:
- break;
- ;
-
- case Executing:
- m_runState = CompletedSuccessfully;
- break;
- case ExecutingChildren:
- if (m_children.empty() || m_children.back()->isComplete())
- m_runState = CompletedSuccessfully;
- break;
-
- default:
- throw std::logic_error("Unexpected state");
- }
- moveToParent();
- m_ctx.completeCycle();
- }
- virtual void fail() CATCH_OVERRIDE
- {
- m_runState = Failed;
- if (m_parent)
- m_parent->markAsNeedingAnotherRun();
- moveToParent();
- m_ctx.completeCycle();
- }
- virtual void markAsNeedingAnotherRun() CATCH_OVERRIDE
- {
- m_runState = NeedsAnotherRun;
- }
-
- private:
- void moveToParent()
- {
- assert(m_parent);
- m_ctx.setCurrentTracker(m_parent);
- }
- void moveToThis()
- {
- m_ctx.setCurrentTracker(this);
- }
-};
-
-class SectionTracker : public TrackerBase
-{
- public:
- SectionTracker(std::string const& name, TrackerContext& ctx, ITracker* parent)
- : TrackerBase(name, ctx, parent)
- {
- }
- virtual ~SectionTracker();
-
- static SectionTracker& acquire(TrackerContext& ctx, std::string const& name)
- {
- SectionTracker* section = CATCH_NULL;
-
- ITracker& currentTracker = ctx.currentTracker();
- if (ITracker* childTracker = currentTracker.findChild(name))
- {
- section = dynamic_cast<SectionTracker*>(childTracker);
- assert(section);
- }
- else
- {
- section = new SectionTracker(name, ctx, ¤tTracker);
- currentTracker.addChild(section);
- }
- if (!ctx.completedCycle() && !section->isComplete())
- {
-
- section->open();
- }
- return *section;
- }
-};
-
-class IndexTracker : public TrackerBase
-{
- int m_size;
- int m_index;
-
- public:
- IndexTracker(std::string const& name, TrackerContext& ctx, ITracker* parent, int size)
- : TrackerBase(name, ctx, parent),
- m_size(size),
- m_index(-1)
- {
- }
- virtual ~IndexTracker();
-
- static IndexTracker& acquire(TrackerContext& ctx, std::string const& name, int size)
- {
- IndexTracker* tracker = CATCH_NULL;
-
- ITracker& currentTracker = ctx.currentTracker();
- if (ITracker* childTracker = currentTracker.findChild(name))
- {
- tracker = dynamic_cast<IndexTracker*>(childTracker);
- assert(tracker);
- }
- else
- {
- tracker = new IndexTracker(name, ctx, ¤tTracker, size);
- currentTracker.addChild(tracker);
- }
-
- if (!ctx.completedCycle() && !tracker->isComplete())
- {
- if (tracker->m_runState != ExecutingChildren && tracker->m_runState != NeedsAnotherRun)
- tracker->moveNext();
- tracker->open();
- }
-
- return *tracker;
- }
-
- int index() const { return m_index; }
-
- void moveNext()
- {
- m_index++;
- m_children.clear();
- }
-
- virtual void close() CATCH_OVERRIDE
- {
- TrackerBase::close();
- if (m_runState == CompletedSuccessfully && m_index < m_size - 1)
- m_runState = Executing;
- }
-};
-
-inline ITracker& TrackerContext::startRun()
-{
- m_rootTracker = new SectionTracker("{root}", *this, CATCH_NULL);
- m_currentTracker = CATCH_NULL;
- m_runState = Executing;
- return *m_rootTracker;
-}
-
-} // namespace TestCaseTracking
-
-using TestCaseTracking::ITracker;
-using TestCaseTracking::TrackerContext;
-using TestCaseTracking::SectionTracker;
-using TestCaseTracking::IndexTracker;
-
-} // namespace Catch
-
-// #included from: catch_fatal_condition.hpp
-#define TWOBLUECUBES_CATCH_FATAL_CONDITION_H_INCLUDED
-
-namespace Catch {
-
-// Report the error condition then exit the process
-inline void fatal(std::string const& message, int exitCode)
-{
- IContext& context = Catch::getCurrentContext();
- IResultCapture* resultCapture = context.getResultCapture();
- resultCapture->handleFatalErrorCondition(message);
-
- if (Catch::alwaysTrue()) // avoids "no return" warnings
- exit(exitCode);
-}
-
-} // namespace Catch
-
-#if defined(CATCH_PLATFORM_WINDOWS) /////////////////////////////////////////
-
-namespace Catch {
-
-struct FatalConditionHandler
-{
- void reset() {}
-};
-
-} // namespace Catch
-
-#else // Not Windows - assumed to be POSIX compatible //////////////////////////
-
-#include <signal.h>
-
-namespace Catch {
-
-struct SignalDefs
-{
- int id;
- const char* name;
-};
-extern SignalDefs signalDefs[];
-SignalDefs signalDefs[] = {
- {SIGINT, "SIGINT - Terminal interrupt signal"},
- {SIGILL, "SIGILL - Illegal instruction signal"},
- {SIGFPE, "SIGFPE - Floating point error signal"},
- {SIGSEGV, "SIGSEGV - Segmentation violation signal"},
- {SIGTERM, "SIGTERM - Termination request signal"},
- {SIGABRT, "SIGABRT - Abort (abnormal termination) signal"}};
-
-struct FatalConditionHandler
-{
-
- static void handleSignal(int sig)
- {
- for (std::size_t i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i)
- if (sig == signalDefs[i].id)
- fatal(signalDefs[i].name, -sig);
- fatal("<unknown signal>", -sig);
- }
-
- FatalConditionHandler() : m_isSet(true)
- {
- for (std::size_t i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i)
- signal(signalDefs[i].id, handleSignal);
- }
- ~FatalConditionHandler()
- {
- reset();
- }
- void reset()
- {
- if (m_isSet)
- {
- for (std::size_t i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i)
- signal(signalDefs[i].id, SIG_DFL);
- m_isSet = false;
- }
- }
-
- bool m_isSet;
-};
-
-} // namespace Catch
-
-#endif // not Windows
-
-#include <set>
-#include <string>
-
-namespace Catch {
-
-class StreamRedirect
-{
-
- public:
- StreamRedirect(std::ostream& stream, std::string& targetString)
- : m_stream(stream),
- m_prevBuf(stream.rdbuf()),
- m_targetString(targetString)
- {
- stream.rdbuf(m_oss.rdbuf());
- }
-
- ~StreamRedirect()
- {
- m_targetString += m_oss.str();
- m_stream.rdbuf(m_prevBuf);
- }
-
- private:
- std::ostream& m_stream;
- std::streambuf* m_prevBuf;
- std::ostringstream m_oss;
- std::string& m_targetString;
-};
-
-///////////////////////////////////////////////////////////////////////////
-
-class RunContext : public IResultCapture, public IRunner
-{
-
- RunContext(RunContext const&);
- void operator=(RunContext const&);
-
- public:
- explicit RunContext(Ptr<IConfig const> const& _config, Ptr<IStreamingReporter> const& reporter)
- : m_runInfo(_config->name()),
- m_context(getCurrentMutableContext()),
- m_activeTestCase(CATCH_NULL),
- m_config(_config),
- m_reporter(reporter)
- {
- m_context.setRunner(this);
- m_context.setConfig(m_config);
- m_context.setResultCapture(this);
- m_reporter->testRunStarting(m_runInfo);
- }
-
- virtual ~RunContext()
- {
- m_reporter->testRunEnded(TestRunStats(m_runInfo, m_totals, aborting()));
- }
-
- void testGroupStarting(std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount)
- {
- m_reporter->testGroupStarting(GroupInfo(testSpec, groupIndex, groupsCount));
- }
- void testGroupEnded(std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount)
- {
- m_reporter->testGroupEnded(TestGroupStats(GroupInfo(testSpec, groupIndex, groupsCount), totals, aborting()));
- }
-
- Totals runTest(TestCase const& testCase)
- {
- Totals prevTotals = m_totals;
-
- std::string redirectedCout;
- std::string redirectedCerr;
-
- TestCaseInfo testInfo = testCase.getTestCaseInfo();
-
- m_reporter->testCaseStarting(testInfo);
-
- m_activeTestCase = &testCase;
-
- do
- {
- m_trackerContext.startRun();
- do
- {
- m_trackerContext.startCycle();
- m_testCaseTracker = &SectionTracker::acquire(m_trackerContext, testInfo.name);
- runCurrentTest(redirectedCout, redirectedCerr);
- } while (!m_testCaseTracker->isSuccessfullyCompleted() && !aborting());
- }
- // !TBD: deprecated - this will be replaced by indexed trackers
- while (getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting());
-
- Totals deltaTotals = m_totals.delta(prevTotals);
- m_totals.testCases += deltaTotals.testCases;
- m_reporter->testCaseEnded(TestCaseStats(testInfo,
- deltaTotals,
- redirectedCout,
- redirectedCerr,
- aborting()));
-
- m_activeTestCase = CATCH_NULL;
- m_testCaseTracker = CATCH_NULL;
-
- return deltaTotals;
- }
-
- Ptr<IConfig const> config() const
- {
- return m_config;
- }
-
- private: // IResultCapture
- virtual void assertionEnded(AssertionResult const& result)
- {
- if (result.getResultType() == ResultWas::Ok)
- {
- m_totals.assertions.passed++;
- }
- else if (!result.isOk())
- {
- m_totals.assertions.failed++;
- }
-
- if (m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals)))
- m_messages.clear();
-
- // Reset working state
- m_lastAssertionInfo = AssertionInfo("", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}", m_lastAssertionInfo.resultDisposition);
- m_lastResult = result;
- }
-
- virtual bool sectionStarted(
- SectionInfo const& sectionInfo,
- Counts& assertions)
- {
- std::ostringstream oss;
- oss << sectionInfo.name << "@" << sectionInfo.lineInfo;
-
- ITracker& sectionTracker = SectionTracker::acquire(m_trackerContext, oss.str());
- if (!sectionTracker.isOpen())
- return false;
- m_activeSections.push_back(§ionTracker);
-
- m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo;
-
- m_reporter->sectionStarting(sectionInfo);
-
- assertions = m_totals.assertions;
-
- return true;
- }
- bool testForMissingAssertions(Counts& assertions)
- {
- if (assertions.total() != 0)
- return false;
- if (!m_config->warnAboutMissingAssertions())
- return false;
- if (m_trackerContext.currentTracker().hasChildren())
- return false;
- m_totals.assertions.failed++;
- assertions.failed++;
- return true;
- }
-
- virtual void sectionEnded(SectionEndInfo const& endInfo)
- {
- Counts assertions = m_totals.assertions - endInfo.prevAssertions;
- bool missingAssertions = testForMissingAssertions(assertions);
-
- if (!m_activeSections.empty())
- {
- m_activeSections.back()->close();
- m_activeSections.pop_back();
- }
-
- m_reporter->sectionEnded(SectionStats(endInfo.sectionInfo, assertions, endInfo.durationInSeconds, missingAssertions));
- m_messages.clear();
- }
-
- virtual void sectionEndedEarly(SectionEndInfo const& endInfo)
- {
- if (m_unfinishedSections.empty())
- m_activeSections.back()->fail();
- else
- m_activeSections.back()->close();
- m_activeSections.pop_back();
-
- m_unfinishedSections.push_back(endInfo);
- }
-
- virtual void pushScopedMessage(MessageInfo const& message)
- {
- m_messages.push_back(message);
- }
-
- virtual void popScopedMessage(MessageInfo const& message)
- {
- m_messages.erase(std::remove(m_messages.begin(), m_messages.end(), message), m_messages.end());
- }
-
- virtual std::string getCurrentTestName() const
- {
- return m_activeTestCase
- ? m_activeTestCase->getTestCaseInfo().name
- : "";
- }
-
- virtual const AssertionResult* getLastResult() const
- {
- return &m_lastResult;
- }
-
- virtual void handleFatalErrorCondition(std::string const& message)
- {
- ResultBuilder resultBuilder = makeUnexpectedResultBuilder();
- resultBuilder.setResultType(ResultWas::FatalErrorCondition);
- resultBuilder << message;
- resultBuilder.captureExpression();
-
- handleUnfinishedSections();
-
- // Recreate section for test case (as we will lose the one that was in scope)
- TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo();
- SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description);
-
- Counts assertions;
- assertions.failed = 1;
- SectionStats testCaseSectionStats(testCaseSection, assertions, 0, false);
- m_reporter->sectionEnded(testCaseSectionStats);
-
- TestCaseInfo testInfo = m_activeTestCase->getTestCaseInfo();
-
- Totals deltaTotals;
- deltaTotals.testCases.failed = 1;
- m_reporter->testCaseEnded(TestCaseStats(testInfo,
- deltaTotals,
- "",
- "",
- false));
- m_totals.testCases.failed++;
- testGroupEnded("", m_totals, 1, 1);
- m_reporter->testRunEnded(TestRunStats(m_runInfo, m_totals, false));
- }
-
- public:
- // !TBD We need to do this another way!
- bool aborting() const
- {
- return m_totals.assertions.failed == static_cast<std::size_t>(m_config->abortAfter());
- }
-
- private:
- void runCurrentTest(std::string& redirectedCout, std::string& redirectedCerr)
- {
- TestCaseInfo const& testCaseInfo = m_activeTestCase->getTestCaseInfo();
- SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description);
- m_reporter->sectionStarting(testCaseSection);
- Counts prevAssertions = m_totals.assertions;
- double duration = 0;
- try
- {
- m_lastAssertionInfo = AssertionInfo("TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal);
-
- seedRng(*m_config);
-
- Timer timer;
- timer.start();
- if (m_reporter->getPreferences().shouldRedirectStdOut)
- {
- StreamRedirect coutRedir(Catch::cout(), redirectedCout);
- StreamRedirect cerrRedir(Catch::cerr(), redirectedCerr);
- invokeActiveTestCase();
- }
- else
- {
- invokeActiveTestCase();
- }
- duration = timer.getElapsedSeconds();
- }
- catch (TestFailureException&)
- {
- // This just means the test was aborted due to failure
- }
- catch (...)
- {
- makeUnexpectedResultBuilder().useActiveException();
- }
- m_testCaseTracker->close();
- handleUnfinishedSections();
- m_messages.clear();
-
- Counts assertions = m_totals.assertions - prevAssertions;
- bool missingAssertions = testForMissingAssertions(assertions);
-
- if (testCaseInfo.okToFail())
- {
- std::swap(assertions.failedButOk, assertions.failed);
- m_totals.assertions.failed -= assertions.failedButOk;
- m_totals.assertions.failedButOk += assertions.failedButOk;
- }
-
- SectionStats testCaseSectionStats(testCaseSection, assertions, duration, missingAssertions);
- m_reporter->sectionEnded(testCaseSectionStats);
- }
-
- void invokeActiveTestCase()
- {
- FatalConditionHandler fatalConditionHandler; // Handle signals
- m_activeTestCase->invoke();
- fatalConditionHandler.reset();
- }
-
- private:
- ResultBuilder makeUnexpectedResultBuilder() const
- {
- return ResultBuilder(m_lastAssertionInfo.macroName.c_str(),
- m_lastAssertionInfo.lineInfo,
- m_lastAssertionInfo.capturedExpression.c_str(),
- m_lastAssertionInfo.resultDisposition);
- }
-
- void handleUnfinishedSections()
- {
- // If sections ended prematurely due to an exception we stored their
- // infos here so we can tear them down outside the unwind process.
- for (std::vector<SectionEndInfo>::const_reverse_iterator it = m_unfinishedSections.rbegin(),
- itEnd = m_unfinishedSections.rend();
- it != itEnd;
- ++it)
- sectionEnded(*it);
- m_unfinishedSections.clear();
- }
-
- TestRunInfo m_runInfo;
- IMutableContext& m_context;
- TestCase const* m_activeTestCase;
- ITracker* m_testCaseTracker;
- ITracker* m_currentSectionTracker;
- AssertionResult m_lastResult;
-
- Ptr<IConfig const> m_config;
- Totals m_totals;
- Ptr<IStreamingReporter> m_reporter;
- std::vector<MessageInfo> m_messages;
- AssertionInfo m_lastAssertionInfo;
- std::vector<SectionEndInfo> m_unfinishedSections;
- std::vector<ITracker*> m_activeSections;
- TrackerContext m_trackerContext;
-};
-
-IResultCapture& getResultCapture()
-{
- if (IResultCapture* capture = getCurrentContext().getResultCapture())
- return *capture;
- else
- throw std::logic_error("No result capture instance");
-}
-
-} // end namespace Catch
-
-// #included from: internal/catch_version.h
-#define TWOBLUECUBES_CATCH_VERSION_H_INCLUDED
-
-namespace Catch {
-
-// Versioning information
-struct Version
-{
- Version(unsigned int _majorVersion,
- unsigned int _minorVersion,
- unsigned int _patchNumber,
- std::string const& _branchName,
- unsigned int _buildNumber);
-
- unsigned int const majorVersion;
- unsigned int const minorVersion;
- unsigned int const patchNumber;
-
- // buildNumber is only used if branchName is not null
- std::string const branchName;
- unsigned int const buildNumber;
-
- friend std::ostream& operator<<(std::ostream& os, Version const& version);
-
- private:
- void operator=(Version const&);
-};
-
-extern Version libraryVersion;
-}
-
-#include <fstream>
-#include <limits>
-#include <stdlib.h>
-
-namespace Catch {
-
-Ptr<IStreamingReporter> createReporter(std::string const& reporterName, Ptr<Config> const& config)
-{
- Ptr<IStreamingReporter> reporter = getRegistryHub().getReporterRegistry().create(reporterName, config.get());
- if (!reporter)
- {
- std::ostringstream oss;
- oss << "No reporter registered with name: '" << reporterName << "'";
- throw std::domain_error(oss.str());
- }
- return reporter;
-}
-
-Ptr<IStreamingReporter> makeReporter(Ptr<Config> const& config)
-{
- std::vector<std::string> reporters = config->getReporterNames();
- if (reporters.empty())
- reporters.push_back("console");
-
- Ptr<IStreamingReporter> reporter;
- for (std::vector<std::string>::const_iterator it = reporters.begin(), itEnd = reporters.end();
- it != itEnd;
- ++it)
- reporter = addReporter(reporter, createReporter(*it, config));
- return reporter;
-}
-Ptr<IStreamingReporter> addListeners(Ptr<IConfig const> const& config, Ptr<IStreamingReporter> reporters)
-{
- IReporterRegistry::Listeners listeners = getRegistryHub().getReporterRegistry().getListeners();
- for (IReporterRegistry::Listeners::const_iterator it = listeners.begin(), itEnd = listeners.end();
- it != itEnd;
- ++it)
- reporters = addReporter(reporters, (*it)->create(ReporterConfig(config)));
- return reporters;
-}
-
-Totals runTests(Ptr<Config> const& config)
-{
-
- Ptr<IConfig const> iconfig = config.get();
-
- Ptr<IStreamingReporter> reporter = makeReporter(config);
- reporter = addListeners(iconfig, reporter);
-
- RunContext context(iconfig, reporter);
-
- Totals totals;
-
- context.testGroupStarting(config->name(), 1, 1);
-
- TestSpec testSpec = config->testSpec();
- if (!testSpec.hasFilters())
- testSpec = TestSpecParser(ITagAliasRegistry::get()).parse("~[.]").testSpec(); // All not hidden tests
-
- std::vector<TestCase> const& allTestCases = getAllTestCasesSorted(*iconfig);
- for (std::vector<TestCase>::const_iterator it = allTestCases.begin(), itEnd = allTestCases.end();
- it != itEnd;
- ++it)
- {
- if (!context.aborting() && matchTest(*it, testSpec, *iconfig))
- totals += context.runTest(*it);
- else
- reporter->skipTest(*it);
- }
-
- context.testGroupEnded(iconfig->name(), totals, 1, 1);
- return totals;
-}
-
-void applyFilenamesAsTags(IConfig const& config)
-{
- std::vector<TestCase> const& tests = getAllTestCasesSorted(config);
- for (std::size_t i = 0; i < tests.size(); ++i)
- {
- TestCase& test = const_cast<TestCase&>(tests[i]);
- std::set<std::string> tags = test.tags;
-
- std::string filename = test.lineInfo.file;
- std::string::size_type lastSlash = filename.find_last_of("\\/");
- if (lastSlash != std::string::npos)
- filename = filename.substr(lastSlash + 1);
-
- std::string::size_type lastDot = filename.find_last_of(".");
- if (lastDot != std::string::npos)
- filename = filename.substr(0, lastDot);
-
- tags.insert("#" + filename);
- setTags(test, tags);
- }
-}
-
-class Session : NonCopyable
-{
- static bool alreadyInstantiated;
-
- public:
- struct OnUnusedOptions
- {
- enum DoWhat
- {
- Ignore,
- Fail
- };
- };
-
- Session()
- : m_cli(makeCommandLineParser())
- {
- if (alreadyInstantiated)
- {
- std::string msg = "Only one instance of Catch::Session can ever be used";
- Catch::cerr() << msg << std::endl;
- throw std::logic_error(msg);
- }
- alreadyInstantiated = true;
- }
- ~Session()
- {
- Catch::cleanUp();
- }
-
- void showHelp(std::string const& processName)
- {
- Catch::cout() << "\nCatch v" << libraryVersion << "\n";
-
- m_cli.usage(Catch::cout(), processName);
- Catch::cout() << "For more detail usage please see the project docs\n"
- << std::endl;
- }
-
- int applyCommandLine(int argc, char const* const argv[], OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail)
- {
- try
- {
- m_cli.setThrowOnUnrecognisedTokens(unusedOptionBehaviour == OnUnusedOptions::Fail);
- m_unusedTokens = m_cli.parseInto(argc, argv, m_configData);
- if (m_configData.showHelp)
- showHelp(m_configData.processName);
- m_config.reset();
- }
- catch (std::exception& ex)
- {
- {
- Colour colourGuard(Colour::Red);
- Catch::cerr()
- << "\nError(s) in input:\n"
- << Text(ex.what(), TextAttributes().setIndent(2))
- << "\n\n";
- }
- m_cli.usage(Catch::cout(), m_configData.processName);
- return (std::numeric_limits<int>::max)();
- }
- return 0;
- }
-
- void useConfigData(ConfigData const& _configData)
- {
- m_configData = _configData;
- m_config.reset();
- }
-
- int run(int argc, char const* const argv[])
- {
-
- int returnCode = applyCommandLine(argc, argv);
- if (returnCode == 0)
- returnCode = run();
- return returnCode;
- }
-
- int run()
- {
- if (m_configData.showHelp)
- return 0;
-
- try
- {
- config(); // Force config to be constructed
-
- seedRng(*m_config);
-
- if (m_configData.filenamesAsTags)
- applyFilenamesAsTags(*m_config);
-
- // Handle list request
- if (Option<std::size_t> listed = list(config()))
- return static_cast<int>(*listed);
-
- return static_cast<int>(runTests(m_config).assertions.failed);
- }
- catch (std::exception& ex)
- {
- Catch::cerr() << ex.what() << std::endl;
- return (std::numeric_limits<int>::max)();
- }
- }
-
- Clara::CommandLine<ConfigData> const& cli() const
- {
- return m_cli;
- }
- std::vector<Clara::Parser::Token> const& unusedTokens() const
- {
- return m_unusedTokens;
- }
- ConfigData& configData()
- {
- return m_configData;
- }
- Config& config()
- {
- if (!m_config)
- m_config = new Config(m_configData);
- return *m_config;
- }
-
- private:
- Clara::CommandLine<ConfigData> m_cli;
- std::vector<Clara::Parser::Token> m_unusedTokens;
- ConfigData m_configData;
- Ptr<Config> m_config;
-};
-
-bool Session::alreadyInstantiated = false;
-
-} // end namespace Catch
-
-// #included from: catch_registry_hub.hpp
-#define TWOBLUECUBES_CATCH_REGISTRY_HUB_HPP_INCLUDED
-
-// #included from: catch_test_case_registry_impl.hpp
-#define TWOBLUECUBES_CATCH_TEST_CASE_REGISTRY_IMPL_HPP_INCLUDED
-
-#include <algorithm>
-#include <iostream>
-#include <set>
-#include <sstream>
-#include <vector>
-
-namespace Catch {
-
-struct LexSort
-{
- bool operator()(TestCase i, TestCase j) const { return (i < j); }
-};
-struct RandomNumberGenerator
-{
- int operator()(int n) const { return std::rand() % n; }
-};
-
-inline std::vector<TestCase> sortTests(IConfig const& config, std::vector<TestCase> const& unsortedTestCases)
-{
-
- std::vector<TestCase> sorted = unsortedTestCases;
-
- switch (config.runOrder())
- {
- case RunTests::InLexicographicalOrder:
- std::sort(sorted.begin(), sorted.end(), LexSort());
- break;
- case RunTests::InRandomOrder:
- {
- seedRng(config);
-
- RandomNumberGenerator rng;
- std::random_shuffle(sorted.begin(), sorted.end(), rng);
- }
- break;
- case RunTests::InDeclarationOrder:
- // already in declaration order
- break;
- }
- return sorted;
-}
-bool matchTest(TestCase const& testCase, TestSpec const& testSpec, IConfig const& config)
-{
- return testSpec.matches(testCase) && (config.allowThrows() || !testCase.throws());
-}
-
-void enforceNoDuplicateTestCases(std::vector<TestCase> const& functions)
-{
- std::set<TestCase> seenFunctions;
- for (std::vector<TestCase>::const_iterator it = functions.begin(), itEnd = functions.end();
- it != itEnd;
- ++it)
- {
- std::pair<std::set<TestCase>::const_iterator, bool> prev = seenFunctions.insert(*it);
- if (!prev.second)
- {
- Catch::cerr()
- << Colour(Colour::Red)
- << "error: TEST_CASE( \"" << it->name << "\" ) already defined.\n"
- << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << "\n"
- << "\tRedefined at " << it->getTestCaseInfo().lineInfo << std::endl;
- exit(1);
- }
- }
-}
-
-std::vector<TestCase> filterTests(std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config)
-{
- std::vector<TestCase> filtered;
- filtered.reserve(testCases.size());
- for (std::vector<TestCase>::const_iterator it = testCases.begin(), itEnd = testCases.end();
- it != itEnd;
- ++it)
- if (matchTest(*it, testSpec, config))
- filtered.push_back(*it);
- return filtered;
-}
-std::vector<TestCase> const& getAllTestCasesSorted(IConfig const& config)
-{
- return getRegistryHub().getTestCaseRegistry().getAllTestsSorted(config);
-}
-
-class TestRegistry : public ITestCaseRegistry
-{
- public:
- TestRegistry()
- : m_currentSortOrder(RunTests::InDeclarationOrder),
- m_unnamedCount(0)
- {
- }
- virtual ~TestRegistry();
-
- virtual void registerTest(TestCase const& testCase)
- {
- std::string name = testCase.getTestCaseInfo().name;
- if (name == "")
- {
- std::ostringstream oss;
- oss << "Anonymous test case " << ++m_unnamedCount;
- return registerTest(testCase.withName(oss.str()));
- }
- m_functions.push_back(testCase);
- }
-
- virtual std::vector<TestCase> const& getAllTests() const
- {
- return m_functions;
- }
- virtual std::vector<TestCase> const& getAllTestsSorted(IConfig const& config) const
- {
- if (m_sortedFunctions.empty())
- enforceNoDuplicateTestCases(m_functions);
-
- if (m_currentSortOrder != config.runOrder() || m_sortedFunctions.empty())
- {
- m_sortedFunctions = sortTests(config, m_functions);
- m_currentSortOrder = config.runOrder();
- }
- return m_sortedFunctions;
- }
-
- private:
- std::vector<TestCase> m_functions;
- mutable RunTests::InWhatOrder m_currentSortOrder;
- mutable std::vector<TestCase> m_sortedFunctions;
- size_t m_unnamedCount;
- std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised
-};
-
-///////////////////////////////////////////////////////////////////////////
-
-class FreeFunctionTestCase : public SharedImpl<ITestCase>
-{
- public:
- FreeFunctionTestCase(TestFunction fun) : m_fun(fun) {}
-
- virtual void invoke() const
- {
- m_fun();
- }
-
- private:
- virtual ~FreeFunctionTestCase();
-
- TestFunction m_fun;
-};
-
-inline std::string extractClassName(std::string const& classOrQualifiedMethodName)
-{
- std::string className = classOrQualifiedMethodName;
- if (startsWith(className, "&"))
- {
- std::size_t lastColons = className.rfind("::");
- std::size_t penultimateColons = className.rfind("::", lastColons - 1);
- if (penultimateColons == std::string::npos)
- penultimateColons = 1;
- className = className.substr(penultimateColons, lastColons - penultimateColons);
- }
- return className;
-}
-
-void registerTestCase(ITestCase* testCase,
- char const* classOrQualifiedMethodName,
- NameAndDesc const& nameAndDesc,
- SourceLineInfo const& lineInfo)
-{
-
- getMutableRegistryHub().registerTest(makeTestCase(testCase,
- extractClassName(classOrQualifiedMethodName),
- nameAndDesc.name,
- nameAndDesc.description,
- lineInfo));
-}
-void registerTestCaseFunction(TestFunction function,
- SourceLineInfo const& lineInfo,
- NameAndDesc const& nameAndDesc)
-{
- registerTestCase(new FreeFunctionTestCase(function), "", nameAndDesc, lineInfo);
-}
-
-///////////////////////////////////////////////////////////////////////////
-
-AutoReg::AutoReg(TestFunction function,
- SourceLineInfo const& lineInfo,
- NameAndDesc const& nameAndDesc)
-{
- registerTestCaseFunction(function, lineInfo, nameAndDesc);
-}
-
-AutoReg::~AutoReg() {}
-
-} // end namespace Catch
-
-// #included from: catch_reporter_registry.hpp
-#define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED
-
-#include <map>
-
-namespace Catch {
-
-class ReporterRegistry : public IReporterRegistry
-{
-
- public:
- virtual ~ReporterRegistry() CATCH_OVERRIDE {}
-
- virtual IStreamingReporter* create(std::string const& name, Ptr<IConfig const> const& config) const CATCH_OVERRIDE
- {
- FactoryMap::const_iterator it = m_factories.find(name);
- if (it == m_factories.end())
- return CATCH_NULL;
- return it->second->create(ReporterConfig(config));
- }
-
- void registerReporter(std::string const& name, Ptr<IReporterFactory> const& factory)
- {
- m_factories.insert(std::make_pair(name, factory));
- }
- void registerListener(Ptr<IReporterFactory> const& factory)
- {
- m_listeners.push_back(factory);
- }
-
- virtual FactoryMap const& getFactories() const CATCH_OVERRIDE
- {
- return m_factories;
- }
- virtual Listeners const& getListeners() const CATCH_OVERRIDE
- {
- return m_listeners;
- }
-
- private:
- FactoryMap m_factories;
- Listeners m_listeners;
-};
-}
-
-// #included from: catch_exception_translator_registry.hpp
-#define TWOBLUECUBES_CATCH_EXCEPTION_TRANSLATOR_REGISTRY_HPP_INCLUDED
-
-#ifdef __OBJC__
-#import "Foundation/Foundation.h"
-#endif
-
-namespace Catch {
-
-class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry
-{
- public:
- ~ExceptionTranslatorRegistry()
- {
- deleteAll(m_translators);
- }
-
- virtual void registerTranslator(const IExceptionTranslator* translator)
- {
- m_translators.push_back(translator);
- }
-
- virtual std::string translateActiveException() const
- {
- try
- {
-#ifdef __OBJC__
- // In Objective-C try objective-c exceptions first
- @try
- {
- return tryTranslators();
- }
- @catch (NSException* exception)
- {
- return Catch::toString([exception description]);
- }
-#else
- return tryTranslators();
-#endif
- }
- catch (TestFailureException&)
- {
- throw;
- }
- catch (std::exception& ex)
- {
- return ex.what();
- }
- catch (std::string& msg)
- {
- return msg;
- }
- catch (const char* msg)
- {
- return msg;
- }
- catch (...)
- {
- return "Unknown exception";
- }
- }
-
- std::string tryTranslators() const
- {
- if (m_translators.empty())
- throw;
- else
- return m_translators[0]->translate(m_translators.begin() + 1, m_translators.end());
- }
-
- private:
- std::vector<const IExceptionTranslator*> m_translators;
-};
-}
-
-namespace Catch {
-
-namespace {
-
-class RegistryHub : public IRegistryHub, public IMutableRegistryHub
-{
-
- RegistryHub(RegistryHub const&);
- void operator=(RegistryHub const&);
-
- public: // IRegistryHub
- RegistryHub()
- {
- }
- virtual IReporterRegistry const& getReporterRegistry() const CATCH_OVERRIDE
- {
- return m_reporterRegistry;
- }
- virtual ITestCaseRegistry const& getTestCaseRegistry() const CATCH_OVERRIDE
- {
- return m_testCaseRegistry;
- }
- virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() CATCH_OVERRIDE
- {
- return m_exceptionTranslatorRegistry;
- }
-
- public: // IMutableRegistryHub
- virtual void registerReporter(std::string const& name, Ptr<IReporterFactory> const& factory) CATCH_OVERRIDE
- {
- m_reporterRegistry.registerReporter(name, factory);
- }
- virtual void registerListener(Ptr<IReporterFactory> const& factory) CATCH_OVERRIDE
- {
- m_reporterRegistry.registerListener(factory);
- }
- virtual void registerTest(TestCase const& testInfo) CATCH_OVERRIDE
- {
- m_testCaseRegistry.registerTest(testInfo);
- }
- virtual void registerTranslator(const IExceptionTranslator* translator) CATCH_OVERRIDE
- {
- m_exceptionTranslatorRegistry.registerTranslator(translator);
- }
-
- private:
- TestRegistry m_testCaseRegistry;
- ReporterRegistry m_reporterRegistry;
- ExceptionTranslatorRegistry m_exceptionTranslatorRegistry;
-};
-
-// Single, global, instance
-inline RegistryHub*& getTheRegistryHub()
-{
- static RegistryHub* theRegistryHub = CATCH_NULL;
- if (!theRegistryHub)
- theRegistryHub = new RegistryHub();
- return theRegistryHub;
-}
-}
-
-IRegistryHub& getRegistryHub()
-{
- return *getTheRegistryHub();
-}
-IMutableRegistryHub& getMutableRegistryHub()
-{
- return *getTheRegistryHub();
-}
-void cleanUp()
-{
- delete getTheRegistryHub();
- getTheRegistryHub() = CATCH_NULL;
- cleanUpContext();
-}
-std::string translateActiveException()
-{
- return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException();
-}
-
-} // end namespace Catch
-
-// #included from: catch_notimplemented_exception.hpp
-#define TWOBLUECUBES_CATCH_NOTIMPLEMENTED_EXCEPTION_HPP_INCLUDED
-
-#include <ostream>
-
-namespace Catch {
-
-NotImplementedException::NotImplementedException(SourceLineInfo const& lineInfo)
- : m_lineInfo(lineInfo)
-{
- std::ostringstream oss;
- oss << lineInfo << ": function ";
- oss << "not implemented";
- m_what = oss.str();
-}
-
-const char* NotImplementedException::what() const CATCH_NOEXCEPT
-{
- return m_what.c_str();
-}
-
-} // end namespace Catch
-
-// #included from: catch_context_impl.hpp
-#define TWOBLUECUBES_CATCH_CONTEXT_IMPL_HPP_INCLUDED
-
-// #included from: catch_stream.hpp
-#define TWOBLUECUBES_CATCH_STREAM_HPP_INCLUDED
-
-#include <cstdio>
-#include <iostream>
-#include <stdexcept>
-
-namespace Catch {
-
-template <typename WriterF, size_t bufferSize = 256>
-class StreamBufImpl : public StreamBufBase
-{
- char data[bufferSize];
- WriterF m_writer;
-
- public:
- StreamBufImpl()
- {
- setp(data, data + sizeof(data));
- }
-
- ~StreamBufImpl() CATCH_NOEXCEPT
- {
- sync();
- }
-
- private:
- int overflow(int c)
- {
- sync();
-
- if (c != EOF)
- {
- if (pbase() == epptr())
- m_writer(std::string(1, static_cast<char>(c)));
- else
- sputc(static_cast<char>(c));
- }
- return 0;
- }
-
- int sync()
- {
- if (pbase() != pptr())
- {
- m_writer(std::string(pbase(), static_cast<std::string::size_type>(pptr() - pbase())));
- setp(pbase(), epptr());
- }
- return 0;
- }
-};
-
-///////////////////////////////////////////////////////////////////////////
-
-FileStream::FileStream(std::string const& filename)
-{
- m_ofs.open(filename.c_str());
- if (m_ofs.fail())
- {
- std::ostringstream oss;
- oss << "Unable to open file: '" << filename << "'";
- throw std::domain_error(oss.str());
- }
-}
-
-std::ostream& FileStream::stream() const
-{
- return m_ofs;
-}
-
-struct OutputDebugWriter
-{
-
- void operator()(std::string const& str)
- {
- writeToDebugConsole(str);
- }
-};
-
-DebugOutStream::DebugOutStream()
- : m_streamBuf(new StreamBufImpl<OutputDebugWriter>()),
- m_os(m_streamBuf.get())
-{
-}
-
-std::ostream& DebugOutStream::stream() const
-{
- return m_os;
-}
-
-// Store the streambuf from cout up-front because
-// cout may get redirected when running tests
-CoutStream::CoutStream()
- : m_os(Catch::cout().rdbuf())
-{
-}
-
-std::ostream& CoutStream::stream() const
-{
- return m_os;
-}
-
-#ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions
-std::ostream& cout()
-{
- return std::cout;
-}
-std::ostream& cerr()
-{
- return std::cerr;
-}
-#endif
-}
-
-namespace Catch {
-
-class Context : public IMutableContext
-{
-
- Context() : m_config(CATCH_NULL), m_runner(CATCH_NULL), m_resultCapture(CATCH_NULL) {}
- Context(Context const&);
- void operator=(Context const&);
-
- public: // IContext
- virtual IResultCapture* getResultCapture()
- {
- return m_resultCapture;
- }
- virtual IRunner* getRunner()
- {
- return m_runner;
- }
- virtual size_t getGeneratorIndex(std::string const& fileInfo, size_t totalSize)
- {
- return getGeneratorsForCurrentTest()
- .getGeneratorInfo(fileInfo, totalSize)
- .getCurrentIndex();
- }
- virtual bool advanceGeneratorsForCurrentTest()
- {
- IGeneratorsForTest* generators = findGeneratorsForCurrentTest();
- return generators && generators->moveNext();
- }
-
- virtual Ptr<IConfig const> getConfig() const
- {
- return m_config;
- }
-
- public: // IMutableContext
- virtual void setResultCapture(IResultCapture* resultCapture)
- {
- m_resultCapture = resultCapture;
- }
- virtual void setRunner(IRunner* runner)
- {
- m_runner = runner;
- }
- virtual void setConfig(Ptr<IConfig const> const& config)
- {
- m_config = config;
- }
-
- friend IMutableContext& getCurrentMutableContext();
-
- private:
- IGeneratorsForTest* findGeneratorsForCurrentTest()
- {
- std::string testName = getResultCapture()->getCurrentTestName();
-
- std::map<std::string, IGeneratorsForTest*>::const_iterator it =
- m_generatorsByTestName.find(testName);
- return it != m_generatorsByTestName.end()
- ? it->second
- : CATCH_NULL;
- }
-
- IGeneratorsForTest& getGeneratorsForCurrentTest()
- {
- IGeneratorsForTest* generators = findGeneratorsForCurrentTest();
- if (!generators)
- {
- std::string testName = getResultCapture()->getCurrentTestName();
- generators = createGeneratorsForTest();
- m_generatorsByTestName.insert(std::make_pair(testName, generators));
- }
- return *generators;
- }
-
- private:
- Ptr<IConfig const> m_config;
- IRunner* m_runner;
- IResultCapture* m_resultCapture;
- std::map<std::string, IGeneratorsForTest*> m_generatorsByTestName;
-};
-
-namespace {
-Context* currentContext = CATCH_NULL;
-}
-IMutableContext& getCurrentMutableContext()
-{
- if (!currentContext)
- currentContext = new Context();
- return *currentContext;
-}
-IContext& getCurrentContext()
-{
- return getCurrentMutableContext();
-}
-
-void cleanUpContext()
-{
- delete currentContext;
- currentContext = CATCH_NULL;
-}
-}
-
-// #included from: catch_console_colour_impl.hpp
-#define TWOBLUECUBES_CATCH_CONSOLE_COLOUR_IMPL_HPP_INCLUDED
-
-namespace Catch {
-namespace {
-
-struct IColourImpl
-{
- virtual ~IColourImpl() {}
- virtual void use(Colour::Code _colourCode) = 0;
-};
-
-struct NoColourImpl : IColourImpl
-{
- void use(Colour::Code) {}
-
- static IColourImpl* instance()
- {
- static NoColourImpl s_instance;
- return &s_instance;
- }
-};
-
-} // anon namespace
-} // namespace Catch
-
-#if !defined(CATCH_CONFIG_COLOUR_NONE) && !defined(CATCH_CONFIG_COLOUR_WINDOWS) && !defined(CATCH_CONFIG_COLOUR_ANSI)
-#ifdef CATCH_PLATFORM_WINDOWS
-#define CATCH_CONFIG_COLOUR_WINDOWS
-#else
-#define CATCH_CONFIG_COLOUR_ANSI
-#endif
-#endif
-
-#if defined(CATCH_CONFIG_COLOUR_WINDOWS) /////////////////////////////////////////
-
-#ifndef NOMINMAX
-#define NOMINMAX
-#endif
-
-#ifdef __AFXDLL
-#include <AfxWin.h>
-#else
-#include <windows.h>
-#endif
-
-namespace Catch {
-namespace {
-
-class Win32ColourImpl : public IColourImpl
-{
- public:
- Win32ColourImpl() : stdoutHandle(GetStdHandle(STD_OUTPUT_HANDLE))
- {
- CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
- GetConsoleScreenBufferInfo(stdoutHandle, &csbiInfo);
- originalForegroundAttributes = csbiInfo.wAttributes & ~(BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY);
- originalBackgroundAttributes = csbiInfo.wAttributes & ~(FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
- }
-
- virtual void use(Colour::Code _colourCode)
- {
- switch (_colourCode)
- {
- case Colour::None:
- return setTextAttribute(originalForegroundAttributes);
- case Colour::White:
- return setTextAttribute(FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
- case Colour::Red:
- return setTextAttribute(FOREGROUND_RED);
- case Colour::Green:
- return setTextAttribute(FOREGROUND_GREEN);
- case Colour::Blue:
- return setTextAttribute(FOREGROUND_BLUE);
- case Colour::Cyan:
- return setTextAttribute(FOREGROUND_BLUE | FOREGROUND_GREEN);
- case Colour::Yellow:
- return setTextAttribute(FOREGROUND_RED | FOREGROUND_GREEN);
- case Colour::Grey:
- return setTextAttribute(0);
-
- case Colour::LightGrey:
- return setTextAttribute(FOREGROUND_INTENSITY);
- case Colour::BrightRed:
- return setTextAttribute(FOREGROUND_INTENSITY | FOREGROUND_RED);
- case Colour::BrightGreen:
- return setTextAttribute(FOREGROUND_INTENSITY | FOREGROUND_GREEN);
- case Colour::BrightWhite:
- return setTextAttribute(FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
-
- case Colour::Bright:
- throw std::logic_error("not a colour");
- }
- }
-
- private:
- void setTextAttribute(WORD _textAttribute)
- {
- SetConsoleTextAttribute(stdoutHandle, _textAttribute | originalBackgroundAttributes);
- }
- HANDLE stdoutHandle;
- WORD originalForegroundAttributes;
- WORD originalBackgroundAttributes;
-};
-
-IColourImpl* platformColourInstance()
-{
- static Win32ColourImpl s_instance;
- return &s_instance;
-}
-
-} // end anon namespace
-} // end namespace Catch
-
-#elif defined(CATCH_CONFIG_COLOUR_ANSI) //////////////////////////////////////
-
-#include <unistd.h>
-
-namespace Catch {
-namespace {
-
-// use POSIX/ ANSI console terminal codes
-// Thanks to Adam Strzelecki for original contribution
-// (http://github.com/nanoant)
-// https://github.com/philsquared/Catch/pull/131
-class PosixColourImpl : public IColourImpl
-{
- public:
- virtual void use(Colour::Code _colourCode)
- {
- switch (_colourCode)
- {
- case Colour::None:
- case Colour::White:
- return setColour("[0m");
- case Colour::Red:
- return setColour("[0;31m");
- case Colour::Green:
- return setColour("[0;32m");
- case Colour::Blue:
- return setColour("[0:34m");
- case Colour::Cyan:
- return setColour("[0;36m");
- case Colour::Yellow:
- return setColour("[0;33m");
- case Colour::Grey:
- return setColour("[1;30m");
-
- case Colour::LightGrey:
- return setColour("[0;37m");
- case Colour::BrightRed:
- return setColour("[1;31m");
- case Colour::BrightGreen:
- return setColour("[1;32m");
- case Colour::BrightWhite:
- return setColour("[1;37m");
-
- case Colour::Bright:
- throw std::logic_error("not a colour");
- }
- }
- static IColourImpl* instance()
- {
- static PosixColourImpl s_instance;
- return &s_instance;
- }
-
- private:
- void setColour(const char* _escapeCode)
- {
- Catch::cout() << '\033' << _escapeCode;
- }
-};
-
-IColourImpl* platformColourInstance()
-{
- Ptr<IConfig const> config = getCurrentContext().getConfig();
- return (config && config->forceColour()) || isatty(STDOUT_FILENO)
- ? PosixColourImpl::instance()
- : NoColourImpl::instance();
-}
-
-} // end anon namespace
-} // end namespace Catch
-
-#else // not Windows or ANSI ///////////////////////////////////////////////
-
-namespace Catch {
-
-static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); }
-
-} // end namespace Catch
-
-#endif // Windows/ ANSI/ None
-
-namespace Catch {
-
-Colour::Colour(Code _colourCode) : m_moved(false) { use(_colourCode); }
-Colour::Colour(Colour const& _other) : m_moved(false) { const_cast<Colour&>(_other).m_moved = true; }
-Colour::~Colour()
-{
- if (!m_moved) use(None);
-}
-
-void Colour::use(Code _colourCode)
-{
- static IColourImpl* impl = isDebuggerActive()
- ? NoColourImpl::instance()
- : platformColourInstance();
- impl->use(_colourCode);
-}
-
-} // end namespace Catch
-
-// #included from: catch_generators_impl.hpp
-#define TWOBLUECUBES_CATCH_GENERATORS_IMPL_HPP_INCLUDED
-
-#include <map>
-#include <string>
-#include <vector>
-
-namespace Catch {
-
-struct GeneratorInfo : IGeneratorInfo
-{
-
- GeneratorInfo(std::size_t size)
- : m_size(size),
- m_currentIndex(0)
- {
- }
-
- bool moveNext()
- {
- if (++m_currentIndex == m_size)
- {
- m_currentIndex = 0;
- return false;
- }
- return true;
- }
-
- std::size_t getCurrentIndex() const
- {
- return m_currentIndex;
- }
-
- std::size_t m_size;
- std::size_t m_currentIndex;
-};
-
-///////////////////////////////////////////////////////////////////////////
-
-class GeneratorsForTest : public IGeneratorsForTest
-{
-
- public:
- ~GeneratorsForTest()
- {
- deleteAll(m_generatorsInOrder);
- }
-
- IGeneratorInfo& getGeneratorInfo(std::string const& fileInfo, std::size_t size)
- {
- std::map<std::string, IGeneratorInfo*>::const_iterator it = m_generatorsByName.find(fileInfo);
- if (it == m_generatorsByName.end())
- {
- IGeneratorInfo* info = new GeneratorInfo(size);
- m_generatorsByName.insert(std::make_pair(fileInfo, info));
- m_generatorsInOrder.push_back(info);
- return *info;
- }
- return *it->second;
- }
-
- bool moveNext()
- {
- std::vector<IGeneratorInfo*>::const_iterator it = m_generatorsInOrder.begin();
- std::vector<IGeneratorInfo*>::const_iterator itEnd = m_generatorsInOrder.end();
- for (; it != itEnd; ++it)
- {
- if ((*it)->moveNext())
- return true;
- }
- return false;
- }
-
- private:
- std::map<std::string, IGeneratorInfo*> m_generatorsByName;
- std::vector<IGeneratorInfo*> m_generatorsInOrder;
-};
-
-IGeneratorsForTest* createGeneratorsForTest()
-{
- return new GeneratorsForTest();
-}
-
-} // end namespace Catch
-
-// #included from: catch_assertionresult.hpp
-#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_HPP_INCLUDED
-
-namespace Catch {
-
-AssertionInfo::AssertionInfo(std::string const& _macroName,
- SourceLineInfo const& _lineInfo,
- std::string const& _capturedExpression,
- ResultDisposition::Flags _resultDisposition)
- : macroName(_macroName),
- lineInfo(_lineInfo),
- capturedExpression(_capturedExpression),
- resultDisposition(_resultDisposition)
-{
-}
-
-AssertionResult::AssertionResult() {}
-
-AssertionResult::AssertionResult(AssertionInfo const& info, AssertionResultData const& data)
- : m_info(info),
- m_resultData(data)
-{
-}
-
-AssertionResult::~AssertionResult() {}
-
-// Result was a success
-bool AssertionResult::succeeded() const
-{
- return Catch::isOk(m_resultData.resultType);
-}
-
-// Result was a success, or failure is suppressed
-bool AssertionResult::isOk() const
-{
- return Catch::isOk(m_resultData.resultType) || shouldSuppressFailure(m_info.resultDisposition);
-}
-
-ResultWas::OfType AssertionResult::getResultType() const
-{
- return m_resultData.resultType;
-}
-
-bool AssertionResult::hasExpression() const
-{
- return !m_info.capturedExpression.empty();
-}
-
-bool AssertionResult::hasMessage() const
-{
- return !m_resultData.message.empty();
-}
-
-std::string AssertionResult::getExpression() const
-{
- if (isFalseTest(m_info.resultDisposition))
- return "!" + m_info.capturedExpression;
- else
- return m_info.capturedExpression;
-}
-std::string AssertionResult::getExpressionInMacro() const
-{
- if (m_info.macroName.empty())
- return m_info.capturedExpression;
- else
- return m_info.macroName + "( " + m_info.capturedExpression + " )";
-}
-
-bool AssertionResult::hasExpandedExpression() const
-{
- return hasExpression() && getExpandedExpression() != getExpression();
-}
-
-std::string AssertionResult::getExpandedExpression() const
-{
- return m_resultData.reconstructedExpression;
-}
-
-std::string AssertionResult::getMessage() const
-{
- return m_resultData.message;
-}
-SourceLineInfo AssertionResult::getSourceInfo() const
-{
- return m_info.lineInfo;
-}
-
-std::string AssertionResult::getTestMacroName() const
-{
- return m_info.macroName;
-}
-
-} // end namespace Catch
-
-// #included from: catch_test_case_info.hpp
-#define TWOBLUECUBES_CATCH_TEST_CASE_INFO_HPP_INCLUDED
-
-namespace Catch {
-
-inline TestCaseInfo::SpecialProperties parseSpecialTag(std::string const& tag)
-{
- if (startsWith(tag, ".") ||
- tag == "hide" ||
- tag == "!hide")
- return TestCaseInfo::IsHidden;
- else if (tag == "!throws")
- return TestCaseInfo::Throws;
- else if (tag == "!shouldfail")
- return TestCaseInfo::ShouldFail;
- else if (tag == "!mayfail")
- return TestCaseInfo::MayFail;
- else
- return TestCaseInfo::None;
-}
-inline bool isReservedTag(std::string const& tag)
-{
- return parseSpecialTag(tag) == TestCaseInfo::None && tag.size() > 0 && !isalnum(tag[0]);
-}
-inline void enforceNotReservedTag(std::string const& tag, SourceLineInfo const& _lineInfo)
-{
- if (isReservedTag(tag))
- {
- {
- Colour colourGuard(Colour::Red);
- Catch::cerr()
- << "Tag name [" << tag << "] not allowed.\n"
- << "Tag names starting with non alpha-numeric characters are reserved\n";
- }
- {
- Colour colourGuard(Colour::FileName);
- Catch::cerr() << _lineInfo << std::endl;
- }
- exit(1);
- }
-}
-
-TestCase makeTestCase(ITestCase* _testCase,
- std::string const& _className,
- std::string const& _name,
- std::string const& _descOrTags,
- SourceLineInfo const& _lineInfo)
-{
- bool isHidden(startsWith(_name, "./")); // Legacy support
-
- // Parse out tags
- std::set<std::string> tags;
- std::string desc, tag;
- bool inTag = false;
- for (std::size_t i = 0; i < _descOrTags.size(); ++i)
- {
- char c = _descOrTags[i];
- if (!inTag)
- {
- if (c == '[')
- inTag = true;
- else
- desc += c;
- }
- else
- {
- if (c == ']')
- {
- TestCaseInfo::SpecialProperties prop = parseSpecialTag(tag);
- if (prop == TestCaseInfo::IsHidden)
- isHidden = true;
- else if (prop == TestCaseInfo::None)
- enforceNotReservedTag(tag, _lineInfo);
-
- tags.insert(tag);
- tag.clear();
- inTag = false;
- }
- else
- tag += c;
- }
- }
- if (isHidden)
- {
- tags.insert("hide");
- tags.insert(".");
- }
-
- TestCaseInfo info(_name, _className, desc, tags, _lineInfo);
- return TestCase(_testCase, info);
-}
-
-void setTags(TestCaseInfo& testCaseInfo, std::set<std::string> const& tags)
-{
- testCaseInfo.tags = tags;
- testCaseInfo.lcaseTags.clear();
-
- std::ostringstream oss;
- for (std::set<std::string>::const_iterator it = tags.begin(), itEnd = tags.end(); it != itEnd; ++it)
- {
- oss << "[" << *it << "]";
- std::string lcaseTag = toLower(*it);
- testCaseInfo.properties = static_cast<TestCaseInfo::SpecialProperties>(testCaseInfo.properties | parseSpecialTag(lcaseTag));
- testCaseInfo.lcaseTags.insert(lcaseTag);
- }
- testCaseInfo.tagsAsString = oss.str();
-}
-
-TestCaseInfo::TestCaseInfo(std::string const& _name,
- std::string const& _className,
- std::string const& _description,
- std::set<std::string> const& _tags,
- SourceLineInfo const& _lineInfo)
- : name(_name),
- className(_className),
- description(_description),
- lineInfo(_lineInfo),
- properties(None)
-{
- setTags(*this, _tags);
-}
-
-TestCaseInfo::TestCaseInfo(TestCaseInfo const& other)
- : name(other.name),
- className(other.className),
- description(other.description),
- tags(other.tags),
- lcaseTags(other.lcaseTags),
- tagsAsString(other.tagsAsString),
- lineInfo(other.lineInfo),
- properties(other.properties)
-{
-}
-
-bool TestCaseInfo::isHidden() const
-{
- return (properties & IsHidden) != 0;
-}
-bool TestCaseInfo::throws() const
-{
- return (properties & Throws) != 0;
-}
-bool TestCaseInfo::okToFail() const
-{
- return (properties & (ShouldFail | MayFail)) != 0;
-}
-bool TestCaseInfo::expectedToFail() const
-{
- return (properties & (ShouldFail)) != 0;
-}
-
-TestCase::TestCase(ITestCase* testCase, TestCaseInfo const& info) : TestCaseInfo(info), test(testCase) {}
-
-TestCase::TestCase(TestCase const& other)
- : TestCaseInfo(other),
- test(other.test)
-{
-}
-
-TestCase TestCase::withName(std::string const& _newName) const
-{
- TestCase other(*this);
- other.name = _newName;
- return other;
-}
-
-void TestCase::swap(TestCase& other)
-{
- test.swap(other.test);
- name.swap(other.name);
- className.swap(other.className);
- description.swap(other.description);
- tags.swap(other.tags);
- lcaseTags.swap(other.lcaseTags);
- tagsAsString.swap(other.tagsAsString);
- std::swap(TestCaseInfo::properties, static_cast<TestCaseInfo&>(other).properties);
- std::swap(lineInfo, other.lineInfo);
-}
-
-void TestCase::invoke() const
-{
- test->invoke();
-}
-
-bool TestCase::operator==(TestCase const& other) const
-{
- return test.get() == other.test.get() &&
- name == other.name &&
- className == other.className;
-}
-
-bool TestCase::operator<(TestCase const& other) const
-{
- return name < other.name;
-}
-TestCase& TestCase::operator=(TestCase const& other)
-{
- TestCase temp(other);
- swap(temp);
- return *this;
-}
-
-TestCaseInfo const& TestCase::getTestCaseInfo() const
-{
- return *this;
-}
-
-} // end namespace Catch
-
-// #included from: catch_version.hpp
-#define TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED
-
-namespace Catch {
-
-Version::Version(unsigned int _majorVersion,
- unsigned int _minorVersion,
- unsigned int _patchNumber,
- std::string const& _branchName,
- unsigned int _buildNumber)
- : majorVersion(_majorVersion),
- minorVersion(_minorVersion),
- patchNumber(_patchNumber),
- branchName(_branchName),
- buildNumber(_buildNumber)
-{
-}
-
-std::ostream& operator<<(std::ostream& os, Version const& version)
-{
- os << version.majorVersion << "."
- << version.minorVersion << "."
- << version.patchNumber;
-
- if (!version.branchName.empty())
- {
- os << "-" << version.branchName
- << "." << version.buildNumber;
- }
- return os;
-}
-
-Version libraryVersion(1, 3, 2, "", 0);
-}
-
-// #included from: catch_message.hpp
-#define TWOBLUECUBES_CATCH_MESSAGE_HPP_INCLUDED
-
-namespace Catch {
-
-MessageInfo::MessageInfo(std::string const& _macroName,
- SourceLineInfo const& _lineInfo,
- ResultWas::OfType _type)
- : macroName(_macroName),
- lineInfo(_lineInfo),
- type(_type),
- sequence(++globalCount)
-{
-}
-
-// This may need protecting if threading support is added
-unsigned int MessageInfo::globalCount = 0;
-
-////////////////////////////////////////////////////////////////////////////
-
-ScopedMessage::ScopedMessage(MessageBuilder const& builder)
- : m_info(builder.m_info)
-{
- m_info.message = builder.m_stream.str();
- getResultCapture().pushScopedMessage(m_info);
-}
-ScopedMessage::ScopedMessage(ScopedMessage const& other)
- : m_info(other.m_info)
-{
-}
-
-ScopedMessage::~ScopedMessage()
-{
- getResultCapture().popScopedMessage(m_info);
-}
-
-} // end namespace Catch
-
-// #included from: catch_legacy_reporter_adapter.hpp
-#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_HPP_INCLUDED
-
-// #included from: catch_legacy_reporter_adapter.h
-#define TWOBLUECUBES_CATCH_LEGACY_REPORTER_ADAPTER_H_INCLUDED
-
-namespace Catch {
-// Deprecated
-struct IReporter : IShared
-{
- virtual ~IReporter();
-
- virtual bool shouldRedirectStdout() const = 0;
-
- virtual void StartTesting() = 0;
- virtual void EndTesting(Totals const& totals) = 0;
- virtual void StartGroup(std::string const& groupName) = 0;
- virtual void EndGroup(std::string const& groupName, Totals const& totals) = 0;
- virtual void StartTestCase(TestCaseInfo const& testInfo) = 0;
- virtual void EndTestCase(TestCaseInfo const& testInfo, Totals const& totals, std::string const& stdOut, std::string const& stdErr) = 0;
- virtual void StartSection(std::string const& sectionName, std::string const& description) = 0;
- virtual void EndSection(std::string const& sectionName, Counts const& assertions) = 0;
- virtual void NoAssertionsInSection(std::string const& sectionName) = 0;
- virtual void NoAssertionsInTestCase(std::string const& testName) = 0;
- virtual void Aborted() = 0;
- virtual void Result(AssertionResult const& result) = 0;
-};
-
-class LegacyReporterAdapter : public SharedImpl<IStreamingReporter>
-{
- public:
- LegacyReporterAdapter(Ptr<IReporter> const& legacyReporter);
- virtual ~LegacyReporterAdapter();
-
- virtual ReporterPreferences getPreferences() const;
- virtual void noMatchingTestCases(std::string const&);
- virtual void testRunStarting(TestRunInfo const&);
- virtual void testGroupStarting(GroupInfo const& groupInfo);
- virtual void testCaseStarting(TestCaseInfo const& testInfo);
- virtual void sectionStarting(SectionInfo const& sectionInfo);
- virtual void assertionStarting(AssertionInfo const&);
- virtual bool assertionEnded(AssertionStats const& assertionStats);
- virtual void sectionEnded(SectionStats const& sectionStats);
- virtual void testCaseEnded(TestCaseStats const& testCaseStats);
- virtual void testGroupEnded(TestGroupStats const& testGroupStats);
- virtual void testRunEnded(TestRunStats const& testRunStats);
- virtual void skipTest(TestCaseInfo const&);
-
- private:
- Ptr<IReporter> m_legacyReporter;
-};
-}
-
-namespace Catch {
-LegacyReporterAdapter::LegacyReporterAdapter(Ptr<IReporter> const& legacyReporter)
- : m_legacyReporter(legacyReporter)
-{
-}
-LegacyReporterAdapter::~LegacyReporterAdapter() {}
-
-ReporterPreferences LegacyReporterAdapter::getPreferences() const
-{
- ReporterPreferences prefs;
- prefs.shouldRedirectStdOut = m_legacyReporter->shouldRedirectStdout();
- return prefs;
-}
-
-void LegacyReporterAdapter::noMatchingTestCases(std::string const&) {}
-void LegacyReporterAdapter::testRunStarting(TestRunInfo const&)
-{
- m_legacyReporter->StartTesting();
-}
-void LegacyReporterAdapter::testGroupStarting(GroupInfo const& groupInfo)
-{
- m_legacyReporter->StartGroup(groupInfo.name);
-}
-void LegacyReporterAdapter::testCaseStarting(TestCaseInfo const& testInfo)
-{
- m_legacyReporter->StartTestCase(testInfo);
-}
-void LegacyReporterAdapter::sectionStarting(SectionInfo const& sectionInfo)
-{
- m_legacyReporter->StartSection(sectionInfo.name, sectionInfo.description);
-}
-void LegacyReporterAdapter::assertionStarting(AssertionInfo const&)
-{
- // Not on legacy interface
-}
-
-bool LegacyReporterAdapter::assertionEnded(AssertionStats const& assertionStats)
-{
- if (assertionStats.assertionResult.getResultType() != ResultWas::Ok)
- {
- for (std::vector<MessageInfo>::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end();
- it != itEnd;
- ++it)
- {
- if (it->type == ResultWas::Info)
- {
- ResultBuilder rb(it->macroName.c_str(), it->lineInfo, "", ResultDisposition::Normal);
- rb << it->message;
- rb.setResultType(ResultWas::Info);
- AssertionResult result = rb.build();
- m_legacyReporter->Result(result);
- }
- }
- }
- m_legacyReporter->Result(assertionStats.assertionResult);
- return true;
-}
-void LegacyReporterAdapter::sectionEnded(SectionStats const& sectionStats)
-{
- if (sectionStats.missingAssertions)
- m_legacyReporter->NoAssertionsInSection(sectionStats.sectionInfo.name);
- m_legacyReporter->EndSection(sectionStats.sectionInfo.name, sectionStats.assertions);
-}
-void LegacyReporterAdapter::testCaseEnded(TestCaseStats const& testCaseStats)
-{
- m_legacyReporter->EndTestCase(testCaseStats.testInfo,
- testCaseStats.totals,
- testCaseStats.stdOut,
- testCaseStats.stdErr);
-}
-void LegacyReporterAdapter::testGroupEnded(TestGroupStats const& testGroupStats)
-{
- if (testGroupStats.aborting)
- m_legacyReporter->Aborted();
- m_legacyReporter->EndGroup(testGroupStats.groupInfo.name, testGroupStats.totals);
-}
-void LegacyReporterAdapter::testRunEnded(TestRunStats const& testRunStats)
-{
- m_legacyReporter->EndTesting(testRunStats.totals);
-}
-void LegacyReporterAdapter::skipTest(TestCaseInfo const&)
-{
-}
-}
-
-// #included from: catch_timer.hpp
-
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wc++11-long-long"
-#endif
-
-#ifdef CATCH_PLATFORM_WINDOWS
-#include <windows.h>
-#else
-#include <sys/time.h>
-#endif
-
-namespace Catch {
-
-namespace {
-#ifdef CATCH_PLATFORM_WINDOWS
-uint64_t getCurrentTicks()
-{
- static uint64_t hz = 0, hzo = 0;
- if (!hz)
- {
- QueryPerformanceFrequency(reinterpret_cast<LARGE_INTEGER*>(&hz));
- QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER*>(&hzo));
- }
- uint64_t t;
- QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER*>(&t));
- return ((t - hzo) * 1000000) / hz;
-}
-#else
-uint64_t getCurrentTicks()
-{
- timeval t;
- gettimeofday(&t, CATCH_NULL);
- return static_cast<uint64_t>(t.tv_sec) * 1000000ull + static_cast<uint64_t>(t.tv_usec);
-}
-#endif
-}
-
-void Timer::start()
-{
- m_ticks = getCurrentTicks();
-}
-unsigned int Timer::getElapsedMicroseconds() const
-{
- return static_cast<unsigned int>(getCurrentTicks() - m_ticks);
-}
-unsigned int Timer::getElapsedMilliseconds() const
-{
- return static_cast<unsigned int>(getElapsedMicroseconds() / 1000);
-}
-double Timer::getElapsedSeconds() const
-{
- return getElapsedMicroseconds() / 1000000.0;
-}
-
-} // namespace Catch
-
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
-// #included from: catch_common.hpp
-#define TWOBLUECUBES_CATCH_COMMON_HPP_INCLUDED
-
-namespace Catch {
-
-bool startsWith(std::string const& s, std::string const& prefix)
-{
- return s.size() >= prefix.size() && s.substr(0, prefix.size()) == prefix;
-}
-bool endsWith(std::string const& s, std::string const& suffix)
-{
- return s.size() >= suffix.size() && s.substr(s.size() - suffix.size(), suffix.size()) == suffix;
-}
-bool contains(std::string const& s, std::string const& infix)
-{
- return s.find(infix) != std::string::npos;
-}
-void toLowerInPlace(std::string& s)
-{
- std::transform(s.begin(), s.end(), s.begin(), ::tolower);
-}
-std::string toLower(std::string const& s)
-{
- std::string lc = s;
- toLowerInPlace(lc);
- return lc;
-}
-std::string trim(std::string const& str)
-{
- static char const* whitespaceChars = "\n\r\t ";
- std::string::size_type start = str.find_first_not_of(whitespaceChars);
- std::string::size_type end = str.find_last_not_of(whitespaceChars);
-
- return start != std::string::npos ? str.substr(start, 1 + end - start) : "";
-}
-
-bool replaceInPlace(std::string& str, std::string const& replaceThis, std::string const& withThis)
-{
- bool replaced = false;
- std::size_t i = str.find(replaceThis);
- while (i != std::string::npos)
- {
- replaced = true;
- str = str.substr(0, i) + withThis + str.substr(i + replaceThis.size());
- if (i < str.size() - withThis.size())
- i = str.find(replaceThis, i + withThis.size());
- else
- i = std::string::npos;
- }
- return replaced;
-}
-
-pluralise::pluralise(std::size_t count, std::string const& label)
- : m_count(count),
- m_label(label)
-{
-}
-
-std::ostream& operator<<(std::ostream& os, pluralise const& pluraliser)
-{
- os << pluraliser.m_count << " " << pluraliser.m_label;
- if (pluraliser.m_count != 1)
- os << "s";
- return os;
-}
-
-SourceLineInfo::SourceLineInfo() : line(0) {}
-SourceLineInfo::SourceLineInfo(char const* _file, std::size_t _line)
- : file(_file),
- line(_line)
-{
-}
-SourceLineInfo::SourceLineInfo(SourceLineInfo const& other)
- : file(other.file),
- line(other.line)
-{
-}
-bool SourceLineInfo::empty() const
-{
- return file.empty();
-}
-bool SourceLineInfo::operator==(SourceLineInfo const& other) const
-{
- return line == other.line && file == other.file;
-}
-bool SourceLineInfo::operator<(SourceLineInfo const& other) const
-{
- return line < other.line || (line == other.line && file < other.file);
-}
-
-void seedRng(IConfig const& config)
-{
- if (config.rngSeed() != 0)
- std::srand(config.rngSeed());
-}
-unsigned int rngSeed()
-{
- return getCurrentContext().getConfig()->rngSeed();
-}
-
-std::ostream& operator<<(std::ostream& os, SourceLineInfo const& info)
-{
-#ifndef __GNUG__
- os << info.file << "(" << info.line << ")";
-#else
- os << info.file << ":" << info.line;
-#endif
- return os;
-}
-
-void throwLogicError(std::string const& message, SourceLineInfo const& locationInfo)
-{
- std::ostringstream oss;
- oss << locationInfo << ": Internal Catch error: '" << message << "'";
- if (alwaysTrue())
- throw std::logic_error(oss.str());
-}
-}
-
-// #included from: catch_section.hpp
-#define TWOBLUECUBES_CATCH_SECTION_HPP_INCLUDED
-
-namespace Catch {
-
-SectionInfo::SectionInfo(SourceLineInfo const& _lineInfo,
- std::string const& _name,
- std::string const& _description)
- : name(_name),
- description(_description),
- lineInfo(_lineInfo)
-{
-}
-
-Section::Section(SectionInfo const& info)
- : m_info(info),
- m_sectionIncluded(getResultCapture().sectionStarted(m_info, m_assertions))
-{
- m_timer.start();
-}
-
-Section::~Section()
-{
- if (m_sectionIncluded)
- {
- SectionEndInfo endInfo(m_info, m_assertions, m_timer.getElapsedSeconds());
- if (std::uncaught_exception())
- getResultCapture().sectionEndedEarly(endInfo);
- else
- getResultCapture().sectionEnded(endInfo);
- }
-}
-
-// This indicates whether the section should be executed or not
-Section::operator bool() const
-{
- return m_sectionIncluded;
-}
-
-} // end namespace Catch
-
-// #included from: catch_debugger.hpp
-#define TWOBLUECUBES_CATCH_DEBUGGER_HPP_INCLUDED
-
-#include <iostream>
-
-#ifdef CATCH_PLATFORM_MAC
-
-#include <assert.h>
-#include <stdbool.h>
-#include <sys/sysctl.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-namespace Catch {
-
-// The following function is taken directly from the following technical note:
-// http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html
-
-// Returns true if the current process is being debugged (either
-// running under the debugger or has a debugger attached post facto).
-bool isDebuggerActive()
-{
-
- int mib[4];
- struct kinfo_proc info;
- size_t size;
-
- // Initialize the flags so that, if sysctl fails for some bizarre
- // reason, we get a predictable result.
-
- info.kp_proc.p_flag = 0;
-
- // Initialize mib, which tells sysctl the info we want, in this case
- // we're looking for information about a specific process ID.
-
- mib[0] = CTL_KERN;
- mib[1] = KERN_PROC;
- mib[2] = KERN_PROC_PID;
- mib[3] = getpid();
-
- // Call sysctl.
-
- size = sizeof(info);
- if (sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, CATCH_NULL, 0) != 0)
- {
- Catch::cerr() << "\n** Call to sysctl failed - unable to determine if debugger is active **\n"
- << std::endl;
- return false;
- }
-
- // We're being debugged if the P_TRACED flag is set.
-
- return ((info.kp_proc.p_flag & P_TRACED) != 0);
-}
-} // namespace Catch
-
-#elif defined(_MSC_VER)
-extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
-namespace Catch {
-bool isDebuggerActive()
-{
- return IsDebuggerPresent() != 0;
-}
-}
-#elif defined(__MINGW32__)
-extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
-namespace Catch {
-bool isDebuggerActive()
-{
- return IsDebuggerPresent() != 0;
-}
-}
-#else
-namespace Catch {
-inline bool isDebuggerActive() { return false; }
-}
-#endif // Platform
-
-#ifdef CATCH_PLATFORM_WINDOWS
-extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA(const char*);
-namespace Catch {
-void writeToDebugConsole(std::string const& text)
-{
- ::OutputDebugStringA(text.c_str());
-}
-}
-#else
-namespace Catch {
-void writeToDebugConsole(std::string const& text)
-{
- // !TBD: Need a version for Mac/ XCode and other IDEs
- Catch::cout() << text;
-}
-}
-#endif // Platform
-
-// #included from: catch_tostring.hpp
-#define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED
-
-namespace Catch {
-
-namespace Detail {
-
-const std::string unprintableString = "{?}";
-
-namespace {
-const int hexThreshold = 255;
-
-struct Endianness
-{
- enum Arch
- {
- Big,
- Little
- };
-
- static Arch which()
- {
- union _
- {
- int asInt;
- char asChar[sizeof(int)];
- } u;
-
- u.asInt = 1;
- return (u.asChar[sizeof(int) - 1] == 1) ? Big : Little;
- }
-};
-}
-
-std::string rawMemoryToString(const void* object, std::size_t size)
-{
- // Reverse order for little endian architectures
- int i = 0, end = static_cast<int>(size), inc = 1;
- if (Endianness::which() == Endianness::Little)
- {
- i = end - 1;
- end = inc = -1;
- }
-
- unsigned char const* bytes = static_cast<unsigned char const*>(object);
- std::ostringstream os;
- os << "0x" << std::setfill('0') << std::hex;
- for (; i != end; i += inc)
- os << std::setw(2) << static_cast<unsigned>(bytes[i]);
- return os.str();
-}
-}
-
-std::string toString(std::string const& value)
-{
- std::string s = value;
- if (getCurrentContext().getConfig()->showInvisibles())
- {
- for (size_t i = 0; i < s.size(); ++i)
- {
- std::string subs;
- switch (s[i])
- {
- case '\n':
- subs = "\\n";
- break;
- case '\t':
- subs = "\\t";
- break;
- default:
- break;
- }
- if (!subs.empty())
- {
- s = s.substr(0, i) + subs + s.substr(i + 1);
- ++i;
- }
- }
- }
- return "\"" + s + "\"";
-}
-std::string toString(std::wstring const& value)
-{
-
- std::string s;
- s.reserve(value.size());
- for (size_t i = 0; i < value.size(); ++i)
- s += value[i] <= 0xff ? static_cast<char>(value[i]) : '?';
- return Catch::toString(s);
-}
-
-std::string toString(const char* const value)
-{
- return value ? Catch::toString(std::string(value)) : std::string("{null string}");
-}
-
-std::string toString(char* const value)
-{
- return Catch::toString(static_cast<const char*>(value));
-}
-
-std::string toString(const wchar_t* const value)
-{
- return value ? Catch::toString(std::wstring(value)) : std::string("{null string}");
-}
-
-std::string toString(wchar_t* const value)
-{
- return Catch::toString(static_cast<const wchar_t*>(value));
-}
-
-std::string toString(int value)
-{
- std::ostringstream oss;
- oss << value;
- if (value > Detail::hexThreshold)
- oss << " (0x" << std::hex << value << ")";
- return oss.str();
-}
-
-std::string toString(unsigned long value)
-{
- std::ostringstream oss;
- oss << value;
- if (value > Detail::hexThreshold)
- oss << " (0x" << std::hex << value << ")";
- return oss.str();
-}
-
-std::string toString(unsigned int value)
-{
- return Catch::toString(static_cast<unsigned long>(value));
-}
-
-template <typename T>
-std::string fpToString(T value, int precision)
-{
- std::ostringstream oss;
- oss << std::setprecision(precision)
- << std::fixed
- << value;
- std::string d = oss.str();
- std::size_t i = d.find_last_not_of('0');
- if (i != std::string::npos && i != d.size() - 1)
- {
- if (d[i] == '.')
- i++;
- d = d.substr(0, i + 1);
- }
- return d;
-}
-
-std::string toString(const double value)
-{
- return fpToString(value, 10);
-}
-std::string toString(const float value)
-{
- return fpToString(value, 5) + "f";
-}
-
-std::string toString(bool value)
-{
- return value ? "true" : "false";
-}
-
-std::string toString(char value)
-{
- return value < ' '
- ? toString(static_cast<unsigned int>(value))
- : Detail::makeString(value);
-}
-
-std::string toString(signed char value)
-{
- return toString(static_cast<char>(value));
-}
-
-std::string toString(unsigned char value)
-{
- return toString(static_cast<char>(value));
-}
-
-#ifdef CATCH_CONFIG_CPP11_LONG_LONG
-std::string toString(long long value)
-{
- std::ostringstream oss;
- oss << value;
- if (value > Detail::hexThreshold)
- oss << " (0x" << std::hex << value << ")";
- return oss.str();
-}
-std::string toString(unsigned long long value)
-{
- std::ostringstream oss;
- oss << value;
- if (value > Detail::hexThreshold)
- oss << " (0x" << std::hex << value << ")";
- return oss.str();
-}
-#endif
-
-#ifdef CATCH_CONFIG_CPP11_NULLPTR
-std::string toString(std::nullptr_t)
-{
- return "nullptr";
-}
-#endif
-
-#ifdef __OBJC__
-std::string toString(NSString const* const& nsstring)
-{
- if (!nsstring)
- return "nil";
- return "@" + toString([nsstring UTF8String]);
-}
-std::string toString(NSString* CATCH_ARC_STRONG const& nsstring)
-{
- if (!nsstring)
- return "nil";
- return "@" + toString([nsstring UTF8String]);
-}
-std::string toString(NSObject* const& nsObject)
-{
- return toString([nsObject description]);
-}
-#endif
-
-} // end namespace Catch
-
-// #included from: catch_result_builder.hpp
-#define TWOBLUECUBES_CATCH_RESULT_BUILDER_HPP_INCLUDED
-
-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,
- SourceLineInfo const& lineInfo,
- char const* capturedExpression,
- ResultDisposition::Flags resultDisposition,
- char const* secondArg)
- : m_assertionInfo(macroName, lineInfo, capturedExpressionWithSecondArgument(capturedExpression, secondArg), resultDisposition),
- m_shouldDebugBreak(false),
- m_shouldThrow(false)
-{
-}
-
-ResultBuilder& ResultBuilder::setResultType(ResultWas::OfType result)
-{
- m_data.resultType = result;
- return *this;
-}
-ResultBuilder& ResultBuilder::setResultType(bool result)
-{
- m_data.resultType = result ? ResultWas::Ok : ResultWas::ExpressionFailed;
- return *this;
-}
-ResultBuilder& ResultBuilder::setLhs(std::string const& lhs)
-{
- m_exprComponents.lhs = lhs;
- return *this;
-}
-ResultBuilder& ResultBuilder::setRhs(std::string const& rhs)
-{
- m_exprComponents.rhs = rhs;
- return *this;
-}
-ResultBuilder& ResultBuilder::setOp(std::string const& op)
-{
- m_exprComponents.op = op;
- return *this;
-}
-
-void ResultBuilder::endExpression()
-{
- m_exprComponents.testFalse = isFalseTest(m_assertionInfo.resultDisposition);
- captureExpression();
-}
-
-void ResultBuilder::useActiveException(ResultDisposition::Flags resultDisposition)
-{
- m_assertionInfo.resultDisposition = resultDisposition;
- m_stream.oss << Catch::translateActiveException();
- captureResult(ResultWas::ThrewException);
-}
-
-void ResultBuilder::captureResult(ResultWas::OfType resultType)
-{
- setResultType(resultType);
- captureExpression();
-}
-void ResultBuilder::captureExpectedException(std::string const& expectedMessage)
-{
- if (expectedMessage.empty())
- captureExpectedException(Matchers::Impl::Generic::AllOf<std::string>());
- else
- captureExpectedException(Matchers::Equals(expectedMessage));
-}
-
-void ResultBuilder::captureExpectedException(Matchers::Impl::Matcher<std::string> const& matcher)
-{
-
- assert(m_exprComponents.testFalse == false);
- AssertionResultData data = m_data;
- data.resultType = ResultWas::Ok;
- data.reconstructedExpression = m_assertionInfo.capturedExpression;
-
- std::string actualMessage = Catch::translateActiveException();
- if (!matcher.match(actualMessage))
- {
- data.resultType = ResultWas::ExpressionFailed;
- data.reconstructedExpression = actualMessage;
- }
- AssertionResult result(m_assertionInfo, data);
- handleResult(result);
-}
-
-void ResultBuilder::captureExpression()
-{
- AssertionResult result = build();
- handleResult(result);
-}
-void ResultBuilder::handleResult(AssertionResult const& result)
-{
- getResultCapture().assertionEnded(result);
-
- if (!result.isOk())
- {
- if (getCurrentContext().getConfig()->shouldDebugBreak())
- m_shouldDebugBreak = true;
- if (getCurrentContext().getRunner()->aborting() || (m_assertionInfo.resultDisposition & ResultDisposition::Normal))
- m_shouldThrow = true;
- }
-}
-void ResultBuilder::react()
-{
- if (m_shouldThrow)
- throw Catch::TestFailureException();
-}
-
-bool ResultBuilder::shouldDebugBreak() const { return m_shouldDebugBreak; }
-bool ResultBuilder::allowThrows() const { return getCurrentContext().getConfig()->allowThrows(); }
-
-AssertionResult ResultBuilder::build() const
-{
- assert(m_data.resultType != ResultWas::Unknown);
-
- AssertionResultData data = m_data;
-
- // Flip bool results if testFalse is set
- if (m_exprComponents.testFalse)
- {
- if (data.resultType == ResultWas::Ok)
- data.resultType = ResultWas::ExpressionFailed;
- else if (data.resultType == ResultWas::ExpressionFailed)
- data.resultType = ResultWas::Ok;
- }
-
- data.message = m_stream.oss.str();
- data.reconstructedExpression = reconstructExpression();
- if (m_exprComponents.testFalse)
- {
- if (m_exprComponents.op == "")
- data.reconstructedExpression = "!" + data.reconstructedExpression;
- else
- data.reconstructedExpression = "!(" + data.reconstructedExpression + ")";
- }
- return AssertionResult(m_assertionInfo, data);
-}
-std::string ResultBuilder::reconstructExpression() const
-{
- if (m_exprComponents.op == "")
- return m_exprComponents.lhs.empty() ? m_assertionInfo.capturedExpression : m_exprComponents.op + m_exprComponents.lhs;
- else if (m_exprComponents.op == "matches")
- return m_exprComponents.lhs + " " + m_exprComponents.rhs;
- else if (m_exprComponents.op != "!")
- {
- if (m_exprComponents.lhs.size() + m_exprComponents.rhs.size() < 40 &&
- m_exprComponents.lhs.find("\n") == std::string::npos &&
- m_exprComponents.rhs.find("\n") == std::string::npos)
- return m_exprComponents.lhs + " " + m_exprComponents.op + " " + m_exprComponents.rhs;
- else
- return m_exprComponents.lhs + "\n" + m_exprComponents.op + "\n" + m_exprComponents.rhs;
- }
- else
- return "{can't expand - use " + m_assertionInfo.macroName + "_FALSE( " + m_assertionInfo.capturedExpression.substr(1) + " ) instead of " + m_assertionInfo.macroName + "( " + m_assertionInfo.capturedExpression + " ) for better diagnostics}";
-}
-
-} // end namespace Catch
-
-// #included from: catch_tag_alias_registry.hpp
-#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_HPP_INCLUDED
-
-// #included from: catch_tag_alias_registry.h
-#define TWOBLUECUBES_CATCH_TAG_ALIAS_REGISTRY_H_INCLUDED
-
-#include <map>
-
-namespace Catch {
-
-class TagAliasRegistry : public ITagAliasRegistry
-{
- public:
- virtual ~TagAliasRegistry();
- virtual Option<TagAlias> find(std::string const& alias) const;
- virtual std::string expandAliases(std::string const& unexpandedTestSpec) const;
- void add(char const* alias, char const* tag, SourceLineInfo const& lineInfo);
- static TagAliasRegistry& get();
-
- private:
- std::map<std::string, TagAlias> m_registry;
-};
-
-} // end namespace Catch
-
-#include <iostream>
-#include <map>
-
-namespace Catch {
-
-TagAliasRegistry::~TagAliasRegistry() {}
-
-Option<TagAlias> TagAliasRegistry::find(std::string const& alias) const
-{
- std::map<std::string, TagAlias>::const_iterator it = m_registry.find(alias);
- if (it != m_registry.end())
- return it->second;
- else
- return Option<TagAlias>();
-}
-
-std::string TagAliasRegistry::expandAliases(std::string const& unexpandedTestSpec) const
-{
- std::string expandedTestSpec = unexpandedTestSpec;
- for (std::map<std::string, TagAlias>::const_iterator it = m_registry.begin(), itEnd = m_registry.end();
- it != itEnd;
- ++it)
- {
- std::size_t pos = expandedTestSpec.find(it->first);
- if (pos != std::string::npos)
- {
- expandedTestSpec = expandedTestSpec.substr(0, pos) +
- it->second.tag +
- expandedTestSpec.substr(pos + it->first.size());
- }
- }
- return expandedTestSpec;
-}
-
-void TagAliasRegistry::add(char const* alias, char const* tag, SourceLineInfo const& lineInfo)
-{
-
- if (!startsWith(alias, "[@") || !endsWith(alias, "]"))
- {
- std::ostringstream oss;
- oss << "error: tag alias, \"" << alias << "\" is not of the form [@alias name].\n"
- << lineInfo;
- throw std::domain_error(oss.str().c_str());
- }
- if (!m_registry.insert(std::make_pair(alias, TagAlias(tag, lineInfo))).second)
- {
- std::ostringstream oss;
- oss << "error: tag alias, \"" << alias << "\" already registered.\n"
- << "\tFirst seen at " << find(alias)->lineInfo << "\n"
- << "\tRedefined at " << lineInfo;
- throw std::domain_error(oss.str().c_str());
- }
-}
-
-TagAliasRegistry& TagAliasRegistry::get()
-{
- static TagAliasRegistry instance;
- return instance;
-}
-
-ITagAliasRegistry::~ITagAliasRegistry() {}
-ITagAliasRegistry const& ITagAliasRegistry::get() { return TagAliasRegistry::get(); }
-
-RegistrarForTagAliases::RegistrarForTagAliases(char const* alias, char const* tag, SourceLineInfo const& lineInfo)
-{
- try
- {
- TagAliasRegistry::get().add(alias, tag, lineInfo);
- }
- catch (std::exception& ex)
- {
- Colour colourGuard(Colour::Red);
- Catch::cerr() << ex.what() << std::endl;
- exit(1);
- }
-}
-
-} // end namespace Catch
-
-// #included from: ../reporters/catch_reporter_multi.hpp
-#define TWOBLUECUBES_CATCH_REPORTER_MULTI_HPP_INCLUDED
-
-namespace Catch {
-
-class MultipleReporters : public SharedImpl<IStreamingReporter>
-{
- typedef std::vector<Ptr<IStreamingReporter>> Reporters;
- Reporters m_reporters;
-
- public:
- void add(Ptr<IStreamingReporter> const& reporter)
- {
- m_reporters.push_back(reporter);
- }
-
- public: // IStreamingReporter
- virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE
- {
- return m_reporters[0]->getPreferences();
- }
-
- virtual void noMatchingTestCases(std::string const& spec) CATCH_OVERRIDE
- {
- for (Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
- it != itEnd;
- ++it)
- (*it)->noMatchingTestCases(spec);
- }
-
- virtual void testRunStarting(TestRunInfo const& testRunInfo) CATCH_OVERRIDE
- {
- for (Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
- it != itEnd;
- ++it)
- (*it)->testRunStarting(testRunInfo);
- }
-
- virtual void testGroupStarting(GroupInfo const& groupInfo) CATCH_OVERRIDE
- {
- for (Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
- it != itEnd;
- ++it)
- (*it)->testGroupStarting(groupInfo);
- }
-
- virtual void testCaseStarting(TestCaseInfo const& testInfo) CATCH_OVERRIDE
- {
- for (Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
- it != itEnd;
- ++it)
- (*it)->testCaseStarting(testInfo);
- }
-
- virtual void sectionStarting(SectionInfo const& sectionInfo) CATCH_OVERRIDE
- {
- for (Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
- it != itEnd;
- ++it)
- (*it)->sectionStarting(sectionInfo);
- }
-
- virtual void assertionStarting(AssertionInfo const& assertionInfo) CATCH_OVERRIDE
- {
- for (Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
- it != itEnd;
- ++it)
- (*it)->assertionStarting(assertionInfo);
- }
-
- // The return value indicates if the messages buffer should be cleared:
- virtual bool assertionEnded(AssertionStats const& assertionStats) CATCH_OVERRIDE
- {
- bool clearBuffer = false;
- for (Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
- it != itEnd;
- ++it)
- clearBuffer |= (*it)->assertionEnded(assertionStats);
- return clearBuffer;
- }
-
- virtual void sectionEnded(SectionStats const& sectionStats) CATCH_OVERRIDE
- {
- for (Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
- it != itEnd;
- ++it)
- (*it)->sectionEnded(sectionStats);
- }
-
- virtual void testCaseEnded(TestCaseStats const& testCaseStats) CATCH_OVERRIDE
- {
- for (Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
- it != itEnd;
- ++it)
- (*it)->testCaseEnded(testCaseStats);
- }
-
- virtual void testGroupEnded(TestGroupStats const& testGroupStats) CATCH_OVERRIDE
- {
- for (Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
- it != itEnd;
- ++it)
- (*it)->testGroupEnded(testGroupStats);
- }
-
- virtual void testRunEnded(TestRunStats const& testRunStats) CATCH_OVERRIDE
- {
- for (Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
- it != itEnd;
- ++it)
- (*it)->testRunEnded(testRunStats);
- }
-
- virtual void skipTest(TestCaseInfo const& testInfo) CATCH_OVERRIDE
- {
- for (Reporters::const_iterator it = m_reporters.begin(), itEnd = m_reporters.end();
- it != itEnd;
- ++it)
- (*it)->skipTest(testInfo);
- }
-};
-
-Ptr<IStreamingReporter> addReporter(Ptr<IStreamingReporter> const& existingReporter, Ptr<IStreamingReporter> const& additionalReporter)
-{
- Ptr<IStreamingReporter> resultingReporter;
-
- if (existingReporter)
- {
- MultipleReporters* multi = dynamic_cast<MultipleReporters*>(existingReporter.get());
- if (!multi)
- {
- multi = new MultipleReporters;
- resultingReporter = Ptr<IStreamingReporter>(multi);
- if (existingReporter)
- multi->add(existingReporter);
- }
- else
- resultingReporter = existingReporter;
- multi->add(additionalReporter);
- }
- else
- resultingReporter = additionalReporter;
-
- return resultingReporter;
-}
-
-} // end namespace Catch
-
-// #included from: ../reporters/catch_reporter_xml.hpp
-#define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED
-
-// #included from: catch_reporter_bases.hpp
-#define TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED
-
-#include <cstring>
-
-namespace Catch {
-
-struct StreamingReporterBase : SharedImpl<IStreamingReporter>
-{
-
- StreamingReporterBase(ReporterConfig const& _config)
- : m_config(_config.fullConfig()),
- stream(_config.stream())
- {
- m_reporterPrefs.shouldRedirectStdOut = false;
- }
-
- virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE
- {
- return m_reporterPrefs;
- }
-
- virtual ~StreamingReporterBase() CATCH_OVERRIDE;
-
- virtual void noMatchingTestCases(std::string const&) CATCH_OVERRIDE {}
-
- virtual void testRunStarting(TestRunInfo const& _testRunInfo) CATCH_OVERRIDE
- {
- currentTestRunInfo = _testRunInfo;
- }
- virtual void testGroupStarting(GroupInfo const& _groupInfo) CATCH_OVERRIDE
- {
- currentGroupInfo = _groupInfo;
- }
-
- virtual void testCaseStarting(TestCaseInfo const& _testInfo) CATCH_OVERRIDE
- {
- currentTestCaseInfo = _testInfo;
- }
- virtual void sectionStarting(SectionInfo const& _sectionInfo) CATCH_OVERRIDE
- {
- m_sectionStack.push_back(_sectionInfo);
- }
-
- virtual void sectionEnded(SectionStats const& /* _sectionStats */) CATCH_OVERRIDE
- {
- m_sectionStack.pop_back();
- }
- virtual void testCaseEnded(TestCaseStats const& /* _testCaseStats */) CATCH_OVERRIDE
- {
- currentTestCaseInfo.reset();
- }
- virtual void testGroupEnded(TestGroupStats const& /* _testGroupStats */) CATCH_OVERRIDE
- {
- currentGroupInfo.reset();
- }
- virtual void testRunEnded(TestRunStats const& /* _testRunStats */) CATCH_OVERRIDE
- {
- currentTestCaseInfo.reset();
- currentGroupInfo.reset();
- currentTestRunInfo.reset();
- }
-
- virtual void skipTest(TestCaseInfo const&) CATCH_OVERRIDE
- {
- // Don't do anything with this by default.
- // It can optionally be overridden in the derived class.
- }
-
- Ptr<IConfig const> m_config;
- std::ostream& stream;
-
- LazyStat<TestRunInfo> currentTestRunInfo;
- LazyStat<GroupInfo> currentGroupInfo;
- LazyStat<TestCaseInfo> currentTestCaseInfo;
-
- std::vector<SectionInfo> m_sectionStack;
- ReporterPreferences m_reporterPrefs;
-};
-
-struct CumulativeReporterBase : SharedImpl<IStreamingReporter>
-{
- template <typename T, typename ChildNodeT>
- struct Node : SharedImpl<>
- {
- explicit Node(T const& _value) : value(_value) {}
- virtual ~Node() {}
-
- typedef std::vector<Ptr<ChildNodeT>> ChildNodes;
- T value;
- ChildNodes children;
- };
- struct SectionNode : SharedImpl<>
- {
- explicit SectionNode(SectionStats const& _stats) : stats(_stats) {}
- virtual ~SectionNode();
-
- bool operator==(SectionNode const& other) const
- {
- return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo;
- }
- bool operator==(Ptr<SectionNode> const& other) const
- {
- return operator==(*other);
- }
-
- SectionStats stats;
- typedef std::vector<Ptr<SectionNode>> ChildSections;
- typedef std::vector<AssertionStats> Assertions;
- ChildSections childSections;
- Assertions assertions;
- std::string stdOut;
- std::string stdErr;
- };
-
- struct BySectionInfo
- {
- BySectionInfo(SectionInfo const& other) : m_other(other) {}
- BySectionInfo(BySectionInfo const& other) : m_other(other.m_other) {}
- bool operator()(Ptr<SectionNode> const& node) const
- {
- return node->stats.sectionInfo.lineInfo == m_other.lineInfo;
- }
-
- private:
- void operator=(BySectionInfo const&);
- SectionInfo const& m_other;
- };
-
- typedef Node<TestCaseStats, SectionNode> TestCaseNode;
- typedef Node<TestGroupStats, TestCaseNode> TestGroupNode;
- typedef Node<TestRunStats, TestGroupNode> TestRunNode;
-
- CumulativeReporterBase(ReporterConfig const& _config)
- : m_config(_config.fullConfig()),
- stream(_config.stream())
- {
- m_reporterPrefs.shouldRedirectStdOut = false;
- }
- ~CumulativeReporterBase();
-
- virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE
- {
- return m_reporterPrefs;
- }
-
- virtual void testRunStarting(TestRunInfo const&) CATCH_OVERRIDE {}
- virtual void testGroupStarting(GroupInfo const&) CATCH_OVERRIDE {}
-
- virtual void testCaseStarting(TestCaseInfo const&) CATCH_OVERRIDE {}
-
- virtual void sectionStarting(SectionInfo const& sectionInfo) CATCH_OVERRIDE
- {
- SectionStats incompleteStats(sectionInfo, Counts(), 0, false);
- Ptr<SectionNode> node;
- if (m_sectionStack.empty())
- {
- if (!m_rootSection)
- m_rootSection = new SectionNode(incompleteStats);
- node = m_rootSection;
- }
- else
- {
- SectionNode& parentNode = *m_sectionStack.back();
- SectionNode::ChildSections::const_iterator it =
- std::find_if(parentNode.childSections.begin(),
- parentNode.childSections.end(),
- BySectionInfo(sectionInfo));
- if (it == parentNode.childSections.end())
- {
- node = new SectionNode(incompleteStats);
- parentNode.childSections.push_back(node);
- }
- else
- node = *it;
- }
- m_sectionStack.push_back(node);
- m_deepestSection = node;
- }
-
- virtual void assertionStarting(AssertionInfo const&) CATCH_OVERRIDE {}
-
- virtual bool assertionEnded(AssertionStats const& assertionStats)
- {
- assert(!m_sectionStack.empty());
- SectionNode& sectionNode = *m_sectionStack.back();
- sectionNode.assertions.push_back(assertionStats);
- return true;
- }
- virtual void sectionEnded(SectionStats const& sectionStats) CATCH_OVERRIDE
- {
- assert(!m_sectionStack.empty());
- SectionNode& node = *m_sectionStack.back();
- node.stats = sectionStats;
- m_sectionStack.pop_back();
- }
- virtual void testCaseEnded(TestCaseStats const& testCaseStats) CATCH_OVERRIDE
- {
- Ptr<TestCaseNode> node = new TestCaseNode(testCaseStats);
- assert(m_sectionStack.size() == 0);
- node->children.push_back(m_rootSection);
- m_testCases.push_back(node);
- m_rootSection.reset();
-
- assert(m_deepestSection);
- m_deepestSection->stdOut = testCaseStats.stdOut;
- m_deepestSection->stdErr = testCaseStats.stdErr;
- }
- virtual void testGroupEnded(TestGroupStats const& testGroupStats) CATCH_OVERRIDE
- {
- Ptr<TestGroupNode> node = new TestGroupNode(testGroupStats);
- node->children.swap(m_testCases);
- m_testGroups.push_back(node);
- }
- virtual void testRunEnded(TestRunStats const& testRunStats) CATCH_OVERRIDE
- {
- Ptr<TestRunNode> node = new TestRunNode(testRunStats);
- node->children.swap(m_testGroups);
- m_testRuns.push_back(node);
- testRunEndedCumulative();
- }
- virtual void testRunEndedCumulative() = 0;
-
- virtual void skipTest(TestCaseInfo const&) CATCH_OVERRIDE {}
-
- Ptr<IConfig const> m_config;
- std::ostream& stream;
- std::vector<AssertionStats> m_assertions;
- std::vector<std::vector<Ptr<SectionNode>>> m_sections;
- std::vector<Ptr<TestCaseNode>> m_testCases;
- std::vector<Ptr<TestGroupNode>> m_testGroups;
-
- std::vector<Ptr<TestRunNode>> m_testRuns;
-
- Ptr<SectionNode> m_rootSection;
- Ptr<SectionNode> m_deepestSection;
- std::vector<Ptr<SectionNode>> m_sectionStack;
- ReporterPreferences m_reporterPrefs;
-};
-
-template <char C>
-char const* getLineOfChars()
-{
- static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0};
- if (!*line)
- {
- memset(line, C, CATCH_CONFIG_CONSOLE_WIDTH - 1);
- line[CATCH_CONFIG_CONSOLE_WIDTH - 1] = 0;
- }
- return line;
-}
-
-struct TestEventListenerBase : StreamingReporterBase
-{
- TestEventListenerBase(ReporterConfig const& _config)
- : StreamingReporterBase(_config)
- {
- }
-
- virtual void assertionStarting(AssertionInfo const&) CATCH_OVERRIDE {}
- virtual bool assertionEnded(AssertionStats const&) CATCH_OVERRIDE
- {
- return false;
- }
-};
-
-} // end namespace Catch
-
-// #included from: ../internal/catch_reporter_registrars.hpp
-#define TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED
-
-namespace Catch {
-
-template <typename T>
-class LegacyReporterRegistrar
-{
-
- class ReporterFactory : public IReporterFactory
- {
- virtual IStreamingReporter* create(ReporterConfig const& config) const
- {
- return new LegacyReporterAdapter(new T(config));
- }
-
- virtual std::string getDescription() const
- {
- return T::getDescription();
- }
- };
-
- public:
- LegacyReporterRegistrar(std::string const& name)
- {
- getMutableRegistryHub().registerReporter(name, new ReporterFactory());
- }
-};
-
-template <typename T>
-class ReporterRegistrar
-{
-
- class ReporterFactory : public SharedImpl<IReporterFactory>
- {
-
- // *** Please Note ***:
- // - If you end up here looking at a compiler error because it's trying to register
- // your custom reporter class be aware that the native reporter interface has changed
- // to IStreamingReporter. The "legacy" interface, IReporter, is still supported via
- // an adapter. Just use REGISTER_LEGACY_REPORTER to take advantage of the adapter.
- // However please consider updating to the new interface as the old one is now
- // deprecated and will probably be removed quite soon!
- // Please contact me via github if you have any questions at all about this.
- // In fact, ideally, please contact me anyway to let me know you've hit this - as I have
- // no idea who is actually using custom reporters at all (possibly no-one!).
- // The new interface is designed to minimise exposure to interface changes in the future.
- virtual IStreamingReporter* create(ReporterConfig const& config) const
- {
- return new T(config);
- }
-
- virtual std::string getDescription() const
- {
- return T::getDescription();
- }
- };
-
- public:
- ReporterRegistrar(std::string const& name)
- {
- getMutableRegistryHub().registerReporter(name, new ReporterFactory());
- }
-};
-
-template <typename T>
-class ListenerRegistrar
-{
-
- class ListenerFactory : public SharedImpl<IReporterFactory>
- {
-
- virtual IStreamingReporter* create(ReporterConfig const& config) const
- {
- return new T(config);
- }
- virtual std::string getDescription() const
- {
- return "";
- }
- };
-
- public:
- ListenerRegistrar()
- {
- getMutableRegistryHub().registerListener(new ListenerFactory());
- }
-};
-}
-
-#define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER(name, reporterType) \
- namespace { \
- Catch::LegacyReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType(name); \
- }
-
-#define INTERNAL_CATCH_REGISTER_REPORTER(name, reporterType) \
- namespace { \
- Catch::ReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType(name); \
- }
-
-#define INTERNAL_CATCH_REGISTER_LISTENER(listenerType) \
- namespace { \
- Catch::ListenerRegistrar<listenerType> catch_internal_RegistrarFor##listenerType; \
- }
-
-// #included from: ../internal/catch_xmlwriter.hpp
-#define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED
-
-#include <iomanip>
-#include <sstream>
-#include <string>
-#include <vector>
-
-namespace Catch {
-
-class XmlEncode
-{
- public:
- enum ForWhat
- {
- ForTextNodes,
- ForAttributes
- };
-
- XmlEncode(std::string const& str, ForWhat forWhat = ForTextNodes)
- : m_str(str),
- m_forWhat(forWhat)
- {
- }
-
- void encodeTo(std::ostream& os) const
- {
-
- // Apostrophe escaping not necessary if we always use " to write attributes
- // (see: http://www.w3.org/TR/xml/#syntax)
-
- for (std::size_t i = 0; i < m_str.size(); ++i)
- {
- char c = m_str[i];
- switch (c)
- {
- case '<':
- os << "<";
- break;
- case '&':
- os << "&";
- break;
-
- case '>':
- // See: http://www.w3.org/TR/xml/#syntax
- if (i > 2 && m_str[i - 1] == ']' && m_str[i - 2] == ']')
- os << ">";
- else
- os << c;
- break;
-
- case '\"':
- if (m_forWhat == ForAttributes)
- os << """;
- else
- os << c;
- break;
-
- default:
- // Escape control chars - based on contribution by @espenalb in PR #465
- if ((c < '\x09') || (c > '\x0D' && c < '\x20') || c == '\x7F')
- os << "&#x" << std::uppercase << std::hex << static_cast<int>(c);
- else
- os << c;
- }
- }
- }
-
- friend std::ostream& operator<<(std::ostream& os, XmlEncode const& xmlEncode)
- {
- xmlEncode.encodeTo(os);
- return os;
- }
-
- private:
- std::string m_str;
- ForWhat m_forWhat;
-};
-
-class XmlWriter
-{
- public:
- class ScopedElement
- {
- public:
- ScopedElement(XmlWriter* writer)
- : m_writer(writer)
- {
- }
-
- ScopedElement(ScopedElement const& other)
- : m_writer(other.m_writer)
- {
- other.m_writer = CATCH_NULL;
- }
-
- ~ScopedElement()
- {
- if (m_writer)
- m_writer->endElement();
- }
-
- ScopedElement& writeText(std::string const& text, bool indent = true)
- {
- m_writer->writeText(text, indent);
- return *this;
- }
-
- template <typename T>
- ScopedElement& writeAttribute(std::string const& name, T const& attribute)
- {
- m_writer->writeAttribute(name, attribute);
- return *this;
- }
-
- private:
- mutable XmlWriter* m_writer;
- };
-
- XmlWriter()
- : m_tagIsOpen(false),
- m_needsNewline(false),
- m_os(&Catch::cout())
- {
- }
-
- XmlWriter(std::ostream& os)
- : m_tagIsOpen(false),
- m_needsNewline(false),
- m_os(&os)
- {
- }
-
- ~XmlWriter()
- {
- while (!m_tags.empty())
- endElement();
- }
-
- XmlWriter& startElement(std::string const& name)
- {
- ensureTagClosed();
- newlineIfNecessary();
- stream() << m_indent << "<" << name;
- m_tags.push_back(name);
- m_indent += " ";
- m_tagIsOpen = true;
- return *this;
- }
-
- ScopedElement scopedElement(std::string const& name)
- {
- ScopedElement scoped(this);
- startElement(name);
- return scoped;
- }
-
- XmlWriter& endElement()
- {
- newlineIfNecessary();
- m_indent = m_indent.substr(0, m_indent.size() - 2);
- if (m_tagIsOpen)
- {
- stream() << "/>\n";
- m_tagIsOpen = false;
- }
- else
- {
- stream() << m_indent << "</" << m_tags.back() << ">\n";
- }
- m_tags.pop_back();
- return *this;
- }
-
- XmlWriter& writeAttribute(std::string const& name, std::string const& attribute)
- {
- if (!name.empty() && !attribute.empty())
- stream() << " " << name << "=\"" << XmlEncode(attribute, XmlEncode::ForAttributes) << "\"";
- return *this;
- }
-
- XmlWriter& writeAttribute(std::string const& name, bool attribute)
- {
- stream() << " " << name << "=\"" << (attribute ? "true" : "false") << "\"";
- return *this;
- }
-
- template <typename T>
- XmlWriter& writeAttribute(std::string const& name, T const& attribute)
- {
- std::ostringstream oss;
- oss << attribute;
- return writeAttribute(name, oss.str());
- }
-
- XmlWriter& writeText(std::string const& text, bool indent = true)
- {
- if (!text.empty())
- {
- bool tagWasOpen = m_tagIsOpen;
- ensureTagClosed();
- if (tagWasOpen && indent)
- stream() << m_indent;
- stream() << XmlEncode(text);
- m_needsNewline = true;
- }
- return *this;
- }
-
- XmlWriter& writeComment(std::string const& text)
- {
- ensureTagClosed();
- stream() << m_indent << "<!--" << text << "-->";
- m_needsNewline = true;
- return *this;
- }
-
- XmlWriter& writeBlankLine()
- {
- ensureTagClosed();
- stream() << "\n";
- return *this;
- }
-
- void setStream(std::ostream& os)
- {
- m_os = &os;
- }
-
- private:
- XmlWriter(XmlWriter const&);
- void operator=(XmlWriter const&);
-
- std::ostream& stream()
- {
- return *m_os;
- }
-
- void ensureTagClosed()
- {
- if (m_tagIsOpen)
- {
- stream() << ">\n";
- m_tagIsOpen = false;
- }
- }
-
- void newlineIfNecessary()
- {
- if (m_needsNewline)
- {
- stream() << "\n";
- m_needsNewline = false;
- }
- }
-
- bool m_tagIsOpen;
- bool m_needsNewline;
- std::vector<std::string> m_tags;
- std::string m_indent;
- std::ostream* m_os;
-};
-}
-// #included from: catch_reenable_warnings.h
-
-#define TWOBLUECUBES_CATCH_REENABLE_WARNINGS_H_INCLUDED
-
-#ifdef __clang__
-#ifdef __ICC // icpc defines the __clang__ macro
-#pragma warning(pop)
-#else
-#pragma clang diagnostic pop
-#endif
-#elif defined __GNUC__
-#pragma GCC diagnostic pop
-#endif
-
-namespace Catch {
-class XmlReporter : public StreamingReporterBase
-{
- public:
- XmlReporter(ReporterConfig const& _config)
- : StreamingReporterBase(_config),
- m_sectionDepth(0)
- {
- m_reporterPrefs.shouldRedirectStdOut = true;
- }
-
- virtual ~XmlReporter() CATCH_OVERRIDE;
-
- static std::string getDescription()
- {
- return "Reports test results as an XML document";
- }
-
- public: // StreamingReporterBase
- virtual void noMatchingTestCases(std::string const& s) CATCH_OVERRIDE
- {
- StreamingReporterBase::noMatchingTestCases(s);
- }
-
- virtual void testRunStarting(TestRunInfo const& testInfo) CATCH_OVERRIDE
- {
- StreamingReporterBase::testRunStarting(testInfo);
- m_xml.setStream(stream);
- m_xml.startElement("Catch");
- if (!m_config->name().empty())
- m_xml.writeAttribute("name", m_config->name());
- }
-
- virtual void testGroupStarting(GroupInfo const& groupInfo) CATCH_OVERRIDE
- {
- StreamingReporterBase::testGroupStarting(groupInfo);
- m_xml.startElement("Group")
- .writeAttribute("name", groupInfo.name);
- }
-
- virtual void testCaseStarting(TestCaseInfo const& testInfo) CATCH_OVERRIDE
- {
- StreamingReporterBase::testCaseStarting(testInfo);
- m_xml.startElement("TestCase").writeAttribute("name", trim(testInfo.name));
-
- if (m_config->showDurations() == ShowDurations::Always)
- m_testCaseTimer.start();
- }
-
- virtual void sectionStarting(SectionInfo const& sectionInfo) CATCH_OVERRIDE
- {
- StreamingReporterBase::sectionStarting(sectionInfo);
- if (m_sectionDepth++ > 0)
- {
- m_xml.startElement("Section")
- .writeAttribute("name", trim(sectionInfo.name))
- .writeAttribute("description", sectionInfo.description);
- }
- }
-
- virtual void assertionStarting(AssertionInfo const&) CATCH_OVERRIDE {}
-
- virtual bool assertionEnded(AssertionStats const& assertionStats) CATCH_OVERRIDE
- {
- const AssertionResult& assertionResult = assertionStats.assertionResult;
-
- // Print any info messages in <Info> tags.
- if (assertionStats.assertionResult.getResultType() != ResultWas::Ok)
- {
- for (std::vector<MessageInfo>::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end();
- it != itEnd;
- ++it)
- {
- if (it->type == ResultWas::Info)
- {
- m_xml.scopedElement("Info")
- .writeText(it->message);
- }
- else if (it->type == ResultWas::Warning)
- {
- m_xml.scopedElement("Warning")
- .writeText(it->message);
- }
- }
- }
-
- // Drop out if result was successful but we're not printing them.
- if (!m_config->includeSuccessfulResults() && isOk(assertionResult.getResultType()))
- return true;
-
- // Print the expression if there is one.
- if (assertionResult.hasExpression())
- {
- m_xml.startElement("Expression")
- .writeAttribute("success", assertionResult.succeeded())
- .writeAttribute("type", assertionResult.getTestMacroName())
- .writeAttribute("filename", assertionResult.getSourceInfo().file)
- .writeAttribute("line", assertionResult.getSourceInfo().line);
-
- m_xml.scopedElement("Original")
- .writeText(assertionResult.getExpression());
- m_xml.scopedElement("Expanded")
- .writeText(assertionResult.getExpandedExpression());
- }
-
- // And... Print a result applicable to each result type.
- switch (assertionResult.getResultType())
- {
- case ResultWas::ThrewException:
- m_xml.scopedElement("Exception")
- .writeAttribute("filename", assertionResult.getSourceInfo().file)
- .writeAttribute("line", assertionResult.getSourceInfo().line)
- .writeText(assertionResult.getMessage());
- break;
- case ResultWas::FatalErrorCondition:
- m_xml.scopedElement("Fatal Error Condition")
- .writeAttribute("filename", assertionResult.getSourceInfo().file)
- .writeAttribute("line", assertionResult.getSourceInfo().line)
- .writeText(assertionResult.getMessage());
- break;
- case ResultWas::Info:
- m_xml.scopedElement("Info")
- .writeText(assertionResult.getMessage());
- break;
- case ResultWas::Warning:
- // Warning will already have been written
- break;
- case ResultWas::ExplicitFailure:
- m_xml.scopedElement("Failure")
- .writeText(assertionResult.getMessage());
- break;
- default:
- break;
- }
-
- if (assertionResult.hasExpression())
- m_xml.endElement();
-
- return true;
- }
-
- virtual void sectionEnded(SectionStats const& sectionStats) CATCH_OVERRIDE
- {
- StreamingReporterBase::sectionEnded(sectionStats);
- if (--m_sectionDepth > 0)
- {
- XmlWriter::ScopedElement e = m_xml.scopedElement("OverallResults");
- e.writeAttribute("successes", sectionStats.assertions.passed);
- e.writeAttribute("failures", sectionStats.assertions.failed);
- e.writeAttribute("expectedFailures", sectionStats.assertions.failedButOk);
-
- if (m_config->showDurations() == ShowDurations::Always)
- e.writeAttribute("durationInSeconds", sectionStats.durationInSeconds);
-
- m_xml.endElement();
- }
- }
-
- virtual void testCaseEnded(TestCaseStats const& testCaseStats) CATCH_OVERRIDE
- {
- StreamingReporterBase::testCaseEnded(testCaseStats);
- XmlWriter::ScopedElement e = m_xml.scopedElement("OverallResult");
- e.writeAttribute("success", testCaseStats.totals.assertions.allOk());
-
- if (m_config->showDurations() == ShowDurations::Always)
- e.writeAttribute("durationInSeconds", m_testCaseTimer.getElapsedSeconds());
-
- m_xml.endElement();
- }
-
- virtual void testGroupEnded(TestGroupStats const& testGroupStats) CATCH_OVERRIDE
- {
- StreamingReporterBase::testGroupEnded(testGroupStats);
- // TODO: Check testGroupStats.aborting and act accordingly.
- m_xml.scopedElement("OverallResults")
- .writeAttribute("successes", testGroupStats.totals.assertions.passed)
- .writeAttribute("failures", testGroupStats.totals.assertions.failed)
- .writeAttribute("expectedFailures", testGroupStats.totals.assertions.failedButOk);
- m_xml.endElement();
- }
-
- virtual void testRunEnded(TestRunStats const& testRunStats) CATCH_OVERRIDE
- {
- StreamingReporterBase::testRunEnded(testRunStats);
- m_xml.scopedElement("OverallResults")
- .writeAttribute("successes", testRunStats.totals.assertions.passed)
- .writeAttribute("failures", testRunStats.totals.assertions.failed)
- .writeAttribute("expectedFailures", testRunStats.totals.assertions.failedButOk);
- m_xml.endElement();
- }
-
- private:
- Timer m_testCaseTimer;
- XmlWriter m_xml;
- int m_sectionDepth;
-};
-
-INTERNAL_CATCH_REGISTER_REPORTER("xml", XmlReporter)
-
-} // end namespace Catch
-
-// #included from: ../reporters/catch_reporter_junit.hpp
-#define TWOBLUECUBES_CATCH_REPORTER_JUNIT_HPP_INCLUDED
-
-#include <assert.h>
-
-namespace Catch {
-
-class JunitReporter : public CumulativeReporterBase
-{
- public:
- JunitReporter(ReporterConfig const& _config)
- : CumulativeReporterBase(_config),
- xml(_config.stream())
- {
- m_reporterPrefs.shouldRedirectStdOut = true;
- }
-
- virtual ~JunitReporter() CATCH_OVERRIDE;
-
- static std::string getDescription()
- {
- return "Reports test results in an XML format that looks like Ant's junitreport target";
- }
-
- virtual void noMatchingTestCases(std::string const& /*spec*/) CATCH_OVERRIDE {}
-
- virtual void testRunStarting(TestRunInfo const& runInfo) CATCH_OVERRIDE
- {
- CumulativeReporterBase::testRunStarting(runInfo);
- xml.startElement("testsuites");
- }
-
- virtual void testGroupStarting(GroupInfo const& groupInfo) CATCH_OVERRIDE
- {
- suiteTimer.start();
- stdOutForSuite.str("");
- stdErrForSuite.str("");
- unexpectedExceptions = 0;
- CumulativeReporterBase::testGroupStarting(groupInfo);
- }
-
- virtual bool assertionEnded(AssertionStats const& assertionStats) CATCH_OVERRIDE
- {
- if (assertionStats.assertionResult.getResultType() == ResultWas::ThrewException)
- unexpectedExceptions++;
- return CumulativeReporterBase::assertionEnded(assertionStats);
- }
-
- virtual void testCaseEnded(TestCaseStats const& testCaseStats) CATCH_OVERRIDE
- {
- stdOutForSuite << testCaseStats.stdOut;
- stdErrForSuite << testCaseStats.stdErr;
- CumulativeReporterBase::testCaseEnded(testCaseStats);
- }
-
- virtual void testGroupEnded(TestGroupStats const& testGroupStats) CATCH_OVERRIDE
- {
- double suiteTime = suiteTimer.getElapsedSeconds();
- CumulativeReporterBase::testGroupEnded(testGroupStats);
- writeGroup(*m_testGroups.back(), suiteTime);
- }
-
- virtual void testRunEndedCumulative() CATCH_OVERRIDE
- {
- xml.endElement();
- }
-
- void writeGroup(TestGroupNode const& groupNode, double suiteTime)
- {
- XmlWriter::ScopedElement e = xml.scopedElement("testsuite");
- TestGroupStats const& stats = groupNode.value;
- xml.writeAttribute("name", stats.groupInfo.name);
- xml.writeAttribute("errors", unexpectedExceptions);
- xml.writeAttribute("failures", stats.totals.assertions.failed - unexpectedExceptions);
- xml.writeAttribute("tests", stats.totals.assertions.total());
- xml.writeAttribute("hostname", "tbd"); // !TBD
- if (m_config->showDurations() == ShowDurations::Never)
- xml.writeAttribute("time", "");
- else
- xml.writeAttribute("time", suiteTime);
- xml.writeAttribute("timestamp", "tbd"); // !TBD
-
- // Write test cases
- for (TestGroupNode::ChildNodes::const_iterator
- it = groupNode.children.begin(),
- itEnd = groupNode.children.end();
- it != itEnd;
- ++it)
- writeTestCase(**it);
-
- xml.scopedElement("system-out").writeText(trim(stdOutForSuite.str()), false);
- xml.scopedElement("system-err").writeText(trim(stdErrForSuite.str()), false);
- }
-
- void writeTestCase(TestCaseNode const& testCaseNode)
- {
- TestCaseStats const& stats = testCaseNode.value;
-
- // All test cases have exactly one section - which represents the
- // test case itself. That section may have 0-n nested sections
- assert(testCaseNode.children.size() == 1);
- SectionNode const& rootSection = *testCaseNode.children.front();
-
- std::string className = stats.testInfo.className;
-
- if (className.empty())
- {
- if (rootSection.childSections.empty())
- className = "global";
- }
- writeSection(className, "", rootSection);
- }
-
- void writeSection(std::string const& className,
- std::string const& rootName,
- SectionNode const& sectionNode)
- {
- std::string name = trim(sectionNode.stats.sectionInfo.name);
- if (!rootName.empty())
- name = rootName + "/" + name;
-
- if (!sectionNode.assertions.empty() ||
- !sectionNode.stdOut.empty() ||
- !sectionNode.stdErr.empty())
- {
- XmlWriter::ScopedElement e = xml.scopedElement("testcase");
- if (className.empty())
- {
- xml.writeAttribute("classname", name);
- xml.writeAttribute("name", "root");
- }
- else
- {
- xml.writeAttribute("classname", className);
- xml.writeAttribute("name", name);
- }
- xml.writeAttribute("time", Catch::toString(sectionNode.stats.durationInSeconds));
-
- writeAssertions(sectionNode);
-
- if (!sectionNode.stdOut.empty())
- xml.scopedElement("system-out").writeText(trim(sectionNode.stdOut), false);
- if (!sectionNode.stdErr.empty())
- xml.scopedElement("system-err").writeText(trim(sectionNode.stdErr), false);
- }
- for (SectionNode::ChildSections::const_iterator
- it = sectionNode.childSections.begin(),
- itEnd = sectionNode.childSections.end();
- it != itEnd;
- ++it)
- if (className.empty())
- writeSection(name, "", **it);
- else
- writeSection(className, name, **it);
- }
-
- void writeAssertions(SectionNode const& sectionNode)
- {
- for (SectionNode::Assertions::const_iterator
- it = sectionNode.assertions.begin(),
- itEnd = sectionNode.assertions.end();
- it != itEnd;
- ++it)
- writeAssertion(*it);
- }
- void writeAssertion(AssertionStats const& stats)
- {
- AssertionResult const& result = stats.assertionResult;
- if (!result.isOk())
- {
- std::string elementName;
- switch (result.getResultType())
- {
- case ResultWas::ThrewException:
- case ResultWas::FatalErrorCondition:
- elementName = "error";
- break;
- case ResultWas::ExplicitFailure:
- elementName = "failure";
- break;
- case ResultWas::ExpressionFailed:
- elementName = "failure";
- break;
- case ResultWas::DidntThrowException:
- elementName = "failure";
- break;
-
- // We should never see these here:
- case ResultWas::Info:
- case ResultWas::Warning:
- case ResultWas::Ok:
- case ResultWas::Unknown:
- case ResultWas::FailureBit:
- case ResultWas::Exception:
- elementName = "internalError";
- break;
- }
-
- XmlWriter::ScopedElement e = xml.scopedElement(elementName);
-
- xml.writeAttribute("message", result.getExpandedExpression());
- xml.writeAttribute("type", result.getTestMacroName());
-
- std::ostringstream oss;
- if (!result.getMessage().empty())
- oss << result.getMessage() << "\n";
- for (std::vector<MessageInfo>::const_iterator
- it = stats.infoMessages.begin(),
- itEnd = stats.infoMessages.end();
- it != itEnd;
- ++it)
- if (it->type == ResultWas::Info)
- oss << it->message << "\n";
-
- oss << "at " << result.getSourceInfo();
- xml.writeText(oss.str(), false);
- }
- }
-
- XmlWriter xml;
- Timer suiteTimer;
- std::ostringstream stdOutForSuite;
- std::ostringstream stdErrForSuite;
- unsigned int unexpectedExceptions;
-};
-
-INTERNAL_CATCH_REGISTER_REPORTER("junit", JunitReporter)
-
-} // end namespace Catch
-
-// #included from: ../reporters/catch_reporter_console.hpp
-#define TWOBLUECUBES_CATCH_REPORTER_CONSOLE_HPP_INCLUDED
-
-namespace Catch {
-
-struct ConsoleReporter : StreamingReporterBase
-{
- ConsoleReporter(ReporterConfig const& _config)
- : StreamingReporterBase(_config),
- m_headerPrinted(false)
- {
- }
-
- virtual ~ConsoleReporter() CATCH_OVERRIDE;
- static std::string getDescription()
- {
- return "Reports test results as plain lines of text";
- }
-
- virtual void noMatchingTestCases(std::string const& spec) CATCH_OVERRIDE
- {
- stream << "No test cases matched '" << spec << "'" << std::endl;
- }
-
- virtual void assertionStarting(AssertionInfo const&) CATCH_OVERRIDE
- {
- }
-
- virtual bool assertionEnded(AssertionStats const& _assertionStats) CATCH_OVERRIDE
- {
- AssertionResult const& result = _assertionStats.assertionResult;
-
- bool printInfoMessages = true;
-
- // Drop out if result was successful and we're not printing those
- if (!m_config->includeSuccessfulResults() && result.isOk())
- {
- if (result.getResultType() != ResultWas::Warning)
- return false;
- printInfoMessages = false;
- }
-
- lazyPrint();
-
- AssertionPrinter printer(stream, _assertionStats, printInfoMessages);
- printer.print();
- stream << std::endl;
- return true;
- }
-
- virtual void sectionStarting(SectionInfo const& _sectionInfo) CATCH_OVERRIDE
- {
- m_headerPrinted = false;
- StreamingReporterBase::sectionStarting(_sectionInfo);
- }
- virtual void sectionEnded(SectionStats const& _sectionStats) CATCH_OVERRIDE
- {
- if (_sectionStats.missingAssertions)
- {
- lazyPrint();
- Colour colour(Colour::ResultError);
- if (m_sectionStack.size() > 1)
- stream << "\nNo assertions in section";
- else
- stream << "\nNo assertions in test case";
- stream << " '" << _sectionStats.sectionInfo.name << "'\n"
- << std::endl;
- }
- if (m_headerPrinted)
- {
- if (m_config->showDurations() == ShowDurations::Always)
- stream << "Completed in " << _sectionStats.durationInSeconds << "s" << std::endl;
- m_headerPrinted = false;
- }
- else
- {
- if (m_config->showDurations() == ShowDurations::Always)
- stream << _sectionStats.sectionInfo.name << " completed in " << _sectionStats.durationInSeconds << "s" << std::endl;
- }
- StreamingReporterBase::sectionEnded(_sectionStats);
- }
-
- virtual void testCaseEnded(TestCaseStats const& _testCaseStats) CATCH_OVERRIDE
- {
- StreamingReporterBase::testCaseEnded(_testCaseStats);
- m_headerPrinted = false;
- }
- virtual void testGroupEnded(TestGroupStats const& _testGroupStats) CATCH_OVERRIDE
- {
- if (currentGroupInfo.used)
- {
- printSummaryDivider();
- stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n";
- printTotals(_testGroupStats.totals);
- stream << "\n"
- << std::endl;
- }
- StreamingReporterBase::testGroupEnded(_testGroupStats);
- }
- virtual void testRunEnded(TestRunStats const& _testRunStats) CATCH_OVERRIDE
- {
- printTotalsDivider(_testRunStats.totals);
- printTotals(_testRunStats.totals);
- stream << std::endl;
- StreamingReporterBase::testRunEnded(_testRunStats);
- }
-
- private:
- class AssertionPrinter
- {
- void operator=(AssertionPrinter const&);
-
- public:
- AssertionPrinter(std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages)
- : stream(_stream),
- stats(_stats),
- result(_stats.assertionResult),
- colour(Colour::None),
- message(result.getMessage()),
- messages(_stats.infoMessages),
- printInfoMessages(_printInfoMessages)
- {
- switch (result.getResultType())
- {
- case ResultWas::Ok:
- colour = Colour::Success;
- passOrFail = "PASSED";
- //if( result.hasMessage() )
- if (_stats.infoMessages.size() == 1)
- messageLabel = "with message";
- if (_stats.infoMessages.size() > 1)
- messageLabel = "with messages";
- break;
- case ResultWas::ExpressionFailed:
- if (result.isOk())
- {
- colour = Colour::Success;
- passOrFail = "FAILED - but was ok";
- }
- else
- {
- colour = Colour::Error;
- passOrFail = "FAILED";
- }
- if (_stats.infoMessages.size() == 1)
- messageLabel = "with message";
- if (_stats.infoMessages.size() > 1)
- messageLabel = "with messages";
- break;
- case ResultWas::ThrewException:
- colour = Colour::Error;
- passOrFail = "FAILED";
- messageLabel = "due to unexpected exception with message";
- break;
- case ResultWas::FatalErrorCondition:
- colour = Colour::Error;
- passOrFail = "FAILED";
- messageLabel = "due to a fatal error condition";
- break;
- case ResultWas::DidntThrowException:
- colour = Colour::Error;
- passOrFail = "FAILED";
- messageLabel = "because no exception was thrown where one was expected";
- break;
- case ResultWas::Info:
- messageLabel = "info";
- break;
- case ResultWas::Warning:
- messageLabel = "warning";
- break;
- case ResultWas::ExplicitFailure:
- passOrFail = "FAILED";
- colour = Colour::Error;
- if (_stats.infoMessages.size() == 1)
- messageLabel = "explicitly with message";
- if (_stats.infoMessages.size() > 1)
- messageLabel = "explicitly with messages";
- break;
- // These cases are here to prevent compiler warnings
- case ResultWas::Unknown:
- case ResultWas::FailureBit:
- case ResultWas::Exception:
- passOrFail = "** internal error **";
- colour = Colour::Error;
- break;
- }
- }
-
- void print() const
- {
- printSourceInfo();
- if (stats.totals.assertions.total() > 0)
- {
- if (result.isOk())
- stream << "\n";
- printResultType();
- printOriginalExpression();
- printReconstructedExpression();
- }
- else
- {
- stream << "\n";
- }
- printMessage();
- }
-
- private:
- void printResultType() const
- {
- if (!passOrFail.empty())
- {
- Colour colourGuard(colour);
- stream << passOrFail << ":\n";
- }
- }
- void printOriginalExpression() const
- {
- if (result.hasExpression())
- {
- Colour colourGuard(Colour::OriginalExpression);
- stream << " ";
- stream << result.getExpressionInMacro();
- stream << "\n";
- }
- }
- void printReconstructedExpression() const
- {
- if (result.hasExpandedExpression())
- {
- stream << "with expansion:\n";
- Colour colourGuard(Colour::ReconstructedExpression);
- stream << Text(result.getExpandedExpression(), TextAttributes().setIndent(2)) << "\n";
- }
- }
- void printMessage() const
- {
- if (!messageLabel.empty())
- stream << messageLabel << ":"
- << "\n";
- for (std::vector<MessageInfo>::const_iterator it = messages.begin(), itEnd = messages.end();
- it != itEnd;
- ++it)
- {
- // If this assertion is a warning ignore any INFO messages
- if (printInfoMessages || it->type != ResultWas::Info)
- stream << Text(it->message, TextAttributes().setIndent(2)) << "\n";
- }
- }
- void printSourceInfo() const
- {
- Colour colourGuard(Colour::FileName);
- stream << result.getSourceInfo() << ": ";
- }
-
- std::ostream& stream;
- AssertionStats const& stats;
- AssertionResult const& result;
- Colour::Code colour;
- std::string passOrFail;
- std::string messageLabel;
- std::string message;
- std::vector<MessageInfo> messages;
- bool printInfoMessages;
- };
-
- void lazyPrint()
- {
-
- if (!currentTestRunInfo.used)
- lazyPrintRunInfo();
- if (!currentGroupInfo.used)
- lazyPrintGroupInfo();
-
- if (!m_headerPrinted)
- {
- printTestCaseAndSectionHeader();
- m_headerPrinted = true;
- }
- }
- void lazyPrintRunInfo()
- {
- stream << "\n"
- << getLineOfChars<'~'>() << "\n";
- Colour colour(Colour::SecondaryText);
- stream << currentTestRunInfo->name
- << " is a Catch v" << libraryVersion << " host application.\n"
- << "Run with -? for options\n\n";
-
- if (m_config->rngSeed() != 0)
- stream << "Randomness seeded to: " << m_config->rngSeed() << "\n\n";
-
- currentTestRunInfo.used = true;
- }
- void lazyPrintGroupInfo()
- {
- if (!currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1)
- {
- printClosedHeader("Group: " + currentGroupInfo->name);
- currentGroupInfo.used = true;
- }
- }
- void printTestCaseAndSectionHeader()
- {
- assert(!m_sectionStack.empty());
- printOpenHeader(currentTestCaseInfo->name);
-
- if (m_sectionStack.size() > 1)
- {
- Colour colourGuard(Colour::Headers);
-
- std::vector<SectionInfo>::const_iterator
- it = m_sectionStack.begin() + 1, // Skip first section (test case)
- itEnd = m_sectionStack.end();
- for (; it != itEnd; ++it)
- printHeaderString(it->name, 2);
- }
-
- SourceLineInfo lineInfo = m_sectionStack.front().lineInfo;
-
- if (!lineInfo.empty())
- {
- stream << getLineOfChars<'-'>() << "\n";
- Colour colourGuard(Colour::FileName);
- stream << lineInfo << "\n";
- }
- stream << getLineOfChars<'.'>() << "\n"
- << std::endl;
- }
-
- void printClosedHeader(std::string const& _name)
- {
- printOpenHeader(_name);
- stream << getLineOfChars<'.'>() << "\n";
- }
- void printOpenHeader(std::string const& _name)
- {
- stream << getLineOfChars<'-'>() << "\n";
- {
- Colour colourGuard(Colour::Headers);
- printHeaderString(_name);
- }
- }
-
- // if string has a : in first line will set indent to follow it on
- // subsequent lines
- void printHeaderString(std::string const& _string, std::size_t indent = 0)
- {
- std::size_t i = _string.find(": ");
- if (i != std::string::npos)
- i += 2;
- else
- i = 0;
- stream << Text(_string, TextAttributes()
- .setIndent(indent + i)
- .setInitialIndent(indent))
- << "\n";
- }
-
- struct SummaryColumn
- {
-
- SummaryColumn(std::string const& _label, Colour::Code _colour)
- : label(_label),
- colour(_colour)
- {
- }
- SummaryColumn addRow(std::size_t count)
- {
- std::ostringstream oss;
- oss << count;
- std::string row = oss.str();
- for (std::vector<std::string>::iterator it = rows.begin(); it != rows.end(); ++it)
- {
- while (it->size() < row.size())
- *it = " " + *it;
- while (it->size() > row.size())
- row = " " + row;
- }
- rows.push_back(row);
- return *this;
- }
-
- std::string label;
- Colour::Code colour;
- std::vector<std::string> rows;
- };
-
- void printTotals(Totals const& totals)
- {
- if (totals.testCases.total() == 0)
- {
- stream << Colour(Colour::Warning) << "No tests ran\n";
- }
- else if (totals.assertions.total() > 0 && totals.assertions.allPassed())
- {
- stream << Colour(Colour::ResultSuccess) << "All tests passed";
- stream << " ("
- << pluralise(totals.assertions.passed, "assertion") << " in "
- << pluralise(totals.testCases.passed, "test case") << ")"
- << "\n";
- }
- else
- {
-
- std::vector<SummaryColumn> columns;
- columns.push_back(SummaryColumn("", Colour::None)
- .addRow(totals.testCases.total())
- .addRow(totals.assertions.total()));
- columns.push_back(SummaryColumn("passed", Colour::Success)
- .addRow(totals.testCases.passed)
- .addRow(totals.assertions.passed));
- columns.push_back(SummaryColumn("failed", Colour::ResultError)
- .addRow(totals.testCases.failed)
- .addRow(totals.assertions.failed));
- columns.push_back(SummaryColumn("failed as expected", Colour::ResultExpectedFailure)
- .addRow(totals.testCases.failedButOk)
- .addRow(totals.assertions.failedButOk));
-
- printSummaryRow("test cases", columns, 0);
- printSummaryRow("assertions", columns, 1);
- }
- }
- void printSummaryRow(std::string const& label, std::vector<SummaryColumn> const& cols, std::size_t row)
- {
- for (std::vector<SummaryColumn>::const_iterator it = cols.begin(); it != cols.end(); ++it)
- {
- std::string value = it->rows[row];
- if (it->label.empty())
- {
- stream << label << ": ";
- if (value != "0")
- stream << value;
- else
- stream << Colour(Colour::Warning) << "- none -";
- }
- else if (value != "0")
- {
- stream << Colour(Colour::LightGrey) << " | ";
- stream << Colour(it->colour)
- << value << " " << it->label;
- }
- }
- stream << "\n";
- }
-
- static std::size_t makeRatio(std::size_t number, std::size_t total)
- {
- std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number / total : 0;
- return (ratio == 0 && number > 0) ? 1 : ratio;
- }
- static std::size_t& findMax(std::size_t& i, std::size_t& j, std::size_t& k)
- {
- if (i > j && i > k)
- return i;
- else if (j > k)
- return j;
- else
- return k;
- }
-
- void printTotalsDivider(Totals const& totals)
- {
- if (totals.testCases.total() > 0)
- {
- std::size_t failedRatio = makeRatio(totals.testCases.failed, totals.testCases.total());
- std::size_t failedButOkRatio = makeRatio(totals.testCases.failedButOk, totals.testCases.total());
- std::size_t passedRatio = makeRatio(totals.testCases.passed, totals.testCases.total());
- while (failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH - 1)
- findMax(failedRatio, failedButOkRatio, passedRatio)++;
- while (failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH - 1)
- findMax(failedRatio, failedButOkRatio, passedRatio)--;
-
- stream << Colour(Colour::Error) << std::string(failedRatio, '=');
- stream << Colour(Colour::ResultExpectedFailure) << std::string(failedButOkRatio, '=');
- if (totals.testCases.allPassed())
- stream << Colour(Colour::ResultSuccess) << std::string(passedRatio, '=');
- else
- stream << Colour(Colour::Success) << std::string(passedRatio, '=');
- }
- else
- {
- stream << Colour(Colour::Warning) << std::string(CATCH_CONFIG_CONSOLE_WIDTH - 1, '=');
- }
- stream << "\n";
- }
- void printSummaryDivider()
- {
- stream << getLineOfChars<'-'>() << "\n";
- }
-
- private:
- bool m_headerPrinted;
-};
-
-INTERNAL_CATCH_REGISTER_REPORTER("console", ConsoleReporter)
-
-} // end namespace Catch
-
-// #included from: ../reporters/catch_reporter_compact.hpp
-#define TWOBLUECUBES_CATCH_REPORTER_COMPACT_HPP_INCLUDED
-
-namespace Catch {
-
-struct CompactReporter : StreamingReporterBase
-{
-
- CompactReporter(ReporterConfig const& _config)
- : StreamingReporterBase(_config)
- {
- }
-
- virtual ~CompactReporter();
-
- static std::string getDescription()
- {
- return "Reports test results on a single line, suitable for IDEs";
- }
-
- virtual ReporterPreferences getPreferences() const
- {
- ReporterPreferences prefs;
- prefs.shouldRedirectStdOut = false;
- return prefs;
- }
-
- virtual void noMatchingTestCases(std::string const& spec)
- {
- stream << "No test cases matched '" << spec << "'" << std::endl;
- }
-
- virtual void assertionStarting(AssertionInfo const&)
- {
- }
-
- virtual bool assertionEnded(AssertionStats const& _assertionStats)
- {
- AssertionResult const& result = _assertionStats.assertionResult;
-
- bool printInfoMessages = true;
-
- // Drop out if result was successful and we're not printing those
- if (!m_config->includeSuccessfulResults() && result.isOk())
- {
- if (result.getResultType() != ResultWas::Warning)
- return false;
- printInfoMessages = false;
- }
-
- AssertionPrinter printer(stream, _assertionStats, printInfoMessages);
- printer.print();
-
- stream << std::endl;
- return true;
- }
-
- virtual void testRunEnded(TestRunStats const& _testRunStats)
- {
- printTotals(_testRunStats.totals);
- stream << "\n"
- << std::endl;
- StreamingReporterBase::testRunEnded(_testRunStats);
- }
-
- private:
- class AssertionPrinter
- {
- void operator=(AssertionPrinter const&);
-
- public:
- AssertionPrinter(std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages)
- : stream(_stream), stats(_stats), result(_stats.assertionResult), messages(_stats.infoMessages), itMessage(_stats.infoMessages.begin()), printInfoMessages(_printInfoMessages)
- {
- }
-
- void print()
- {
- printSourceInfo();
-
- itMessage = messages.begin();
-
- switch (result.getResultType())
- {
- case ResultWas::Ok:
- printResultType(Colour::ResultSuccess, passedString());
- printOriginalExpression();
- printReconstructedExpression();
- if (!result.hasExpression())
- printRemainingMessages(Colour::None);
- else
- printRemainingMessages();
- break;
- case ResultWas::ExpressionFailed:
- if (result.isOk())
- printResultType(Colour::ResultSuccess, failedString() + std::string(" - but was ok"));
- else
- printResultType(Colour::Error, failedString());
- printOriginalExpression();
- printReconstructedExpression();
- printRemainingMessages();
- break;
- case ResultWas::ThrewException:
- printResultType(Colour::Error, failedString());
- printIssue("unexpected exception with message:");
- printMessage();
- printExpressionWas();
- printRemainingMessages();
- break;
- case ResultWas::FatalErrorCondition:
- printResultType(Colour::Error, failedString());
- printIssue("fatal error condition with message:");
- printMessage();
- printExpressionWas();
- printRemainingMessages();
- break;
- case ResultWas::DidntThrowException:
- printResultType(Colour::Error, failedString());
- printIssue("expected exception, got none");
- printExpressionWas();
- printRemainingMessages();
- break;
- case ResultWas::Info:
- printResultType(Colour::None, "info");
- printMessage();
- printRemainingMessages();
- break;
- case ResultWas::Warning:
- printResultType(Colour::None, "warning");
- printMessage();
- printRemainingMessages();
- break;
- case ResultWas::ExplicitFailure:
- printResultType(Colour::Error, failedString());
- printIssue("explicitly");
- printRemainingMessages(Colour::None);
- break;
- // These cases are here to prevent compiler warnings
- case ResultWas::Unknown:
- case ResultWas::FailureBit:
- case ResultWas::Exception:
- printResultType(Colour::Error, "** internal error **");
- break;
- }
- }
-
- private:
- // Colour::LightGrey
-
- static Colour::Code dimColour() { return Colour::FileName; }
-
-#ifdef CATCH_PLATFORM_MAC
- static const char* failedString()
- {
- return "FAILED";
- }
- static const char* passedString() { return "PASSED"; }
-#else
- static const char* failedString()
- {
- return "failed";
- }
- static const char* passedString() { return "passed"; }
-#endif
-
- void printSourceInfo() const
- {
- Colour colourGuard(Colour::FileName);
- stream << result.getSourceInfo() << ":";
- }
-
- void printResultType(Colour::Code colour, std::string passOrFail) const
- {
- if (!passOrFail.empty())
- {
- {
- Colour colourGuard(colour);
- stream << " " << passOrFail;
- }
- stream << ":";
- }
- }
-
- void printIssue(std::string issue) const
- {
- stream << " " << issue;
- }
-
- void printExpressionWas()
- {
- if (result.hasExpression())
- {
- stream << ";";
- {
- Colour colour(dimColour());
- stream << " expression was:";
- }
- printOriginalExpression();
- }
- }
-
- void printOriginalExpression() const
- {
- if (result.hasExpression())
- {
- stream << " " << result.getExpression();
- }
- }
-
- void printReconstructedExpression() const
- {
- if (result.hasExpandedExpression())
- {
- {
- Colour colour(dimColour());
- stream << " for: ";
- }
- stream << result.getExpandedExpression();
- }
- }
-
- void printMessage()
- {
- if (itMessage != messages.end())
- {
- stream << " '" << itMessage->message << "'";
- ++itMessage;
- }
- }
-
- void printRemainingMessages(Colour::Code colour = dimColour())
- {
- if (itMessage == messages.end())
- return;
-
- // using messages.end() directly yields compilation error:
- std::vector<MessageInfo>::const_iterator itEnd = messages.end();
- const std::size_t N = static_cast<std::size_t>(std::distance(itMessage, itEnd));
-
- {
- Colour colourGuard(colour);
- stream << " with " << pluralise(N, "message") << ":";
- }
-
- for (; itMessage != itEnd;)
- {
- // If this assertion is a warning ignore any INFO messages
- if (printInfoMessages || itMessage->type != ResultWas::Info)
- {
- stream << " '" << itMessage->message << "'";
- if (++itMessage != itEnd)
- {
- Colour colourGuard(dimColour());
- stream << " and";
- }
- }
- }
- }
-
- private:
- std::ostream& stream;
- AssertionStats const& stats;
- AssertionResult const& result;
- std::vector<MessageInfo> messages;
- std::vector<MessageInfo>::const_iterator itMessage;
- bool printInfoMessages;
- };
-
- // Colour, message variants:
- // - white: No tests ran.
- // - red: Failed [both/all] N test cases, failed [both/all] M assertions.
- // - white: Passed [both/all] N test cases (no assertions).
- // - red: Failed N tests cases, failed M assertions.
- // - green: Passed [both/all] N tests cases with M assertions.
-
- std::string bothOrAll(std::size_t count) const
- {
- return count == 1 ? "" : count == 2 ? "both " : "all ";
- }
-
- void printTotals(const Totals& totals) const
- {
- if (totals.testCases.total() == 0)
- {
- stream << "No tests ran.";
- }
- else if (totals.testCases.failed == totals.testCases.total())
- {
- Colour colour(Colour::ResultError);
- const std::string qualify_assertions_failed =
- totals.assertions.failed == totals.assertions.total() ? bothOrAll(totals.assertions.failed) : "";
- stream << "Failed " << bothOrAll(totals.testCases.failed)
- << pluralise(totals.testCases.failed, "test case") << ", "
- "failed "
- << qualify_assertions_failed << pluralise(totals.assertions.failed, "assertion") << ".";
- }
- else if (totals.assertions.total() == 0)
- {
- stream << "Passed " << bothOrAll(totals.testCases.total())
- << pluralise(totals.testCases.total(), "test case")
- << " (no assertions).";
- }
- else if (totals.assertions.failed)
- {
- Colour colour(Colour::ResultError);
- stream << "Failed " << pluralise(totals.testCases.failed, "test case") << ", "
- "failed "
- << pluralise(totals.assertions.failed, "assertion") << ".";
- }
- else
- {
- Colour colour(Colour::ResultSuccess);
- stream << "Passed " << bothOrAll(totals.testCases.passed)
- << pluralise(totals.testCases.passed, "test case") << " with " << pluralise(totals.assertions.passed, "assertion") << ".";
- }
- }
-};
-
-INTERNAL_CATCH_REGISTER_REPORTER("compact", CompactReporter)
-
-} // end namespace Catch
-
-namespace Catch {
-// These are all here to avoid warnings about not having any out of line
-// virtual methods
-NonCopyable::~NonCopyable() {}
-IShared::~IShared() {}
-IStream::~IStream() CATCH_NOEXCEPT {}
-FileStream::~FileStream() CATCH_NOEXCEPT {}
-CoutStream::~CoutStream() CATCH_NOEXCEPT {}
-DebugOutStream::~DebugOutStream() CATCH_NOEXCEPT {}
-StreamBufBase::~StreamBufBase() CATCH_NOEXCEPT {}
-IContext::~IContext() {}
-IResultCapture::~IResultCapture() {}
-ITestCase::~ITestCase() {}
-ITestCaseRegistry::~ITestCaseRegistry() {}
-IRegistryHub::~IRegistryHub() {}
-IMutableRegistryHub::~IMutableRegistryHub() {}
-IExceptionTranslator::~IExceptionTranslator() {}
-IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() {}
-IReporter::~IReporter() {}
-IReporterFactory::~IReporterFactory() {}
-IReporterRegistry::~IReporterRegistry() {}
-IStreamingReporter::~IStreamingReporter() {}
-AssertionStats::~AssertionStats() {}
-SectionStats::~SectionStats() {}
-TestCaseStats::~TestCaseStats() {}
-TestGroupStats::~TestGroupStats() {}
-TestRunStats::~TestRunStats() {}
-CumulativeReporterBase::SectionNode::~SectionNode() {}
-CumulativeReporterBase::~CumulativeReporterBase() {}
-
-StreamingReporterBase::~StreamingReporterBase() {}
-ConsoleReporter::~ConsoleReporter() {}
-CompactReporter::~CompactReporter() {}
-IRunner::~IRunner() {}
-IMutableContext::~IMutableContext() {}
-IConfig::~IConfig() {}
-XmlReporter::~XmlReporter() {}
-JunitReporter::~JunitReporter() {}
-TestRegistry::~TestRegistry() {}
-FreeFunctionTestCase::~FreeFunctionTestCase() {}
-IGeneratorInfo::~IGeneratorInfo() {}
-IGeneratorsForTest::~IGeneratorsForTest() {}
-WildcardPattern::~WildcardPattern() {}
-TestSpec::Pattern::~Pattern() {}
-TestSpec::NamePattern::~NamePattern() {}
-TestSpec::TagPattern::~TagPattern() {}
-TestSpec::ExcludedPattern::~ExcludedPattern() {}
-
-Matchers::Impl::StdString::Equals::~Equals() {}
-Matchers::Impl::StdString::Contains::~Contains() {}
-Matchers::Impl::StdString::StartsWith::~StartsWith() {}
-Matchers::Impl::StdString::EndsWith::~EndsWith() {}
-
-void Config::dummy() {}
-
-namespace TestCaseTracking {
-ITracker::~ITracker() {}
-TrackerBase::~TrackerBase() {}
-SectionTracker::~SectionTracker() {}
-IndexTracker::~IndexTracker() {}
-}
-}
-
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
-
-#endif
-
-#ifdef CATCH_CONFIG_MAIN
-// #included from: internal/catch_default_main.hpp
-#define TWOBLUECUBES_CATCH_DEFAULT_MAIN_HPP_INCLUDED
-
-#ifndef __OBJC__
-
-// Standard C/C++ main entry point
-int main(int argc, char* argv[])
-{
- return Catch::Session().run(argc, argv);
-}
-
-#else // __OBJC__
-
-// Objective-C entry point
-int main(int argc, char* const argv[])
-{
-#if !CATCH_ARC_ENABLED
- NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
-#endif
-
- Catch::registerTestMethods();
- int result = Catch::Session().run(argc, (char* const*)argv);
-
-#if !CATCH_ARC_ENABLED
- [pool drain];
-#endif
-
- return result;
-}
-
-#endif // __OBJC__
-
-#endif
-
-#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED
-#undef CLARA_CONFIG_MAIN
-#endif
-
-//////
-
-// If this config identifier is defined then all CATCH macros are prefixed with CATCH_
-#ifdef CATCH_CONFIG_PREFIX_ALL
-
-#define CATCH_REQUIRE(expr) INTERNAL_CATCH_TEST(expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE")
-#define CATCH_REQUIRE_FALSE(expr) INTERNAL_CATCH_TEST(expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "CATCH_REQUIRE_FALSE")
-
-#define CATCH_REQUIRE_THROWS(expr) INTERNAL_CATCH_THROWS(expr, Catch::ResultDisposition::Normal, "", "CATCH_REQUIRE_THROWS")
-#define CATCH_REQUIRE_THROWS_AS(expr, exceptionType) INTERNAL_CATCH_THROWS_AS(expr, exceptionType, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THROWS_AS")
-#define CATCH_REQUIRE_THROWS_WITH(expr, matcher) INTERNAL_CATCH_THROWS(expr, Catch::ResultDisposition::Normal, matcher, "CATCH_REQUIRE_THROWS_WITH")
-#define CATCH_REQUIRE_NOTHROW(expr) INTERNAL_CATCH_NO_THROW(expr, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_NOTHROW")
-
-#define CATCH_CHECK(expr) INTERNAL_CATCH_TEST(expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK")
-#define CATCH_CHECK_FALSE(expr) INTERNAL_CATCH_TEST(expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CATCH_CHECK_FALSE")
-#define CATCH_CHECKED_IF(expr) INTERNAL_CATCH_IF(expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_IF")
-#define CATCH_CHECKED_ELSE(expr) INTERNAL_CATCH_ELSE(expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECKED_ELSE")
-#define CATCH_CHECK_NOFAIL(expr) INTERNAL_CATCH_TEST(expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CATCH_CHECK_NOFAIL")
-
-#define CATCH_CHECK_THROWS(expr) INTERNAL_CATCH_THROWS(expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS")
-#define CATCH_CHECK_THROWS_AS(expr, exceptionType) INTERNAL_CATCH_THROWS_AS(expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THROWS_AS")
-#define CATCH_CHECK_THROWS_WITH(expr, matcher) INTERNAL_CATCH_THROWS(expr, Catch::ResultDisposition::ContinueOnFailure, matcher, "CATCH_CHECK_THROWS_WITH")
-#define CATCH_CHECK_NOTHROW(expr) INTERNAL_CATCH_NO_THROW(expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_NOTHROW")
-
-#define CHECK_THAT(arg, matcher) INTERNAL_CHECK_THAT(arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THAT")
-#define CATCH_REQUIRE_THAT(arg, matcher) INTERNAL_CHECK_THAT(arg, matcher, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THAT")
-
-#define CATCH_INFO(msg) INTERNAL_CATCH_INFO(msg, "CATCH_INFO")
-#define CATCH_WARN(msg) INTERNAL_CATCH_MSG(Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "CATCH_WARN", msg)
-#define CATCH_SCOPED_INFO(msg) INTERNAL_CATCH_INFO(msg, "CATCH_INFO")
-#define CATCH_CAPTURE(msg) INTERNAL_CATCH_INFO(#msg " := " << msg, "CATCH_CAPTURE")
-#define CATCH_SCOPED_CAPTURE(msg) INTERNAL_CATCH_INFO(#msg " := " << msg, "CATCH_CAPTURE")
-
-#ifdef CATCH_CONFIG_VARIADIC_MACROS
-#define CATCH_TEST_CASE(...) INTERNAL_CATCH_TESTCASE(__VA_ARGS__)
-#define CATCH_TEST_CASE_METHOD(className, ...) INTERNAL_CATCH_TEST_CASE_METHOD(className, __VA_ARGS__)
-#define CATCH_METHOD_AS_TEST_CASE(method, ...) INTERNAL_CATCH_METHOD_AS_TEST_CASE(method, __VA_ARGS__)
-#define CATCH_REGISTER_TEST_CASE(...) INTERNAL_CATCH_REGISTER_TESTCASE(__VA_ARGS__)
-#define CATCH_SECTION(...) INTERNAL_CATCH_SECTION(__VA_ARGS__)
-#define CATCH_FAIL(...) INTERNAL_CATCH_MSG(Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", __VA_ARGS__)
-#define CATCH_SUCCEED(...) INTERNAL_CATCH_MSG(Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", __VA_ARGS__)
-#else
-#define CATCH_TEST_CASE(name, description) INTERNAL_CATCH_TESTCASE(name, description)
-#define CATCH_TEST_CASE_METHOD(className, name, description) INTERNAL_CATCH_TEST_CASE_METHOD(className, name, description)
-#define CATCH_METHOD_AS_TEST_CASE(method, name, description) INTERNAL_CATCH_METHOD_AS_TEST_CASE(method, name, description)
-#define CATCH_REGISTER_TEST_CASE(function, name, description) INTERNAL_CATCH_REGISTER_TESTCASE(function, name, description)
-#define CATCH_SECTION(name, description) INTERNAL_CATCH_SECTION(name, description)
-#define CATCH_FAIL(msg) INTERNAL_CATCH_MSG(Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", msg)
-#define CATCH_SUCCEED(msg) INTERNAL_CATCH_MSG(Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", msg)
-#endif
-#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE("", "")
-
-#define CATCH_REGISTER_REPORTER(name, reporterType) INTERNAL_CATCH_REGISTER_REPORTER(name, reporterType)
-#define CATCH_REGISTER_LEGACY_REPORTER(name, reporterType) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER(name, reporterType)
-
-#define CATCH_GENERATE(expr) INTERNAL_CATCH_GENERATE(expr)
-
-// "BDD-style" convenience wrappers
-#ifdef CATCH_CONFIG_VARIADIC_MACROS
-#define CATCH_SCENARIO(...) CATCH_TEST_CASE("Scenario: " __VA_ARGS__)
-#define CATCH_SCENARIO_METHOD(className, ...) INTERNAL_CATCH_TEST_CASE_METHOD(className, "Scenario: " __VA_ARGS__)
-#else
-#define CATCH_SCENARIO(name, tags) CATCH_TEST_CASE("Scenario: " name, tags)
-#define CATCH_SCENARIO_METHOD(className, name, tags) INTERNAL_CATCH_TEST_CASE_METHOD(className, "Scenario: " name, tags)
-#endif
-#define CATCH_GIVEN(desc) CATCH_SECTION(std::string("Given: ") + desc, "")
-#define CATCH_WHEN(desc) CATCH_SECTION(std::string(" When: ") + desc, "")
-#define CATCH_AND_WHEN(desc) CATCH_SECTION(std::string(" And: ") + desc, "")
-#define CATCH_THEN(desc) CATCH_SECTION(std::string(" Then: ") + desc, "")
-#define CATCH_AND_THEN(desc) CATCH_SECTION(std::string(" And: ") + desc, "")
-
-// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required
-#else
-
-#define REQUIRE(expr) INTERNAL_CATCH_TEST(expr, Catch::ResultDisposition::Normal, "REQUIRE")
-#define REQUIRE_FALSE(expr) INTERNAL_CATCH_TEST(expr, Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, "REQUIRE_FALSE")
-
-#define REQUIRE_THROWS(expr) INTERNAL_CATCH_THROWS(expr, Catch::ResultDisposition::Normal, "", "REQUIRE_THROWS")
-#define REQUIRE_THROWS_AS(expr, exceptionType) INTERNAL_CATCH_THROWS_AS(expr, exceptionType, Catch::ResultDisposition::Normal, "REQUIRE_THROWS_AS")
-#define REQUIRE_THROWS_WITH(expr, matcher) INTERNAL_CATCH_THROWS(expr, Catch::ResultDisposition::Normal, matcher, "REQUIRE_THROWS_WITH")
-#define REQUIRE_NOTHROW(expr) INTERNAL_CATCH_NO_THROW(expr, Catch::ResultDisposition::Normal, "REQUIRE_NOTHROW")
-
-#define CHECK(expr) INTERNAL_CATCH_TEST(expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK")
-#define CHECK_FALSE(expr) INTERNAL_CATCH_TEST(expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, "CHECK_FALSE")
-#define CHECKED_IF(expr) INTERNAL_CATCH_IF(expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_IF")
-#define CHECKED_ELSE(expr) INTERNAL_CATCH_ELSE(expr, Catch::ResultDisposition::ContinueOnFailure, "CHECKED_ELSE")
-#define CHECK_NOFAIL(expr) INTERNAL_CATCH_TEST(expr, Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, "CHECK_NOFAIL")
-
-#define CHECK_THROWS(expr) INTERNAL_CATCH_THROWS(expr, Catch::ResultDisposition::ContinueOnFailure, "", "CHECK_THROWS")
-#define CHECK_THROWS_AS(expr, exceptionType) INTERNAL_CATCH_THROWS_AS(expr, exceptionType, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THROWS_AS")
-#define CHECK_THROWS_WITH(expr, matcher) INTERNAL_CATCH_THROWS(expr, Catch::ResultDisposition::ContinueOnFailure, matcher, "CHECK_THROWS_WITH")
-#define CHECK_NOTHROW(expr) INTERNAL_CATCH_NO_THROW(expr, Catch::ResultDisposition::ContinueOnFailure, "CHECK_NOTHROW")
-
-#define CHECK_THAT(arg, matcher) INTERNAL_CHECK_THAT(arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CHECK_THAT")
-#define REQUIRE_THAT(arg, matcher) INTERNAL_CHECK_THAT(arg, matcher, Catch::ResultDisposition::Normal, "REQUIRE_THAT")
-
-#define INFO(msg) INTERNAL_CATCH_INFO(msg, "INFO")
-#define WARN(msg) INTERNAL_CATCH_MSG(Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, "WARN", msg)
-#define SCOPED_INFO(msg) INTERNAL_CATCH_INFO(msg, "INFO")
-#define CAPTURE(msg) INTERNAL_CATCH_INFO(#msg " := " << msg, "CAPTURE")
-#define SCOPED_CAPTURE(msg) INTERNAL_CATCH_INFO(#msg " := " << msg, "CAPTURE")
-
-#ifdef CATCH_CONFIG_VARIADIC_MACROS
-#define TEST_CASE(...) INTERNAL_CATCH_TESTCASE(__VA_ARGS__)
-#define TEST_CASE_METHOD(className, ...) INTERNAL_CATCH_TEST_CASE_METHOD(className, __VA_ARGS__)
-#define METHOD_AS_TEST_CASE(method, ...) INTERNAL_CATCH_METHOD_AS_TEST_CASE(method, __VA_ARGS__)
-#define REGISTER_TEST_CASE(...) INTERNAL_CATCH_REGISTER_TESTCASE(__VA_ARGS__)
-#define SECTION(...) INTERNAL_CATCH_SECTION(__VA_ARGS__)
-#define FAIL(...) INTERNAL_CATCH_MSG(Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", __VA_ARGS__)
-#define SUCCEED(...) INTERNAL_CATCH_MSG(Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", __VA_ARGS__)
-#else
-#define TEST_CASE(name, description) INTERNAL_CATCH_TESTCASE(name, description)
-#define TEST_CASE_METHOD(className, name, description) INTERNAL_CATCH_TEST_CASE_METHOD(className, name, description)
-#define METHOD_AS_TEST_CASE(method, name, description) INTERNAL_CATCH_METHOD_AS_TEST_CASE(method, name, description)
-#define REGISTER_TEST_CASE(method, name, description) INTERNAL_CATCH_REGISTER_TESTCASE(method, name, description)
-#define SECTION(name, description) INTERNAL_CATCH_SECTION(name, description)
-#define FAIL(msg) INTERNAL_CATCH_MSG(Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", msg)
-#define SUCCEED(msg) INTERNAL_CATCH_MSG(Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", msg)
-#endif
-#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE("", "")
-
-#define REGISTER_REPORTER(name, reporterType) INTERNAL_CATCH_REGISTER_REPORTER(name, reporterType)
-#define REGISTER_LEGACY_REPORTER(name, reporterType) INTERNAL_CATCH_REGISTER_LEGACY_REPORTER(name, reporterType)
-
-#define GENERATE(expr) INTERNAL_CATCH_GENERATE(expr)
-
-#endif
-
-#define CATCH_TRANSLATE_EXCEPTION(signature) INTERNAL_CATCH_TRANSLATE_EXCEPTION(signature)
-
-// "BDD-style" convenience wrappers
-#ifdef CATCH_CONFIG_VARIADIC_MACROS
-#define SCENARIO(...) TEST_CASE("Scenario: " __VA_ARGS__)
-#define SCENARIO_METHOD(className, ...) INTERNAL_CATCH_TEST_CASE_METHOD(className, "Scenario: " __VA_ARGS__)
-#else
-#define SCENARIO(name, tags) TEST_CASE("Scenario: " name, tags)
-#define SCENARIO_METHOD(className, name, tags) INTERNAL_CATCH_TEST_CASE_METHOD(className, "Scenario: " name, tags)
-#endif
-#define GIVEN(desc) SECTION(std::string(" Given: ") + desc, "")
-#define WHEN(desc) SECTION(std::string(" When: ") + desc, "")
-#define AND_WHEN(desc) SECTION(std::string("And when: ") + desc, "")
-#define THEN(desc) SECTION(std::string(" Then: ") + desc, "")
-#define AND_THEN(desc) SECTION(std::string(" And: ") + desc, "")
-
-using Catch::Detail::Approx;
-
-#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
diff --git a/third_party/variant/test/our_variant_hello_world.cpp b/third_party/variant/test/our_variant_hello_world.cpp
deleted file mode 100644
index be5996b..0000000
--- a/third_party/variant/test/our_variant_hello_world.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-#include "variant.hpp"
-
-#include <stdexcept>
-
-struct check
-{
- template <typename T>
- void operator()(T const& val) const
- {
- if (val != 0) throw std::runtime_error("invalid");
- }
-};
-
-int main()
-{
- typedef mapbox::util::variant<bool, int, double> variant_type;
- variant_type v(0);
- mapbox::util::apply_visitor(check(), v);
- return 0;
-}
diff --git a/third_party/variant/test/recursive_wrapper_test.cpp b/third_party/variant/test/recursive_wrapper_test.cpp
deleted file mode 100644
index 0492af4..0000000
--- a/third_party/variant/test/recursive_wrapper_test.cpp
+++ /dev/null
@@ -1,125 +0,0 @@
-
-#include <cstdlib>
-#include <iostream>
-#include <string>
-#include <typeinfo>
-#include <utility>
-
-#include <boost/timer/timer.hpp>
-
-#include "variant.hpp"
-
-using namespace mapbox;
-
-namespace test {
-
-struct add;
-struct sub;
-
-template <typename OpTag>
-struct binary_op;
-
-typedef util::variant<int,
- util::recursive_wrapper<binary_op<add>>,
- util::recursive_wrapper<binary_op<sub>>>
- expression;
-
-template <typename Op>
-struct binary_op
-{
- expression left; // variant instantiated here...
- expression right;
-
- binary_op(expression&& lhs, expression&& rhs)
- : left(std::move(lhs)), right(std::move(rhs))
- {
- }
-};
-
-struct print
-{
- template <typename T>
- void operator()(T const& val) const
- {
- std::cerr << val << ":" << typeid(T).name() << std::endl;
- }
-};
-
-struct test
-{
- template <typename T>
- std::string operator()(T const& obj) const
- {
- return std::string("TYPE_ID=") + typeid(obj).name();
- }
-};
-
-struct calculator
-{
- public:
- int operator()(int value) const
- {
- return value;
- }
-
- int operator()(binary_op<add> const& binary) const
- {
- return util::apply_visitor(calculator(), binary.left) + util::apply_visitor(calculator(), binary.right);
- }
-
- int operator()(binary_op<sub> const& binary) const
- {
- return util::apply_visitor(calculator(), binary.left) - util::apply_visitor(calculator(), binary.right);
- }
-};
-
-struct to_string
-{
- public:
- std::string operator()(int value) const
- {
- return std::to_string(value);
- }
-
- std::string operator()(binary_op<add> const& binary) const
- {
- return util::apply_visitor(to_string(), binary.left) + std::string("+") + util::apply_visitor(to_string(), binary.right);
- }
-
- std::string operator()(binary_op<sub> const& binary) const
- {
- return util::apply_visitor(to_string(), binary.left) + std::string("-") + util::apply_visitor(to_string(), binary.right);
- }
-};
-
-} // namespace test
-
-int main(int argc, char** argv)
-{
- if (argc != 2)
- {
- std::cerr << "Usage" << argv[0] << " <num-iter>" << std::endl;
- return EXIT_FAILURE;
- }
-
- const std::size_t NUM_ITER = static_cast<std::size_t>(std::stol(argv[1]));
-
- test::expression sum(test::binary_op<test::add>(2, 3));
- test::expression result(test::binary_op<test::sub>(std::move(sum), 4));
-
- std::cerr << "TYPE OF RESULT-> " << util::apply_visitor(test::test(), result) << std::endl;
-
- int total = 0;
- {
- boost::timer::auto_cpu_timer t;
- for (std::size_t i = 0; i < NUM_ITER; ++i)
- {
- total += util::apply_visitor(test::calculator(), result);
- }
- }
- std::cerr << "total=" << total << std::endl;
-
- std::cerr << util::apply_visitor(test::to_string(), result) << "=" << util::apply_visitor(test::calculator(), result) << std::endl;
-
- return EXIT_SUCCESS;
-}
diff --git a/third_party/variant/test/reference_wrapper_test.cpp b/third_party/variant/test/reference_wrapper_test.cpp
deleted file mode 100644
index dc1209f..0000000
--- a/third_party/variant/test/reference_wrapper_test.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-#include <cstdlib>
-#include <functional>
-#include <iostream>
-#include <type_traits>
-#include <typeinfo>
-#include <utility>
-#include <vector>
-
-#include "variant.hpp"
-
-using namespace mapbox;
-
-namespace test {
-
-struct point
-{
- public:
- point(double x_, double y_)
- : x(x_), y(y_) {}
- double x;
- double y;
-};
-
-struct line_string : std::vector<point>
-{
-};
-struct polygon : std::vector<line_string>
-{
-};
-using variant = util::variant<std::reference_wrapper<const point>,
- std::reference_wrapper<const line_string>,
- std::reference_wrapper<const polygon>>;
-
-struct print
-{
- using result_type = void;
- void operator()(point const& pt) const
- {
- std::cerr << "Point(" << pt.x << "," << pt.y << ")" << std::endl;
- }
- void operator()(line_string const& line) const
- {
- std::cerr << "Line(";
- for (auto const& pt : line)
- {
- std::cerr << pt.x << " " << pt.y << ",";
- }
- std::cerr << ")" << std::endl;
- }
- template <typename T>
- void operator()(T const& val) const
- {
- std::cerr << typeid(T).name() << std::endl;
- }
-};
-}
-
-int main()
-{
- std::cerr << sizeof(test::polygon) << std::endl;
- std::cerr << sizeof(test::variant) << std::endl;
- test::point pt(123, 456);
- test::variant var = std::cref(pt);
- util::apply_visitor(test::print(), var);
- test::line_string line;
- line.push_back(pt);
- line.push_back(pt);
- line.push_back(test::point(999, 333));
- var = std::cref(line);
- util::apply_visitor(test::print(), var);
- std::cerr << "Is line (cref) ? " << var.is<std::reference_wrapper<test::line_string const>>() << std::endl;
- auto const& line2 = var.get<test::line_string>(); // accessing underlying type of std::reference_wrapper<T>
- test::print printer;
- printer(line2);
- return EXIT_SUCCESS;
-}
diff --git a/third_party/variant/test/t/binary_visitor_1.cpp b/third_party/variant/test/t/binary_visitor_1.cpp
deleted file mode 100644
index 298a40b..0000000
--- a/third_party/variant/test/t/binary_visitor_1.cpp
+++ /dev/null
@@ -1,7 +0,0 @@
-
-#include "variant.hpp"
-
-#define NAME_EXT " i-d"
-using variant_type = mapbox::util::variant<int, double>;
-
-#include "binary_visitor_impl.hpp"
diff --git a/third_party/variant/test/t/binary_visitor_2.cpp b/third_party/variant/test/t/binary_visitor_2.cpp
deleted file mode 100644
index 33768b6..0000000
--- a/third_party/variant/test/t/binary_visitor_2.cpp
+++ /dev/null
@@ -1,7 +0,0 @@
-
-#include "variant.hpp"
-
-#define NAME_EXT " b-i-d"
-using variant_type = mapbox::util::variant<bool, int, double>;
-
-#include "binary_visitor_impl.hpp"
diff --git a/third_party/variant/test/t/binary_visitor_3.cpp b/third_party/variant/test/t/binary_visitor_3.cpp
deleted file mode 100644
index d35af4e..0000000
--- a/third_party/variant/test/t/binary_visitor_3.cpp
+++ /dev/null
@@ -1,7 +0,0 @@
-
-#include "variant.hpp"
-
-#define NAME_EXT " i-d-b"
-using variant_type = mapbox::util::variant<int, double, bool>;
-
-#include "binary_visitor_impl.hpp"
diff --git a/third_party/variant/test/t/binary_visitor_4.cpp b/third_party/variant/test/t/binary_visitor_4.cpp
deleted file mode 100644
index daacc1b..0000000
--- a/third_party/variant/test/t/binary_visitor_4.cpp
+++ /dev/null
@@ -1,7 +0,0 @@
-
-#include "variant.hpp"
-
-#define NAME_EXT " b-i-d-c"
-using variant_type = mapbox::util::variant<bool, int, double, char>;
-
-#include "binary_visitor_impl.hpp"
diff --git a/third_party/variant/test/t/binary_visitor_5.cpp b/third_party/variant/test/t/binary_visitor_5.cpp
deleted file mode 100644
index 28669be..0000000
--- a/third_party/variant/test/t/binary_visitor_5.cpp
+++ /dev/null
@@ -1,7 +0,0 @@
-
-#include "variant.hpp"
-
-#define NAME_EXT " b-i-c-d-i"
-using variant_type = mapbox::util::variant<bool, int, char, double, int>;
-
-#include "binary_visitor_impl.hpp"
diff --git a/third_party/variant/test/t/binary_visitor_6.cpp b/third_party/variant/test/t/binary_visitor_6.cpp
deleted file mode 100644
index c881b0f..0000000
--- a/third_party/variant/test/t/binary_visitor_6.cpp
+++ /dev/null
@@ -1,7 +0,0 @@
-
-#include "variant.hpp"
-
-#define NAME_EXT " b-i-i-d-c-u"
-using variant_type = mapbox::util::variant<bool, int, int, double, char, short int>;
-
-#include "binary_visitor_impl.hpp"
diff --git a/third_party/variant/test/t/binary_visitor_impl.hpp b/third_party/variant/test/t/binary_visitor_impl.hpp
deleted file mode 100644
index 4d9a43f..0000000
--- a/third_party/variant/test/t/binary_visitor_impl.hpp
+++ /dev/null
@@ -1,204 +0,0 @@
-
-#include <type_traits>
-
-#include "catch.hpp"
-
-#include "variant_io.hpp"
-
-struct add_visitor
-{
- add_visitor() {}
-
- template <typename A, typename B>
- double operator()(A a, B b) const
- {
- return a + b;
- }
-};
-
-TEST_CASE("const binary visitor works on const variants" NAME_EXT, "[visitor][binary visitor]")
-{
- const variant_type a{7};
- const variant_type b = 3;
- const variant_type c{7.1};
- const variant_type d = 2.9;
-
- const add_visitor v;
-
- REQUIRE(mapbox::util::apply_visitor(v, a, b) == Approx(10));
- REQUIRE(mapbox::util::apply_visitor(v, c, d) == Approx(10));
- REQUIRE(mapbox::util::apply_visitor(v, a, c) == Approx(14.1));
- REQUIRE(mapbox::util::apply_visitor(v, a, d) == Approx(9.9));
-
- REQUIRE(mapbox::util::apply_visitor(v, b, a) == Approx(10));
- REQUIRE(mapbox::util::apply_visitor(v, d, c) == Approx(10));
- REQUIRE(mapbox::util::apply_visitor(v, c, a) == Approx(14.1));
- REQUIRE(mapbox::util::apply_visitor(v, d, a) == Approx(9.9));
-}
-
-TEST_CASE("non-const binary visitor works on const variants" NAME_EXT, "[visitor][binary visitor]")
-{
- const variant_type a = 7;
- const variant_type b = 3;
- const variant_type c = 7.1;
- const variant_type d = 2.9;
-
- add_visitor v;
-
- REQUIRE(mapbox::util::apply_visitor(v, a, b) == Approx(10));
- REQUIRE(mapbox::util::apply_visitor(v, c, d) == Approx(10));
- REQUIRE(mapbox::util::apply_visitor(v, a, c) == Approx(14.1));
- REQUIRE(mapbox::util::apply_visitor(v, a, d) == Approx(9.9));
-
- REQUIRE(mapbox::util::apply_visitor(v, b, a) == Approx(10));
- REQUIRE(mapbox::util::apply_visitor(v, d, c) == Approx(10));
- REQUIRE(mapbox::util::apply_visitor(v, c, a) == Approx(14.1));
- REQUIRE(mapbox::util::apply_visitor(v, d, a) == Approx(9.9));
-}
-
-TEST_CASE("const binary visitor works on non-const variants" NAME_EXT, "[visitor][binary visitor]")
-{
- variant_type a = 7;
- variant_type b = 3;
- variant_type c = 7.1;
- variant_type d = 2.9;
-
- const add_visitor v;
-
- REQUIRE(mapbox::util::apply_visitor(v, a, b) == Approx(10));
- REQUIRE(mapbox::util::apply_visitor(v, c, d) == Approx(10));
- REQUIRE(mapbox::util::apply_visitor(v, a, c) == Approx(14.1));
- REQUIRE(mapbox::util::apply_visitor(v, a, d) == Approx(9.9));
-
- REQUIRE(mapbox::util::apply_visitor(v, b, a) == Approx(10));
- REQUIRE(mapbox::util::apply_visitor(v, d, c) == Approx(10));
- REQUIRE(mapbox::util::apply_visitor(v, c, a) == Approx(14.1));
- REQUIRE(mapbox::util::apply_visitor(v, d, a) == Approx(9.9));
-}
-
-TEST_CASE("non-const binary visitor works on non-const variants" NAME_EXT, "[visitor][binary visitor]")
-{
- variant_type a = 7;
- variant_type b = 3;
- variant_type c = 7.1;
- variant_type d = 2.9;
-
- add_visitor v;
-
- REQUIRE(mapbox::util::apply_visitor(v, a, b) == Approx(10));
- REQUIRE(mapbox::util::apply_visitor(v, c, d) == Approx(10));
- REQUIRE(mapbox::util::apply_visitor(v, a, c) == Approx(14.1));
- REQUIRE(mapbox::util::apply_visitor(v, a, d) == Approx(9.9));
-
- REQUIRE(mapbox::util::apply_visitor(v, b, a) == Approx(10));
- REQUIRE(mapbox::util::apply_visitor(v, d, c) == Approx(10));
- REQUIRE(mapbox::util::apply_visitor(v, c, a) == Approx(14.1));
- REQUIRE(mapbox::util::apply_visitor(v, d, a) == Approx(9.9));
-}
-
-TEST_CASE("rvalue binary visitor works on const variants" NAME_EXT, "[visitor][binary visitor]")
-{
- const variant_type a = 7;
- const variant_type b = 3;
- const variant_type c = 7.1;
- const variant_type d = 2.9;
-
- REQUIRE(mapbox::util::apply_visitor(add_visitor{}, a, b) == Approx(10));
- REQUIRE(mapbox::util::apply_visitor(add_visitor{}, c, d) == Approx(10));
- REQUIRE(mapbox::util::apply_visitor(add_visitor{}, a, c) == Approx(14.1));
- REQUIRE(mapbox::util::apply_visitor(add_visitor{}, a, d) == Approx(9.9));
-
- REQUIRE(mapbox::util::apply_visitor(add_visitor{}, b, a) == Approx(10));
- REQUIRE(mapbox::util::apply_visitor(add_visitor{}, d, c) == Approx(10));
- REQUIRE(mapbox::util::apply_visitor(add_visitor{}, c, a) == Approx(14.1));
- REQUIRE(mapbox::util::apply_visitor(add_visitor{}, d, a) == Approx(9.9));
-}
-
-struct sum_mul_visitor
-{
- double sum;
-
- sum_mul_visitor() : sum(0.0) {}
-
- template <typename A, typename B>
- double operator()(A a, B b)
- {
- double m = a * b;
- sum += m;
- return m;
- }
-};
-
-TEST_CASE("mutable binary visitor works" NAME_EXT, "[visitor][binary visitor]")
-{
- const variant_type a = 2;
- const variant_type b = 3;
- const variant_type c = 0.1;
- const variant_type d = 0.2;
-
- sum_mul_visitor v;
-
- REQUIRE(mapbox::util::apply_visitor(v, a, b) == Approx(6));
- REQUIRE(mapbox::util::apply_visitor(v, c, d) == Approx(0.02));
- REQUIRE(mapbox::util::apply_visitor(v, a, c) == Approx(0.2));
- REQUIRE(mapbox::util::apply_visitor(v, a, d) == Approx(0.4));
-
- REQUIRE(v.sum == Approx(6.62));
-
- REQUIRE(mapbox::util::apply_visitor(v, b, a) == Approx(6));
- REQUIRE(mapbox::util::apply_visitor(v, d, c) == Approx(0.02));
- REQUIRE(mapbox::util::apply_visitor(v, c, a) == Approx(0.2));
- REQUIRE(mapbox::util::apply_visitor(v, d, a) == Approx(0.4));
-}
-
-struct swap_visitor
-{
- swap_visitor(){};
-
- template <typename A, typename B>
- void operator()(A& a, B& b) const
- {
- using T = typename std::common_type<A, B>::type;
- T tmp = a;
- a = b;
- b = tmp;
- }
-};
-
-TEST_CASE("static mutating visitor on mutable variants works" NAME_EXT, "[visitor][binary visitor]")
-{
- variant_type a = 2;
- variant_type b = 3;
- variant_type c = 0.1;
- variant_type d = 0.2;
-
- const swap_visitor v;
-
- SECTION("swap a and b")
- {
- mapbox::util::apply_visitor(v, a, b);
- REQUIRE(a.get<int>() == 3);
- REQUIRE(b.get<int>() == 2);
- }
-
- SECTION("swap c and d")
- {
- mapbox::util::apply_visitor(v, c, d);
- REQUIRE(c.get<double>() == Approx(0.2));
- REQUIRE(d.get<double>() == Approx(0.1));
- }
-
- SECTION("swap a and c")
- {
- mapbox::util::apply_visitor(v, a, c);
- REQUIRE(a.get<int>() == 0);
- REQUIRE(c.get<double>() == Approx(2.0));
- }
-
- SECTION("swap c and a")
- {
- mapbox::util::apply_visitor(v, c, a);
- REQUIRE(a.get<int>() == 0);
- REQUIRE(c.get<double>() == Approx(2.0));
- }
-}
diff --git a/third_party/variant/test/t/issue21.cpp b/third_party/variant/test/t/issue21.cpp
deleted file mode 100644
index b952313..0000000
--- a/third_party/variant/test/t/issue21.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-
-#include "catch.hpp"
-
-#include "variant.hpp"
-#include "variant_io.hpp"
-
-// https://github.com/mapbox/variant/issues/21
-
-static int count;
-
-struct t1
-{
- int value;
- t1(int v) : value(v)
- {
- ++count;
- }
- ~t1()
- {
- --count;
- }
-};
-
-struct t2
-{
- int value;
- t2(int v) : value(v)
- { // constructor fails
- throw std::runtime_error("fail");
- }
-};
-
-TEST_CASE("set() works cleanly even if the constructor throws ", "[variant]")
-{
-
- using variant_type = mapbox::util::variant<t1, t2>;
-
- count = 0;
- {
- variant_type v{42};
- REQUIRE(v.is<t1>());
- REQUIRE(v.get<t1>().value == 42);
- REQUIRE_THROWS({
- v.set<t2>(13);
- });
- }
- REQUIRE(count == 0);
-}
diff --git a/third_party/variant/test/t/mutating_visitor.cpp b/third_party/variant/test/t/mutating_visitor.cpp
deleted file mode 100644
index f07afb8..0000000
--- a/third_party/variant/test/t/mutating_visitor.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-
-#include "catch.hpp"
-
-#include "variant.hpp"
-#include "variant_io.hpp"
-
-#include <string>
-
-template <typename T>
-struct mutating_visitor
-{
- mutating_visitor(T& val)
- : val_(val) {}
-
- void operator()(T& val) const
- {
- val = val_;
- }
-
- template <typename T1>
- void operator()(T1&) const
- {
- } // no-op
-
- T& val_;
-};
-
-TEST_CASE("variant visitation", "[visitor][unary visitor]")
-{
- mapbox::util::variant<int, double, std::string> var(123);
- REQUIRE(var.get<int>() == 123);
- int val = 456;
- const mutating_visitor<int> visitor(val);
- mapbox::util::apply_visitor(visitor, var);
- REQUIRE(var.get<int>() == 456);
-}
diff --git a/third_party/variant/test/t/optional.cpp b/third_party/variant/test/t/optional.cpp
deleted file mode 100644
index b77beda..0000000
--- a/third_party/variant/test/t/optional.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-
-#include "catch.hpp"
-
-#include "optional.hpp"
-
-struct dummy
-{
- dummy(int _m_1, int _m_2) : m_1(_m_1), m_2(_m_2) {}
- int m_1;
- int m_2;
-};
-
-TEST_CASE("optional can be instantiated with a POD type", "[optional]")
-{
- mapbox::util::optional<int> dbl_opt;
-
- REQUIRE(!dbl_opt);
- dbl_opt = 3;
- REQUIRE(dbl_opt);
-
- REQUIRE(dbl_opt.get() == 3);
- REQUIRE(*dbl_opt == 3);
-}
-
-TEST_CASE("copy c'tor", "[optional]")
-{
- mapbox::util::optional<int> dbl_opt;
-
- REQUIRE(!dbl_opt);
- dbl_opt = 3;
- REQUIRE(dbl_opt);
-
- mapbox::util::optional<int> other = dbl_opt;
-
- REQUIRE(other.get() == 3);
- REQUIRE(*other == 3);
-}
-
-TEST_CASE("const operator*, const get()", "[optional]")
-{
- const mapbox::util::optional<int> dbl_opt = 3;
-
- REQUIRE(dbl_opt);
-
- auto pi1 = dbl_opt.get();
- auto pi2 = *dbl_opt;
-
- REQUIRE(pi1 == 3);
- REQUIRE(pi2 == 3);
-}
-
-TEST_CASE("non-const operator*, non-const get()", "[optional]")
-{
- mapbox::util::optional<int> dbl_opt = 3;
-
- REQUIRE(dbl_opt);
-
- auto pi1 = dbl_opt.get();
- auto pi2 = *dbl_opt;
-
- REQUIRE(pi1 == 3);
- REQUIRE(pi2 == 3);
-}
-
-TEST_CASE("emplace initialization, reset", "[optional]")
-{
- mapbox::util::optional<dummy> dummy_opt;
- REQUIRE(!dummy_opt);
-
- // rvalues, baby!
- dummy_opt.emplace(1, 2);
- REQUIRE(dummy_opt);
- REQUIRE(dummy_opt.get().m_1 == 1);
- REQUIRE((*dummy_opt).m_2 == 2);
-
- dummy_opt.reset();
- REQUIRE(!dummy_opt);
-}
-
-TEST_CASE("assignment", "[optional]")
-{
- mapbox::util::optional<int> a;
- mapbox::util::optional<int> b;
-
- a = 1;
- b = 3;
- REQUIRE(a.get() == 1);
- REQUIRE(b.get() == 3);
- b = a;
- REQUIRE(a.get() == b.get());
- REQUIRE(b.get() == 1);
-}
-
-TEST_CASE("self assignment", "[optional]")
-{
- mapbox::util::optional<int> a;
-
- a = 1;
- REQUIRE(a.get() == 1);
- a = a;
- REQUIRE(a.get() == 1);
-}
diff --git a/third_party/variant/test/t/recursive_wrapper.cpp b/third_party/variant/test/t/recursive_wrapper.cpp
deleted file mode 100644
index b2dec45..0000000
--- a/third_party/variant/test/t/recursive_wrapper.cpp
+++ /dev/null
@@ -1,158 +0,0 @@
-
-#include "catch.hpp"
-
-#include "recursive_wrapper.hpp"
-
-#include <type_traits>
-#include <utility>
-
-using rwi = mapbox::util::recursive_wrapper<int>;
-using rwp = mapbox::util::recursive_wrapper<std::pair<int, int>>;
-
-static_assert(std::is_same<rwi::type, int>::value, "type check failed");
-
-TEST_CASE("recursive wrapper of int")
-{
-
- SECTION("construct with value")
- {
- rwi a{7};
-
- REQUIRE(a.get() == 7);
- REQUIRE(*a.get_pointer() == 7);
-
- a = 8;
- REQUIRE(a.get() == 8);
-
- rwi b{a};
- REQUIRE(b.get() == 8);
-
- rwi c;
- c = b;
- REQUIRE(b.get() == 8);
- REQUIRE(c.get() == 8);
-
- c = 9;
- REQUIRE(c.get() == 9);
-
- int x = 10;
- c = x;
- REQUIRE(c.get() == 10);
-
- b = std::move(c);
- REQUIRE(b.get() == 10);
- }
-
- SECTION("construct with const reference")
- {
- int i = 7;
- rwi a{i};
-
- REQUIRE(a.get() == 7);
- }
-
- SECTION("implicit conversion to reference of underlying type")
- {
-
- SECTION("const")
- {
- rwi const a{7};
- REQUIRE(a.get() == 7);
- REQUIRE(*a.get_pointer() == 7);
-
- rwi::type const& underlying = a;
- REQUIRE(underlying == 7);
- }
-
- SECTION("non const")
- {
- rwi a{7};
- REQUIRE(a.get() == 7);
- REQUIRE(*a.get_pointer() == 7);
-
- rwi::type& underlying = a;
- REQUIRE(underlying == 7);
- a = 8;
- REQUIRE(underlying == 8);
- }
- }
-}
-
-TEST_CASE("move of recursive wrapper")
-{
- rwi a{1};
-
- SECTION("move constructor")
- {
- rwi b{std::move(a)};
- REQUIRE(b.get() == 1);
- }
-
- SECTION("operator= on rvalue")
- {
- rwi b{2};
- b = std::move(a);
- REQUIRE(b.get() == 1);
- }
-}
-
-TEST_CASE("swap")
-{
- rwi a{1};
- rwi b{2};
-
- REQUIRE(a.get() == 1);
- REQUIRE(b.get() == 2);
-
- using std::swap;
- swap(a, b);
-
- REQUIRE(a.get() == 2);
- REQUIRE(b.get() == 1);
-}
-
-TEST_CASE("recursive wrapper of pair<int, int>")
-{
-
- SECTION("default constructed")
- {
- rwp a;
- REQUIRE(a.get().first == 0);
- REQUIRE(a.get().second == 0);
- }
-
- SECTION("construct with value")
- {
- rwp a{std::make_pair(1, 2)};
-
- REQUIRE(a.get().first == 1);
- REQUIRE(a.get().second == 2);
-
- REQUIRE(a.get_pointer()->first == 1);
- REQUIRE(a.get_pointer()->second == 2);
-
- a = {3, 4};
- REQUIRE(a.get().first == 3);
- REQUIRE(a.get().second == 4);
-
- rwp b{a};
- REQUIRE(b.get().first == 3);
- REQUIRE(b.get().second == 4);
-
- rwp c;
- c = b;
- REQUIRE(b.get().first == 3);
- REQUIRE(b.get().second == 4);
- REQUIRE(c.get().first == 3);
- REQUIRE(c.get().second == 4);
-
- c = {5, 6};
- REQUIRE(c.get().first == 5);
- REQUIRE(c.get().second == 6);
-
- b = std::move(c);
- REQUIRE(b.get().first == 5);
- REQUIRE(b.get().second == 6);
- // REQUIRE(c.get_pointer() == nullptr);
- }
-}
diff --git a/third_party/variant/test/t/sizeof.cpp b/third_party/variant/test/t/sizeof.cpp
deleted file mode 100644
index 0e74ce5..0000000
--- a/third_party/variant/test/t/sizeof.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-
-#include <algorithm>
-#include <cstddef>
-#include <cstdint>
-
-#include "catch.hpp"
-
-#include "variant.hpp"
-#include "variant_io.hpp"
-
-struct some_struct
-{
- int a;
- bool b;
- std::string c;
-};
-
-using variant_internal_index_type = size_t;
-
-TEST_CASE("size of variants")
-{
- constexpr const auto min_overhead = sizeof(variant_internal_index_type);
-
- using namespace std; // workaround for bug in GCC <= 4.8 where max_align_t is not in std
- constexpr const auto max_overhead = alignof(max_align_t) + min_overhead;
-
- using v1 = mapbox::util::variant<int>;
- using v2 = mapbox::util::variant<int, bool, int64_t>;
- using v3 = mapbox::util::variant<int, std::string>;
- using v4 = mapbox::util::variant<std::string, std::string>;
- using v5 = mapbox::util::variant<some_struct>;
-
- constexpr const auto si = sizeof(int);
- constexpr const auto sb = sizeof(bool);
- constexpr const auto si64 = sizeof(int64_t);
- constexpr const auto sd = sizeof(double);
- constexpr const auto sstr = sizeof(std::string);
- constexpr const auto spi = sizeof(std::pair<int, int>);
- constexpr const auto ss = sizeof(some_struct);
-
- REQUIRE(sizeof(v1) <= max_overhead + si);
- REQUIRE(sizeof(v2) <= max_overhead + std::max({si, sb, si64}));
- REQUIRE(sizeof(v3) <= max_overhead + std::max({si, sstr}));
- REQUIRE(sizeof(v4) <= max_overhead + sstr);
- REQUIRE(sizeof(v5) <= max_overhead + ss);
-
- REQUIRE(sizeof(v1) >= min_overhead + si);
- REQUIRE(sizeof(v2) >= min_overhead + std::max({si, sb, si64}));
- REQUIRE(sizeof(v3) >= min_overhead + std::max({si, sstr}));
- REQUIRE(sizeof(v4) >= min_overhead + sstr);
- REQUIRE(sizeof(v5) >= min_overhead + ss);
-}
diff --git a/third_party/variant/test/t/unary_visitor.cpp b/third_party/variant/test/t/unary_visitor.cpp
deleted file mode 100644
index 8df6110..0000000
--- a/third_party/variant/test/t/unary_visitor.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-
-#include "catch.hpp"
-
-#include "variant.hpp"
-#include "variant_io.hpp"
-
-#include <string>
-
-struct some_visitor
-{
- int var_;
-
- some_visitor(int init)
- : var_(init) {}
-
- int operator()(int val) const
- {
- return var_ + val;
- }
-
- int operator()(double val) const
- {
- return var_ + int(val);
- }
-
- int operator()(const std::string&) const
- {
- return 0;
- }
-};
-
-TEST_CASE("non-const visitor works on const variants", "[visitor][unary visitor]")
-{
- using variant_type = const mapbox::util::variant<int, double, std::string>;
- variant_type var1(123);
- variant_type var2(3.2);
- variant_type var3("foo");
- REQUIRE(var1.get<int>() == 123);
- REQUIRE(var2.get<double>() == Approx(3.2));
- REQUIRE(var3.get<std::string>() == "foo");
-
- some_visitor visitor{1};
-
- REQUIRE(mapbox::util::apply_visitor(visitor, var1) == 124);
- REQUIRE(mapbox::util::apply_visitor(visitor, var2) == 4);
- REQUIRE(mapbox::util::apply_visitor(visitor, var3) == 0);
-}
-
-TEST_CASE("const visitor works on const variants", "[visitor][unary visitor]")
-{
- using variant_type = const mapbox::util::variant<int, double, std::string>;
- variant_type var1(123);
- variant_type var2(3.2);
- variant_type var3("foo");
- REQUIRE(var1.get<int>() == 123);
- REQUIRE(var2.get<double>() == Approx(3.2));
- REQUIRE(var3.get<std::string>() == "foo");
-
- const some_visitor visitor{1};
-
- REQUIRE(mapbox::util::apply_visitor(visitor, var1) == 124);
- REQUIRE(mapbox::util::apply_visitor(visitor, var2) == 4);
- REQUIRE(mapbox::util::apply_visitor(visitor, var3) == 0);
-}
-
-TEST_CASE("rvalue visitor works on const variants", "[visitor][unary visitor]")
-{
- using variant_type = const mapbox::util::variant<int, double, std::string>;
- variant_type var1(123);
- variant_type var2(3.2);
- variant_type var3("foo");
- REQUIRE(var1.get<int>() == 123);
- REQUIRE(var2.get<double>() == Approx(3.2));
- REQUIRE(var3.get<std::string>() == "foo");
-
- REQUIRE(mapbox::util::apply_visitor(some_visitor{1}, var1) == 124);
- REQUIRE(mapbox::util::apply_visitor(some_visitor{1}, var2) == 4);
- REQUIRE(mapbox::util::apply_visitor(some_visitor{1}, var3) == 0);
-}
-
-TEST_CASE("visitor works on rvalue variants", "[visitor][unary visitor]")
-{
- using variant_type = const mapbox::util::variant<int, double, std::string>;
-
- REQUIRE(mapbox::util::apply_visitor(some_visitor{1}, variant_type{123}) == 124);
- REQUIRE(mapbox::util::apply_visitor(some_visitor{1}, variant_type{3.2}) == 4);
- REQUIRE(mapbox::util::apply_visitor(some_visitor{1}, variant_type{"foo"}) == 0);
-}
-
-struct total_sizeof
-{
- total_sizeof() : total_(0) {}
-
- template <class Value>
- int operator()(const Value&) const
- {
- total_ += int(sizeof(Value));
- return total_;
- }
-
- int result() const
- {
- return total_;
- }
-
- mutable int total_;
-
-}; // total_sizeof
-
-TEST_CASE("changes in visitor should be visible", "[visitor][unary visitor]")
-{
- using variant_type = mapbox::util::variant<int, std::string, double>;
- variant_type v;
- total_sizeof ts;
- v = 5.9;
- REQUIRE(mapbox::util::apply_visitor(ts, v) == sizeof(double));
- REQUIRE(ts.result() == sizeof(double));
-}
-
-TEST_CASE("changes in const visitor (with mutable internals) should be visible", "[visitor][unary visitor]")
-{
- using variant_type = const mapbox::util::variant<int, std::string, double>;
- variant_type v{"foo"};
- const total_sizeof ts;
- REQUIRE(mapbox::util::apply_visitor(ts, v) == sizeof(std::string));
- REQUIRE(ts.result() == sizeof(std::string));
-}
diff --git a/third_party/variant/test/t/variant.cpp b/third_party/variant/test/t/variant.cpp
deleted file mode 100644
index 36655a5..0000000
--- a/third_party/variant/test/t/variant.cpp
+++ /dev/null
@@ -1,570 +0,0 @@
-#include "catch.hpp"
-
-#include "variant.hpp"
-#include "variant_io.hpp"
-
-#include <algorithm>
-#include <cstdint>
-#include <functional>
-#include <iterator>
-#include <limits>
-#include <memory>
-#include <ostream>
-#include <sstream>
-#include <string>
-
-// Hack to make nullptr work with Catch
-namespace std {
-
-template <class C, class T>
-std::basic_ostream<C, T>& operator<<(std::basic_ostream<C, T>& os, std::nullptr_t)
-{
- return os << (void*)nullptr;
-}
-}
-
-TEST_CASE("variant can be moved into vector", "[variant]")
-{
- using variant_type = mapbox::util::variant<bool, std::string>;
- variant_type v(std::string("test"));
- std::vector<variant_type> vec;
- vec.emplace_back(std::move(v));
- REQUIRE(v.get<std::string>() != std::string("test"));
- REQUIRE(vec.at(0).get<std::string>() == std::string("test"));
-}
-
-TEST_CASE("variant should support built-in types", "[variant]")
-{
- SECTION("bool")
- {
- mapbox::util::variant<bool> v(true);
- REQUIRE(v.valid());
- REQUIRE(v.is<bool>());
- REQUIRE(v.which() == 0);
- REQUIRE(v.get<bool>() == true);
- v.set<bool>(false);
- REQUIRE(v.get<bool>() == false);
- v = true;
- REQUIRE(v == mapbox::util::variant<bool>(true));
- }
- SECTION("nullptr")
- {
- using value_type = std::nullptr_t;
- mapbox::util::variant<value_type> v(nullptr);
- REQUIRE(v.valid());
- REQUIRE(v.is<value_type>());
- REQUIRE(v.which() == 0);
- REQUIRE(v.get<value_type>() == nullptr);
- REQUIRE(v == mapbox::util::variant<value_type>(nullptr));
- }
- SECTION("unique_ptr")
- {
- using value_type = std::unique_ptr<std::string>;
- mapbox::util::variant<value_type> v(value_type(new std::string("hello")));
- REQUIRE(v.valid());
- REQUIRE(v.is<value_type>());
- REQUIRE(v.which() == 0);
- REQUIRE(*v.get<value_type>().get() == *value_type(new std::string("hello")).get());
- REQUIRE(*v.get<value_type>() == "hello");
- }
- SECTION("string")
- {
- using value_type = std::string;
- mapbox::util::variant<value_type> v(value_type("hello"));
- REQUIRE(v.valid());
- REQUIRE(v.is<value_type>());
- REQUIRE(v.which() == 0);
- REQUIRE(v.get<value_type>() == value_type("hello"));
- v.set<value_type>(value_type("there"));
- REQUIRE(v.get<value_type>() == value_type("there"));
- v = value_type("variant");
- REQUIRE(v == mapbox::util::variant<value_type>(value_type("variant")));
- }
- SECTION("size_t")
- {
- using value_type = std::size_t;
- mapbox::util::variant<value_type> v(std::numeric_limits<value_type>::max());
- REQUIRE(v.valid());
- REQUIRE(v.is<value_type>());
- REQUIRE(v.which() == 0);
- REQUIRE(v.get<value_type>() == std::numeric_limits<value_type>::max());
- v.set<value_type>(value_type(0));
- REQUIRE(v.get<value_type>() == value_type(0));
- v = value_type(1);
- REQUIRE(v == mapbox::util::variant<value_type>(value_type(1)));
- }
- SECTION("int8_t")
- {
- using value_type = std::int8_t;
- mapbox::util::variant<value_type> v(std::numeric_limits<value_type>::max());
- REQUIRE(v.valid());
- REQUIRE(v.is<value_type>());
- REQUIRE(v.which() == 0);
- REQUIRE(v.get<value_type>() == std::numeric_limits<value_type>::max());
- v.set<value_type>(0);
- REQUIRE(v.get<value_type>() == value_type(0));
- v = value_type(1);
- REQUIRE(v == mapbox::util::variant<value_type>(value_type(1)));
- }
- SECTION("int16_t")
- {
- using value_type = std::int16_t;
- mapbox::util::variant<value_type> v(std::numeric_limits<value_type>::max());
- REQUIRE(v.valid());
- REQUIRE(v.is<value_type>());
- REQUIRE(v.which() == 0);
- REQUIRE(v.get<value_type>() == std::numeric_limits<value_type>::max());
- v.set<value_type>(0);
- REQUIRE(v.get<value_type>() == value_type(0));
- v = value_type(1);
- REQUIRE(v == mapbox::util::variant<value_type>(value_type(1)));
- }
- SECTION("int32_t")
- {
- using value_type = std::int32_t;
- mapbox::util::variant<value_type> v(std::numeric_limits<value_type>::max());
- REQUIRE(v.valid());
- REQUIRE(v.is<value_type>());
- REQUIRE(v.which() == 0);
- REQUIRE(v.get<value_type>() == std::numeric_limits<value_type>::max());
- v.set<value_type>(0);
- REQUIRE(v.get<value_type>() == value_type(0));
- v = value_type(1);
- REQUIRE(v == mapbox::util::variant<value_type>(value_type(1)));
- }
- SECTION("int64_t")
- {
- using value_type = std::int64_t;
- mapbox::util::variant<value_type> v(std::numeric_limits<value_type>::max());
- REQUIRE(v.valid());
- REQUIRE(v.is<value_type>());
- REQUIRE(v.which() == 0);
- REQUIRE(v.get<value_type>() == std::numeric_limits<value_type>::max());
- v.set<value_type>(0);
- REQUIRE(v.get<value_type>() == value_type(0));
- v = value_type(1);
- REQUIRE(v == mapbox::util::variant<value_type>(value_type(1)));
- }
-}
-
-struct MissionInteger
-{
- using value_type = uint64_t;
- value_type val_;
-
- public:
- MissionInteger(uint64_t val) : val_(val) {}
-
- bool operator==(MissionInteger const& rhs) const
- {
- return (val_ == rhs.get());
- }
-
- uint64_t get() const
- {
- return val_;
- }
-};
-
-std::ostream& operator<<(std::ostream& os, MissionInteger const& rhs)
-{
- os << rhs.get();
- return os;
-}
-
-TEST_CASE("variant should support custom types", "[variant]")
-{
- // http://www.missionintegers.com/integer/34838300
- mapbox::util::variant<MissionInteger> v(MissionInteger(34838300));
- REQUIRE(v.valid());
- REQUIRE(v.is<MissionInteger>());
- REQUIRE(v.which() == 0);
- REQUIRE(v.get<MissionInteger>() == MissionInteger(34838300));
- REQUIRE(v.get<MissionInteger>().get() == MissionInteger::value_type(34838300));
- // TODO: should both of the set usages below compile?
- v.set<MissionInteger>(MissionInteger::value_type(0));
- v.set<MissionInteger>(MissionInteger(0));
- REQUIRE(v.get<MissionInteger>().get() == MissionInteger::value_type(0));
- v = MissionInteger(1);
- REQUIRE(v == mapbox::util::variant<MissionInteger>(MissionInteger(1)));
-}
-
-TEST_CASE("variant::which() returns zero based index of stored type", "[variant]")
-{
- using variant_type = mapbox::util::variant<bool, std::string, std::uint64_t, std::int64_t, double, float>;
- // which() returns index in forward order
- REQUIRE(0 == variant_type(true).which());
- REQUIRE(1 == variant_type(std::string("test")).which());
- REQUIRE(2 == variant_type(std::uint64_t(0)).which());
- REQUIRE(3 == variant_type(std::int64_t(0)).which());
- REQUIRE(4 == variant_type(double(0.0)).which());
- REQUIRE(5 == variant_type(float(0.0)).which());
-}
-
-TEST_CASE("get with wrong type (here: double) should throw", "[variant]")
-{
- using variant_type = mapbox::util::variant<int, double>;
- variant_type var = 5;
- REQUIRE(var.is<int>());
- REQUIRE_FALSE(var.is<double>());
- REQUIRE(var.get<int>() == 5);
- REQUIRE_THROWS_AS({
- var.get<double>();
- },
- mapbox::util::bad_variant_access&);
-}
-
-TEST_CASE("get with wrong type (here: int) should throw", "[variant]")
-{
- using variant_type = mapbox::util::variant<int, double>;
- variant_type var = 5.0;
- REQUIRE(var.is<double>());
- REQUIRE_FALSE(var.is<int>());
- REQUIRE(var.get<double>() == 5.0);
- REQUIRE(mapbox::util::get<double>(var) == 5.0);
- REQUIRE_THROWS_AS({
- var.get<int>();
- },
- mapbox::util::bad_variant_access&);
- REQUIRE_THROWS_AS({
- mapbox::util::get<int>(var);
- },
- mapbox::util::bad_variant_access&);
-}
-
-TEST_CASE("get on const varint with wrong type (here: int) should throw", "[variant]")
-{
- using variant_type = mapbox::util::variant<int, double>;
- const variant_type var = 5.0;
- REQUIRE(var.is<double>());
- REQUIRE_FALSE(var.is<int>());
- REQUIRE(var.get<double>() == 5.0);
- REQUIRE(mapbox::util::get<double>(var) == 5.0);
- REQUIRE_THROWS_AS({
- var.get<int>();
- },
- mapbox::util::bad_variant_access&);
- REQUIRE_THROWS_AS({
- mapbox::util::get<int>(var);
- },
- mapbox::util::bad_variant_access&);
-}
-
-TEST_CASE("get with any type should throw if not initialized", "[variant]")
-{
- mapbox::util::variant<int, double> var{mapbox::util::no_init()};
- REQUIRE_THROWS_AS({
- var.get<int>();
- },
- mapbox::util::bad_variant_access&);
- REQUIRE_THROWS_AS({
- var.get<double>();
- },
- mapbox::util::bad_variant_access&);
-}
-
-TEST_CASE("no_init variant can be copied and moved from", "[variant]")
-{
- using variant_type = mapbox::util::variant<int, double>;
-
- variant_type v1{mapbox::util::no_init()};
- variant_type v2{42};
- variant_type v3{23};
-
- REQUIRE(v2.get<int>() == 42);
- v2 = v1;
- REQUIRE_THROWS_AS({
- v2.get<int>();
- },
- mapbox::util::bad_variant_access&);
-
- REQUIRE(v3.get<int>() == 23);
- v3 = std::move(v1);
- REQUIRE_THROWS_AS({
- v3.get<int>();
- },
- mapbox::util::bad_variant_access&);
-}
-
-TEST_CASE("no_init variant can be copied and moved to", "[variant]")
-{
- using variant_type = mapbox::util::variant<int, double>;
-
- variant_type v1{42};
- variant_type v2{mapbox::util::no_init()};
- variant_type v3{mapbox::util::no_init()};
-
- REQUIRE_THROWS_AS({
- v2.get<int>();
- },
- mapbox::util::bad_variant_access&);
-
- REQUIRE(v1.get<int>() == 42);
- v2 = v1;
- REQUIRE(v2.get<int>() == 42);
- REQUIRE(v1.get<int>() == 42);
-
- REQUIRE_THROWS_AS({
- v3.get<int>();
- },
- mapbox::util::bad_variant_access&);
-
- v3 = std::move(v1);
- REQUIRE(v3.get<int>() == 42);
-}
-
-TEST_CASE("implicit conversion", "[variant][implicit conversion]")
-{
- using variant_type = mapbox::util::variant<int>;
- variant_type var(5.0); // converted to int
- REQUIRE(var.get<int>() == 5);
- var = 6.0; // works for operator=, too
- REQUIRE(var.get<int>() == 6);
-}
-
-TEST_CASE("implicit conversion to first type in variant type list", "[variant][implicit conversion]")
-{
- using variant_type = mapbox::util::variant<long, char>;
- variant_type var = 5.0; // converted to long
- REQUIRE(var.get<long>() == 5);
- REQUIRE_THROWS_AS({
- var.get<char>();
- },
- mapbox::util::bad_variant_access&);
-}
-
-TEST_CASE("implicit conversion to unsigned char", "[variant][implicit conversion]")
-{
- using variant_type = mapbox::util::variant<unsigned char>;
- variant_type var = 100.0;
- CHECK(var.get<unsigned char>() == static_cast<unsigned char>(100.0));
- CHECK(var.get<unsigned char>() == static_cast<unsigned char>(static_cast<unsigned int>(100.0)));
-}
-
-struct dummy
-{
-};
-
-TEST_CASE("implicit conversion to a suitable type", "[variant][implicit conversion]")
-{
- using mapbox::util::variant;
- CHECK_NOTHROW((variant<dummy, float, std::string>(123)).get<float>());
- CHECK_NOTHROW((variant<dummy, float, std::string>("foo")).get<std::string>());
-}
-
-TEST_CASE("value_traits for non-convertible type", "[variant::detail]")
-{
- namespace detail = mapbox::util::detail;
- using target_type = detail::value_traits<dummy, int>::target_type;
- CHECK((std::is_same<target_type, void>::value) == true);
-}
-
-TEST_CASE("Type indexing should work with variants with duplicated types", "[variant::detail]")
-{
- // Index is in reverse order
- REQUIRE((mapbox::util::detail::value_traits<bool, bool, int, double, std::string>::index == 3));
- REQUIRE((mapbox::util::detail::value_traits<bool, bool, int, double, int>::index == 3));
- REQUIRE((mapbox::util::detail::value_traits<int, bool, int, double, std::string>::index == 2));
- REQUIRE((mapbox::util::detail::value_traits<int, bool, int, double, int>::index == 2));
- REQUIRE((mapbox::util::detail::value_traits<double, bool, int, double, std::string>::index == 1));
- REQUIRE((mapbox::util::detail::value_traits<bool, bool, int, bool, std::string>::index == 3));
- REQUIRE((mapbox::util::detail::value_traits<std::string, bool, int, double, std::string>::index == 0));
- REQUIRE((mapbox::util::detail::value_traits<dummy, bool, int, double, std::string>::index == mapbox::util::detail::invalid_value));
- REQUIRE((mapbox::util::detail::value_traits<std::vector<int>, bool, int, double, std::string>::index == mapbox::util::detail::invalid_value));
-}
-
-TEST_CASE("variant default constructor", "[variant][default constructor]")
-{
- // By default variant is initialised with (default constructed) first type in template parameters pack
- // As a result first type in Types... must be default constructable
- // NOTE: index in reverse order -> index = N - 1
- using variant_type = mapbox::util::variant<int, double, std::string>;
- REQUIRE(variant_type{}.which() == 0);
- REQUIRE(variant_type{}.valid());
- REQUIRE_FALSE(variant_type{mapbox::util::no_init()}.valid());
-}
-
-TEST_CASE("variant printer", "[visitor][unary visitor][printer]")
-{
- using variant_type = mapbox::util::variant<int, double, std::string>;
- std::vector<variant_type> var = {2.1, 123, "foo", 456};
- std::stringstream out;
- std::copy(var.begin(), var.end(), std::ostream_iterator<variant_type>(out, ","));
- out << var[2];
- REQUIRE(out.str() == "2.1,123,foo,456,foo");
-}
-
-TEST_CASE("swapping variants should do the right thing", "[variant]")
-{
- using variant_type = mapbox::util::variant<int, double, std::string>;
- variant_type a = 7;
- variant_type b = 3;
- variant_type c = 3.141;
- variant_type d = "foo";
- variant_type e = "a long string that is longer than small string optimization";
-
- using std::swap;
- swap(a, b);
- REQUIRE(a.get<int>() == 3);
- REQUIRE(a.which() == 0);
- REQUIRE(b.get<int>() == 7);
- REQUIRE(b.which() == 0);
-
- swap(b, c);
- REQUIRE(b.get<double>() == Approx(3.141));
- REQUIRE(b.which() == 1);
- REQUIRE(c.get<int>() == 7);
- REQUIRE(c.which() == 0);
-
- swap(b, d);
- REQUIRE(b.get<std::string>() == "foo");
- REQUIRE(b.which() == 2);
- REQUIRE(d.get<double>() == Approx(3.141));
- REQUIRE(d.which() == 1);
-
- swap(b, e);
- REQUIRE(b.get<std::string>() == "a long string that is longer than small string optimization");
- REQUIRE(b.which() == 2);
- REQUIRE(e.get<std::string>() == "foo");
- REQUIRE(e.which() == 2);
-}
-
-TEST_CASE("variant should work with equality operators")
-{
- using variant_type = mapbox::util::variant<int, std::string>;
-
- variant_type a{1};
- variant_type b{1};
- variant_type c{2};
- variant_type s{"foo"};
-
- REQUIRE(a == a);
- REQUIRE(a == b);
- REQUIRE_FALSE(a == c);
- REQUIRE_FALSE(a == s);
- REQUIRE_FALSE(c == s);
-
- REQUIRE_FALSE(a != a);
- REQUIRE_FALSE(a != b);
- REQUIRE(a != c);
- REQUIRE(a != s);
- REQUIRE(c != s);
-}
-
-TEST_CASE("variant should work with comparison operators")
-{
- using variant_type = mapbox::util::variant<int, std::string>;
-
- variant_type a{1};
- variant_type b{1};
- variant_type c{2};
- variant_type s{"foo"};
- variant_type t{"bar"};
-
- REQUIRE_FALSE(a < a);
- REQUIRE_FALSE(a < b);
- REQUIRE(a < c);
- REQUIRE(a < s);
- REQUIRE(c < s);
- REQUIRE(t < s);
-
- REQUIRE_FALSE(a > a);
- REQUIRE_FALSE(a > b);
- REQUIRE_FALSE(a > c);
- REQUIRE_FALSE(a > s);
- REQUIRE_FALSE(c > s);
- REQUIRE_FALSE(t > s);
-
- REQUIRE(a <= a);
- REQUIRE(a <= b);
- REQUIRE(a <= c);
- REQUIRE(a <= s);
- REQUIRE(c <= s);
- REQUIRE(t <= s);
-
- REQUIRE(a >= a);
- REQUIRE(a >= b);
- REQUIRE_FALSE(a >= c);
- REQUIRE_FALSE(a >= s);
- REQUIRE_FALSE(c >= s);
- REQUIRE_FALSE(t >= s);
-}
-
-TEST_CASE("storing reference wrappers works")
-{
- using variant_type = mapbox::util::variant<std::reference_wrapper<int>, std::reference_wrapper<double>>;
-
- int a = 1;
- variant_type v{std::ref(a)};
- REQUIRE(v.get<int>() == 1);
- REQUIRE(mapbox::util::get<int>(v) == 1);
- REQUIRE_THROWS_AS({
- v.get<double>();
- },
- mapbox::util::bad_variant_access&);
- REQUIRE_THROWS_AS({
- mapbox::util::get<double>(v);
- },
- mapbox::util::bad_variant_access&);
- a = 2;
- REQUIRE(v.get<int>() == 2);
- v.get<int>() = 3;
- REQUIRE(a == 3);
-
- double b = 3.141;
- v = std::ref(b);
- REQUIRE(v.get<double>() == Approx(3.141));
- REQUIRE(mapbox::util::get<double>(v) == Approx(3.141));
- REQUIRE_THROWS_AS({
- v.get<int>();
- },
- mapbox::util::bad_variant_access&);
- REQUIRE_THROWS_AS({
- mapbox::util::get<int>(v);
- },
- mapbox::util::bad_variant_access&);
- b = 2.718;
- REQUIRE(v.get<double>() == Approx(2.718));
- a = 3;
- REQUIRE(v.get<double>() == Approx(2.718));
- v.get<double>() = 4.1;
- REQUIRE(b == Approx(4.1));
-
- REQUIRE_THROWS_AS({
- v.get<int>() = 4;
- },
- mapbox::util::bad_variant_access&);
-}
-
-TEST_CASE("storing reference wrappers to consts works")
-{
- using variant_type = mapbox::util::variant<std::reference_wrapper<int const>, std::reference_wrapper<double const>>;
-
- int a = 1;
- variant_type v{std::cref(a)};
- REQUIRE(v.get<int const>() == 1);
- REQUIRE(v.get<int>() == 1); // this works (see #82)
- REQUIRE(mapbox::util::get<int const>(v) == 1);
- // REQUIRE(mapbox::util::get<int>(v) == 1); // this doesn't work (see #82)
- REQUIRE_THROWS_AS({
- v.get<double const>();
- },
- mapbox::util::bad_variant_access&);
- REQUIRE_THROWS_AS({
- mapbox::util::get<double const>(v);
- },
- mapbox::util::bad_variant_access&);
-
- double b = 3.141;
- v = std::cref(b);
- REQUIRE(v.get<double const>() == Approx(3.141));
- REQUIRE(mapbox::util::get<double const>(v) == Approx(3.141));
- REQUIRE_THROWS_AS({
- v.get<int const>();
- },
- mapbox::util::bad_variant_access&);
- REQUIRE_THROWS_AS({
- mapbox::util::get<int const>(v);
- },
- mapbox::util::bad_variant_access&);
-}
diff --git a/third_party/variant/test/unique_ptr_test.cpp b/third_party/variant/test/unique_ptr_test.cpp
deleted file mode 100644
index 6578991..0000000
--- a/third_party/variant/test/unique_ptr_test.cpp
+++ /dev/null
@@ -1,126 +0,0 @@
-
-#include <cstdlib>
-#include <iostream>
-#include <memory>
-#include <string>
-#include <typeinfo>
-#include <utility>
-
-#include <boost/timer/timer.hpp>
-
-#include "variant.hpp"
-
-using namespace mapbox;
-
-namespace test {
-
-struct add;
-struct sub;
-
-template <typename OpTag>
-struct binary_op;
-
-typedef util::variant<int,
- std::unique_ptr<binary_op<add>>,
- std::unique_ptr<binary_op<sub>>>
- expression;
-
-template <typename Op>
-struct binary_op
-{
- expression left; // variant instantiated here...
- expression right;
-
- binary_op(expression&& lhs, expression&& rhs)
- : left(std::move(lhs)), right(std::move(rhs))
- {
- }
-};
-
-struct print
-{
- template <typename T>
- void operator()(T const& val) const
- {
- std::cerr << val << ":" << typeid(T).name() << std::endl;
- }
-};
-
-struct test
-{
- template <typename T>
- std::string operator()(T const& obj) const
- {
- return std::string("TYPE_ID=") + typeid(obj).name();
- }
-};
-
-struct calculator
-{
- public:
- int operator()(int value) const
- {
- return value;
- }
-
- int operator()(std::unique_ptr<binary_op<add>> const& binary) const
- {
- return util::apply_visitor(calculator(), binary->left) + util::apply_visitor(calculator(), binary->right);
- }
-
- int operator()(std::unique_ptr<binary_op<sub>> const& binary) const
- {
- return util::apply_visitor(calculator(), binary->left) - util::apply_visitor(calculator(), binary->right);
- }
-};
-
-struct to_string
-{
- public:
- std::string operator()(int value) const
- {
- return std::to_string(value);
- }
-
- std::string operator()(std::unique_ptr<binary_op<add>> const& binary) const
- {
- return util::apply_visitor(to_string(), binary->left) + std::string("+") + util::apply_visitor(to_string(), binary->right);
- }
-
- std::string operator()(std::unique_ptr<binary_op<sub>> const& binary) const
- {
- return util::apply_visitor(to_string(), binary->left) + std::string("-") + util::apply_visitor(to_string(), binary->right);
- }
-};
-
-} // namespace test
-
-int main(int argc, char** argv)
-{
- if (argc != 2)
- {
- std::cerr << "Usage" << argv[0] << " <num-iter>" << std::endl;
- return EXIT_FAILURE;
- }
-
- const std::size_t NUM_ITER = static_cast<std::size_t>(std::stol(argv[1]));
-
- test::expression sum(std::unique_ptr<test::binary_op<test::add>>(new test::binary_op<test::add>(2, 3)));
- test::expression result(std::unique_ptr<test::binary_op<test::sub>>(new test::binary_op<test::sub>(std::move(sum), 4)));
-
- std::cerr << "TYPE OF RESULT-> " << util::apply_visitor(test::test(), result) << std::endl;
-
- int total = 0;
- {
- boost::timer::auto_cpu_timer t;
- for (std::size_t i = 0; i < NUM_ITER; ++i)
- {
- total += util::apply_visitor(test::calculator(), result);
- }
- }
- std::cerr << "total=" << total << std::endl;
-
- std::cerr << util::apply_visitor(test::to_string(), result) << "=" << util::apply_visitor(test::calculator(), result) << std::endl;
-
- return EXIT_SUCCESS;
-}
diff --git a/third_party/variant/test/unit.cpp b/third_party/variant/test/unit.cpp
deleted file mode 100644
index 0c7c351..0000000
--- a/third_party/variant/test/unit.cpp
+++ /dev/null
@@ -1,2 +0,0 @@
-#define CATCH_CONFIG_MAIN
-#include "catch.hpp"
diff --git a/third_party/variant/variant.gyp b/third_party/variant/variant.gyp
deleted file mode 100644
index b1f3801..0000000
--- a/third_party/variant/variant.gyp
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "includes": [
- "common.gypi"
- ],
- "targets": [
- {
- "target_name": "tests",
- "type": "executable",
- "sources": [
- "test/unit.cpp",
- "test/t/binary_visitor_1.cpp",
- "test/t/binary_visitor_2.cpp",
- "test/t/binary_visitor_3.cpp",
- "test/t/binary_visitor_4.cpp",
- "test/t/binary_visitor_5.cpp",
- "test/t/binary_visitor_6.cpp",
- "test/t/issue21.cpp",
- "test/t/mutating_visitor.cpp",
- "test/t/optional.cpp",
- "test/t/recursive_wrapper.cpp",
- "test/t/sizeof.cpp",
- "test/t/unary_visitor.cpp",
- "test/t/variant.cpp"
- ],
- "xcode_settings": {
- "SDKROOT": "macosx",
- "SUPPORTED_PLATFORMS":["macosx"]
- },
- "include_dirs": [
- "./",
- "test/include"
- ]
- }
- ]
-}
diff --git a/third_party/variant/variant.hpp b/third_party/variant/variant.hpp
deleted file mode 100644
index db5d3c8..0000000
--- a/third_party/variant/variant.hpp
+++ /dev/null
@@ -1,901 +0,0 @@
-#ifndef MAPBOX_UTIL_VARIANT_HPP
-#define MAPBOX_UTIL_VARIANT_HPP
-
-#include <cassert>
-#include <cstddef> // size_t
-#include <new> // operator new
-#include <stdexcept> // runtime_error
-#include <string>
-#include <tuple>
-#include <type_traits>
-#include <typeinfo>
-#include <utility>
-
-#include "recursive_wrapper.hpp"
-
-// clang-format off
-// [[deprecated]] is only available in C++14, use this for the time being
-#if __cplusplus <= 201103L
-# ifdef __GNUC__
-# define MAPBOX_VARIANT_DEPRECATED __attribute__((deprecated))
-# elif defined(_MSC_VER)
-# define MAPBOX_VARIANT_DEPRECATED __declspec(deprecated)
-# else
-# define MAPBOX_VARIANT_DEPRECATED
-# endif
-#else
-# define MAPBOX_VARIANT_DEPRECATED [[deprecated]]
-#endif
-
-
-#ifdef _MSC_VER
- // https://msdn.microsoft.com/en-us/library/bw1hbe6y.aspx
- #ifdef NDEBUG
- #define VARIANT_INLINE __forceinline
- #else
- #define VARIANT_INLINE __declspec(noinline)
- #endif
-#else
- #ifdef NDEBUG
- #define VARIANT_INLINE inline __attribute__((always_inline))
- #else
- #define VARIANT_INLINE __attribute__((noinline))
- #endif
-#endif
-// clang-format on
-
-#define VARIANT_MAJOR_VERSION 1
-#define VARIANT_MINOR_VERSION 1
-#define VARIANT_PATCH_VERSION 0
-
-#define VARIANT_VERSION (VARIANT_MAJOR_VERSION * 100000) + (VARIANT_MINOR_VERSION * 100) + (VARIANT_PATCH_VERSION)
-
-namespace mapbox {
-namespace util {
-
-// XXX This should derive from std::logic_error instead of std::runtime_error.
-// See https://github.com/mapbox/variant/issues/48 for details.
-class bad_variant_access : public std::runtime_error
-{
-
- public:
- explicit bad_variant_access(const std::string& what_arg)
- : runtime_error(what_arg) {}
-
- explicit bad_variant_access(const char* what_arg)
- : runtime_error(what_arg) {}
-
-}; // class bad_variant_access
-
-template <typename R = void>
-struct MAPBOX_VARIANT_DEPRECATED static_visitor
-{
- using result_type = R;
-
- protected:
- static_visitor() {}
- ~static_visitor() {}
-};
-
-namespace detail {
-
-static constexpr std::size_t invalid_value = std::size_t(-1);
-
-template <typename T, typename... Types>
-struct direct_type;
-
-template <typename T, typename First, typename... Types>
-struct direct_type<T, First, Types...>
-{
- static constexpr std::size_t index = std::is_same<T, First>::value
- ? sizeof...(Types)
- : direct_type<T, Types...>::index;
-};
-
-template <typename T>
-struct direct_type<T>
-{
- static constexpr std::size_t index = invalid_value;
-};
-
-template <typename T, typename... Types>
-struct convertible_type;
-
-template <typename T, typename First, typename... Types>
-struct convertible_type<T, First, Types...>
-{
- static constexpr std::size_t index = std::is_convertible<T, First>::value
- ? sizeof...(Types)
- : convertible_type<T, Types...>::index;
-};
-
-template <typename T>
-struct convertible_type<T>
-{
- static constexpr std::size_t index = invalid_value;
-};
-
-template <typename T, typename... Types>
-struct value_traits
-{
- using value_type = typename std::remove_reference<T>::type;
- static constexpr std::size_t direct_index = direct_type<value_type, Types...>::index;
- static constexpr bool is_direct = direct_index != invalid_value;
- static constexpr std::size_t index = is_direct ? direct_index : convertible_type<value_type, Types...>::index;
- static constexpr bool is_valid = index != invalid_value;
- static constexpr std::size_t tindex = is_valid ? sizeof...(Types)-index : 0;
- using target_type = typename std::tuple_element<tindex, std::tuple<void, Types...>>::type;
-};
-
-// check if T is in Types...
-template <typename T, typename... Types>
-struct has_type;
-
-template <typename T, typename First, typename... Types>
-struct has_type<T, First, Types...>
-{
- static constexpr bool value = std::is_same<T, First>::value || has_type<T, Types...>::value;
-};
-
-template <typename T>
-struct has_type<T> : std::false_type
-{
-};
-
-template <typename T, typename... Types>
-struct is_valid_type;
-
-template <typename T, typename First, typename... Types>
-struct is_valid_type<T, First, Types...>
-{
- static constexpr bool value = std::is_convertible<T, First>::value || is_valid_type<T, Types...>::value;
-};
-
-template <typename T>
-struct is_valid_type<T> : std::false_type
-{
-};
-
-template <typename T, typename R = void>
-struct enable_if_type
-{
- using type = R;
-};
-
-template <typename F, typename V, typename Enable = void>
-struct result_of_unary_visit
-{
- using type = typename std::result_of<F(V&)>::type;
-};
-
-template <typename F, typename V>
-struct result_of_unary_visit<F, V, typename enable_if_type<typename F::result_type>::type>
-{
- using type = typename F::result_type;
-};
-
-template <typename F, typename V, typename Enable = void>
-struct result_of_binary_visit
-{
- using type = typename std::result_of<F(V&, V&)>::type;
-};
-
-template <typename F, typename V>
-struct result_of_binary_visit<F, V, typename enable_if_type<typename F::result_type>::type>
-{
- using type = typename F::result_type;
-};
-
-template <std::size_t arg1, std::size_t... others>
-struct static_max;
-
-template <std::size_t arg>
-struct static_max<arg>
-{
- static const std::size_t value = arg;
-};
-
-template <std::size_t arg1, std::size_t arg2, std::size_t... others>
-struct static_max<arg1, arg2, others...>
-{
- static const std::size_t value = arg1 >= arg2 ? static_max<arg1, others...>::value : static_max<arg2, others...>::value;
-};
-
-template <typename... Types>
-struct variant_helper;
-
-template <typename T, typename... Types>
-struct variant_helper<T, Types...>
-{
- VARIANT_INLINE static void destroy(const std::size_t type_index, void* data)
- {
- if (type_index == sizeof...(Types))
- {
- reinterpret_cast<T*>(data)->~T();
- }
- else
- {
- variant_helper<Types...>::destroy(type_index, data);
- }
- }
-
- VARIANT_INLINE static void move(const std::size_t old_type_index, void* old_value, void* new_value)
- {
- if (old_type_index == sizeof...(Types))
- {
- new (new_value) T(std::move(*reinterpret_cast<T*>(old_value)));
- }
- else
- {
- variant_helper<Types...>::move(old_type_index, old_value, new_value);
- }
- }
-
- VARIANT_INLINE static void copy(const std::size_t old_type_index, const void* old_value, void* new_value)
- {
- if (old_type_index == sizeof...(Types))
- {
- new (new_value) T(*reinterpret_cast<const T*>(old_value));
- }
- else
- {
- variant_helper<Types...>::copy(old_type_index, old_value, new_value);
- }
- }
-};
-
-template <>
-struct variant_helper<>
-{
- VARIANT_INLINE static void destroy(const std::size_t, void*) {}
- VARIANT_INLINE static void move(const std::size_t, void*, void*) {}
- VARIANT_INLINE static void copy(const std::size_t, const void*, void*) {}
-};
-
-template <typename T>
-struct unwrapper
-{
- static T const& apply_const(T const& obj) { return obj; }
- static T& apply(T& obj) { return obj; }
-};
-
-template <typename T>
-struct unwrapper<recursive_wrapper<T>>
-{
- static auto apply_const(recursive_wrapper<T> const& obj)
- -> typename recursive_wrapper<T>::type const&
- {
- return obj.get();
- }
- static auto apply(recursive_wrapper<T>& obj)
- -> typename recursive_wrapper<T>::type&
- {
- return obj.get();
- }
-};
-
-template <typename T>
-struct unwrapper<std::reference_wrapper<T>>
-{
- static auto apply_const(std::reference_wrapper<T> const& obj)
- -> typename std::reference_wrapper<T>::type const&
- {
- return obj.get();
- }
- static auto apply(std::reference_wrapper<T>& obj)
- -> typename std::reference_wrapper<T>::type&
- {
- return obj.get();
- }
-};
-
-template <typename F, typename V, typename R, typename... Types>
-struct dispatcher;
-
-template <typename F, typename V, typename R, typename T, typename... Types>
-struct dispatcher<F, V, R, T, Types...>
-{
- VARIANT_INLINE static R apply_const(V const& v, F&& f)
- {
- if (v.template is<T>())
- {
- return f(unwrapper<T>::apply_const(v.template get<T>()));
- }
- else
- {
- return dispatcher<F, V, R, Types...>::apply_const(v, std::forward<F>(f));
- }
- }
-
- VARIANT_INLINE static R apply(V& v, F&& f)
- {
- if (v.template is<T>())
- {
- return f(unwrapper<T>::apply(v.template get<T>()));
- }
- else
- {
- return dispatcher<F, V, R, Types...>::apply(v, std::forward<F>(f));
- }
- }
-};
-
-template <typename F, typename V, typename R, typename T>
-struct dispatcher<F, V, R, T>
-{
- VARIANT_INLINE static R apply_const(V const& v, F&& f)
- {
- return f(unwrapper<T>::apply_const(v.template get<T>()));
- }
-
- VARIANT_INLINE static R apply(V& v, F&& f)
- {
- return f(unwrapper<T>::apply(v.template get<T>()));
- }
-};
-
-template <typename F, typename V, typename R, typename T, typename... Types>
-struct binary_dispatcher_rhs;
-
-template <typename F, typename V, typename R, typename T0, typename T1, typename... Types>
-struct binary_dispatcher_rhs<F, V, R, T0, T1, Types...>
-{
- VARIANT_INLINE static R apply_const(V const& lhs, V const& rhs, F&& f)
- {
- if (rhs.template is<T1>()) // call binary functor
- {
- return f(unwrapper<T0>::apply_const(lhs.template get<T0>()),
- unwrapper<T1>::apply_const(rhs.template get<T1>()));
- }
- else
- {
- return binary_dispatcher_rhs<F, V, R, T0, Types...>::apply_const(lhs, rhs, std::forward<F>(f));
- }
- }
-
- VARIANT_INLINE static R apply(V& lhs, V& rhs, F&& f)
- {
- if (rhs.template is<T1>()) // call binary functor
- {
- return f(unwrapper<T0>::apply(lhs.template get<T0>()),
- unwrapper<T1>::apply(rhs.template get<T1>()));
- }
- else
- {
- return binary_dispatcher_rhs<F, V, R, T0, Types...>::apply(lhs, rhs, std::forward<F>(f));
- }
- }
-};
-
-template <typename F, typename V, typename R, typename T0, typename T1>
-struct binary_dispatcher_rhs<F, V, R, T0, T1>
-{
- VARIANT_INLINE static R apply_const(V const& lhs, V const& rhs, F&& f)
- {
- return f(unwrapper<T0>::apply_const(lhs.template get<T0>()),
- unwrapper<T1>::apply_const(rhs.template get<T1>()));
- }
-
- VARIANT_INLINE static R apply(V& lhs, V& rhs, F&& f)
- {
- return f(unwrapper<T0>::apply(lhs.template get<T0>()),
- unwrapper<T1>::apply(rhs.template get<T1>()));
- }
-};
-
-template <typename F, typename V, typename R, typename T, typename... Types>
-struct binary_dispatcher_lhs;
-
-template <typename F, typename V, typename R, typename T0, typename T1, typename... Types>
-struct binary_dispatcher_lhs<F, V, R, T0, T1, Types...>
-{
- VARIANT_INLINE static R apply_const(V const& lhs, V const& rhs, F&& f)
- {
- if (lhs.template is<T1>()) // call binary functor
- {
- return f(unwrapper<T1>::apply_const(lhs.template get<T1>()),
- unwrapper<T0>::apply_const(rhs.template get<T0>()));
- }
- else
- {
- return binary_dispatcher_lhs<F, V, R, T0, Types...>::apply_const(lhs, rhs, std::forward<F>(f));
- }
- }
-
- VARIANT_INLINE static R apply(V& lhs, V& rhs, F&& f)
- {
- if (lhs.template is<T1>()) // call binary functor
- {
- return f(unwrapper<T1>::apply(lhs.template get<T1>()),
- unwrapper<T0>::apply(rhs.template get<T0>()));
- }
- else
- {
- return binary_dispatcher_lhs<F, V, R, T0, Types...>::apply(lhs, rhs, std::forward<F>(f));
- }
- }
-};
-
-template <typename F, typename V, typename R, typename T0, typename T1>
-struct binary_dispatcher_lhs<F, V, R, T0, T1>
-{
- VARIANT_INLINE static R apply_const(V const& lhs, V const& rhs, F&& f)
- {
- return f(unwrapper<T1>::apply_const(lhs.template get<T1>()),
- unwrapper<T0>::apply_const(rhs.template get<T0>()));
- }
-
- VARIANT_INLINE static R apply(V& lhs, V& rhs, F&& f)
- {
- return f(unwrapper<T1>::apply(lhs.template get<T1>()),
- unwrapper<T0>::apply(rhs.template get<T0>()));
- }
-};
-
-template <typename F, typename V, typename R, typename... Types>
-struct binary_dispatcher;
-
-template <typename F, typename V, typename R, typename T, typename... Types>
-struct binary_dispatcher<F, V, R, T, Types...>
-{
- VARIANT_INLINE static R apply_const(V const& v0, V const& v1, F&& f)
- {
- if (v0.template is<T>())
- {
- if (v1.template is<T>())
- {
- return f(unwrapper<T>::apply_const(v0.template get<T>()),
- unwrapper<T>::apply_const(v1.template get<T>())); // call binary functor
- }
- else
- {
- return binary_dispatcher_rhs<F, V, R, T, Types...>::apply_const(v0, v1, std::forward<F>(f));
- }
- }
- else if (v1.template is<T>())
- {
- return binary_dispatcher_lhs<F, V, R, T, Types...>::apply_const(v0, v1, std::forward<F>(f));
- }
- return binary_dispatcher<F, V, R, Types...>::apply_const(v0, v1, std::forward<F>(f));
- }
-
- VARIANT_INLINE static R apply(V& v0, V& v1, F&& f)
- {
- if (v0.template is<T>())
- {
- if (v1.template is<T>())
- {
- return f(unwrapper<T>::apply(v0.template get<T>()),
- unwrapper<T>::apply(v1.template get<T>())); // call binary functor
- }
- else
- {
- return binary_dispatcher_rhs<F, V, R, T, Types...>::apply(v0, v1, std::forward<F>(f));
- }
- }
- else if (v1.template is<T>())
- {
- return binary_dispatcher_lhs<F, V, R, T, Types...>::apply(v0, v1, std::forward<F>(f));
- }
- return binary_dispatcher<F, V, R, Types...>::apply(v0, v1, std::forward<F>(f));
- }
-};
-
-template <typename F, typename V, typename R, typename T>
-struct binary_dispatcher<F, V, R, T>
-{
- VARIANT_INLINE static R apply_const(V const& v0, V const& v1, F&& f)
- {
- return f(unwrapper<T>::apply_const(v0.template get<T>()),
- unwrapper<T>::apply_const(v1.template get<T>())); // call binary functor
- }
-
- VARIANT_INLINE static R apply(V& v0, V& v1, F&& f)
- {
- return f(unwrapper<T>::apply(v0.template get<T>()),
- unwrapper<T>::apply(v1.template get<T>())); // call binary functor
- }
-};
-
-// comparator functors
-struct equal_comp
-{
- template <typename T>
- bool operator()(T const& lhs, T const& rhs) const
- {
- return lhs == rhs;
- }
-};
-
-struct less_comp
-{
- template <typename T>
- bool operator()(T const& lhs, T const& rhs) const
- {
- return lhs < rhs;
- }
-};
-
-template <typename Variant, typename Comp>
-class comparer
-{
- public:
- explicit comparer(Variant const& lhs) noexcept
- : lhs_(lhs) {}
- comparer& operator=(comparer const&) = delete;
- // visitor
- template <typename T>
- bool operator()(T const& rhs_content) const
- {
- T const& lhs_content = lhs_.template get<T>();
- return Comp()(lhs_content, rhs_content);
- }
-
- private:
- Variant const& lhs_;
-};
-
-// True if Predicate matches for all of the types Ts
-template <template <typename> class Predicate, typename... Ts>
-struct static_all_of : std::is_same<std::tuple<std::true_type, typename Predicate<Ts>::type...>,
- std::tuple<typename Predicate<Ts>::type..., std::true_type>>
-{
-};
-
-// True if Predicate matches for none of the types Ts
-template <template <typename> class Predicate, typename... Ts>
-struct static_none_of : std::is_same<std::tuple<std::false_type, typename Predicate<Ts>::type...>,
- std::tuple<typename Predicate<Ts>::type..., std::false_type>>
-{
-};
-
-} // namespace detail
-
-struct no_init
-{
-};
-
-template <typename... Types>
-class variant
-{
- static_assert(sizeof...(Types) > 0, "Template parameter type list of variant can not be empty");
- static_assert(detail::static_none_of<std::is_reference, Types...>::value, "Variant can not hold reference types. Maybe use std::reference?");
-
- private:
- static const std::size_t data_size = detail::static_max<sizeof(Types)...>::value;
- static const std::size_t data_align = detail::static_max<alignof(Types)...>::value;
-
- using first_type = typename std::tuple_element<0, std::tuple<Types...>>::type;
- using data_type = typename std::aligned_storage<data_size, data_align>::type;
- using helper_type = detail::variant_helper<Types...>;
-
- std::size_t type_index;
- data_type data;
-
- public:
- VARIANT_INLINE variant() noexcept(std::is_nothrow_default_constructible<first_type>::value)
- : type_index(sizeof...(Types)-1)
- {
- static_assert(std::is_default_constructible<first_type>::value, "First type in variant must be default constructible to allow default construction of variant");
- new (&data) first_type();
- }
-
- VARIANT_INLINE variant(no_init) noexcept
- : type_index(detail::invalid_value) {}
-
- // http://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers
- template <typename T, typename Traits = detail::value_traits<T, Types...>,
- typename Enable = typename std::enable_if<Traits::is_valid>::type>
- VARIANT_INLINE variant(T&& val) noexcept(std::is_nothrow_constructible<typename Traits::target_type, T&&>::value)
- : type_index(Traits::index)
- {
- new (&data) typename Traits::target_type(std::forward<T>(val));
- }
-
- VARIANT_INLINE variant(variant<Types...> const& old)
- : type_index(old.type_index)
- {
- helper_type::copy(old.type_index, &old.data, &data);
- }
-
- VARIANT_INLINE variant(variant<Types...>&& old) noexcept(std::is_nothrow_move_constructible<std::tuple<Types...>>::value)
- : type_index(old.type_index)
- {
- helper_type::move(old.type_index, &old.data, &data);
- }
-
- private:
- VARIANT_INLINE void copy_assign(variant<Types...> const& rhs)
- {
- helper_type::destroy(type_index, &data);
- type_index = detail::invalid_value;
- helper_type::copy(rhs.type_index, &rhs.data, &data);
- type_index = rhs.type_index;
- }
-
- VARIANT_INLINE void move_assign(variant<Types...>&& rhs)
- {
- helper_type::destroy(type_index, &data);
- type_index = detail::invalid_value;
- helper_type::move(rhs.type_index, &rhs.data, &data);
- type_index = rhs.type_index;
- }
-
- public:
- VARIANT_INLINE variant<Types...>& operator=(variant<Types...>&& other)
- {
- move_assign(std::move(other));
- return *this;
- }
-
- VARIANT_INLINE variant<Types...>& operator=(variant<Types...> const& other)
- {
- copy_assign(other);
- return *this;
- }
-
- // conversions
- // move-assign
- template <typename T>
- VARIANT_INLINE variant<Types...>& operator=(T&& rhs) noexcept
- {
- variant<Types...> temp(std::forward<T>(rhs));
- move_assign(std::move(temp));
- return *this;
- }
-
- // copy-assign
- template <typename T>
- VARIANT_INLINE variant<Types...>& operator=(T const& rhs)
- {
- variant<Types...> temp(rhs);
- copy_assign(temp);
- return *this;
- }
-
- template <typename T>
- VARIANT_INLINE bool is() const
- {
- static_assert(detail::has_type<T, Types...>::value, "invalid type in T in `is<T>()` for this variant");
- return type_index == detail::direct_type<T, Types...>::index;
- }
-
- VARIANT_INLINE bool valid() const
- {
- return type_index != detail::invalid_value;
- }
-
- template <typename T, typename... Args>
- VARIANT_INLINE void set(Args&&... args)
- {
- helper_type::destroy(type_index, &data);
- type_index = detail::invalid_value;
- new (&data) T(std::forward<Args>(args)...);
- type_index = detail::direct_type<T, Types...>::index;
- }
-
- // get<T>()
- template <typename T, typename std::enable_if<
- (detail::direct_type<T, Types...>::index != detail::invalid_value)>::type* = nullptr>
- VARIANT_INLINE T& get()
- {
- if (type_index == detail::direct_type<T, Types...>::index)
- {
- return *reinterpret_cast<T*>(&data);
- }
- else
- {
- throw bad_variant_access("in get<T>()");
- }
- }
-
- template <typename T, typename std::enable_if<
- (detail::direct_type<T, Types...>::index != detail::invalid_value)>::type* = nullptr>
- VARIANT_INLINE T const& get() const
- {
- if (type_index == detail::direct_type<T, Types...>::index)
- {
- return *reinterpret_cast<T const*>(&data);
- }
- else
- {
- throw bad_variant_access("in get<T>()");
- }
- }
-
- // get<T>() - T stored as recursive_wrapper<T>
- template <typename T, typename std::enable_if<
- (detail::direct_type<recursive_wrapper<T>, Types...>::index != detail::invalid_value)>::type* = nullptr>
- VARIANT_INLINE T& get()
- {
- if (type_index == detail::direct_type<recursive_wrapper<T>, Types...>::index)
- {
- return (*reinterpret_cast<recursive_wrapper<T>*>(&data)).get();
- }
- else
- {
- throw bad_variant_access("in get<T>()");
- }
- }
-
- template <typename T, typename std::enable_if<
- (detail::direct_type<recursive_wrapper<T>, Types...>::index != detail::invalid_value)>::type* = nullptr>
- VARIANT_INLINE T const& get() const
- {
- if (type_index == detail::direct_type<recursive_wrapper<T>, Types...>::index)
- {
- return (*reinterpret_cast<recursive_wrapper<T> const*>(&data)).get();
- }
- else
- {
- throw bad_variant_access("in get<T>()");
- }
- }
-
- // get<T>() - T stored as std::reference_wrapper<T>
- template <typename T, typename std::enable_if<
- (detail::direct_type<std::reference_wrapper<T>, Types...>::index != detail::invalid_value)>::type* = nullptr>
- VARIANT_INLINE T& get()
- {
- if (type_index == detail::direct_type<std::reference_wrapper<T>, Types...>::index)
- {
- return (*reinterpret_cast<std::reference_wrapper<T>*>(&data)).get();
- }
- else
- {
- throw bad_variant_access("in get<T>()");
- }
- }
-
- template <typename T, typename std::enable_if<
- (detail::direct_type<std::reference_wrapper<T const>, Types...>::index != detail::invalid_value)>::type* = nullptr>
- VARIANT_INLINE T const& get() const
- {
- if (type_index == detail::direct_type<std::reference_wrapper<T const>, Types...>::index)
- {
- return (*reinterpret_cast<std::reference_wrapper<T const> const*>(&data)).get();
- }
- else
- {
- throw bad_variant_access("in get<T>()");
- }
- }
-
- // This function is deprecated because it returns an internal index field.
- // Use which() instead.
- MAPBOX_VARIANT_DEPRECATED VARIANT_INLINE std::size_t get_type_index() const
- {
- return type_index;
- }
-
- VARIANT_INLINE int which() const noexcept
- {
- return static_cast<int>(sizeof...(Types)-type_index - 1);
- }
-
- // visitor
- // unary
- template <typename F, typename V, typename R = typename detail::result_of_unary_visit<F, first_type>::type>
- auto VARIANT_INLINE static visit(V const& v, F&& f)
- -> decltype(detail::dispatcher<F, V, R, Types...>::apply_const(v, std::forward<F>(f)))
- {
- return detail::dispatcher<F, V, R, Types...>::apply_const(v, std::forward<F>(f));
- }
- // non-const
- template <typename F, typename V, typename R = typename detail::result_of_unary_visit<F, first_type>::type>
- auto VARIANT_INLINE static visit(V& v, F&& f)
- -> decltype(detail::dispatcher<F, V, R, Types...>::apply(v, std::forward<F>(f)))
- {
- return detail::dispatcher<F, V, R, Types...>::apply(v, std::forward<F>(f));
- }
-
- // binary
- // const
- template <typename F, typename V, typename R = typename detail::result_of_binary_visit<F, first_type>::type>
- auto VARIANT_INLINE static binary_visit(V const& v0, V const& v1, F&& f)
- -> decltype(detail::binary_dispatcher<F, V, R, Types...>::apply_const(v0, v1, std::forward<F>(f)))
- {
- return detail::binary_dispatcher<F, V, R, Types...>::apply_const(v0, v1, std::forward<F>(f));
- }
- // non-const
- template <typename F, typename V, typename R = typename detail::result_of_binary_visit<F, first_type>::type>
- auto VARIANT_INLINE static binary_visit(V& v0, V& v1, F&& f)
- -> decltype(detail::binary_dispatcher<F, V, R, Types...>::apply(v0, v1, std::forward<F>(f)))
- {
- return detail::binary_dispatcher<F, V, R, Types...>::apply(v0, v1, std::forward<F>(f));
- }
-
- ~variant() noexcept // no-throw destructor
- {
- helper_type::destroy(type_index, &data);
- }
-
- // comparison operators
- // equality
- VARIANT_INLINE bool operator==(variant const& rhs) const
- {
- assert(valid() && rhs.valid());
- if (this->which() != rhs.which())
- {
- return false;
- }
- detail::comparer<variant, detail::equal_comp> visitor(*this);
- return visit(rhs, visitor);
- }
-
- VARIANT_INLINE bool operator!=(variant const& rhs) const
- {
- return !(*this == rhs);
- }
-
- // less than
- VARIANT_INLINE bool operator<(variant const& rhs) const
- {
- assert(valid() && rhs.valid());
- if (this->which() != rhs.which())
- {
- return this->which() < rhs.which();
- }
- detail::comparer<variant, detail::less_comp> visitor(*this);
- return visit(rhs, visitor);
- }
- VARIANT_INLINE bool operator>(variant const& rhs) const
- {
- return rhs < *this;
- }
- VARIANT_INLINE bool operator<=(variant const& rhs) const
- {
- return !(*this > rhs);
- }
- VARIANT_INLINE bool operator>=(variant const& rhs) const
- {
- return !(*this < rhs);
- }
-};
-
-// unary visitor interface
-// const
-template <typename F, typename V>
-auto VARIANT_INLINE apply_visitor(F&& f, V const& v) -> decltype(V::visit(v, std::forward<F>(f)))
-{
- return V::visit(v, std::forward<F>(f));
-}
-
-// non-const
-template <typename F, typename V>
-auto VARIANT_INLINE apply_visitor(F&& f, V& v) -> decltype(V::visit(v, std::forward<F>(f)))
-{
- return V::visit(v, std::forward<F>(f));
-}
-
-// binary visitor interface
-// const
-template <typename F, typename V>
-auto VARIANT_INLINE apply_visitor(F&& f, V const& v0, V const& v1) -> decltype(V::binary_visit(v0, v1, std::forward<F>(f)))
-{
- return V::binary_visit(v0, v1, std::forward<F>(f));
-}
-
-// non-const
-template <typename F, typename V>
-auto VARIANT_INLINE apply_visitor(F&& f, V& v0, V& v1) -> decltype(V::binary_visit(v0, v1, std::forward<F>(f)))
-{
- return V::binary_visit(v0, v1, std::forward<F>(f));
-}
-
-// getter interface
-template <typename ResultType, typename T>
-ResultType& get(T& var)
-{
- return var.template get<ResultType>();
-}
-
-template <typename ResultType, typename T>
-ResultType const& get(T const& var)
-{
- return var.template get<ResultType>();
-}
-} // namespace util
-} // namespace mapbox
-
-#endif // MAPBOX_UTIL_VARIANT_HPP
diff --git a/third_party/variant/variant_io.hpp b/third_party/variant/variant_io.hpp
deleted file mode 100644
index e64cbad..0000000
--- a/third_party/variant/variant_io.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef MAPBOX_UTIL_VARIANT_IO_HPP
-#define MAPBOX_UTIL_VARIANT_IO_HPP
-
-#include <iosfwd>
-
-#include "variant.hpp"
-
-namespace mapbox {
-namespace util {
-
-namespace detail {
-// operator<< helper
-template <typename Out>
-class printer
-{
- public:
- explicit printer(Out& out)
- : out_(out) {}
- printer& operator=(printer const&) = delete;
-
- // visitor
- template <typename T>
- void operator()(T const& operand) const
- {
- out_ << operand;
- }
-
- private:
- Out& out_;
-};
-}
-
-// operator<<
-template <typename CharT, typename Traits, typename... Types>
-VARIANT_INLINE std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& out, variant<Types...> const& rhs)
-{
- detail::printer<std::basic_ostream<CharT, Traits>> visitor(out);
- apply_visitor(visitor, rhs);
- return out;
-}
-} // namespace util
-} // namespace mapbox
-
-#endif // MAPBOX_UTIL_VARIANT_IO_HPP
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/osrm.git
More information about the Pkg-grass-devel
mailing list