mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 12:17:11 +01:00 
			
		
		
		
	Split SelfTest test files into Usage and Introspective varieties
Usage: just exercises Catch. The tests are over arbitrary date/ types Introspective: Tests parts of Catch itself.
This commit is contained in:
		
							
								
								
									
										264
									
								
								projects/SelfTest/IntrospectiveTests/CmdLineTests.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										264
									
								
								projects/SelfTest/IntrospectiveTests/CmdLineTests.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,264 @@ | ||||
| /* | ||||
|  *  Created by Phil on 13/5/2013. | ||||
|  *  Copyright 2014 Two Blue Cubes Ltd. All rights reserved. | ||||
|  * | ||||
|  *  Distributed under the Boost Software License, Version 1.0. (See accompanying | ||||
|  *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | ||||
|  */ | ||||
|  | ||||
| #include "catch.hpp" | ||||
| #include "internal/catch_test_spec_parser.h" | ||||
|  | ||||
| #ifdef __clang__ | ||||
| #   pragma clang diagnostic ignored "-Wc++98-compat" | ||||
| #endif | ||||
|  | ||||
| inline Catch::TestCase fakeTestCase( const char* name, const char* desc = "" ){ return Catch::makeTestCase( nullptr, "", name, desc, CATCH_INTERNAL_LINEINFO ); } | ||||
|  | ||||
| TEST_CASE( "Parse test names and tags" ) { | ||||
|  | ||||
|     using Catch::parseTestSpec; | ||||
|     using Catch::TestSpec; | ||||
|  | ||||
|     Catch::TestCase tcA = fakeTestCase( "a" ); | ||||
|     Catch::TestCase tcB = fakeTestCase( "b", "[one][x]" ); | ||||
|     Catch::TestCase tcC = fakeTestCase( "longer name with spaces", "[two][three][.][x]" ); | ||||
|     Catch::TestCase tcD = fakeTestCase( "zlonger name with spacesz" ); | ||||
|  | ||||
|     SECTION( "Empty test spec should have no filters" ) { | ||||
|         TestSpec spec; | ||||
|         CHECK( spec.hasFilters() == false ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|     } | ||||
|  | ||||
|     SECTION( "Test spec from empty string should have no filters" ) { | ||||
|         TestSpec spec = parseTestSpec( "" ); | ||||
|         CHECK( spec.hasFilters() == false ); | ||||
|         CHECK( spec.matches(tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|     } | ||||
|  | ||||
|     SECTION( "Test spec from just a comma should have no filters" ) { | ||||
|         TestSpec spec = parseTestSpec( "," ); | ||||
|         CHECK( spec.hasFilters() == false ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|     } | ||||
|  | ||||
|     SECTION( "Test spec from name should have one filter" ) { | ||||
|         TestSpec spec = parseTestSpec( "b" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == true ); | ||||
|     } | ||||
|  | ||||
|     SECTION( "Test spec from quoted name should have one filter" ) { | ||||
|         TestSpec spec = parseTestSpec( "\"b\"" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == true ); | ||||
|     } | ||||
|  | ||||
|     SECTION( "Test spec from name should have one filter" ) { | ||||
|         TestSpec spec = parseTestSpec( "b" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == true ); | ||||
|         CHECK( spec.matches( tcC ) == false ); | ||||
|     } | ||||
|  | ||||
|     SECTION( "Wildcard at the start" ) { | ||||
|         TestSpec spec = parseTestSpec( "*spaces" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|         CHECK( spec.matches( tcC ) == true ); | ||||
|         CHECK( spec.matches( tcD ) == false ); | ||||
|         CHECK( parseTestSpec( "*a" ).matches( tcA ) == true ); | ||||
|     } | ||||
|     SECTION( "Wildcard at the end" ) { | ||||
|         TestSpec spec = parseTestSpec( "long*" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|         CHECK( spec.matches( tcC ) == true ); | ||||
|         CHECK( spec.matches( tcD ) == false ); | ||||
|         CHECK( parseTestSpec( "a*" ).matches( tcA ) == true ); | ||||
|     } | ||||
|     SECTION( "Wildcard at both ends" ) { | ||||
|         TestSpec spec = parseTestSpec( "*name*" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|         CHECK( spec.matches( tcC ) == true ); | ||||
|         CHECK( spec.matches( tcD ) == true ); | ||||
|         CHECK( parseTestSpec( "*a*" ).matches( tcA ) == true ); | ||||
|     } | ||||
|     SECTION( "Redundant wildcard at the start" ) { | ||||
|         TestSpec spec = parseTestSpec( "*a" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == true ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|     } | ||||
|     SECTION( "Redundant wildcard at the end" ) { | ||||
|         TestSpec spec = parseTestSpec( "a*" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == true ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|     } | ||||
|     SECTION( "Redundant wildcard at both ends" ) { | ||||
|         TestSpec spec = parseTestSpec( "*a*" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == true ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|     } | ||||
|     SECTION( "Wildcard at both ends, redundant at start" ) { | ||||
|         TestSpec spec = parseTestSpec( "*longer*" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|         CHECK( spec.matches( tcC ) == true ); | ||||
|         CHECK( spec.matches( tcD ) == true ); | ||||
|     } | ||||
|     SECTION( "Just wildcard" ) { | ||||
|         TestSpec spec = parseTestSpec( "*" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == true ); | ||||
|         CHECK( spec.matches( tcB ) == true ); | ||||
|         CHECK( spec.matches( tcC ) == true ); | ||||
|         CHECK( spec.matches( tcD ) == true ); | ||||
|     } | ||||
|  | ||||
|     SECTION( "Single tag" ) { | ||||
|         TestSpec spec = parseTestSpec( "[one]" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == true ); | ||||
|         CHECK( spec.matches( tcC ) == false ); | ||||
|     } | ||||
|     SECTION( "Single tag, two matches" ) { | ||||
|         TestSpec spec = parseTestSpec( "[x]" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == true ); | ||||
|         CHECK( spec.matches( tcC ) == true ); | ||||
|     } | ||||
|     SECTION( "Two tags" ) { | ||||
|         TestSpec spec = parseTestSpec( "[two][x]" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|         CHECK( spec.matches( tcC ) == true ); | ||||
|     } | ||||
|     SECTION( "Two tags, spare separated" ) { | ||||
|         TestSpec spec = parseTestSpec( "[two] [x]" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|         CHECK( spec.matches( tcC ) == true ); | ||||
|     } | ||||
|     SECTION( "Wildcarded name and tag" ) { | ||||
|         TestSpec spec = parseTestSpec( "*name*[x]" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|         CHECK( spec.matches( tcC ) == true ); | ||||
|         CHECK( spec.matches( tcD ) == false ); | ||||
|     } | ||||
|     SECTION( "Single tag exclusion" ) { | ||||
|         TestSpec spec = parseTestSpec( "~[one]" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == true ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|         CHECK( spec.matches( tcC ) == true ); | ||||
|     } | ||||
|     SECTION( "One tag exclusion and one tag inclusion" ) { | ||||
|         TestSpec spec = parseTestSpec( "~[two][x]" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == true ); | ||||
|         CHECK( spec.matches( tcC ) == false ); | ||||
|     } | ||||
|     SECTION( "One tag exclusion and one wldcarded name inclusion" ) { | ||||
|         TestSpec spec = parseTestSpec( "~[two]*name*" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|         CHECK( spec.matches( tcC ) == false ); | ||||
|         CHECK( spec.matches( tcD ) == true ); | ||||
|     } | ||||
|     SECTION( "One tag exclusion, using exclude:, and one wldcarded name inclusion" ) { | ||||
|         TestSpec spec = parseTestSpec( "exclude:[two]*name*" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|         CHECK( spec.matches( tcC ) == false ); | ||||
|         CHECK( spec.matches( tcD ) == true ); | ||||
|     } | ||||
|     SECTION( "name exclusion" ) { | ||||
|         TestSpec spec = parseTestSpec( "~b" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == true ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|         CHECK( spec.matches( tcC ) == true ); | ||||
|         CHECK( spec.matches( tcD ) == true ); | ||||
|     } | ||||
|     SECTION( "wildcarded name exclusion" ) { | ||||
|         TestSpec spec = parseTestSpec( "~*name*" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == true ); | ||||
|         CHECK( spec.matches( tcB ) == true ); | ||||
|         CHECK( spec.matches( tcC ) == false ); | ||||
|         CHECK( spec.matches( tcD ) == false ); | ||||
|     } | ||||
|     SECTION( "wildcarded name exclusion with tag inclusion" ) { | ||||
|         TestSpec spec = parseTestSpec( "~*name*,[three]" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == true ); | ||||
|         CHECK( spec.matches( tcB ) == true ); | ||||
|         CHECK( spec.matches( tcC ) == true ); | ||||
|         CHECK( spec.matches( tcD ) == false ); | ||||
|     } | ||||
|     SECTION( "wildcarded name exclusion, using exclude:, with tag inclusion" ) { | ||||
|         TestSpec spec = parseTestSpec( "exclude:*name*,[three]" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == true ); | ||||
|         CHECK( spec.matches( tcB ) == true ); | ||||
|         CHECK( spec.matches( tcC ) == true ); | ||||
|         CHECK( spec.matches( tcD ) == false ); | ||||
|     } | ||||
|     SECTION( "two wildcarded names" ) { | ||||
|         TestSpec spec = parseTestSpec( "\"longer*\"\"*spaces\"" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|         CHECK( spec.matches( tcC ) == true ); | ||||
|         CHECK( spec.matches( tcD ) == false ); | ||||
|     } | ||||
|     SECTION( "empty tag" ) { | ||||
|         TestSpec spec = parseTestSpec( "[]" ); | ||||
|         CHECK( spec.hasFilters() == false ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|         CHECK( spec.matches( tcC ) == false ); | ||||
|         CHECK( spec.matches( tcD ) == false ); | ||||
|     } | ||||
|     SECTION( "empty quoted name" ) { | ||||
|         TestSpec spec = parseTestSpec( "\"\"" ); | ||||
|         CHECK( spec.hasFilters() == false ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|         CHECK( spec.matches( tcC ) == false ); | ||||
|         CHECK( spec.matches( tcD ) == false ); | ||||
|     } | ||||
|     SECTION( "quoted string followed by tag exclusion" ) { | ||||
|         TestSpec spec = parseTestSpec( "\"*name*\"~[.]" ); | ||||
|         CHECK( spec.hasFilters() == true ); | ||||
|         CHECK( spec.matches( tcA ) == false ); | ||||
|         CHECK( spec.matches( tcB ) == false ); | ||||
|         CHECK( spec.matches( tcC ) == false ); | ||||
|         CHECK( spec.matches( tcD ) == true ); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										333
									
								
								projects/SelfTest/IntrospectiveTests/PartTrackerTests.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										333
									
								
								projects/SelfTest/IntrospectiveTests/PartTrackerTests.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,333 @@ | ||||
| /* | ||||
|  *  Created by Phil on 1/10/2015. | ||||
|  *  Copyright 2015 Two Blue Cubes Ltd | ||||
|  * | ||||
|  *  Distributed under the Boost Software License, Version 1.0. (See accompanying | ||||
|  *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | ||||
|  */ | ||||
| #include "internal/catch_suppress_warnings.h" | ||||
| #include "internal/catch_test_case_tracker.h" | ||||
|  | ||||
|  | ||||
| namespace Catch | ||||
| { | ||||
|     class LocalContext { | ||||
|  | ||||
|     public: | ||||
|         TrackerContext& operator()() const { | ||||
|             return TrackerContext::instance(); | ||||
|         } | ||||
|     }; | ||||
|  | ||||
| } // namespace Catch | ||||
|  | ||||
| inline Catch::TrackerContext& C_A_T_C_H_Context() { | ||||
|     return Catch::TrackerContext::instance(); | ||||
| } | ||||
|  | ||||
| // ------------------- | ||||
|  | ||||
| #include "catch.hpp" | ||||
|  | ||||
| using namespace Catch; | ||||
|  | ||||
| //inline void testCase( Catch::LocalContext const& C_A_T_C_H_Context ) { | ||||
| // | ||||
| //    REQUIRE( C_A_T_C_H_Context().i() == 42 ); | ||||
| //} | ||||
|  | ||||
| Catch::TestCaseTracking::NameAndLocation makeNAL( std::string const& name ) { | ||||
|     return Catch::TestCaseTracking::NameAndLocation( name, Catch::SourceLineInfo("",0) ); | ||||
| } | ||||
|  | ||||
| TEST_CASE( "Tracker" ) { | ||||
|  | ||||
|     TrackerContext ctx; | ||||
|     ctx.startRun(); | ||||
|     ctx.startCycle(); | ||||
|  | ||||
|  | ||||
|     ITracker& testCase = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) ); | ||||
|     REQUIRE( testCase.isOpen() ); | ||||
|  | ||||
|     ITracker& s1 = SectionTracker::acquire( ctx, makeNAL( "S1" ) ); | ||||
|     REQUIRE( s1.isOpen() ); | ||||
|  | ||||
|     SECTION( "successfully close one section" ) { | ||||
|         s1.close(); | ||||
|         REQUIRE( s1.isSuccessfullyCompleted() ); | ||||
|         REQUIRE( testCase.isComplete() == false ); | ||||
|  | ||||
|         testCase.close(); | ||||
|         REQUIRE( ctx.completedCycle() ); | ||||
|         REQUIRE( testCase.isSuccessfullyCompleted() ); | ||||
|     } | ||||
|  | ||||
|     SECTION( "fail one section" ) { | ||||
|         s1.fail(); | ||||
|         REQUIRE( s1.isComplete() ); | ||||
|         REQUIRE( s1.isSuccessfullyCompleted() == false ); | ||||
|         REQUIRE( testCase.isComplete() == false ); | ||||
|  | ||||
|         testCase.close(); | ||||
|         REQUIRE( ctx.completedCycle() ); | ||||
|         REQUIRE( testCase.isSuccessfullyCompleted() == false ); | ||||
|  | ||||
|         SECTION( "re-enter after failed section" ) { | ||||
|             ctx.startCycle(); | ||||
|             ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) ); | ||||
|             REQUIRE( testCase2.isOpen() ); | ||||
|  | ||||
|             ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) ); | ||||
|             REQUIRE( s1b.isOpen() == false ); | ||||
|  | ||||
|             testCase2.close(); | ||||
|             REQUIRE( ctx.completedCycle() ); | ||||
|             REQUIRE( testCase.isComplete() ); | ||||
|             REQUIRE( testCase.isSuccessfullyCompleted() ); | ||||
|         } | ||||
|         SECTION( "re-enter after failed section and find next section" ) { | ||||
|             ctx.startCycle(); | ||||
|             ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) ); | ||||
|             REQUIRE( testCase2.isOpen() ); | ||||
|  | ||||
|             ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) ); | ||||
|             REQUIRE( s1b.isOpen() == false ); | ||||
|  | ||||
|             ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) ); | ||||
|             REQUIRE( s2.isOpen() ); | ||||
|  | ||||
|             s2.close(); | ||||
|             REQUIRE( ctx.completedCycle() ); | ||||
|  | ||||
|             testCase2.close(); | ||||
|             REQUIRE( testCase.isComplete() ); | ||||
|             REQUIRE( testCase.isSuccessfullyCompleted() ); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     SECTION( "successfully close one section, then find another" ) { | ||||
|         s1.close(); | ||||
|  | ||||
|         ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) ); | ||||
|         REQUIRE( s2.isOpen() == false ); | ||||
|  | ||||
|         testCase.close(); | ||||
|         REQUIRE( testCase.isComplete() == false ); | ||||
|  | ||||
|         SECTION( "Re-enter - skips S1 and enters S2" ) { | ||||
|             ctx.startCycle(); | ||||
|             ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) ); | ||||
|             REQUIRE( testCase2.isOpen() ); | ||||
|  | ||||
|             ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) ); | ||||
|             REQUIRE( s1b.isOpen() == false ); | ||||
|  | ||||
|             ITracker& s2b = SectionTracker::acquire( ctx, makeNAL( "S2" ) ); | ||||
|             REQUIRE( s2b.isOpen() ); | ||||
|  | ||||
|             REQUIRE( ctx.completedCycle() == false ); | ||||
|  | ||||
|             SECTION ("Successfully close S2") { | ||||
|                 s2b.close(); | ||||
|                 REQUIRE( ctx.completedCycle() ); | ||||
|  | ||||
|                 REQUIRE( s2b.isSuccessfullyCompleted() ); | ||||
|                 REQUIRE( testCase2.isComplete() == false ); | ||||
|  | ||||
|                 testCase2.close(); | ||||
|                 REQUIRE( testCase2.isSuccessfullyCompleted() ); | ||||
|             } | ||||
|             SECTION ("fail S2") { | ||||
|                 s2b.fail(); | ||||
|                 REQUIRE( ctx.completedCycle() ); | ||||
|  | ||||
|                 REQUIRE( s2b.isComplete() ); | ||||
|                 REQUIRE( s2b.isSuccessfullyCompleted() == false ); | ||||
|  | ||||
|                 testCase2.close(); | ||||
|                 REQUIRE( testCase2.isSuccessfullyCompleted() == false ); | ||||
|  | ||||
|                 // Need a final cycle | ||||
|                 ctx.startCycle(); | ||||
|                 ITracker& testCase3 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) ); | ||||
|                 REQUIRE( testCase3.isOpen() ); | ||||
|  | ||||
|                 ITracker& s1c = SectionTracker::acquire( ctx, makeNAL( "S1" ) ); | ||||
|                 REQUIRE( s1c.isOpen() == false ); | ||||
|  | ||||
|                 ITracker& s2c = SectionTracker::acquire( ctx, makeNAL( "S2" ) ); | ||||
|                 REQUIRE( s2c.isOpen() == false ); | ||||
|  | ||||
|                 testCase3.close(); | ||||
|                 REQUIRE( testCase3.isSuccessfullyCompleted() ); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     SECTION( "open a nested section" ) { | ||||
|         ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) ); | ||||
|         REQUIRE( s2.isOpen() ); | ||||
|  | ||||
|         s2.close(); | ||||
|         REQUIRE( s2.isComplete() ); | ||||
|         REQUIRE( s1.isComplete() == false ); | ||||
|  | ||||
|         s1.close(); | ||||
|         REQUIRE( s1.isComplete() ); | ||||
|         REQUIRE( testCase.isComplete() == false ); | ||||
|  | ||||
|         testCase.close(); | ||||
|         REQUIRE( testCase.isComplete() ); | ||||
|     } | ||||
|  | ||||
|     SECTION( "start a generator" ) { | ||||
|         IndexTracker& g1 = IndexTracker::acquire( ctx, makeNAL( "G1" ), 2 ); | ||||
|         REQUIRE( g1.isOpen() ); | ||||
|         REQUIRE( g1.index() == 0 ); | ||||
|  | ||||
|         REQUIRE( g1.isComplete() == false ); | ||||
|         REQUIRE( s1.isComplete() == false ); | ||||
|  | ||||
|         SECTION( "close outer section" ) | ||||
|         { | ||||
|             s1.close(); | ||||
|             REQUIRE( s1.isComplete() == false ); | ||||
|             testCase.close(); | ||||
|             REQUIRE( testCase.isSuccessfullyCompleted() == false ); | ||||
|  | ||||
|             SECTION( "Re-enter for second generation" ) { | ||||
|                 ctx.startCycle(); | ||||
|                 ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) ); | ||||
|                 REQUIRE( testCase2.isOpen() ); | ||||
|  | ||||
|                 ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) ); | ||||
|                 REQUIRE( s1b.isOpen() ); | ||||
|  | ||||
|  | ||||
|                 IndexTracker& g1b = IndexTracker::acquire( ctx, makeNAL( "G1" ), 2 ); | ||||
|                 REQUIRE( g1b.isOpen() ); | ||||
|                 REQUIRE( g1b.index() == 1 ); | ||||
|  | ||||
|                 REQUIRE( s1.isComplete() == false ); | ||||
|  | ||||
|                 s1b.close(); | ||||
|                 REQUIRE( s1b.isComplete() ); | ||||
|                 REQUIRE( g1b.isComplete() ); | ||||
|                 testCase2.close(); | ||||
|                 REQUIRE( testCase2.isComplete() ); | ||||
|             } | ||||
|         } | ||||
|         SECTION( "Start a new inner section" ) { | ||||
|             ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) ); | ||||
|             REQUIRE( s2.isOpen() ); | ||||
|  | ||||
|             s2.close(); | ||||
|             REQUIRE( s2.isComplete() ); | ||||
|  | ||||
|             s1.close(); | ||||
|             REQUIRE( s1.isComplete() == false ); | ||||
|  | ||||
|             testCase.close(); | ||||
|             REQUIRE( testCase.isComplete() == false ); | ||||
|  | ||||
|             SECTION( "Re-enter for second generation" ) { | ||||
|                 ctx.startCycle(); | ||||
|                 ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) ); | ||||
|                 REQUIRE( testCase2.isOpen() ); | ||||
|  | ||||
|                 ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) ); | ||||
|                 REQUIRE( s1b.isOpen() ); | ||||
|  | ||||
|                 // generator - next value | ||||
|                 IndexTracker& g1b = IndexTracker::acquire( ctx, makeNAL( "G1" ), 2 ); | ||||
|                 REQUIRE( g1b.isOpen() ); | ||||
|                 REQUIRE( g1b.index() == 1 ); | ||||
|  | ||||
|                 // inner section again | ||||
|                 ITracker& s2b = SectionTracker::acquire( ctx, makeNAL( "S2" ) ); | ||||
|                 REQUIRE( s2b.isOpen() ); | ||||
|  | ||||
|                 s2b.close(); | ||||
|                 REQUIRE( s2b.isComplete() ); | ||||
|  | ||||
|                 s1b.close(); | ||||
|                 REQUIRE( g1b.isComplete() ); | ||||
|                 REQUIRE( s1b.isComplete() ); | ||||
|  | ||||
|                 testCase2.close(); | ||||
|                 REQUIRE( testCase2.isComplete() ); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         SECTION( "Fail an inner section" ) { | ||||
|             ITracker& s2 = SectionTracker::acquire( ctx, makeNAL( "S2" ) ); | ||||
|             REQUIRE( s2.isOpen() ); | ||||
|  | ||||
|             s2.fail(); | ||||
|             REQUIRE( s2.isComplete() ); | ||||
|             REQUIRE( s2.isSuccessfullyCompleted() == false ); | ||||
|  | ||||
|             s1.close(); | ||||
|             REQUIRE( s1.isComplete() == false ); | ||||
|  | ||||
|             testCase.close(); | ||||
|             REQUIRE( testCase.isComplete() == false ); | ||||
|  | ||||
|             SECTION( "Re-enter for second generation" ) { | ||||
|                 ctx.startCycle(); | ||||
|                 ITracker& testCase2 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) ); | ||||
|                 REQUIRE( testCase2.isOpen() ); | ||||
|  | ||||
|                 ITracker& s1b = SectionTracker::acquire( ctx, makeNAL( "S1" ) ); | ||||
|                 REQUIRE( s1b.isOpen() ); | ||||
|  | ||||
|                 // generator - still same value | ||||
|                 IndexTracker& g1b = IndexTracker::acquire( ctx, makeNAL( "G1" ), 2 ); | ||||
|                 REQUIRE( g1b.isOpen() ); | ||||
|                 REQUIRE( g1b.index() == 0 ); | ||||
|  | ||||
|                 // inner section again - this time won't open | ||||
|                 ITracker& s2b = SectionTracker::acquire( ctx, makeNAL( "S2" ) ); | ||||
|                 REQUIRE( s2b.isOpen() == false ); | ||||
|  | ||||
|                 s1b.close(); | ||||
|                 REQUIRE( g1b.isComplete() == false ); | ||||
|                 REQUIRE( s1b.isComplete() == false ); | ||||
|  | ||||
|                 testCase2.close(); | ||||
|                 REQUIRE( testCase2.isComplete() == false ); | ||||
|  | ||||
|                 // Another cycle - now should complete | ||||
|                 ctx.startCycle(); | ||||
|                 ITracker& testCase3 = SectionTracker::acquire( ctx, makeNAL( "Testcase" ) ); | ||||
|                 REQUIRE( testCase3.isOpen() ); | ||||
|  | ||||
|                 ITracker& s1c = SectionTracker::acquire( ctx, makeNAL( "S1" ) ); | ||||
|                 REQUIRE( s1c.isOpen() ); | ||||
|  | ||||
|                 // generator - now next value | ||||
|                 IndexTracker& g1c = IndexTracker::acquire( ctx, makeNAL( "G1" ), 2 ); | ||||
|                 REQUIRE( g1c.isOpen() ); | ||||
|                 REQUIRE( g1c.index() == 1 ); | ||||
|  | ||||
|                 // inner section - now should open again | ||||
|                 ITracker& s2c = SectionTracker::acquire( ctx, makeNAL( "S2" ) ); | ||||
|                 REQUIRE( s2c.isOpen() ); | ||||
|  | ||||
|                 s2c.close(); | ||||
|                 REQUIRE( s2c.isComplete() ); | ||||
|  | ||||
|                 s1c.close(); | ||||
|                 REQUIRE( g1c.isComplete() ); | ||||
|                 REQUIRE( s1c.isComplete() ); | ||||
|  | ||||
|                 testCase3.close(); | ||||
|                 REQUIRE( testCase3.isComplete() ); | ||||
|             } | ||||
|         } | ||||
|         // !TBD" | ||||
|         //   nested generator | ||||
|         //   two sections within a generator | ||||
|     } | ||||
| } | ||||
							
								
								
									
										167
									
								
								projects/SelfTest/IntrospectiveTests/StringRef.tests.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								projects/SelfTest/IntrospectiveTests/StringRef.tests.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,167 @@ | ||||
