| // 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; | |
| } |