1#include "XMLHandler.h"
2#include <stdio.h>
3#include <unistd.h>
4#include <fcntl.h>
5
6const char *const NS_MAP[] = {
7    "xml", XMLNS_XMLNS,
8    NULL, NULL
9};
10
11const XMLNamespaceMap NO_NAMESPACES(NS_MAP);
12
13char const*const EXPECTED_EXACT =
14       "<ASDF>\n"
15        "    <a id=\"system\" old-cl=\"1\" new-cl=\"43019\">\n"
16        "        <app dir=\"apps/common\" />\n"
17        "    </a>\n"
18        "    <a id=\"samples\" old-cl=\"1\" new-cl=\"43019\">asdf\n"
19        "        <app dir=\"samples/NotePad\" />\n"
20        "        <app dir=\"samples/LunarLander\" />\n"
21        "        <something>a<b>,</b>b </something>\n"
22        "        <exact xml:space=\"preserve\">a<b>,</b>b </exact>\n"
23        "    </a>\n"
24        "</ASDF>\n";
25
26char const*const EXPECTED_PRETTY =
27        "<ASDF>\n"
28        "  <a id=\"system\"\n"
29        "      old-cl=\"1\"\n"
30        "      new-cl=\"43019\">\n"
31        "    <app dir=\"apps/common\" />\n"
32        "  </a>\n"
33        "  <a id=\"samples\"\n"
34        "      old-cl=\"1\"\n"
35        "      new-cl=\"43019\">asdf\n"
36        "    <app dir=\"samples/NotePad\" />\n"
37        "    <app dir=\"samples/LunarLander\" />\n"
38        "    <something>a\n"
39        "      <b>,\n"
40        "      </b>b \n"
41        "    </something>\n"
42        "    <exact xml:space=\"preserve\">a<b>,</b>b </exact>\n"
43        "  </a>\n"
44        "</ASDF>\n";
45
46static string
47read_file(const string& filename)
48{
49    char buf[1024];
50    int fd = open(filename.c_str(), O_RDONLY);
51    if (fd < 0) {
52        return "";
53    }
54    string result;
55    while (true) {
56        ssize_t len = read(fd, buf, sizeof(buf)-1);
57        buf[len] = '\0';
58        if (len <= 0) {
59            break;
60        }
61        result.append(buf, len);
62    }
63    close(fd);
64    return result;
65}
66
67static int
68ParseFile_EXACT_test()
69{
70    XMLNode* root = NodeHandler::ParseFile("testdata/xml.xml", XMLNode::EXACT);
71    if (root == NULL) {
72        return 1;
73    }
74    string result = root->ToString(NO_NAMESPACES);
75    delete root;
76    //printf("[[%s]]\n", result.c_str());
77    return result == EXPECTED_EXACT;
78}
79
80static int
81ParseFile_PRETTY_test()
82{
83    XMLNode* root = NodeHandler::ParseFile("testdata/xml.xml", XMLNode::PRETTY);
84    if (root == NULL) {
85        return 1;
86    }
87    string result = root->ToString(NO_NAMESPACES);
88    delete root;
89    //printf("[[%s]]\n", result.c_str());
90    return result == EXPECTED_PRETTY;
91}
92
93static int
94ParseString_EXACT_test()
95{
96    string text = read_file("testdata/xml.xml");
97    XMLNode* root = NodeHandler::ParseString("testdata/xml.xml", text, XMLNode::EXACT);
98    if (root == NULL) {
99        return 1;
100    }
101    string result = root->ToString(NO_NAMESPACES);
102    delete root;
103    //printf("[[%s]]\n", result.c_str());
104    return result == EXPECTED_EXACT;
105}
106
107static int
108ParseString_PRETTY_test()
109{
110    string text = read_file("testdata/xml.xml");
111    XMLNode* root = NodeHandler::ParseString("testdata/xml.xml", text, XMLNode::PRETTY);
112    if (root == NULL) {
113        return 1;
114    }
115    string result = root->ToString(NO_NAMESPACES);
116    delete root;
117    //printf("[[%s]]\n", result.c_str());
118    return result == EXPECTED_PRETTY;
119}
120
121int
122XMLHandler_test()
123{
124    int err = 0;
125    bool all = true;
126
127    if (all) err |= ParseFile_EXACT_test();
128    if (all) err |= ParseFile_PRETTY_test();
129    if (all) err |= ParseString_EXACT_test();
130    if (all) err |= ParseString_PRETTY_test();
131
132    return err;
133}
134