clean up Value of XMLDocument
diff --git a/tinyxml2.cpp b/tinyxml2.cpp
index cefd22d..e007294 100755
--- a/tinyxml2.cpp
+++ b/tinyxml2.cpp
@@ -645,6 +645,9 @@
 

 const char* XMLNode::Value() const 

 {

+    // Catch an edge case: XMLDocuments don't have a a Value. Carefully return nullptr.

+    if ( this->ToDocument() )

+        return 0;

     return _value.GetStr();

 }

 

diff --git a/tinyxml2.h b/tinyxml2.h
index d0620cc..70a9851 100755
--- a/tinyxml2.h
+++ b/tinyxml2.h
@@ -122,9 +122,9 @@
 /* Versioning, past 1.0.14:

 	http://semver.org/

 */

-static const int TIXML2_MAJOR_VERSION = 3;
-static const int TIXML2_MINOR_VERSION = 0;
-static const int TIXML2_PATCH_VERSION = 0;
+static const int TIXML2_MAJOR_VERSION = 3;

+static const int TIXML2_MINOR_VERSION = 0;

+static const int TIXML2_PATCH_VERSION = 0;

 

 namespace tinyxml2

 {

@@ -708,7 +708,7 @@
 

     /** The meaning of 'value' changes for the specific type.

     	@verbatim

-    	Document:	empty

+    	Document:	empty (NULL is returned, not an empty string)

     	Element:	name of the element

     	Comment:	the comment text

     	Unknown:	the tag contents

diff --git a/xmltest.cpp b/xmltest.cpp
index f3fa7b2..5e0eb3a 100644
--- a/xmltest.cpp
+++ b/xmltest.cpp
@@ -30,7 +30,13 @@
 

 bool XMLTest (const char* testString, const char* expected, const char* found, bool echo=true, bool extraNL=false )

 {

-	bool pass = !strcmp( expected, found );

+	bool pass;

+	if ( !expected && !found )

+		pass = true;

+	else if ( !expected || !found )

+		pass = false;

+	else 

+		pass = !strcmp( expected, found );

 	if ( pass )

 		printf ("[pass]");

 	else

@@ -1462,24 +1468,37 @@
 

 	{

 		// Check that declarations are parsed only as the FirstChild

-                const char* xml0 = "<?xml version=\"1.0\" ?>"

-                                   "   <!-- xml version=\"1.1\" -->"

-                                   "<first />";

-                const char* xml1 = "<?xml version=\"1.0\" ?>"

-                                   "   <?xml version=\"1.1\" ?>"

-                                   "<first />";

-                const char* xml2 = "<first />"

-                                   "<?xml version=\"1.0\" ?>";

-                XMLDocument doc;

-                doc.Parse(xml0);

-                XMLTest("Test that the code changes do not affect normal parsing", doc.Error(), false);

-                doc.Parse(xml1);

-                XMLTest("Test that the second declaration throws an error", doc.ErrorID(), XML_ERROR_PARSING_DECLARATION);

-                doc.Parse(xml2);

-                XMLTest("Test that declaration after a child throws an error", doc.ErrorID(), XML_ERROR_PARSING_DECLARATION);

+	    const char* xml0 = "<?xml version=\"1.0\" ?>"

+	                       "   <!-- xml version=\"1.1\" -->"

+	                       "<first />";

+	    const char* xml1 = "<?xml version=\"1.0\" ?>"

+	                       "   <?xml version=\"1.1\" ?>"

+	                       "<first />";

+	    const char* xml2 = "<first />"

+	                       "<?xml version=\"1.0\" ?>";

+	    XMLDocument doc;

+	    doc.Parse(xml0);

+	    XMLTest("Test that the code changes do not affect normal parsing", doc.Error(), false);

+	    doc.Parse(xml1);

+	    XMLTest("Test that the second declaration throws an error", doc.ErrorID(), XML_ERROR_PARSING_DECLARATION);

+	    doc.Parse(xml2);

+	    XMLTest("Test that declaration after a child throws an error", doc.ErrorID(), XML_ERROR_PARSING_DECLARATION);

 	}

 

-	// ----------- Performance tracking --------------

+    {

+	    // No matter - before or after successfully parsing a text -

+	    // calling XMLDocument::Value() causes an assert in debug.

+	    const char* validXml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"

+	                           "<first />"

+	                           "<second />";

+	    XMLDocument* doc = new XMLDocument();

+	    XMLTest( "XMLDocument::Value() returns null?", NULL, doc->Value() );

+	    doc->Parse( validXml );

+	    XMLTest( "XMLDocument::Value() returns null?", NULL, doc->Value() );

+	    delete doc;

+    }

+

+    // ----------- Performance tracking --------------

 	{

 #if defined( _MSC_VER )

 		__int64 start, end, freq;