mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-11-04 05:59:32 +01:00 
			
		
		
		
	@@ -387,7 +387,7 @@ namespace Catch {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    template<typename R>
 | 
					    template<typename R>
 | 
				
			||||||
    struct StringMaker<R, typename std::enable_if<is_range<R>::value && !std::is_array<R>::value>::type> {
 | 
					    struct StringMaker<R, typename std::enable_if<is_range<R>::value && !::Catch::Detail::IsStreamInsertable<R>::value>::type> {
 | 
				
			||||||
        static std::string convert( R const& range ) {
 | 
					        static std::string convert( R const& range ) {
 | 
				
			||||||
            return rangeToString( range );
 | 
					            return rangeToString( range );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -987,6 +987,14 @@ Misc.tests.cpp:<line number>: passed: result == "/"wide load/"" for: ""wide load
 | 
				
			|||||||
Misc.tests.cpp:<line number>: passed: result == "/"wide load/"" for: ""wide load"" == ""wide load""
 | 
					Misc.tests.cpp:<line number>: passed: result == "/"wide load/"" for: ""wide load"" == ""wide load""
 | 
				
			||||||
Misc.tests.cpp:<line number>: passed: result == "/"wide load/"" for: ""wide load"" == ""wide load""
 | 
					Misc.tests.cpp:<line number>: passed: result == "/"wide load/"" for: ""wide load"" == ""wide load""
 | 
				
			||||||
Misc.tests.cpp:<line number>: passed: result == "/"wide load/"" for: ""wide load"" == ""wide load""
 | 
					Misc.tests.cpp:<line number>: passed: result == "/"wide load/"" for: ""wide load"" == ""wide load""
 | 
				
			||||||
 | 
					ToStringWhich.tests.cpp:<line number>: passed: ::Catch::Detail::stringify(streamable_range{}) == "op<<(streamable_range)" for: "op<<(streamable_range)"
 | 
				
			||||||
 | 
					==
 | 
				
			||||||
 | 
					"op<<(streamable_range)"
 | 
				
			||||||
 | 
					ToStringWhich.tests.cpp:<line number>: passed: ::Catch::Detail::stringify(stringmaker_range{}) == "stringmaker(streamable_range)" for: "stringmaker(streamable_range)"
 | 
				
			||||||
 | 
					==
 | 
				
			||||||
 | 
					"stringmaker(streamable_range)"
 | 
				
			||||||
 | 
					ToStringWhich.tests.cpp:<line number>: passed: ::Catch::Detail::stringify(just_range{}) == "{ 1, 2, 3, 4 }" for: "{ 1, 2, 3, 4 }" == "{ 1, 2, 3, 4 }"
 | 
				
			||||||
 | 
					ToStringWhich.tests.cpp:<line number>: passed: ::Catch::Detail::stringify(disabled_range{}) == "{?}" for: "{?}" == "{?}"
 | 
				
			||||||
ToStringWhich.tests.cpp:<line number>: passed: ::Catch::Detail::stringify( v ) == "{ StringMaker<has_maker> }" for: "{ StringMaker<has_maker> }"
 | 
					ToStringWhich.tests.cpp:<line number>: passed: ::Catch::Detail::stringify( v ) == "{ StringMaker<has_maker> }" for: "{ StringMaker<has_maker> }"
 | 
				
			||||||
==
 | 
					==
 | 
				
			||||||
"{ StringMaker<has_maker> }"
 | 
					"{ StringMaker<has_maker> }"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1064,6 +1064,6 @@ with expansion:
 | 
				
			|||||||
  "first" == "second"
 | 
					  "first" == "second"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
===============================================================================
 | 
					===============================================================================
 | 
				
			||||||
test cases: 197 | 146 passed |  47 failed |  4 failed as expected
 | 
					test cases: 198 | 147 passed |  47 failed |  4 failed as expected
 | 
				
			||||||
assertions: 992 | 866 passed | 105 failed | 21 failed as expected
 | 
					assertions: 996 | 870 passed | 105 failed | 21 failed as expected
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7894,6 +7894,40 @@ PASSED:
 | 
				
			|||||||
with expansion:
 | 
					with expansion:
 | 
				
			||||||
  ""wide load"" == ""wide load""
 | 
					  ""wide load"" == ""wide load""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					toString streamable range
 | 
				
			||||||
 | 
					-------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					ToStringWhich.tests.cpp:<line number>
 | 
				
			||||||
 | 
					...............................................................................
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ToStringWhich.tests.cpp:<line number>:
 | 
				
			||||||
 | 
					PASSED:
 | 
				
			||||||
 | 
					  REQUIRE( ::Catch::Detail::stringify(streamable_range{}) == "op<<(streamable_range)" )
 | 
				
			||||||
 | 
					with expansion:
 | 
				
			||||||
 | 
					  "op<<(streamable_range)"
 | 
				
			||||||
 | 
					  ==
 | 
				
			||||||
 | 
					  "op<<(streamable_range)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ToStringWhich.tests.cpp:<line number>:
 | 
				
			||||||
 | 
					PASSED:
 | 
				
			||||||
 | 
					  REQUIRE( ::Catch::Detail::stringify(stringmaker_range{}) == "stringmaker(streamable_range)" )
 | 
				
			||||||
 | 
					with expansion:
 | 
				
			||||||
 | 
					  "stringmaker(streamable_range)"
 | 
				
			||||||
 | 
					  ==
 | 
				
			||||||
 | 
					  "stringmaker(streamable_range)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ToStringWhich.tests.cpp:<line number>:
 | 
				
			||||||
 | 
					PASSED:
 | 
				
			||||||
 | 
					  REQUIRE( ::Catch::Detail::stringify(just_range{}) == "{ 1, 2, 3, 4 }" )
 | 
				
			||||||
 | 
					with expansion:
 | 
				
			||||||
 | 
					  "{ 1, 2, 3, 4 }" == "{ 1, 2, 3, 4 }"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ToStringWhich.tests.cpp:<line number>:
 | 
				
			||||||
 | 
					PASSED:
 | 
				
			||||||
 | 
					  REQUIRE( ::Catch::Detail::stringify(disabled_range{}) == "{?}" )
 | 
				
			||||||
 | 
					with expansion:
 | 
				
			||||||
 | 
					  "{?}" == "{?}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-------------------------------------------------------------------------------
 | 
					-------------------------------------------------------------------------------
 | 
				
			||||||
toString( vectors<has_maker> )
 | 
					toString( vectors<has_maker> )
 | 
				
			||||||
-------------------------------------------------------------------------------
 | 
					-------------------------------------------------------------------------------
 | 
				
			||||||
@@ -8407,6 +8441,6 @@ Misc.tests.cpp:<line number>:
 | 
				
			|||||||
PASSED:
 | 
					PASSED:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
===============================================================================
 | 
					===============================================================================
 | 
				
			||||||
test cases:  197 | 132 passed |  61 failed |  4 failed as expected
 | 
					test cases:  198 | 133 passed |  61 failed |  4 failed as expected
 | 
				
			||||||
assertions: 1003 | 862 passed | 120 failed | 21 failed as expected
 | 
					assertions: 1007 | 866 passed | 120 failed | 21 failed as expected
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
<testsuitesloose text artifact
 | 
					<testsuitesloose text artifact
 | 
				
			||||||
>
 | 
					>
 | 
				
			||||||
  <testsuite name="<exe-name>" errors="15" failures="106" tests="1004" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
 | 
					  <testsuite name="<exe-name>" errors="15" failures="106" tests="1008" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
 | 
				
			||||||
    <testcase classname="<exe-name>.global" name="# A test name that starts with a #" time="{duration}"/>
 | 
					    <testcase classname="<exe-name>.global" name="# A test name that starts with a #" time="{duration}"/>
 | 
				
			||||||
    <testcase classname="<exe-name>.global" name="#1005: Comparing pointer to int and long (NULL can be either on various systems)" time="{duration}"/>
 | 
					    <testcase classname="<exe-name>.global" name="#1005: Comparing pointer to int and long (NULL can be either on various systems)" time="{duration}"/>
 | 
				
			||||||
    <testcase classname="<exe-name>.global" name="#1027" time="{duration}"/>
 | 
					    <testcase classname="<exe-name>.global" name="#1027" time="{duration}"/>
 | 
				
			||||||
@@ -825,6 +825,7 @@ Tricky.tests.cpp:<line number>
 | 
				
			|||||||
    <testcase classname="<exe-name>.global" name="toString on const wchar_t pointer returns the string contents" time="{duration}"/>
 | 
					    <testcase classname="<exe-name>.global" name="toString on const wchar_t pointer returns the string contents" time="{duration}"/>
 | 
				
			||||||
    <testcase classname="<exe-name>.global" name="toString on wchar_t const pointer returns the string contents" time="{duration}"/>
 | 
					    <testcase classname="<exe-name>.global" name="toString on wchar_t const pointer returns the string contents" time="{duration}"/>
 | 
				
			||||||
    <testcase classname="<exe-name>.global" name="toString on wchar_t returns the string contents" time="{duration}"/>
 | 
					    <testcase classname="<exe-name>.global" name="toString on wchar_t returns the string contents" time="{duration}"/>
 | 
				
			||||||
 | 
					    <testcase classname="<exe-name>.global" name="toString streamable range" time="{duration}"/>
 | 
				
			||||||
    <testcase classname="<exe-name>.global" name="toString( vectors<has_maker> )" time="{duration}"/>
 | 
					    <testcase classname="<exe-name>.global" name="toString( vectors<has_maker> )" time="{duration}"/>
 | 
				
			||||||
    <testcase classname="<exe-name>.global" name="toString( vectors<has_maker_and_operator> )" time="{duration}"/>
 | 
					    <testcase classname="<exe-name>.global" name="toString( vectors<has_maker_and_operator> )" time="{duration}"/>
 | 
				
			||||||
    <testcase classname="<exe-name>.global" name="toString( vectors<has_operator> )" time="{duration}"/>
 | 
					    <testcase classname="<exe-name>.global" name="toString( vectors<has_operator> )" time="{duration}"/>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8750,6 +8750,45 @@ loose text artifact
 | 
				
			|||||||
      </Expression>
 | 
					      </Expression>
 | 
				
			||||||
      <OverallResult success="true"/>
 | 
					      <OverallResult success="true"/>
 | 
				
			||||||
    </TestCase>
 | 
					    </TestCase>
 | 
				
			||||||
 | 
					    <TestCase name="toString streamable range" tags="[toString]" filename="projects/<exe-name>/UsageTests/ToStringWhich.tests.cpp" >
 | 
				
			||||||
 | 
					      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/ToStringWhich.tests.cpp" >
 | 
				
			||||||
 | 
					        <Original>
 | 
				
			||||||
 | 
					          ::Catch::Detail::stringify(streamable_range{}) == "op<<(streamable_range)"
 | 
				
			||||||
 | 
					        </Original>
 | 
				
			||||||
 | 
					        <Expanded>
 | 
				
			||||||
 | 
					          "op<<(streamable_range)"
 | 
				
			||||||
 | 
					==
 | 
				
			||||||
 | 
					"op<<(streamable_range)"
 | 
				
			||||||
 | 
					        </Expanded>
 | 
				
			||||||
 | 
					      </Expression>
 | 
				
			||||||
 | 
					      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/ToStringWhich.tests.cpp" >
 | 
				
			||||||
 | 
					        <Original>
 | 
				
			||||||
 | 
					          ::Catch::Detail::stringify(stringmaker_range{}) == "stringmaker(streamable_range)"
 | 
				
			||||||
 | 
					        </Original>
 | 
				
			||||||
 | 
					        <Expanded>
 | 
				
			||||||
 | 
					          "stringmaker(streamable_range)"
 | 
				
			||||||
 | 
					==
 | 
				
			||||||
 | 
					"stringmaker(streamable_range)"
 | 
				
			||||||
 | 
					        </Expanded>
 | 
				
			||||||
 | 
					      </Expression>
 | 
				
			||||||
 | 
					      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/ToStringWhich.tests.cpp" >
 | 
				
			||||||
 | 
					        <Original>
 | 
				
			||||||
 | 
					          ::Catch::Detail::stringify(just_range{}) == "{ 1, 2, 3, 4 }"
 | 
				
			||||||
 | 
					        </Original>
 | 
				
			||||||
 | 
					        <Expanded>
 | 
				
			||||||
 | 
					          "{ 1, 2, 3, 4 }" == "{ 1, 2, 3, 4 }"
 | 
				
			||||||
 | 
					        </Expanded>
 | 
				
			||||||
 | 
					      </Expression>
 | 
				
			||||||
 | 
					      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/ToStringWhich.tests.cpp" >
 | 
				
			||||||
 | 
					        <Original>
 | 
				
			||||||
 | 
					          ::Catch::Detail::stringify(disabled_range{}) == "{?}"
 | 
				
			||||||
 | 
					        </Original>
 | 
				
			||||||
 | 
					        <Expanded>
 | 
				
			||||||
 | 
					          "{?}" == "{?}"
 | 
				
			||||||
 | 
					        </Expanded>
 | 
				
			||||||
 | 
					      </Expression>
 | 
				
			||||||
 | 
					      <OverallResult success="true"/>
 | 
				
			||||||
 | 
					    </TestCase>
 | 
				
			||||||
    <TestCase name="toString( vectors<has_maker> )" tags="[toString]" filename="projects/<exe-name>/UsageTests/ToStringWhich.tests.cpp" >
 | 
					    <TestCase name="toString( vectors<has_maker> )" tags="[toString]" filename="projects/<exe-name>/UsageTests/ToStringWhich.tests.cpp" >
 | 
				
			||||||
      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/ToStringWhich.tests.cpp" >
 | 
					      <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/ToStringWhich.tests.cpp" >
 | 
				
			||||||
        <Original>
 | 
					        <Original>
 | 
				
			||||||
@@ -9257,7 +9296,7 @@ loose text artifact
 | 
				
			|||||||
      </Section>
 | 
					      </Section>
 | 
				
			||||||
      <OverallResult success="true"/>
 | 
					      <OverallResult success="true"/>
 | 
				
			||||||
    </TestCase>
 | 
					    </TestCase>
 | 
				
			||||||
    <OverallResults successes="862" failures="121" expectedFailures="21"/>
 | 
					    <OverallResults successes="866" failures="121" expectedFailures="21"/>
 | 
				
			||||||
  </Group>
 | 
					  </Group>
 | 
				
			||||||
  <OverallResults successes="862" failures="120" expectedFailures="21"/>
 | 
					  <OverallResults successes="866" failures="120" expectedFailures="21"/>
 | 
				
			||||||
</Catch>
 | 
					</Catch>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -71,3 +71,76 @@ TEST_CASE( "toString( vectors<has_maker_and_operator> )", "[toString]" ) {
 | 
				
			|||||||
    std::vector<has_maker_and_operator> v(1);
 | 
					    std::vector<has_maker_and_operator> v(1);
 | 
				
			||||||
    REQUIRE( ::Catch::Detail::stringify( v ) == "{ StringMaker<has_maker_and_operator> }" );
 | 
					    REQUIRE( ::Catch::Detail::stringify( v ) == "{ StringMaker<has_maker_and_operator> }" );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Conversion should go
 | 
				
			||||||
 | 
					// StringMaker specialization, operator<<, range/enum detection, unprintable
 | 
				
			||||||
 | 
					struct int_iterator {
 | 
				
			||||||
 | 
					    using iterator_category = std::input_iterator_tag;
 | 
				
			||||||
 | 
					    using difference_type = std::ptrdiff_t;
 | 
				
			||||||
 | 
					    using value_type = int;
 | 
				
			||||||
 | 
					    using reference = int&;
 | 
				
			||||||
 | 
					    using pointer = int*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int_iterator() = default;
 | 
				
			||||||
 | 
					    int_iterator(int i) :val(i) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    value_type operator*() const { return val; }
 | 
				
			||||||
 | 
					    bool operator==(int_iterator rhs) const { return val == rhs.val; }
 | 
				
			||||||
 | 
					    bool operator!=(int_iterator rhs) const { return val != rhs.val; }
 | 
				
			||||||
 | 
					    int_iterator operator++() { ++val; return *this; }
 | 
				
			||||||
 | 
					    int_iterator operator++(int) {
 | 
				
			||||||
 | 
					        auto temp(*this);
 | 
				
			||||||
 | 
					        ++val;
 | 
				
			||||||
 | 
					        return temp;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    int val = 5;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct streamable_range {
 | 
				
			||||||
 | 
					    int_iterator begin() const { return int_iterator{ 1 }; }
 | 
				
			||||||
 | 
					    int_iterator end() const { return {}; }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::ostream& operator<<(std::ostream& os, const streamable_range&) {
 | 
				
			||||||
 | 
					    os << "op<<(streamable_range)";
 | 
				
			||||||
 | 
					    return os;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct stringmaker_range {
 | 
				
			||||||
 | 
					    int_iterator begin() const { return int_iterator{ 1 }; }
 | 
				
			||||||
 | 
					    int_iterator end() const { return {}; }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Catch {
 | 
				
			||||||
 | 
					template <>
 | 
				
			||||||
 | 
					struct StringMaker<stringmaker_range> {
 | 
				
			||||||
 | 
					    static std::string convert(stringmaker_range const&) {
 | 
				
			||||||
 | 
					        return "stringmaker(streamable_range)";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct just_range {
 | 
				
			||||||
 | 
					    int_iterator begin() const { return int_iterator{ 1 }; }
 | 
				
			||||||
 | 
					    int_iterator end() const { return {}; }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct disabled_range {
 | 
				
			||||||
 | 
					    int_iterator begin() const { return int_iterator{ 1 }; }
 | 
				
			||||||
 | 
					    int_iterator end() const { return {}; }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Catch {
 | 
				
			||||||
 | 
					template <>
 | 
				
			||||||
 | 
					struct is_range<disabled_range> {
 | 
				
			||||||
 | 
					    static const bool value = false;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST_CASE("toString streamable range", "[toString]") {
 | 
				
			||||||
 | 
					    REQUIRE(::Catch::Detail::stringify(streamable_range{}) == "op<<(streamable_range)");
 | 
				
			||||||
 | 
					    REQUIRE(::Catch::Detail::stringify(stringmaker_range{}) == "stringmaker(streamable_range)");
 | 
				
			||||||
 | 
					    REQUIRE(::Catch::Detail::stringify(just_range{}) == "{ 1, 2, 3, 4 }");
 | 
				
			||||||
 | 
					    REQUIRE(::Catch::Detail::stringify(disabled_range{}) == "{?}");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user