xmltest.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. #include "tinyxml2.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #if defined( WIN32 )
  6. #include <crtdbg.h>
  7. _CrtMemState startMemState;
  8. _CrtMemState endMemState;
  9. #endif
  10. using namespace tinyxml2;
  11. int gPass = 0;
  12. int gFail = 0;
  13. //#define DREAM_ONLY
  14. /*
  15. int gNew = 0;
  16. int gNewTotal = 0;
  17. void* operator new( size_t size )
  18. {
  19. ++gNew;
  20. return malloc( size );
  21. }
  22. void* operator new[]( size_t size )
  23. {
  24. ++gNew;
  25. return malloc( size );
  26. }
  27. void operator delete[]( void* mem )
  28. {
  29. free( mem );
  30. }
  31. void operator delete( void* mem )
  32. {
  33. free( mem );
  34. }
  35. */
  36. bool XMLTest (const char* testString, const char* expected, const char* found, bool echo=true )
  37. {
  38. bool pass = !strcmp( expected, found );
  39. if ( pass )
  40. printf ("[pass]");
  41. else
  42. printf ("[fail]");
  43. if ( !echo )
  44. printf (" %s\n", testString);
  45. else
  46. printf (" %s [%s][%s]\n", testString, expected, found);
  47. if ( pass )
  48. ++gPass;
  49. else
  50. ++gFail;
  51. return pass;
  52. }
  53. bool XMLTest( const char* testString, int expected, int found, bool echo=true )
  54. {
  55. bool pass = ( expected == found );
  56. if ( pass )
  57. printf ("[pass]");
  58. else
  59. printf ("[fail]");
  60. if ( !echo )
  61. printf (" %s\n", testString);
  62. else
  63. printf (" %s [%d][%d]\n", testString, expected, found);
  64. if ( pass )
  65. ++gPass;
  66. else
  67. ++gFail;
  68. return pass;
  69. }
  70. int main( int argc, const char* argv )
  71. {
  72. #if defined( WIN32 )
  73. _CrtMemCheckpoint( &startMemState );
  74. #endif
  75. #ifndef DREAM_ONLY
  76. #if 0
  77. {
  78. static const char* test = "<!--hello world\n"
  79. " line 2\r"
  80. " line 3\r\n"
  81. " line 4\n\r"
  82. " line 5\r-->";
  83. XMLDocument doc;
  84. doc.Parse( test );
  85. doc.Print();
  86. }
  87. #endif
  88. #if 0
  89. {
  90. static const char* test[] = { "<element />",
  91. "<element></element>",
  92. "<element><subelement/></element>",
  93. "<element><subelement></subelement></element>",
  94. "<element><subelement><subsub/></subelement></element>",
  95. "<!--comment beside elements--><element><subelement></subelement></element>",
  96. "<!--comment beside elements, this time with spaces--> \n <element> <subelement> \n </subelement> </element>",
  97. "<element attrib1='foo' attrib2=\"bar\" ></element>",
  98. "<element attrib1='foo' attrib2=\"bar\" ><subelement attrib3='yeehaa' /></element>",
  99. "<element>Text inside element.</element>",
  100. "<element><b></b></element>",
  101. "<element>Text inside and <b>bolded</b> in the element.</element>",
  102. "<outer><element>Text inside and <b>bolded</b> in the element.</element></outer>",
  103. "<element>This &amp; That.</element>",
  104. "<element attrib='This&lt;That' />",
  105. 0
  106. };
  107. for( int i=0; test[i]; ++i ) {
  108. XMLDocument doc;
  109. doc.Parse( test[i] );
  110. doc.Print();
  111. printf( "----------------------------------------------\n" );
  112. }
  113. }
  114. #endif
  115. #if 0
  116. {
  117. static const char* test = "<element>Text before.</element>";
  118. XMLDocument doc;
  119. doc.Parse( test );
  120. XMLElement* root = doc.FirstChildElement();
  121. XMLElement* newElement = doc.NewElement( "Subelement" );
  122. root->InsertEndChild( newElement );
  123. doc.Print();
  124. }
  125. {
  126. XMLDocument* doc = new XMLDocument();
  127. static const char* test = "<element><sub/></element>";
  128. doc->Parse( test );
  129. delete doc;
  130. }
  131. #endif
  132. {
  133. // Test: Programmatic DOM
  134. // Build:
  135. // <element>
  136. // <!--comment-->
  137. // <sub attrib="1" />
  138. // <sub attrib="2" />
  139. // <sub attrib="3" >& Text!</sub>
  140. // <element>
  141. XMLDocument* doc = new XMLDocument();
  142. XMLNode* element = doc->InsertEndChild( doc->NewElement( "element" ) );
  143. XMLElement* sub[3] = { doc->NewElement( "sub" ), doc->NewElement( "sub" ), doc->NewElement( "sub" ) };
  144. for( int i=0; i<3; ++i ) {
  145. sub[i]->SetAttribute( "attrib", i );
  146. }
  147. element->InsertEndChild( sub[2] );
  148. XMLNode* comment = element->InsertFirstChild( doc->NewComment( "comment" ) );
  149. element->InsertAfterChild( comment, sub[0] );
  150. element->InsertAfterChild( sub[0], sub[1] );
  151. sub[2]->InsertFirstChild( doc->NewText( "& Text!" ));
  152. doc->Print();
  153. XMLTest( "Programmatic DOM", "comment", doc->FirstChildElement( "element" )->FirstChild()->Value() );
  154. XMLTest( "Programmatic DOM", "0", doc->FirstChildElement( "element" )->FirstChildElement()->Attribute( "attrib" ) );
  155. XMLTest( "Programmatic DOM", 2, doc->FirstChildElement()->LastChildElement( "sub" )->IntAttribute( "attrib" ) );
  156. XMLTest( "Programmatic DOM", "& Text!",
  157. doc->FirstChildElement()->LastChildElement( "sub" )->FirstChild()->ToText()->Value() );
  158. // And now deletion:
  159. element->DeleteChild( sub[2] );
  160. doc->DeleteNode( comment );
  161. element->FirstChildElement()->SetAttribute( "attrib", true );
  162. element->LastChildElement()->DeleteAttribute( "attrib" );
  163. XMLTest( "Programmatic DOM", true, doc->FirstChildElement()->FirstChildElement()->BoolAttribute( "attrib" ) );
  164. int value = 10;
  165. int result = doc->FirstChildElement()->LastChildElement()->QueryIntAttribute( "attrib", &value );
  166. XMLTest( "Programmatic DOM", result, NO_ATTRIBUTE );
  167. XMLTest( "Programmatic DOM", value, 10 );
  168. doc->Print();
  169. XMLStreamer streamer;
  170. doc->Print( &streamer );
  171. printf( "%s", streamer.CStr() );
  172. delete doc;
  173. }
  174. #endif
  175. {
  176. // Test: Dream
  177. // XML1 : 1,187,569 bytes in 31,209 allocations
  178. // XML2 : 469,073 bytes in 323 allocations
  179. //int newStart = gNew;
  180. XMLDocument doc;
  181. doc.Load( "dream.xml" );
  182. doc.Save( "dreamout.xml" );
  183. doc.PrintError();
  184. XMLTest( "Dream", "xml version=\"1.0\"",
  185. doc.FirstChild()->ToDeclaration()->Value() );
  186. XMLTest( "Dream", true, doc.FirstChild()->NextSibling()->ToUnknown() ? true : false );
  187. XMLTest( "Dream", "DOCTYPE PLAY SYSTEM \"play.dtd\"",
  188. doc.FirstChild()->NextSibling()->ToUnknown()->Value() );
  189. XMLTest( "Dream", "And Robin shall restore amends.",
  190. doc.LastChild()->LastChild()->LastChild()->LastChild()->LastChildElement()->GetText() );
  191. XMLTest( "Dream", "And Robin shall restore amends.",
  192. doc.LastChild()->LastChild()->LastChild()->LastChild()->LastChildElement()->GetText() );
  193. XMLDocument doc2;
  194. doc2.Load( "dreamout.xml" );
  195. XMLTest( "Dream-out", "xml version=\"1.0\"",
  196. doc2.FirstChild()->ToDeclaration()->Value() );
  197. XMLTest( "Dream-out", true, doc2.FirstChild()->NextSibling()->ToUnknown() ? true : false );
  198. XMLTest( "Dream-out", "DOCTYPE PLAY SYSTEM \"play.dtd\"",
  199. doc2.FirstChild()->NextSibling()->ToUnknown()->Value() );
  200. XMLTest( "Dream-out", "And Robin shall restore amends.",
  201. doc2.LastChild()->LastChild()->LastChild()->LastChild()->LastChildElement()->GetText() );
  202. //gNewTotal = gNew - newStart;
  203. }
  204. #if defined( WIN32 )
  205. _CrtMemCheckpoint( &endMemState );
  206. //_CrtMemDumpStatistics( &endMemState );
  207. _CrtMemState diffMemState;
  208. _CrtMemDifference( &diffMemState, &startMemState, &endMemState );
  209. _CrtMemDumpStatistics( &diffMemState );
  210. //printf( "new total=%d\n", gNewTotal );
  211. #endif
  212. printf ("\nPass %d, Fail %d\n", gPass, gFail);
  213. return 0;
  214. }