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