Refactored simple content and child-handling into mixin classes.
[shibboleth/cpp-xmltooling.git] / xmltoolingtest / MarshallingTest.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 \r
21 class MarshallingTest : public CxxTest::TestSuite {\r
22 public:\r
23     void setUp() {\r
24         QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME);\r
25         QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME);\r
26         XMLObjectBuilder::registerBuilder(qname, new SimpleXMLObjectBuilder());\r
27         XMLObjectBuilder::registerBuilder(qtype, new SimpleXMLObjectBuilder());\r
28     }\r
29 \r
30     void tearDown() {\r
31         QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME);\r
32         QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME);\r
33         XMLObjectBuilder::deregisterBuilder(qname);\r
34         XMLObjectBuilder::deregisterBuilder(qtype);\r
35     }\r
36 \r
37     void testMarshallingWithAttributes() {\r
38         TS_TRACE("testMarshallingWithAttributes");\r
39 \r
40         QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME);\r
41         const SimpleXMLObjectBuilder* b=dynamic_cast<const SimpleXMLObjectBuilder*>(XMLObjectBuilder::getBuilder(qname));\r
42         auto_ptr<SimpleXMLObject> sxObject(b->buildObject());\r
43         TS_ASSERT(sxObject.get()!=NULL);\r
44         auto_ptr_XMLCh expected("Firefly");\r
45         sxObject->setId(expected.get());\r
46         \r
47         DOMElement* rootElement = sxObject->marshall();\r
48 \r
49         string path=data_path + "SimpleXMLObjectWithAttribute.xml";\r
50         ifstream fs(path.c_str());\r
51         DOMDocument* doc=nonvalidatingPool->parse(fs);\r
52         TS_ASSERT(doc!=NULL);\r
53 \r
54         TS_ASSERT(rootElement->isEqualNode(doc->getDocumentElement()));\r
55         doc->release();\r
56     }\r
57 \r
58     void testMarshallingWithElementContent() {\r
59         TS_TRACE("testMarshallingWithElementContent");\r
60 \r
61         QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME);\r
62         const SimpleXMLObjectBuilder* b=dynamic_cast<const SimpleXMLObjectBuilder*>(XMLObjectBuilder::getBuilder(qname));\r
63         auto_ptr<SimpleXMLObject> sxObject(b->buildObject());\r
64         TS_ASSERT(sxObject.get()!=NULL);\r
65         auto_ptr_XMLCh expected("Sample Content");\r
66         sxObject->setValue(expected.get());\r
67         \r
68         DOMElement* rootElement = sxObject->marshall();\r
69 \r
70         string path=data_path + "SimpleXMLObjectWithContent.xml";\r
71         ifstream fs(path.c_str());\r
72         DOMDocument* doc=nonvalidatingPool->parse(fs);\r
73         TS_ASSERT(doc!=NULL);\r
74 \r
75         TS_ASSERT(rootElement->isEqualNode(doc->getDocumentElement()));\r
76         doc->release();\r
77     }\r
78 \r
79     void testMarshallingWithChildElements() {\r
80         TS_TRACE("testMarshallingWithChildElements");\r
81 \r
82         QName qname(SimpleXMLObject::NAMESPACE,SimpleXMLObject::LOCAL_NAME);\r
83         const SimpleXMLObjectBuilder* b=dynamic_cast<const SimpleXMLObjectBuilder*>(XMLObjectBuilder::getBuilder(qname));\r
84         TS_ASSERT(b!=NULL);\r
85         \r
86         auto_ptr<SimpleXMLObject> sxObject(b->buildObject());\r
87         TS_ASSERT(sxObject.get()!=NULL);\r
88         VectorOf(SimpleXMLObject) kids=sxObject->getSimpleXMLObjects();\r
89         kids.push_back(b->buildObject());\r
90         kids.push_back(b->buildObject());\r
91         kids.push_back(b->buildObject());\r
92         \r
93         // Test some collection stuff\r
94         auto_ptr_XMLCh foo("Foo");\r
95         auto_ptr_XMLCh bar("Bar");\r
96         auto_ptr_XMLCh baz("Baz");\r
97         kids.begin()->setId(foo.get());\r
98         kids.at(2)->setValue(bar.get());\r
99         kids.erase(kids.begin()+1);\r
100         TS_ASSERT_SAME_DATA(kids.back()->getValue(), bar.get(), XMLString::stringLen(bar.get()));\r
101         \r
102         QName qtype(SimpleXMLObject::NAMESPACE,SimpleXMLObject::TYPE_NAME,SimpleXMLObject::NAMESPACE_PREFIX);\r
103         kids.push_back(\r
104             b->buildObject(SimpleXMLObject::NAMESPACE,SimpleXMLObject::DERIVED_NAME,SimpleXMLObject::NAMESPACE_PREFIX,&qtype)\r
105             );\r
106         kids.back()->setValue(baz.get());\r
107         \r
108         DOMElement* rootElement = sxObject->marshall();\r
109 \r
110         string path=data_path + "SimpleXMLObjectWithChildren.xml";\r
111         ifstream fs(path.c_str());\r
112         DOMDocument* doc=nonvalidatingPool->parse(fs);\r
113         TS_ASSERT(doc!=NULL);\r
114 \r
115         TS_ASSERT(rootElement->isEqualNode(doc->getDocumentElement()));\r
116         doc->release();\r
117     }\r
118 \r
119 };\r