| 
									
										
										
										
											2011-01-14 08:38:46 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  *  Created by Phil on 14/01/2011. | 
					
						
							|  |  |  |  *  Copyright 2011 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_CATCH_SELF_TEST_HPP_INCLUDED
 | 
					
						
							|  |  |  | #define TWOBLUECUBES_CATCH_SELF_TEST_HPP_INCLUDED
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-24 08:23:02 +01:00
										 |  |  | #include "catch.hpp"
 | 
					
						
							| 
									
										
										
										
											2012-08-09 07:47:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Use this external guard here as if we're using the single header version
 | 
					
						
							|  |  |  | // this will already be defined
 | 
					
						
							|  |  |  | #ifndef TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED
 | 
					
						
							| 
									
										
										
										
											2012-08-07 07:58:34 +01:00
										 |  |  | #include "catch_interfaces_registry_hub.h"
 | 
					
						
							| 
									
										
										
										
											2012-08-09 07:47:30 +01:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-01-14 08:38:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-04 07:55:11 +01:00
										 |  |  | #include "set"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-16 15:02:51 +01:00
										 |  |  | namespace Catch { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-01 09:13:36 +00:00
										 |  |  |     class NullStreamingReporter : public SharedImpl<IStreamingReporter> { | 
					
						
							| 
									
										
										
										
											2012-05-04 07:55:11 +01:00
										 |  |  |     public: | 
					
						
							| 
									
										
										
										
											2012-08-31 08:10:36 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-01 09:13:36 +00:00
										 |  |  |         virtual ~NullStreamingReporter(); | 
					
						
							| 
									
										
										
										
											2012-08-31 08:10:36 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-01 09:13:36 +00:00
										 |  |  |         static std::string getDescription() { | 
					
						
							|  |  |  |             return "null reporter"; | 
					
						
							| 
									
										
										
										
											2012-05-04 07:55:11 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2012-12-01 09:13:36 +00:00
										 |  |  |     private: // IStreamingReporter
 | 
					
						
							| 
									
										
										
										
											2012-06-01 19:40:27 +01:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2012-12-01 09:13:36 +00:00
										 |  |  |         virtual ReporterPreferences getPreferences() const { | 
					
						
							|  |  |  |             return ReporterPreferences(); | 
					
						
							| 
									
										
										
										
											2012-05-04 07:55:11 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-01 23:49:57 +00:00
										 |  |  |         virtual void testRunStarting( TestRunInfo const& ) {} | 
					
						
							|  |  |  |         virtual void testGroupStarting( GroupInfo const& ) {} | 
					
						
							| 
									
										
										
										
											2012-12-01 09:13:36 +00:00
										 |  |  |         virtual void testCaseStarting( TestCaseInfo const& ) {} | 
					
						
							|  |  |  |         virtual void sectionStarting( SectionInfo const& ) {} | 
					
						
							|  |  |  |         virtual void assertionStarting( AssertionInfo const& ) {} | 
					
						
							|  |  |  |         virtual void assertionEnded( Ptr<AssertionStats const> const& ) {} | 
					
						
							|  |  |  |         virtual void sectionEnded( Ptr<SectionStats const> const& ) {} | 
					
						
							|  |  |  |         virtual void testCaseEnded( Ptr<TestCaseStats const> const& ) {} | 
					
						
							|  |  |  |         virtual void testGroupEnded( Ptr<TestGroupStats const> const& ) {} | 
					
						
							|  |  |  |         virtual void testRunEnded( Ptr<TestRunStats const> const& ) {} | 
					
						
							| 
									
										
										
										
											2012-05-31 19:40:26 +01:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2012-12-01 09:13:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-16 15:02:51 +01:00
										 |  |  |     class EmbeddedRunner { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-14 08:38:46 +00:00
										 |  |  |     public: | 
					
						
							| 
									
										
										
										
											2012-12-01 09:13:36 +00:00
										 |  |  |         EmbeddedRunner() : m_reporter( new NullStreamingReporter() ) {} | 
					
						
							| 
									
										
										
										
											2011-01-14 08:38:46 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2012-08-15 19:12:51 +01:00
										 |  |  |         Totals runMatching( const std::string& rawTestSpec, | 
					
						
							|  |  |  |                             const std::string& reporter = "basic" ); | 
					
						
							| 
									
										
										
										
											2011-03-11 19:44:59 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2011-01-14 08:38:46 +00:00
										 |  |  |     private: | 
					
						
							| 
									
										
										
										
											2012-12-01 09:13:36 +00:00
										 |  |  |         Ptr<IStreamingReporter> m_reporter; | 
					
						
							| 
									
										
										
										
											2011-01-14 08:38:46 +00:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2011-03-11 19:44:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-16 15:02:51 +01:00
										 |  |  |     class MetaTestRunner { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-11 19:44:59 +00:00
										 |  |  |     public: | 
					
						
							| 
									
										
										
										
											2012-05-16 15:02:51 +01:00
										 |  |  |         struct Expected { enum Result { | 
					
						
							|  |  |  |             ToSucceed, | 
					
						
							|  |  |  |             ToFail | 
					
						
							|  |  |  |         }; }; | 
					
						
							| 
									
										
										
										
											2011-03-11 19:44:59 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2012-05-16 15:02:51 +01:00
										 |  |  |         MetaTestRunner( Expected::Result expectedResult ) : m_expectedResult( expectedResult ) {} | 
					
						
							| 
									
										
										
										
											2011-03-11 19:44:59 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2012-05-16 15:02:51 +01:00
										 |  |  |         static void runMatching(    const std::string& testSpec,  | 
					
						
							|  |  |  |                                     Expected::Result expectedResult ) { | 
					
						
							| 
									
										
										
										
											2012-08-07 07:58:34 +01:00
										 |  |  |             forEach(    getRegistryHub().getTestCaseRegistry().getMatchingTestCases( testSpec ),  | 
					
						
							| 
									
										
										
										
											2012-05-04 07:55:11 +01:00
										 |  |  |                         MetaTestRunner( expectedResult ) ); | 
					
						
							| 
									
										
										
										
											2011-03-11 19:44:59 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2012-11-22 19:17:20 +00:00
										 |  |  |         void operator()( const TestCase& testCase ) { | 
					
						
							| 
									
										
										
										
											2012-12-01 09:13:36 +00:00
										 |  |  |             std::string name; | 
					
						
							|  |  |  |             Totals totals; | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 EmbeddedRunner runner; | 
					
						
							|  |  |  |                 name = testCase.getTestCaseInfo().name; | 
					
						
							|  |  |  |                 totals = runner.runMatching( name ); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2012-05-16 15:02:51 +01:00
										 |  |  |             switch( m_expectedResult ) { | 
					
						
							| 
									
										
										
										
											2011-03-11 19:44:59 +00:00
										 |  |  |                 case Expected::ToSucceed: | 
					
						
							| 
									
										
										
										
											2012-05-16 15:02:51 +01:00
										 |  |  |                     if( totals.assertions.failed > 0 ) { | 
					
						
							| 
									
										
										
										
											2012-12-01 09:13:36 +00:00
										 |  |  |                         FAIL( "Expected test case '" | 
					
						
							| 
									
										
										
										
											2012-11-25 11:19:55 +00:00
										 |  |  |                              << name | 
					
						
							| 
									
										
										
										
											2011-03-11 19:44:59 +00:00
										 |  |  |                              << "' to succeed but there was/ were "  | 
					
						
							| 
									
										
										
										
											2012-02-23 18:51:21 +00:00
										 |  |  |                              << totals.assertions.failed << " failure(s)" ); | 
					
						
							| 
									
										
										
										
											2011-03-11 19:44:59 +00:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2012-08-31 08:10:36 +01:00
										 |  |  |                     else { | 
					
						
							|  |  |  |                         SUCCEED( "Tests passed, as expected" ); | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2011-03-11 19:44:59 +00:00
										 |  |  |                     break; | 
					
						
							|  |  |  |                 case Expected::ToFail: | 
					
						
							| 
									
										
										
										
											2012-11-19 19:59:10 +00:00
										 |  |  |                     if( totals.assertions.failed == 0 ) { | 
					
						
							| 
									
										
										
										
											2012-12-01 09:13:36 +00:00
										 |  |  |                         FAIL( "Expected test case '" | 
					
						
							| 
									
										
										
										
											2012-11-25 11:19:55 +00:00
										 |  |  |                              << name | 
					
						
							| 
									
										
										
										
											2011-03-11 19:44:59 +00:00
										 |  |  |                              << "' to fail but there was/ were "  | 
					
						
							| 
									
										
										
										
											2012-02-23 18:51:21 +00:00
										 |  |  |                              << totals.assertions.passed << " success(es)" ); | 
					
						
							| 
									
										
										
										
											2011-03-11 19:44:59 +00:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2012-08-31 08:10:36 +01:00
										 |  |  |                     else { | 
					
						
							|  |  |  |                         SUCCEED( "Tests failed, as expected" ); | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2011-03-11 19:44:59 +00:00
										 |  |  |                     break; | 
					
						
							|  |  |  |             }         | 
					
						
							|  |  |  |         }; | 
					
						
							| 
									
										
										
										
											2012-12-01 19:09:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-11 19:44:59 +00:00
										 |  |  |     private: | 
					
						
							|  |  |  |         Expected::Result m_expectedResult; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2012-02-15 08:20:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-16 15:02:51 +01:00
										 |  |  |     struct LineInfoRegistry { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         static LineInfoRegistry& get() { | 
					
						
							| 
									
										
										
										
											2012-02-15 08:20:06 +00:00
										 |  |  |             static LineInfoRegistry s_instance; | 
					
						
							|  |  |  |             return s_instance; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2012-05-16 15:02:51 +01:00
										 |  |  |         void registerLineInfo(  const std::string& name,  | 
					
						
							|  |  |  |                                 const SourceLineInfo& info ) { | 
					
						
							| 
									
										
										
										
											2012-02-15 08:20:06 +00:00
										 |  |  |             m_registry.insert( std::make_pair( name, info ) ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2012-05-16 15:02:51 +01:00
										 |  |  |         const SourceLineInfo* find( const std::string& name ) const { | 
					
						
							| 
									
										
										
										
											2012-02-15 08:20:06 +00:00
										 |  |  |             std::map<std::string, SourceLineInfo>::const_iterator it = m_registry.find( name ); | 
					
						
							|  |  |  |             return it == m_registry.end() ? NULL : &(it->second); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-16 15:02:51 +01:00
										 |  |  |         const std::string infoForName( const std::string& name ) const { | 
					
						
							| 
									
										
										
										
											2012-02-15 08:20:06 +00:00
										 |  |  |             std::map<std::string, SourceLineInfo>::const_iterator it = m_registry.find( name ); | 
					
						
							|  |  |  |             if( it == m_registry.end() ) | 
					
						
							|  |  |  |                 return ""; | 
					
						
							|  |  |  |             std::ostringstream oss; | 
					
						
							|  |  |  |             oss << it->second; | 
					
						
							|  |  |  |             return oss.str(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         std::map<std::string, SourceLineInfo> m_registry; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2012-05-16 15:02:51 +01:00
										 |  |  |     struct LineInfoRegistrar { | 
					
						
							|  |  |  |         LineInfoRegistrar( const char* name, const SourceLineInfo& lineInfo ) { | 
					
						
							| 
									
										
										
										
											2012-02-15 08:20:06 +00:00
										 |  |  |             LineInfoRegistry::get().registerLineInfo( name, lineInfo ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2012-05-04 07:55:11 +01:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2011-01-14 08:38:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-15 08:20:06 +00:00
										 |  |  | #define CATCH_REGISTER_LINE_INFO( name ) ::Catch::LineInfoRegistrar INTERNAL_CATCH_UNIQUE_NAME( lineRegistrar )( name, ::Catch::SourceLineInfo( __FILE__, __LINE__ ) );
 | 
					
						
							|  |  |  | #define CATCH_GET_LINE_INFO( name ) ::Catch::LineInfoRegistry::get().infoForName( name )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-14 08:38:46 +00:00
										 |  |  | #endif // TWOBLUECUBES_CATCH_SELF_TEST_HPP_INCLUDED
 |