// TestValues.cpp : Test XML encoding and decoding of XmlRpcValues. #include <stdlib.h> #include "XmlRpcValue.h" #include <assert.h> #include <iostream> using namespace XmlRpc; void testBoolean() { XmlRpcValue booleanFalse(false); XmlRpcValue booleanTrue(true); int offset = 0; XmlRpcValue booleanFalseXml("<value><boolean>0</boolean></value>", &offset); offset = 0; XmlRpcValue booleanTrueXml("<value><boolean>1</boolean></value>", &offset); assert(booleanFalse != booleanTrue); assert(booleanFalse == booleanFalseXml); assert(booleanFalse != booleanTrueXml); if (bool(booleanFalse)) assert(false); if ( ! bool(booleanTrue)) assert(false); } // Int void testInt() { XmlRpcValue int0(0); XmlRpcValue int1(1); XmlRpcValue int10(10); XmlRpcValue int_1(-1); int offset = 0; XmlRpcValue int0Xml("<value><int>0</int></value>", &offset); offset = 0; XmlRpcValue int9Xml("<value><i4>9</i4></value>", &offset); assert(int0 == int0Xml); assert(int(int10) - int(int1) == int(int9Xml)); assert(9 == int(int9Xml)); assert(int(int10) + int(int_1) == int(int9Xml)); } void testDouble() { // Double XmlRpcValue d(43.7); int offset = 0; XmlRpcValue dXml("<value><double>56.3</double></value>", &offset); assert(double(d) + double(dXml) == 100.0); // questionable practice... } void testString() { // String XmlRpcValue s("Now is the time <&"); char csxml[] = "<value><string>Now is the time <&</string></value>"; std::string ssxml = csxml; int offset = 0; XmlRpcValue vscXml(csxml, &offset); offset = 0; XmlRpcValue vssXml(ssxml, &offset); assert(s == vscXml); assert(s == vssXml); offset = 0; XmlRpcValue fromXml(vssXml.toXml(), &offset); assert(s == fromXml); // Empty or blank strings with no <string> tags std::string emptyStringXml("<value></value>"); offset = 0; XmlRpcValue emptyStringVal1(emptyStringXml, &offset); XmlRpcValue emptyStringVal2(""); assert(emptyStringVal1 == emptyStringVal2); emptyStringXml = "<value> </value>"; offset = 0; XmlRpcValue blankStringVal(emptyStringXml, &offset); assert(std::string(blankStringVal) == " "); } void testDateTime() { // DateTime int offset = 0; XmlRpcValue dateTime("<value><dateTime.iso8601>19040101T03:12:35</dateTime.iso8601></value>", &offset); struct tm &t = dateTime; assert(t.tm_year == 1904 && t.tm_min == 12); } void testArray(XmlRpcValue const& d) { // Array XmlRpcValue a; a.setSize(4); a[0] = 1; a[1] = std::string("two"); a[2] = 43.7; a[3] = "four"; assert(int(a[0]) == 1); assert(a[2] == d); char csaXml[] = "<value><array>\n" " <data>\n" " <value><i4>1</i4></value> \n" " <value> <string>two</string></value>\n" " <value><double>43.7</double></value>\n" " <value>four</value>\n" " </data>\n" "</array></value>"; int offset = 0; XmlRpcValue aXml(csaXml, &offset); assert(a == aXml); } void testStruct() { // Struct XmlRpcValue struct1; struct1["i4"] = 1; struct1["str"] = "two"; struct1["d"] = 43.7; XmlRpcValue a; a.setSize(4); a[0] = 1; a[1] = std::string("two"); a[2] = 43.7; a[3] = "four"; assert(struct1["d"] == a[2]); char csStructXml[] = "<value><struct>\n" " <member>\n" " <name>i4</name> \n" " <value><i4>1</i4></value> \n" " </member>\n" " <member>\n" " <name>d</name> \n" " <value><double>43.7</double></value>\n" " </member>\n" " <member>\n" " <name>str</name> \n" " <value> <string>two</string></value>\n" " </member>\n" "</struct></value>"; int offset = 0; XmlRpcValue structXml(csStructXml, &offset); assert(struct1 == structXml); XmlRpcValue astruct; astruct["array"] = a; assert(astruct["array"][2] == struct1["d"]); for (int i=0; i<10; i++) { XmlRpcValue Event; Event["Name"] = "string"; Event.clear(); const int NELMTS = 100; int ii; for (ii=0; ii< NELMTS; ++ii) { char buf[40]; sprintf(buf,"%d", ii); Event[std::string(buf)] = buf; } Event.clear(); for (ii=0; ii< NELMTS; ++ii) { char buf[40]; sprintf(buf,"%d", ii); if (ii != NELMTS/2) Event[std::string(buf)] = ii; else for (int jj=0; jj< NELMTS; ++jj) { char bufj[40]; sprintf(bufj,"%d", jj); Event[std::string(buf)][std::string(bufj)] = bufj; } } for (ii=0; ii< NELMTS; ++ii) { char buf[40]; sprintf(buf,"%d", ii); if (ii != NELMTS/2) assert(Event[std::string(buf)] == XmlRpcValue(ii)); else assert(Event[std::string(buf)].size() == NELMTS); } } } int main(int argc, char* argv[]) { testBoolean(); testInt(); testDouble(); testString(); testDateTime(); testArray(43.7); testStruct(); return 0; }