Merge branch 'master' of https://github.com/jbrwilkinson/Catch

# By James Wilkinson
# Via James Wilkinson
* 'master' of https://github.com/jbrwilkinson/Catch:
  Added SCENARIO_METHOD for BDD testing with fixtures.
diff --git a/README.md b/README.md
index 6367b2a..d5992a4 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 ![catch logo](catch-logo-small.png)
 
-*v1.0 build 53 (master branch)*
+*v1.0 build 52 (master branch)*
 
 Build status (on Travis CI) [![Build Status](https://travis-ci.org/philsquared/Catch.png)](https://travis-ci.org/philsquared/Catch)
 
diff --git a/docs/Readme.md b/docs/Readme.md
new file mode 100644
index 0000000..45350f9
--- /dev/null
+++ b/docs/Readme.md
@@ -0,0 +1,23 @@
+These are the currently documented areas of the framework. There is more to come.
+
+Before looking at this material be sure to read the [tutorial](tutorial.md)
+
+* [Assertion macros](assertions.md)
+* [Logging macros](logging.md)
+* [Test cases and sections](test-cases-and-sections.md)
+* [Test fixtures](test-fixtures.md)
+* [Command line](command-line.md)
+* [Build systems](build-systems.md)
+* [Supplying your own main()](own-main.md)
+* [Why are my tests slow to compile?](slow-compiles.md)
+
+Other
+
+* [Why Catch?](why-catch.md)
+* [What's changed](whats-changed.md)
+* [Contributing](contributing.md)
+
+---
+
+[Home](../README.md)
+
diff --git a/docs/reference-index.md b/docs/reference-index.md
deleted file mode 100644
index 0d66257..0000000
--- a/docs/reference-index.md
+++ /dev/null
@@ -1,14 +0,0 @@
-These are the currently documented areas of the framework. There is more to come.
-
-Before looking at this material be sure to read the [tutorial](tutorial.md)
-
-* [Command Line](command-line.md)
-* [Assertion Macros](assertions.md)
-* [Test cases and sections](test-cases-and-sections.md)
-* [Logging Macros](logging.md)
-* [Supplying your own main()](own-main.md)
-* [Test fixtures](test-fixtures.md)
-
----
-
-[Home](../README.md)
\ No newline at end of file
diff --git a/docs/slow-compiles.md b/docs/slow-compiles.md
new file mode 100644
index 0000000..5dc5914
--- /dev/null
+++ b/docs/slow-compiles.md
@@ -0,0 +1,22 @@
+# Why do my tests take so long to compile?
+
+Several people have reported that test code written with Catch takes much longer to compile than they would expect. Why is that?
+
+Catch is implemented entirely in headers. There is a little overhead due to this - but not as much as you might think - and you can minimise it simply by organising your test code as follows:
+
+## Short answer
+Exactly one source file must ```#define``` either ```CATCH_CONFIG_MAIN``` or ```CATCH_CONFIG_RUNNER``` before ```#include```-ing Catch. In this file *do not write any test cases*! In most cases that means this file will just contain two lines (the ```#define``` and the ```#include```).
+
+## Long answer
+
+Usually C++ code is split between a header file, containing declarations and prototypes, and an implementation file (.cpp) containig the definition, or implementation, code. Each implementation file, along with all the headers that it includes (and which those headers include, etc), is expanded into a single entity called a translation unit - which is then passed to the compiler and compiled down to an object file.
+
+But functions and methods can also be written inline in header files. The downside to this is that these definitions will then be compiled in *every* translation unit that includes the header.
+
+Because Catch is implemented *entirely* in headers you might think that the whole of Catch must be compiled into every translation unit that uses it! Actually it's not quite as bad as that. Catch mitigates this situation by effectively maintaining the traditional separation between the implementation code and declarations. Internally the implementation code is protected by ```#ifdef```s and is conditionally compiled into only one translation unit. This translation unit is that one that ```#define```s ```CATCH_CONFIG_MAIN``` or ```CATCH_CONFIG_RUNNER```. Let's call this the main source file.
+
+As a result the main source file *does* compile the whole of Catch every time! So it makes sense to dedicate this file to *only* ```#define```-ing the identifier and ```#include```-ing Catch (and implementing the runner code, if you're doing that). Keep all your test cases in other files. This way you won't pay the recompilation cost for the whole of Catch 
+
+---
+
+[Home](../README.md)
\ No newline at end of file
diff --git a/docs/tutorial.md b/docs/tutorial.md
index aa514d3..a2555f7 100644
--- a/docs/tutorial.md
+++ b/docs/tutorial.md
@@ -7,7 +7,7 @@
 
 ## Where to put it?
 
-Catch is header only. All you need to do is drop the file(s) somewhere reachable from your project - either in some central location you can set your header search path to find, or directly into your project tree itself! This is a particularly good option for other Open-Source projects that want to use Catch for their test suite. See [this blog entry for more on that](http://www.levelofindirection.com/journal/2011/5/27/unit-testing-in-c-and-objective-c-just-got-ridiculously-easi-1.html). 
+Catch is header only. All you need to do is drop the file(s) somewhere reachable from your project - either in some central location you can set your header search path to find, or directly into your project tree itself! This is a particularly good option for other Open-Source projects that want to use Catch for their test suite. See [this blog entry for more on that](http://www.levelofindirection.com/journal/2011/5/27/unit-testing-in-c-and-objective-c-just-got-ridiculously-easi.html). 
 
 The rest of this tutorial will assume that the Catch single-include header (or the include folder) is available unqualified - but you may need to prefix it with a folder name if necessary.
 
@@ -220,7 +220,7 @@
 ```
 
 ## Next steps
-For more specific information see the [Reference pages](reference-index.md)
+For more specific information see the [Reference pages](Readme.md)
 
 
 ---
diff --git a/include/internal/catch_reenable_warnings.h b/include/internal/catch_reenable_warnings.h
index fbdfebc..07765f4 100644
--- a/include/internal/catch_reenable_warnings.h
+++ b/include/internal/catch_reenable_warnings.h
@@ -10,6 +10,8 @@
 
 #ifdef __clang__
 #pragma clang diagnostic pop
+#elif defined __GNUC__
+#pragma GCC diagnostic pop
 #endif
 
 #endif // TWOBLUECUBES_CATCH_REENABLE_WARNINGS_H_INCLUDED
diff --git a/include/internal/catch_suppress_warnings.h b/include/internal/catch_suppress_warnings.h
index b39a0b3..cc36c07 100644
--- a/include/internal/catch_suppress_warnings.h
+++ b/include/internal/catch_suppress_warnings.h
@@ -17,6 +17,11 @@
 #pragma clang diagnostic ignored "-Wpadded"
 #pragma clang diagnostic ignored "-Wc++98-compat"
 #pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
+#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
 
 #endif // TWOBLUECUBES_CATCH_SUPPRESS_WARNINGS_H_INCLUDED
diff --git a/include/internal/catch_tostring.h b/include/internal/catch_tostring.h
index 4b46883..e8e3829 100644
--- a/include/internal/catch_tostring.h
+++ b/include/internal/catch_tostring.h
@@ -154,6 +154,8 @@
 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 );
diff --git a/include/internal/catch_tostring.hpp b/include/internal/catch_tostring.hpp
index 825ceb5..f9369f1 100644
--- a/include/internal/catch_tostring.hpp
+++ b/include/internal/catch_tostring.hpp
@@ -84,6 +84,16 @@
     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;
diff --git a/include/internal/catch_version.hpp b/include/internal/catch_version.hpp
index db7a7ec..831e354 100644
--- a/include/internal/catch_version.hpp
+++ b/include/internal/catch_version.hpp
@@ -13,7 +13,7 @@
 namespace Catch {
 
     // These numbers are maintained by a script
-    Version libraryVersion( 1, 0, 53, "master" );
+    Version libraryVersion( 1, 0, 52, "master" );
 }
 
 #endif // TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED
diff --git a/projects/SelfTest/MiscTests.cpp b/projects/SelfTest/MiscTests.cpp
index ad572ee..e425b64 100644
--- a/projects/SelfTest/MiscTests.cpp
+++ b/projects/SelfTest/MiscTests.cpp
@@ -356,3 +356,27 @@
     CHECK( s1 == s2 );
 }
 
+
+TEST_CASE( "toString on const wchar_t const pointer returns the string contents", "[toString]" ) {
+	const wchar_t * const s = L"wide load";
+	std::string result = Catch::toString( s );
+	CHECK( result == "\"wide load\"" );
+}
+
+TEST_CASE( "toString on const wchar_t pointer returns the string contents", "[toString]" ) {
+	const wchar_t * s = L"wide load";
+	std::string result = Catch::toString( s );
+	CHECK( result == "\"wide load\"" );
+}
+
+TEST_CASE( "toString on wchar_t const pointer returns the string contents", "[toString]" ) {
+	wchar_t * const s = L"wide load";
+	std::string result = Catch::toString( s );
+	CHECK( result == "\"wide load\"" );
+}
+
+TEST_CASE( "toString on wchar_t returns the string contents", "[toString]" ) {
+	wchar_t * s = L"wide load";
+	std::string result = Catch::toString( s );
+	CHECK( result == "\"wide load\"" );
+}
\ No newline at end of file
diff --git a/scripts/generateSingleHeader.py b/scripts/generateSingleHeader.py
index 9f5ddcb..cd97010 100644
--- a/scripts/generateSingleHeader.py
+++ b/scripts/generateSingleHeader.py
@@ -16,7 +16,7 @@
 endIfParser = re.compile( r'\s*#endif // TWOBLUECUBES_CATCH_.*_INCLUDED')
 ifImplParser = re.compile( r'\s*#ifdef CATCH_CONFIG_RUNNER' )
 commentParser1 = re.compile( r'^\s*/\*')
-commentParser2 = re.compile( r'^\s*\*')
+commentParser2 = re.compile( r'^ \*')
 blankParser = re.compile( r'^\s*$')
 seenHeaders = set([])
 rootPath = os.path.join( catchPath, 'include/' )
diff --git a/single_include/catch.hpp b/single_include/catch.hpp
index 2684c59..6e2053e 100644
--- a/single_include/catch.hpp
+++ b/single_include/catch.hpp
@@ -1,6 +1,6 @@
 /*
- *  CATCH v1.0 build 53 (master branch)
- *  Generated: 2014-07-10 10:03:22.176925
+ *  CATCH v1.0 build 52 (master branch)
+ *  Generated: 2014-07-10 09:17:43.994453
  *  ----------------------------------------------------------
  *  This file has been merged from multiple headers. Please don't edit it directly
  *  Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved.
@@ -26,6 +26,11 @@
 #pragma clang diagnostic ignored "-Wpadded"
 #pragma clang diagnostic ignored "-Wc++98-compat"
 #pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
+#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
 
 #ifdef CATCH_CONFIG_MAIN
@@ -6410,7 +6415,7 @@
 namespace Catch {
 
     // These numbers are maintained by a script
-    Version libraryVersion( 1, 0, 53, "master" );
+    Version libraryVersion( 1, 0, 52, "master" );
 }
 
 // #included from: catch_message.hpp
@@ -8333,6 +8338,7 @@
                 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;
                 }
@@ -8883,10 +8889,8 @@
 // "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( "Given: " desc, "" )
 #define CATCH_WHEN( desc )     CATCH_SECTION( " When: " desc, "" )
@@ -8952,10 +8956,8 @@
 // "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( "   Given: " desc, "" )
 #define WHEN( desc )     SECTION( "    When: " desc, "" )