ProteoWizard
Classes | Functions | Variables
XMLWriterTest.cpp File Reference
#include "XMLWriter.hpp"
#include "pwiz/utility/misc/unit.hpp"
#include "pwiz/utility/misc/Std.hpp"

Go to the source code of this file.

Classes

struct  TestOutputObserver
 

Functions

void test ()
 
void testNormalization ()
 
int main (int argc, char *argv[])
 

Variables

ostream * os_ = 0
 
const char * targetXML
 

Function Documentation

§ test()

void test ( )

Definition at line 73 of file XMLWriterTest.cpp.

References TestOutputObserver::cache, pwiz::minimxml::XMLWriter::characters(), pwiz::minimxml::encode_xml_id(), pwiz::minimxml::encode_xml_id_copy(), pwiz::minimxml::XMLWriter::endElement(), pwiz::minimxml::XMLWriter::Config::indentationStep, os_, pwiz::minimxml::XMLWriter::Config::outputObserver, pwiz::minimxml::XMLWriter::popStyle(), pwiz::minimxml::XMLWriter::position(), pwiz::minimxml::XMLWriter::positionNext(), pwiz::minimxml::XMLWriter::processingInstruction(), pwiz::minimxml::XMLWriter::pushStyle(), pwiz::minimxml::XMLWriter::startElement(), StyleFlag_Inline, StyleFlag_InlineInner, targetXML, and unit_assert.

Referenced by main().

74 {
75  ostringstream oss;
76 
77  TestOutputObserver outputObserver;
78  XMLWriter::Config config;
79  config.indentationStep = 4;
80  config.outputObserver = &outputObserver;
81 
82  XMLWriter writer(oss, config);
83  if (os_) *os_ << "target:\n" << targetXML << endl;
84 
85  unit_assert(writer.position() < 1); // 0 or -1 depending on platform
86 
87  const char* piData = "version=\"1.0\" encoding=\"UTF-8\"";
88  writer.processingInstruction("xml", piData);
89 
90  unit_assert(writer.position() == 39);
91 
92  XMLWriter::Attributes attributes;
93  attributes.push_back(make_pair("name1", "value1"));
94  attributes.push_back(make_pair("name2", "420"));
95  attributes.push_back(make_pair("name3", "0.666"));
96  writer.startElement("root", attributes);
97 
98  unit_assert(writer.position() == 87);
99  unit_assert(writer.positionNext() == 91);
100 
101  attributes.clear();
102  attributes.push_back(make_pair("name", "nixon"));
103  attributes.push_back(make_pair("color", "red"));
104  attributes.push_back(make_pair("number", "37"));
105  writer.pushStyle(XMLWriter::StyleFlag_AttributesOnMultipleLines);
106  writer.startElement("record", attributes);
107  writer.pushStyle(XMLWriter::StyleFlag_InlineInner);
108  writer.startElement("quote");
109  writer.characters("I'm not a crook.");
110  writer.endElement();
111  writer.startElement("resigned", XMLWriter::Attributes(), XMLWriter::EmptyElement);
112  writer.popStyle();
113  writer.endElement();
114  writer.popStyle();
115 
116  attributes.clear();
117  attributes.push_back(make_pair("name", "\"Penn & Teller\""));
118  writer.startElement("record", attributes);
119  writer.pushStyle(XMLWriter::StyleFlag_InlineInner);
120  writer.startElement("quote");
121  writer.characters("'Bull<shit!'");
122  writer.endElement();
123  writer.popStyle();
124  writer.endElement();
125 
126  attributes.clear();
127  attributes.push_back(make_pair("name", "clinton"));
128  attributes.push_back(make_pair("color", "blue"));
129  attributes.push_back(make_pair("number", "42"));
130  writer.pushStyle(XMLWriter::StyleFlag_AttributesOnMultipleLines);
131  writer.startElement("record", attributes);
132  writer.pushStyle(XMLWriter::StyleFlag_InlineInner);
133  writer.startElement("quote");
134  writer.characters("I did ");
135  writer.pushStyle(XMLWriter::StyleFlag_Inline);
136  unit_assert(writer.position() == writer.positionNext()); // no indentation
137  writer.startElement("em");
138  writer.characters("not");
139  writer.endElement();
140  writer.popStyle();
141  writer.characters(" have sexual relations with that woman.");
142  writer.endElement();
143  writer.popStyle();
144  writer.startElement("impeached", XMLWriter::Attributes(), XMLWriter::EmptyElement);
145  writer.endElement();
146  writer.popStyle();
147 
148  attributes.clear();
149  attributes.push_back(make_pair("name", "bush"));
150  attributes.push_back(make_pair("color", "red"));
151  attributes.push_back(make_pair("number", "43"));
152  writer.pushStyle(XMLWriter::StyleFlag_AttributesOnMultipleLines);
153  writer.startElement("record", attributes);
154  writer.pushStyle(XMLWriter::StyleFlag_InlineInner);
155  writer.startElement("quote");
156  writer.characters("Mission accomplished.");
157  writer.endElement();
158  writer.popStyle();
159  writer.endElement();
160  writer.popStyle();
161 
162  writer.endElement();
163 
164  if (os_) *os_ << "test: (" << oss.str().size() << ")\n" << oss.str() << endl;
165 
166  unit_assert(targetXML == oss.str());
167  unit_assert(writer.position() == (int)oss.str().size());
168  unit_assert(writer.position() == 671);
169 
170  if (os_) *os_ << "outputObserver cache:\n" << outputObserver.cache << endl;
171  unit_assert(targetXML == outputObserver.cache);
172 
173 
174  // test id encoding
175 
176  string id1("1invalid ID");
177  unit_assert(encode_xml_id_copy(id1) == "_x0031_invalid_x0020_ID");
178  unit_assert(&encode_xml_id(id1) == &id1);
179  unit_assert(id1 == "_x0031_invalid_x0020_ID");
180 
181  string id2("_invalid-ID_#2_<3>");
182  unit_assert(encode_xml_id_copy(id2) == "_invalid-ID__x0023_2__x003c_3_x003e_");
183  unit_assert(encode_xml_id(id2) == "_invalid-ID__x0023_2__x003c_3_x003e_");
184 
185  string crazyId("!!!");
186  unit_assert(encode_xml_id(crazyId) == "_x0021__x0021__x0021_");
187 }
The XMLWriter class provides simple, tag-level XML syntax writing.
Definition: XMLWriter.hpp:47
StyleFlag_Inline
Definition: XMLWriter.hpp:56
initial configuration of the XMLWriter
Definition: XMLWriter.hpp:69
PWIZ_API_DECL std::string encode_xml_id_copy(const std::string &str)
Encodes any characters not suitable in an xml:ID or xml:IDREF with their hexadecimal value...
StyleFlag_InlineInner
Definition: XMLWriter.hpp:54
vector of name/value pairs to be written as XML attributes
Definition: XMLWriter.hpp:81
ostream * os_
PWIZ_API_DECL std::string & encode_xml_id(std::string &str)
Encodes any characters not suitable in an xml:ID or xml:IDREF with their hexadecimal value...
#define unit_assert(x)
Definition: unit.hpp:85
const char * targetXML

