1// TestValues.cpp : Test XML encoding and decoding of XmlRpcValues.
2
3#include <stdlib.h>
4
5#include "XmlRpcValue.h"
6
7
8#include <assert.h>
9#include <iostream>
10
11
12using namespace XmlRpc;
13
14
15void testBoolean()
16{
17  XmlRpcValue booleanFalse(false);
18  XmlRpcValue booleanTrue(true);
19  int offset = 0;
20  XmlRpcValue booleanFalseXml("<value><boolean>0</boolean></value>", &offset);
21  offset = 0;
22  XmlRpcValue booleanTrueXml("<value><boolean>1</boolean></value>", &offset);
23  assert(booleanFalse != booleanTrue);
24  assert(booleanFalse == booleanFalseXml);
25  assert(booleanFalse != booleanTrueXml);
26
27  if (bool(booleanFalse))
28    assert(false);
29
30  if ( ! bool(booleanTrue))
31    assert(false);
32}
33
34// Int
35void testInt()
36{
37  XmlRpcValue int0(0);
38  XmlRpcValue int1(1);
39  XmlRpcValue int10(10);
40  XmlRpcValue int_1(-1);
41  int offset = 0;
42  XmlRpcValue int0Xml("<value><int>0</int></value>", &offset);
43  offset = 0;
44  XmlRpcValue int9Xml("<value><i4>9</i4></value>", &offset);
45  assert(int0 == int0Xml);
46  assert(int(int10) - int(int1) == int(int9Xml));
47  assert(9 == int(int9Xml));
48  assert(int(int10) + int(int_1) == int(int9Xml));
49}
50
51void testDouble()
52{
53  // Double
54  XmlRpcValue d(43.7);
55  int offset = 0;
56  XmlRpcValue dXml("<value><double>56.3</double></value>", &offset);
57  assert(double(d) + double(dXml) == 100.0);  // questionable practice...
58}
59
60void testString()
61{
62  // String
63  XmlRpcValue s("Now is the time <&");
64  char csxml[] = "<value><string>Now is the time &lt;&amp;</string></value>";
65  std::string ssxml = csxml;
66  int offset = 0;
67  XmlRpcValue vscXml(csxml, &offset);
68  offset = 0;
69  XmlRpcValue vssXml(ssxml, &offset);
70  assert(s == vscXml);
71  assert(s == vssXml);
72  offset = 0;
73  XmlRpcValue fromXml(vssXml.toXml(), &offset);
74  assert(s == fromXml);
75
76  // Empty or blank strings with no <string> tags
77  std::string emptyStringXml("<value></value>");
78  offset = 0;
79  XmlRpcValue emptyStringVal1(emptyStringXml, &offset);
80  XmlRpcValue emptyStringVal2("");
81  assert(emptyStringVal1 == emptyStringVal2);
82
83  emptyStringXml = "<value>  </value>";
84  offset = 0;
85  XmlRpcValue blankStringVal(emptyStringXml, &offset);
86  assert(std::string(blankStringVal) == "  ");
87}
88
89
90void testDateTime()
91{
92  // DateTime
93  int offset = 0;
94  XmlRpcValue dateTime("<value><dateTime.iso8601>19040101T03:12:35</dateTime.iso8601></value>", &offset);
95  struct tm &t = dateTime;
96  assert(t.tm_year == 1904 && t.tm_min == 12);
97}
98
99
100void testArray(XmlRpcValue const& d)
101{
102  // Array
103  XmlRpcValue a;
104  a.setSize(4);
105  a[0] = 1;
106  a[1] = std::string("two");
107  a[2] = 43.7;
108  a[3] = "four";
109  assert(int(a[0]) == 1);
110  assert(a[2] == d);
111
112  char csaXml[] =
113    "<value><array>\n"
114    "  <data>\n"
115    "    <value><i4>1</i4></value> \n"
116    "    <value> <string>two</string></value>\n"
117    "    <value><double>43.7</double></value>\n"
118    "    <value>four</value>\n"
119    "  </data>\n"
120    "</array></value>";
121
122  int offset = 0;
123  XmlRpcValue aXml(csaXml, &offset);
124  assert(a == aXml);
125}
126
127void testStruct()
128{
129  // Struct
130  XmlRpcValue struct1;
131  struct1["i4"] = 1;
132  struct1["str"] = "two";
133  struct1["d"] = 43.7;
134
135  XmlRpcValue a;
136  a.setSize(4);
137  a[0] = 1;
138  a[1] = std::string("two");
139  a[2] = 43.7;
140  a[3] = "four";
141
142  assert(struct1["d"] == a[2]);
143
144  char csStructXml[] =
145    "<value><struct>\n"
146    "  <member>\n"
147    "    <name>i4</name> \n"
148    "    <value><i4>1</i4></value> \n"
149    "  </member>\n"
150    "  <member>\n"
151    "    <name>d</name> \n"
152    "    <value><double>43.7</double></value>\n"
153    "  </member>\n"
154    "  <member>\n"
155    "    <name>str</name> \n"
156    "    <value> <string>two</string></value>\n"
157    "  </member>\n"
158    "</struct></value>";
159
160  int offset = 0;
161  XmlRpcValue structXml(csStructXml, &offset);
162  assert(struct1 == structXml);
163
164  XmlRpcValue astruct;
165  astruct["array"] = a;
166  assert(astruct["array"][2] == struct1["d"]);
167
168  for (int i=0; i<10; i++) {
169    XmlRpcValue Event;
170    Event["Name"] = "string";
171
172    Event.clear();
173
174    const int NELMTS = 100;
175    int ii;
176
177    for (ii=0; ii< NELMTS; ++ii) {
178      char buf[40];
179      sprintf(buf,"%d", ii);
180      Event[std::string(buf)] = buf;
181    }
182
183    Event.clear();
184
185    for (ii=0; ii< NELMTS; ++ii) {
186      char buf[40];
187      sprintf(buf,"%d", ii);
188      if (ii != NELMTS/2)
189        Event[std::string(buf)] = ii;
190      else
191        for (int jj=0; jj< NELMTS; ++jj) {
192          char bufj[40];
193          sprintf(bufj,"%d", jj);
194          Event[std::string(buf)][std::string(bufj)] = bufj;
195        }
196    }
197
198    for (ii=0; ii< NELMTS; ++ii) {
199      char buf[40];
200      sprintf(buf,"%d", ii);
201      if (ii != NELMTS/2)
202        assert(Event[std::string(buf)] == XmlRpcValue(ii));
203      else
204        assert(Event[std::string(buf)].size() == NELMTS);
205    }
206  }
207}
208
209
210
211int main(int argc, char* argv[])
212{
213  testBoolean();
214
215  testInt();
216
217
218  testDouble();
219
220
221  testString();
222
223
224  testDateTime();
225
226
227  testArray(43.7);
228
229
230  testStruct();
231
232  return 0;
233}
234