| #include "internal/catch_stringref.h" | ||||
|  | ||||
| #include "catch.hpp" | ||||
|  | ||||
| #include <cstring> | ||||
|  | ||||
| namespace Catch { | ||||
|  | ||||
|     // Implementation of test accessors | ||||
|     struct StringRefTestAccess { | ||||
|         static auto isOwned( StringRef const& stringRef ) -> bool { | ||||
|             return stringRef.isOwned(); | ||||
|         } | ||||
|         static auto isSubstring( StringRef const& stringRef ) -> bool { | ||||
|             return stringRef.isSubstring(); | ||||
|         } | ||||
|         static auto data( StringRef const& stringRef ) -> char const* { | ||||
|             return stringRef.data(); | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     auto isOwned( StringRef const& stringRef ) -> bool { | ||||
|         return StringRefTestAccess::isOwned( stringRef ); | ||||
|     } | ||||
|     auto isSubstring( StringRef const& stringRef ) -> bool { | ||||
|         return StringRefTestAccess::isSubstring( stringRef ); | ||||
|     } | ||||
|     auto data( StringRef const& stringRef ) -> char const* { | ||||
|         return StringRefTestAccess::data( stringRef ); | ||||
|     } | ||||
| } // namespace Catch2 | ||||
|  | ||||
| namespace Catch { | ||||
|     inline auto toString( Catch::StringRef const& stringRef ) -> std::string { | ||||
|         return std::string( data( stringRef ), stringRef.size() ); | ||||
|     } | ||||
| } // namespace Catch | ||||
|  | ||||
| TEST_CASE( "StringRef", "[Strings]" ) { | ||||
|      | ||||
|     using Catch::StringRef; | ||||
|  | ||||
|     SECTION( "Empty string" ) { | ||||
|         StringRef empty; | ||||
|         REQUIRE( empty.empty() ); | ||||
|         REQUIRE( empty.size() == 0 ); | ||||
|         REQUIRE( std::strcmp( empty.c_str(), "" ) == 0 ); | ||||
|     } | ||||
|      | ||||
|     SECTION( "From string literal" ) { | ||||
|         StringRef s = "hello"; | ||||
|         REQUIRE( s.empty() == false ); | ||||
|         REQUIRE( s.size() == 5 ); | ||||
|         REQUIRE( isSubstring( s ) == false ); | ||||
|          | ||||
|         auto rawChars = data( s ); | ||||
|         REQUIRE( std::strcmp( rawChars, "hello" ) == 0 ); | ||||
|          | ||||
|         SECTION( "c_str() does not cause copy" ) { | ||||
|             REQUIRE( isOwned( s ) == false ); | ||||
|              | ||||
|             REQUIRE( s.c_str() == rawChars ); | ||||
|              | ||||
|             REQUIRE( isOwned( s ) == false ); | ||||
|         } | ||||
|     } | ||||
|     SECTION( "From sub-string" ) { | ||||
|         StringRef original = StringRef( "original string" ).substr(0, 8); | ||||
|         REQUIRE( original == "original" ); | ||||
|         REQUIRE( isSubstring( original ) ); | ||||
|         REQUIRE( isOwned( original ) == false ); | ||||
|          | ||||
|         original.c_str(); // Forces it to take ownership | ||||
|          | ||||
|         REQUIRE( isSubstring( original ) == false ); | ||||
|         REQUIRE( isOwned( original ) ); | ||||
|          | ||||
|     } | ||||
|      | ||||
|      | ||||
|     SECTION( "Substrings" ) { | ||||
|         StringRef s = "hello world!"; | ||||
|         StringRef ss = s.substr(0, 5); | ||||
|          | ||||
|         SECTION( "zero-based substring" ) { | ||||
|             REQUIRE( ss.empty() == false ); | ||||
|             REQUIRE( ss.size() == 5 ); | ||||
|             REQUIRE( std::strcmp( ss.c_str(), "hello" ) == 0 ); | ||||
|             REQUIRE( ss == "hello" ); | ||||
|         } | ||||
|         SECTION( "c_str() causes copy" ) { | ||||
|             REQUIRE( isSubstring( ss ) ); | ||||
|             REQUIRE( isOwned( ss ) == false ); | ||||
|              | ||||
|             auto rawChars = data( ss ); | ||||
|             REQUIRE( rawChars == data( s ) ); // same pointer value | ||||
|             REQUIRE( ss.c_str() != rawChars ); | ||||
|              | ||||
|             REQUIRE( isSubstring( ss ) == false ); | ||||
|             REQUIRE( isOwned( ss ) ); | ||||
|              | ||||
|             REQUIRE( data( ss ) != data( s ) ); // different pointer value | ||||
|         } | ||||
|          | ||||
|         SECTION( "non-zero-based substring") { | ||||
|             ss = s.substr( 6, 6 ); | ||||
|             REQUIRE( ss.size() == 6 ); | ||||
|             REQUIRE( std::strcmp( ss.c_str(), "world!" ) == 0 ); | ||||
|         } | ||||
|          | ||||
|         SECTION( "Pointer values of full refs should match" ) { | ||||
|             StringRef s2 = s; | ||||
|             REQUIRE( s.c_str() == s2.c_str() ); | ||||
|         } | ||||
|          | ||||
|         SECTION( "Pointer values of substring refs should not match" ) { | ||||
|             REQUIRE( s.c_str() != ss.c_str() ); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     SECTION( "Comparisons" ) { | ||||
|         REQUIRE( StringRef("hello") == StringRef("hello") ); | ||||
|         REQUIRE( StringRef("hello") != StringRef("cello") ); | ||||
|     } | ||||
|  | ||||
|     SECTION( "from std::string" ) { | ||||
|         std::string stdStr = "a standard string"; | ||||
|  | ||||
|         SECTION( "implicitly constructed" ) { | ||||
|             StringRef sr = stdStr; | ||||
|             REQUIRE( sr == "a standard string" ); | ||||
|             REQUIRE( sr.size() == stdStr.size() ); | ||||
|         } | ||||
|         SECTION( "explicitly constructed" ) { | ||||
|             StringRef sr( stdStr ); | ||||
|             REQUIRE( sr == "a standard string" ); | ||||
|             REQUIRE( sr.size() == stdStr.size() ); | ||||
|         } | ||||
|         SECTION( "assigned" ) { | ||||
|             StringRef sr; | ||||
|             sr = stdStr; | ||||
|             REQUIRE( sr == "a standard string" ); | ||||
|             REQUIRE( sr.size() == stdStr.size() ); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     SECTION( "to std::string" ) { | ||||
|         StringRef sr = "a stringref"; | ||||
|  | ||||
|         SECTION( "implicitly constructed" ) { | ||||
|             std::string stdStr = sr; | ||||
|             REQUIRE( stdStr == "a stringref" ); | ||||
|             REQUIRE( stdStr.size() == sr.size() ); | ||||
|         } | ||||
|         SECTION( "explicitly constructed" ) { | ||||
|             std::string stdStr( sr ); | ||||
|             REQUIRE( stdStr == "a stringref" ); | ||||
|             REQUIRE( stdStr.size() == sr.size() ); | ||||
|         } | ||||
|         SECTION( "assigned" ) { | ||||
|             std::string stdStr; | ||||
|             stdStr = sr; | ||||
|             REQUIRE( stdStr == "a stringref" ); | ||||
|             REQUIRE( stdStr.size() == sr.size() ); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										42
									
								
								projects/SelfTest/IntrospectiveTests/TagAliasTests.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								projects/SelfTest/IntrospectiveTests/TagAliasTests.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| /* | ||||
|  *  Created by Phil on 27/06/2014. | ||||
|  *  Copyright 2014 Two Blue Cubes Ltd. All rights reserved. | ||||
|  * | ||||
|  *  Distributed under the Boost Software License, Version 1.0. (See accompanying | ||||
|  *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | ||||
|  */ | ||||
|  | ||||
| #include "catch.hpp" | ||||
| #include "internal/catch_tag_alias_registry.h" | ||||
|  | ||||
| TEST_CASE( "Tag alias can be registered against tag patterns" ) { | ||||
|  | ||||
|     Catch::TagAliasRegistry registry; | ||||
|  | ||||
|     registry.add( "[@zzz]", "[one][two]", Catch::SourceLineInfo( "file", 2 ) ); | ||||
|  | ||||
|     SECTION( "The same tag alias can only be registered once" ) { | ||||
|  | ||||
|         try { | ||||
|             registry.add( "[@zzz]", "[one][two]", Catch::SourceLineInfo( "file", 10 ) ); | ||||
|             FAIL( "expected exception" ); | ||||
|         } | ||||
|         catch( std::exception& ex ) { | ||||
| #ifndef CATCH_CONFIG_DISABLE_MATCHERS | ||||
|             std::string what = ex.what(); | ||||
|             using namespace Catch::Matchers; | ||||
|             CHECK_THAT( what, Contains( "[@zzz]" ) ); | ||||
|             CHECK_THAT( what, Contains( "file" ) ); | ||||
|             CHECK_THAT( what, Contains( "2" ) ); | ||||
|             CHECK_THAT( what, Contains( "10" ) ); | ||||
| #endif | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     SECTION( "Tag aliases must be of the form [@name]" ) { | ||||
|         CHECK_THROWS( registry.add( "[no ampersat]", "", Catch::SourceLineInfo( "file", 3 ) ) ); | ||||
|         CHECK_THROWS( registry.add( "[the @ is not at the start]", "", Catch::SourceLineInfo( "file", 3 ) ) ); | ||||
|         CHECK_THROWS( registry.add( "@no square bracket at start]", "", Catch::SourceLineInfo( "file", 3 ) ) ); | ||||
|         CHECK_THROWS( registry.add( "[@no square bracket at end", "", Catch::SourceLineInfo( "file", 3 ) ) ); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										268
									
								
								projects/SelfTest/IntrospectiveTests/TestMain.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										268
									
								
								projects/SelfTest/IntrospectiveTests/TestMain.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,268 @@ | ||||
| /* | ||||
|  *  Created by Phil on 22/10/2010. | ||||
|  *  Copyright 2010 Two Blue Cubes Ltd | ||||
|  * | ||||
|  *  Distributed under the Boost Software License, Version 1.0. (See accompanying | ||||
|  *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | ||||
|  */ | ||||
|  | ||||
| #define CATCH_CONFIG_MAIN | ||||
| #include "catch.hpp" | ||||
| #include "reporters/catch_reporter_teamcity.hpp" | ||||
| #include "reporters/catch_reporter_tap.hpp" | ||||
| #include "reporters/catch_reporter_automake.hpp" | ||||
|  | ||||
|  | ||||
| // Some example tag aliases | ||||
| CATCH_REGISTER_TAG_ALIAS( "[@nhf]", "[failing]~[.]" ) | ||||
| CATCH_REGISTER_TAG_ALIAS( "[@tricky]", "[tricky]~[.]" ) | ||||
|  | ||||
|  | ||||
| #ifdef __clang__ | ||||
| #   pragma clang diagnostic ignored "-Wpadded" | ||||
| #   pragma clang diagnostic ignored "-Wweak-vtables" | ||||
| #   pragma clang diagnostic ignored "-Wc++98-compat" | ||||
| #endif | ||||
|  | ||||
| struct TestListener : Catch::TestEventListenerBase { | ||||
|     using TestEventListenerBase::TestEventListenerBase; // inherit constructor | ||||
| }; | ||||
| CATCH_REGISTER_LISTENER( TestListener ); | ||||
|  | ||||
| inline Catch::TestCase fakeTestCase( const char* name, const char* desc = "" ){ return Catch::makeTestCase( nullptr, "", name, desc, CATCH_INTERNAL_LINEINFO ); } | ||||
|  | ||||
| TEST_CASE( "Process can be configured on command line", "[config][command-line]" ) { | ||||
|  | ||||
| #ifndef CATCH_CONFIG_DISABLE_MATCHERS | ||||
|     using namespace Catch::Matchers; | ||||
| #endif | ||||
|  | ||||
|     Catch::ConfigData config; | ||||
|     auto cli = Catch::makeCommandLineParser(config); | ||||
|  | ||||
|     SECTION("empty args don't cause a crash") { | ||||
|         auto result = cli.parse({""}); | ||||
|         CHECK(result); | ||||
|         CHECK(config.processName == ""); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     SECTION("default - no arguments") { | ||||
|         auto result = cli.parse({"test"}); | ||||
|         CHECK(result); | ||||
|         CHECK(config.processName == "test"); | ||||
|         CHECK(config.shouldDebugBreak == false); | ||||
|         CHECK(config.abortAfter == -1); | ||||
|         CHECK(config.noThrow == false); | ||||
|         CHECK(config.reporterNames.empty()); | ||||
|     } | ||||
|  | ||||
|     SECTION("test lists") { | ||||
|         SECTION("1 test", "Specify one test case using") { | ||||
|             auto result = cli.parse({"test", "test1"}); | ||||
|             CHECK(result); | ||||
|  | ||||
|             Catch::Config cfg(config); | ||||
|             REQUIRE(cfg.testSpec().matches(fakeTestCase("notIncluded")) == false); | ||||
|             REQUIRE(cfg.testSpec().matches(fakeTestCase("test1"))); | ||||
|         } | ||||
|         SECTION("Specify one test case exclusion using exclude:") { | ||||
|             auto result = cli.parse({"test", "exclude:test1"}); | ||||
|             CHECK(result); | ||||
|  | ||||
|             Catch::Config cfg(config); | ||||
|             REQUIRE(cfg.testSpec().matches(fakeTestCase("test1")) == false); | ||||
|             REQUIRE(cfg.testSpec().matches(fakeTestCase("alwaysIncluded"))); | ||||
|         } | ||||
|  | ||||
|         SECTION("Specify one test case exclusion using ~") { | ||||
|             auto result = cli.parse({"test", "~test1"}); | ||||
|             CHECK(result); | ||||
|  | ||||
|             Catch::Config cfg(config); | ||||
|             REQUIRE(cfg.testSpec().matches(fakeTestCase("test1")) == false); | ||||
|             REQUIRE(cfg.testSpec().matches(fakeTestCase("alwaysIncluded"))); | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     SECTION("reporter") { | ||||
|         SECTION("-r/console") { | ||||
|             CHECK(cli.parse({"test", "-r", "console"})); | ||||
|  | ||||
|             REQUIRE(config.reporterNames[0] == "console"); | ||||
|         } | ||||
|         SECTION("-r/xml") { | ||||
|             CHECK(cli.parse({"test", "-r", "xml"})); | ||||
|  | ||||
|             REQUIRE(config.reporterNames[0] == "xml"); | ||||
|         } | ||||
|         SECTION("-r xml and junit") { | ||||
|             CHECK(cli.parse({"test", "-r", "xml", "-r", "junit"})); | ||||
|  | ||||
|             REQUIRE(config.reporterNames.size() == 2); | ||||
|             REQUIRE(config.reporterNames[0] == "xml"); | ||||
|             REQUIRE(config.reporterNames[1] == "junit"); | ||||
|         } | ||||
|         SECTION("--reporter/junit") { | ||||
|             CHECK(cli.parse({"test", "--reporter", "junit"})); | ||||
|  | ||||
|             REQUIRE(config.reporterNames[0] == "junit"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
|     SECTION("debugger") { | ||||
|         SECTION("-b") { | ||||
|             CHECK(cli.parse({"test", "-b"})); | ||||
|  | ||||
|             REQUIRE(config.shouldDebugBreak == true); | ||||
|         } | ||||
|         SECTION("--break") { | ||||
|             CHECK(cli.parse({"test", "--break"})); | ||||
|  | ||||
|             REQUIRE(config.shouldDebugBreak); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
|     SECTION("abort") { | ||||
|         SECTION("-a aborts after first failure") { | ||||
|             CHECK(cli.parse({"test", "-a"})); | ||||
|  | ||||
|             REQUIRE(config.abortAfter == 1); | ||||
|         } | ||||
|         SECTION("-x 2 aborts after two failures") { | ||||
|             CHECK(cli.parse({"test", "-x", "2"})); | ||||
|  | ||||
|             REQUIRE(config.abortAfter == 2); | ||||
|         } | ||||
|         SECTION("-x must be numeric") { | ||||
|             auto result = cli.parse({"test", "-x", "oops"}); | ||||
|             CHECK(!result); | ||||
|  | ||||
| #ifndef CATCH_CONFIG_DISABLE_MATCHERS | ||||
|             REQUIRE_THAT(result.errorMessage(), Contains("convert") && Contains("oops")); | ||||
| #endif | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     SECTION("nothrow") { | ||||
|         SECTION("-e") { | ||||
|             CHECK(cli.parse({"test", "-e"})); | ||||
|  | ||||
|             REQUIRE(config.noThrow); | ||||
|         } | ||||
|         SECTION("--nothrow") { | ||||
|             CHECK(cli.parse({"test", "--nothrow"})); | ||||
|  | ||||
|             REQUIRE(config.noThrow); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     SECTION("output filename") { | ||||
|         SECTION("-o filename") { | ||||
|             CHECK(cli.parse({"test", "-o", "filename.ext"})); | ||||
|  | ||||
|             REQUIRE(config.outputFilename == "filename.ext"); | ||||
|         } | ||||
|         SECTION("--out") { | ||||
|             CHECK(cli.parse({"test", "--out", "filename.ext"})); | ||||
|  | ||||
|             REQUIRE(config.outputFilename == "filename.ext"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     SECTION("combinations") { | ||||
|         SECTION("Single character flags can be combined") { | ||||
|             CHECK(cli.parse({"test", "-abe"})); | ||||
|  | ||||
|             CHECK(config.abortAfter == 1); | ||||
|             CHECK(config.shouldDebugBreak); | ||||
|             CHECK(config.noThrow == true); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
|     SECTION( "use-colour") { | ||||
|  | ||||
|         using Catch::UseColour; | ||||
|  | ||||
|         SECTION( "without option" ) { | ||||
|             CHECK(cli.parse({"test"})); | ||||
|  | ||||
|             REQUIRE( config.useColour == UseColour::Auto ); | ||||
|         } | ||||
|  | ||||
|         SECTION( "auto" ) { | ||||
|             CHECK(cli.parse({"test", "--use-colour", "auto"})); | ||||
|  | ||||
|             REQUIRE( config.useColour == UseColour::Auto ); | ||||
|         } | ||||
|  | ||||
|         SECTION( "yes" ) { | ||||
|             CHECK(cli.parse({"test", "--use-colour", "yes"})); | ||||
|  | ||||
|             REQUIRE( config.useColour == UseColour::Yes ); | ||||
|         } | ||||
|  | ||||
|         SECTION( "no" ) { | ||||
|             CHECK(cli.parse({"test", "--use-colour", "no"})); | ||||
|  | ||||
|             REQUIRE( config.useColour == UseColour::No ); | ||||
|         } | ||||
|  | ||||
|         SECTION( "error" ) { | ||||
|             auto result = cli.parse({"test", "--use-colour", "wrong"}); | ||||
|             CHECK( !result ); | ||||
| #ifndef CATCH_CONFIG_DISABLE_MATCHERS | ||||
|             CHECK_THAT( result.errorMessage(), Contains( "colour mode must be one of" ) ); | ||||
| #endif | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST_CASE( "replaceInPlace" ) { | ||||
|     std::string letters = "abcdefcg"; | ||||
|     SECTION( "replace single char" ) { | ||||
|         CHECK( Catch::replaceInPlace( letters, "b", "z" ) ); | ||||
|         CHECK( letters == "azcdefcg" ); | ||||
|     } | ||||
|     SECTION( "replace two chars" ) { | ||||
|         CHECK( Catch::replaceInPlace( letters, "c", "z" ) ); | ||||
|         CHECK( letters == "abzdefzg" ); | ||||
|     } | ||||
|     SECTION( "replace first char" ) { | ||||
|         CHECK( Catch::replaceInPlace( letters, "a", "z" ) ); | ||||
|         CHECK( letters == "zbcdefcg" ); | ||||
|     } | ||||
|     SECTION( "replace last char" ) { | ||||
|         CHECK( Catch::replaceInPlace( letters, "g", "z" ) ); | ||||
|         CHECK( letters == "abcdefcz" ); | ||||
|     } | ||||
|     SECTION( "replace all chars" ) { | ||||
|         CHECK( Catch::replaceInPlace( letters, letters, "replaced" ) ); | ||||
|         CHECK( letters == "replaced" ); | ||||
|     } | ||||
|     SECTION( "replace no chars" ) { | ||||
|         CHECK_FALSE( Catch::replaceInPlace( letters, "x", "z" ) ); | ||||
|         CHECK( letters == letters ); | ||||
|     } | ||||
|     SECTION( "escape '" ) { | ||||
|         std::string s = "didn't"; | ||||
|         CHECK( Catch::replaceInPlace( s, "'", "|'" ) ); | ||||
|         CHECK( s == "didn|'t" ); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| inline void manuallyRegisteredTestFunction() { | ||||
|     SUCCEED( "was called" ); | ||||
| } | ||||
| struct AutoTestReg { | ||||
|     AutoTestReg() { | ||||
|         REGISTER_TEST_CASE( manuallyRegisteredTestFunction, "ManuallyRegistered" ); | ||||
|     } | ||||
| }; | ||||
| static AutoTestReg autoTestReg; | ||||
							
								
								
									
										41
									
								
								projects/SelfTest/IntrospectiveTests/XmlTests.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								projects/SelfTest/IntrospectiveTests/XmlTests.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| #include "catch.hpp" | ||||
|  | ||||
| #include "internal/catch_xmlwriter.h" | ||||
|  | ||||
| #include <sstream> | ||||
|  | ||||
| inline std::string encode( std::string const& str, Catch::XmlEncode::ForWhat forWhat = Catch::XmlEncode::ForTextNodes ) { | ||||
|     std::ostringstream oss; | ||||
|     oss << Catch::XmlEncode( str, forWhat ); | ||||
|     return oss.str(); | ||||
| } | ||||
|  | ||||
| TEST_CASE( "XmlEncode" ) { | ||||
|     SECTION( "normal string" ) { | ||||
|         REQUIRE( encode( "normal string" ) == "normal string" ); | ||||
|     } | ||||
|     SECTION( "empty string" ) { | ||||
|         REQUIRE( encode( "" ) == "" ); | ||||
|     } | ||||
|     SECTION( "string with ampersand" ) { | ||||
|         REQUIRE( encode( "smith & jones" ) == "smith & jones" ); | ||||
|     } | ||||
|     SECTION( "string with less-than" ) { | ||||
|         REQUIRE( encode( "smith < jones" ) == "smith < jones" ); | ||||
|     } | ||||
|     SECTION( "string with greater-than" ) { | ||||
|         REQUIRE( encode( "smith > jones" ) == "smith > jones" ); | ||||
|         REQUIRE( encode( "smith ]]> jones" ) == "smith ]]> jones" ); | ||||
|     } | ||||
|     SECTION( "string with quotes" ) { | ||||
|         std::string stringWithQuotes = "don't \"quote\" me on that"; | ||||
|         REQUIRE( encode( stringWithQuotes ) == stringWithQuotes ); | ||||
|         REQUIRE( encode( stringWithQuotes, Catch::XmlEncode::ForAttributes ) == "don't "quote" me on that" ); | ||||
|     } | ||||
|     SECTION( "string with control char (1)" ) { | ||||
|         REQUIRE( encode( "[\x01]" ) == "[\\x01]" ); | ||||
|     } | ||||
|     SECTION( "string with control char (x7F)" ) { | ||||
|         REQUIRE( encode( "[\x7F]" ) == "[\\x7F]" ); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Phil Nash
					Phil Nash