§ testNormalization()

void testNormalization ( )

Definition at line 189 of file XMLWriterTest.cpp.

References pwiz::minimxml::XMLWriter::Attributes::add(), and unit_assert_operator_equal.

Referenced by main().

190 {
191 #ifndef __APPLE__ // TODO: how to test that this works with Darwin's compiler?
192  // test that subnormal values are clamped and provide 12 decimal places
193  XMLWriter::Attributes attributes;
194  attributes.add("1", 2.2250738585072014e-309);
195  attributes.add("2", -2.2250738585072014e-309);
196  unit_assert_operator_equal(2.225073858507e-308, lexical_cast<double>(attributes[0].second));
197  unit_assert_operator_equal(-2.225073858507e-308, lexical_cast<double>(attributes[1].second));
198 #endif
199 }
#define unit_assert_operator_equal(expected, actual)
Definition: unit.hpp:92
vector of name/value pairs to be written as XML attributes
Definition: XMLWriter.hpp:81
void add(const std::string &name, const double &value)

§ main()

int main ( int  argc,
char *  argv[] 
)

Definition at line 202 of file XMLWriterTest.cpp.

References os_, test(), TEST_EPILOG, TEST_FAILED, TEST_PROLOG, and testNormalization().

203 {
204  TEST_PROLOG(argc, argv)
205 
206  try
207  {
208  if (argc>1 && !strcmp(argv[1],"-v")) os_ = &cout;
209  test();
211  }
212  catch (exception& e)
213  {
214  TEST_FAILED(e.what())
215  }
216  catch (...)
217  {
218  TEST_FAILED("Caught unknown exception.")
219  }
220 
222 }
#define TEST_EPILOG
Definition: unit.hpp:182
void test()
void testNormalization()
#define TEST_FAILED(x)
Definition: unit.hpp:176
ostream * os_
#define TEST_PROLOG(argc, argv)
Definition: unit.hpp:174

Variable Documentation

§ os_

ostream* os_ = 0

Definition at line 33 of file XMLWriterTest.cpp.

Referenced by main(), and test().

§ targetXML

const char* targetXML
Initial value:
=
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<root name1=\"value1\" name2=\"420\" name3=\"0.666\">\n"
" <record name=\"nixon\"\n"
" color=\"red\"\n"
" number=\"37\">\n"
" <quote>I'm not a crook.</quote>\n"
" <resigned/>\n"
" </record>\n"
" <record name=\"&quot;Penn &amp; Teller&quot;\">\n"
" <quote>'Bull&lt;shit!'</quote>\n"
" </record>\n"
" <record name=\"clinton\"\n"
" color=\"blue\"\n"
" number=\"42\">\n"
" <quote>I did <em>not</em> have sexual relations with that woman.</quote>\n"
" <impeached/>\n"
" </record>\n"
" <record name=\"bush\"\n"
" color=\"red\"\n"
" number=\"43\">\n"
" <quote>Mission accomplished.</quote>\n"
" </record>\n"
"</root>\n"

Definition at line 36 of file XMLWriterTest.cpp.

Referenced by test().