Refactored simple content and child-handling into mixin classes.
[shibboleth/cpp-xmltooling.git] / xmltoolingtest / xmltoolingtest.h
1 /*\r
2  *  Copyright 2001-2005 Internet2\r
3  * \r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 #include "XMLObjectBaseTestCase.h"\r
18 \r
19 #include <fstream>\r
20 #include <cxxtest/GlobalFixture.h>\r
21 #include <xmltooling/XMLToolingConfig.h>\r
22 #include <xmltooling/util/ParserPool.h>\r
23 \r
24 //#define XMLTOOLINGTEST_LEAKCHECK\r
25 \r
26 ParserPool* validatingPool=NULL;\r
27 ParserPool* nonvalidatingPool=NULL;\r
28 std::string data_path = "../xmltoolingtest/data/";\r
29 \r
30 class ToolingFixture : public CxxTest::GlobalFixture\r
31 {\r
32 public:\r
33     bool setUpWorld() {\r
34         XMLToolingConfig::getConfig().log_config();\r
35         if (!XMLToolingConfig::getConfig().init())\r
36             return false;\r
37         validatingPool = new ParserPool(true,true);\r
38         nonvalidatingPool = new ParserPool();\r
39         if (getenv("XMLTOOLINGTEST_DATA"))\r
40             data_path=std::string(getenv("XMLTOOLINGTEST_DATA")) + "/";\r
41         return true;\r
42     }\r
43     bool tearDownWorld() {\r
44         delete validatingPool;\r
45         delete nonvalidatingPool;\r
46         XMLToolingConfig::getConfig().term();\r
47 #if defined(_MSC_VER ) && defined(XMLTOOLINGTEST_LEAKCHECK)\r
48        _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );\r
49        _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT );\r
50        _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );\r
51        _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT );\r
52        _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );\r
53        _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT );\r
54        _CrtDumpMemoryLeaks();\r
55 #endif\r
56         return true;\r
57     }\r
58     //bool setUp() { printf( "</test>" ); return true; }\r
59     //bool tearDown() { printf( "</test>" ); return true; }\r
60 };\r
61 \r
62 static ToolingFixture globalFixture;\r
63 \r
64 class GlobalTest : public CxxTest::TestSuite\r
65 {\r
66 public:\r
67     void setUp() {\r
68         XMLObjectBuilder::registerDefaultBuilder(new UnknownElementBuilder());\r
69     }\r
70 \r
71     void tearDown() {\r
72         XMLObjectBuilder::deregisterDefaultBuilder();\r
73     }\r
74 \r
75     void testCatalog(void) {\r
76         std::string path=data_path + "catalog.xml";\r
77         auto_ptr_XMLCh temp(path.c_str());\r
78         TS_ASSERT(validatingPool->loadCatalog(temp.get()));\r
79     }\r
80 \r
81     void testUnknown() {\r
82         ifstream fs("../xmltoolingtest/data/SimpleXMLObjectWithChildren.xml");\r
83         DOMDocument* doc=nonvalidatingPool->parse(fs);\r
84         TS_ASSERT(doc!=NULL);\r
85 \r
86         string buf1;\r
87         XMLHelper::serialize(doc->getDocumentElement(), buf1);\r
88 \r
89         const XMLObjectBuilder* b=XMLObjectBuilder::getBuilder(doc->getDocumentElement());\r
90         TS_ASSERT(b!=NULL);\r
91 \r
92         auto_ptr<XMLObject> xmlObject(b->buildFromDocument(doc)); // bind document\r
93         TS_ASSERT(xmlObject.get()!=NULL);\r
94 \r
95         auto_ptr<XMLObject> clonedObject(xmlObject->clone());\r
96         TS_ASSERT(clonedObject.get()!=NULL);\r
97 \r
98         DOMElement* rootElement=clonedObject->marshall();\r
99         TS_ASSERT(rootElement!=NULL);\r
100 \r
101         // should reuse DOM\r
102         TS_ASSERT(rootElement==clonedObject->marshall());\r
103 \r
104         string buf2;\r
105         XMLHelper::serialize(rootElement, buf2);\r
106         TS_ASSERT_EQUALS(buf1,buf2);\r
107     }\r
108 \r
109     void testUnknownWithDocChange() {\r
110         ifstream fs("../xmltoolingtest/data/SimpleXMLObjectWithChildren.xml");\r
111         DOMDocument* doc=nonvalidatingPool->parse(fs);\r
112         TS_ASSERT(doc!=NULL);\r
113 \r
114         string buf1;\r
115         XMLHelper::serialize(doc->getDocumentElement(), buf1);\r
116 \r
117         const XMLObjectBuilder* b=XMLObjectBuilder::getBuilder(doc->getDocumentElement());\r
118         TS_ASSERT(b!=NULL);\r
119 \r
120         auto_ptr<XMLObject> xmlObject(b->buildFromDocument(doc)); // bind document\r
121         TS_ASSERT(xmlObject.get()!=NULL);\r
122 \r
123         DOMDocument* newDoc=nonvalidatingPool->newDocument();\r
124         DOMElement* rootElement=xmlObject->marshall(newDoc);\r
125         TS_ASSERT(rootElement!=NULL);\r
126 \r
127         string buf2;\r
128         XMLHelper::serialize(rootElement, buf2);\r
129         TS_ASSERT_EQUALS(buf1,buf2);\r
130 \r
131         newDoc->release();\r
132     }\r
133 };\r
134 \r