/kissxml/DDXMLTesting.m

https://github.com/GunioRobot/iphone-dev-libraries · Objective C · 838 lines · 498 code · 231 blank · 109 comment · 25 complexity · 512df9b0997a9367fcf27ab5ff68eda7 MD5 · raw file

  1. #import "DDXMLTesting.h"
  2. #import "DDXML.h"
  3. @interface DDXMLTesting (Tests)
  4. + (void)setUp;
  5. + (void)tearDown;
  6. + (void)testLocalName;
  7. + (void)testPrefixName;
  8. + (void)testDoubleAdd;
  9. + (void)testNsGeneral;
  10. + (void)testNsLevel;
  11. + (void)testNsURI;
  12. + (void)testAttrGeneral;
  13. + (void)testAttrSiblings;
  14. + (void)testAttrDocOrder;
  15. + (void)testAttrChildren;
  16. + (void)testString;
  17. + (void)testPreviousNextNode;
  18. + (void)testPrefix;
  19. + (void)testURI;
  20. + (void)testXmlns;
  21. @end
  22. @implementation DDXMLTesting
  23. + (void)performTests
  24. {
  25. [self setUp];
  26. [self testLocalName];
  27. [self testPrefixName];
  28. [self testDoubleAdd];
  29. [self testNsGeneral];
  30. [self testNsLevel];
  31. [self testNsURI];
  32. [self testAttrGeneral];
  33. [self testAttrSiblings];
  34. [self testAttrDocOrder];
  35. [self testAttrChildren];
  36. [self testString];
  37. [self testPreviousNextNode];
  38. [self testPrefix];
  39. [self testURI];
  40. [self testXmlns];
  41. [self tearDown];
  42. }
  43. + (void)setUp
  44. {
  45. // Reserved for future use
  46. }
  47. + (void)tearDown
  48. {
  49. // Reserved for future use
  50. }
  51. + (void)testLocalName
  52. {
  53. NSLog(@"Starting %@...", NSStringFromSelector(_cmd));
  54. NSString *nsTest1 = [NSXMLNode localNameForName:@"a:quack"];
  55. NSString *ddTest1 = [DDXMLNode localNameForName:@"a:quack"];
  56. NSAssert([nsTest1 isEqualToString:ddTest1], @"Failed test 1");
  57. NSString *nsTest2 = [NSXMLNode localNameForName:@"a:a:quack"];
  58. NSString *ddTest2 = [DDXMLNode localNameForName:@"a:a:quack"];
  59. NSAssert([nsTest2 isEqualToString:ddTest2], @"Failed test 2");
  60. NSString *nsTest3 = [NSXMLNode localNameForName:@"quack"];
  61. NSString *ddTest3 = [DDXMLNode localNameForName:@"quack"];
  62. NSAssert([nsTest3 isEqualToString:ddTest3], @"Failed test 3");
  63. NSString *nsTest4 = [NSXMLNode localNameForName:@"a:"];
  64. NSString *ddTest4 = [DDXMLNode localNameForName:@"a:"];
  65. NSAssert([nsTest4 isEqualToString:ddTest4], @"Failed test 4");
  66. NSString *nsTest5 = [NSXMLNode localNameForName:nil];
  67. NSString *ddTest5 = [DDXMLNode localNameForName:nil];
  68. NSAssert(!nsTest5 && !ddTest5, @"Failed test 5");
  69. NSXMLNode *nsNode = [NSXMLNode namespaceWithName:@"tucker" stringValue:@"dog"];
  70. DDXMLNode *ddNode = [DDXMLNode namespaceWithName:@"tucker" stringValue:@"dog"];
  71. NSString *nsTest6 = [nsNode localName];
  72. NSString *ddTest6 = [ddNode localName];
  73. NSAssert([nsTest6 isEqualToString:ddTest6], @"Failed test 6");
  74. }
  75. + (void)testPrefixName
  76. {
  77. NSLog(@"Starting %@...", NSStringFromSelector(_cmd));
  78. NSString *nsTest1 = [NSXMLNode prefixForName:@"a:quack"];
  79. NSString *ddTest1 = [DDXMLNode prefixForName:@"a:quack"];
  80. NSAssert([nsTest1 isEqualToString:ddTest1], @"Failed test 1");
  81. NSString *nsTest2 = [NSXMLNode prefixForName:@"a:a:quack"];
  82. NSString *ddTest2 = [DDXMLNode prefixForName:@"a:a:quack"];
  83. NSAssert([nsTest2 isEqualToString:ddTest2], @"Failed test 2");
  84. NSString *nsTest3 = [NSXMLNode prefixForName:@"quack"];
  85. NSString *ddTest3 = [DDXMLNode prefixForName:@"quack"];
  86. NSAssert([nsTest3 isEqualToString:ddTest3], @"Failed test 3");
  87. NSString *nsTest4 = [NSXMLNode prefixForName:@"a:"];
  88. NSString *ddTest4 = [DDXMLNode prefixForName:@"a:"];
  89. NSAssert([nsTest4 isEqualToString:ddTest4], @"Failed test 4");
  90. NSString *nsTest5 = [NSXMLNode prefixForName:nil];
  91. NSString *ddTest5 = [DDXMLNode prefixForName:nil];
  92. NSAssert([nsTest5 isEqualToString:ddTest5], @"Failed test 5");
  93. NSXMLNode *nsNode = [NSXMLNode namespaceWithName:@"tucker" stringValue:@"dog"];
  94. DDXMLNode *ddNode = [DDXMLNode namespaceWithName:@"tucker" stringValue:@"dog"];
  95. NSString *nsTest6 = [nsNode prefix];
  96. NSString *ddTest6 = [ddNode prefix];
  97. NSAssert([nsTest6 isEqualToString:ddTest6], @"Failed test 6");
  98. }
  99. + (void)testDoubleAdd
  100. {
  101. NSLog(@"Starting %@...", NSStringFromSelector(_cmd));
  102. // NSXMLElement *nsRoot1 = [NSXMLElement elementWithName:@"root1"];
  103. // NSXMLElement *nsRoot2 = [NSXMLElement elementWithName:@"root2"];
  104. // NSXMLElement *nsNode = [NSXMLElement elementWithName:@"node"];
  105. // NSXMLNode *nsAttr = [NSXMLNode attributeWithName:@"key" stringValue:@"value"];
  106. // NSXMLNode *nsNs = [NSXMLNode namespaceWithName:@"a" stringValue:@"domain.com"];
  107. // [nsRoot1 addChild:nsAttr]; // Elements can only have text, elements, processing instructions, and comments as children
  108. // [nsRoot1 addAttribute:nsNode]; // Not an attribute
  109. // [nsRoot1 addNamespace:nsNode]; // Not a namespace
  110. // [nsRoot1 addChild:nsNode];
  111. // [nsRoot2 addChild:nsNode]; // Cannot add a child that has a parent; detach or copy first
  112. // [nsRoot1 addAttribute:nsAttr];
  113. // [nsRoot2 addAttribute:nsAttr]; // Cannot add an attribute with a parent; detach or copy first
  114. // [nsRoot1 addNamespace:nsNs];
  115. // [nsRoot2 addNamespace:nsNs]; // Cannot add a namespace with a parent; detach or copy first
  116. // DDXMLElement *ddRoot1 = [DDXMLElement elementWithName:@"root1"];
  117. // DDXMLElement *ddRoot2 = [DDXMLElement elementWithName:@"root2"];
  118. // DDXMLElement *ddNode = [DDXMLElement elementWithName:@"node"];
  119. // DDXMLNode *ddAttr = [DDXMLNode attributeWithName:@"key" stringValue:@"value"];
  120. // DDXMLNode *ddNs = [DDXMLNode namespaceWithName:@"a" stringValue:@"domain.com"];
  121. // [ddRoot1 addChild:ddAttr]; // Elements can only have text, elements, processing instructions, and comments as children
  122. // [ddRoot1 addAttribute:ddNode]; // Not an attribute
  123. // [ddRoot1 addNamespace:ddNode]; // Not a namespace
  124. // [ddRoot1 addChild:ddNode];
  125. // [ddRoot2 addChild:ddNode]; // Cannot add a child that has a parent; detach or copy first
  126. // [ddRoot1 addAttribute:ddAttr];
  127. // [ddRoot2 addAttribute:ddAttr]; // Cannot add an attribute with a parent; detach or copy first
  128. // [ddRoot1 addNamespace:ddNs];
  129. // [ddRoot2 addNamespace:ddNs]; // Cannot add a namespace with a parent; detach or copy first
  130. }
  131. + (void)testNsGeneral
  132. {
  133. NSLog(@"Starting %@...", NSStringFromSelector(_cmd));
  134. NSXMLNode *nsNs = [NSXMLNode namespaceWithName:@"a" stringValue:@"deusty.com"];
  135. DDXMLNode *ddNs = [DDXMLNode namespaceWithName:@"a" stringValue:@"deusty.com"];
  136. NSString *nsTest1 = [nsNs XMLString];
  137. NSString *ddTest1 = [ddNs XMLString];
  138. NSAssert([nsTest1 isEqualToString:ddTest1], @"Failed test 1");
  139. [nsNs setName:@"b"];
  140. [ddNs setName:@"b"];
  141. NSString *nsTest2 = [nsNs XMLString];
  142. NSString *ddTest2 = [ddNs XMLString];
  143. NSAssert([nsTest2 isEqualToString:ddTest2], @"Failed test 2");
  144. [nsNs setStringValue:@"robbiehanson.com"];
  145. [ddNs setStringValue:@"robbiehanson.com"];
  146. NSString *nsTest3 = [nsNs XMLString];
  147. NSString *ddTest3 = [ddNs XMLString];
  148. NSAssert([nsTest3 isEqualToString:ddTest3], @"Failed test 3");
  149. }
  150. + (void)testNsLevel
  151. {
  152. NSLog(@"Starting %@...", NSStringFromSelector(_cmd));
  153. // <root xmlns:a="apple.com">
  154. // <node xmlns:d="deusty.com" xmlns:rh="robbiehanson.com"/>
  155. // </root>
  156. NSXMLElement *nsRoot = [NSXMLElement elementWithName:@"root"];
  157. NSXMLElement *nsNode = [NSXMLElement elementWithName:@"node"];
  158. NSXMLNode *nsNs0 = [NSXMLNode namespaceWithName:@"a" stringValue:@"apple.com"];
  159. NSXMLNode *nsNs1 = [NSXMLNode namespaceWithName:@"d" stringValue:@"deusty.com"];
  160. NSXMLNode *nsNs2 = [NSXMLNode namespaceWithName:@"rh" stringValue:@"robbiehanson.com"];
  161. [nsNode addNamespace:nsNs1];
  162. [nsNode addNamespace:nsNs2];
  163. [nsRoot addNamespace:nsNs0];
  164. [nsRoot addChild:nsNode];
  165. DDXMLElement *ddRoot = [DDXMLElement elementWithName:@"root"];
  166. DDXMLElement *ddNode = [DDXMLElement elementWithName:@"node"];
  167. DDXMLNode *ddNs0 = [DDXMLNode namespaceWithName:@"a" stringValue:@"apple.com"];
  168. DDXMLNode *ddNs1 = [DDXMLNode namespaceWithName:@"d" stringValue:@"deusty.com"];
  169. DDXMLNode *ddNs2 = [DDXMLNode namespaceWithName:@"rh" stringValue:@"robbiehanson.com"];
  170. [ddNode addNamespace:ddNs1];
  171. [ddNode addNamespace:ddNs2];
  172. [ddRoot addNamespace:ddNs0];
  173. [ddRoot addChild:ddNode];
  174. NSAssert([nsNs0 index] == [ddNs0 index], @"Failed test 1");
  175. NSAssert([nsNs1 index] == [ddNs1 index], @"Failed test 2");
  176. NSAssert([nsNs2 index] == [ddNs2 index], @"Failed test 3");
  177. NSAssert([nsNs0 level] == [ddNs0 level], @"Failed test 4");
  178. NSAssert([nsNs1 level] == [ddNs1 level], @"Failed test 5");
  179. NSAssert([nsNs2 level] == [ddNs2 level], @"Failed test 6");
  180. }
  181. + (void)testNsURI
  182. {
  183. NSLog(@"Starting %@...", NSStringFromSelector(_cmd));
  184. NSXMLElement *nsNode = [NSXMLElement elementWithName:@"duck" URI:@"quack.com"];
  185. DDXMLElement *ddNode = [DDXMLElement elementWithName:@"duck" URI:@"quack.com"];
  186. NSString *nsTest1 = [nsNode URI];
  187. NSString *ddTest1 = [ddNode URI];
  188. NSAssert([nsTest1 isEqualToString:ddTest1], @"Failed test 1");
  189. NSXMLElement *nsAttr = [NSXMLElement attributeWithName:@"duck" URI:@"quack.com" stringValue:@"quack"];
  190. DDXMLElement *ddAttr = [DDXMLElement attributeWithName:@"duck" URI:@"quack.com" stringValue:@"quack"];
  191. NSString *nsTest2 = [nsAttr URI];
  192. NSString *ddTest2 = [ddAttr URI];
  193. NSAssert([nsTest2 isEqualToString:ddTest2], @"Failed test 2");
  194. }
  195. + (void)testAttrGeneral
  196. {
  197. NSLog(@"Starting %@...", NSStringFromSelector(_cmd));
  198. NSXMLNode *nsAttr = [NSXMLNode attributeWithName:@"apple" stringValue:@"inc"];
  199. DDXMLNode *ddAttr = [DDXMLNode attributeWithName:@"apple" stringValue:@"inc"];
  200. NSString *nsStr1 = [nsAttr XMLString];
  201. NSString *ddStr1 = [ddAttr XMLString];
  202. NSAssert([nsStr1 isEqualToString:ddStr1], @"Failed test 1");
  203. [nsAttr setName:@"deusty"];
  204. [ddAttr setName:@"deusty"];
  205. NSString *nsStr2 = [nsAttr XMLString];
  206. NSString *ddStr2 = [ddAttr XMLString];
  207. NSAssert([nsStr2 isEqualToString:ddStr2], @"Failed test 2");
  208. [nsAttr setStringValue:@"designs"];
  209. [ddAttr setStringValue:@"designs"];
  210. NSString *nsStr3 = [nsAttr XMLString];
  211. NSString *ddStr3 = [ddAttr XMLString];
  212. NSAssert([nsStr3 isEqualToString:ddStr3], @"Failed test 3");
  213. }
  214. + (void)testAttrSiblings
  215. {
  216. NSLog(@"Starting %@...", NSStringFromSelector(_cmd));
  217. // <duck sound="quack" swims="YES" flys="YES"/>
  218. NSXMLElement *nsNode = [NSXMLElement elementWithName:@"duck"];
  219. [nsNode addAttribute:[NSXMLNode attributeWithName:@"sound" stringValue:@"quack"]];
  220. [nsNode addAttribute:[NSXMLNode attributeWithName:@"swims" stringValue:@"YES"]];
  221. [nsNode addAttribute:[NSXMLNode attributeWithName:@"flys" stringValue:@"YES"]];
  222. DDXMLElement *ddNode = [DDXMLElement elementWithName:@"duck"];
  223. [ddNode addAttribute:[DDXMLNode attributeWithName:@"sound" stringValue:@"quack"]];
  224. [ddNode addAttribute:[DDXMLNode attributeWithName:@"swims" stringValue:@"YES"]];
  225. [ddNode addAttribute:[DDXMLNode attributeWithName:@"flys" stringValue:@"YES"]];
  226. NSXMLNode *nsAttr = [nsNode attributeForName:@"swims"];
  227. DDXMLNode *ddAttr = [ddNode attributeForName:@"swims"];
  228. NSString *nsTest1 = [nsAttr XMLString];
  229. NSString *ddTest1 = [ddAttr XMLString];
  230. NSAssert([nsTest1 isEqualToString:ddTest1], @"Failed test 1");
  231. // NSLog(@"nsAttr prev: %@", [[nsAttr previousSibling] XMLString]);
  232. // NSLog(@"nsAttr next: %@", [[nsAttr nextSibling] XMLString]);
  233. //
  234. // NSLog(@"ddAttr prev: %@", [[ddAttr previousSibling] XMLString]);
  235. // NSLog(@"ddAttr next: %@", [[ddAttr nextSibling] XMLString]);
  236. //
  237. // Analysis: Ours works and theirs doesn't. I see no need to cripple ours because of that.
  238. }
  239. + (void)testAttrDocOrder
  240. {
  241. NSLog(@"Starting %@...", NSStringFromSelector(_cmd));
  242. // <duck sound="quack" swims="YES" flys="YES"/>
  243. NSXMLElement *nsNode = [NSXMLElement elementWithName:@"duck"];
  244. [nsNode addAttribute:[NSXMLNode attributeWithName:@"sound" stringValue:@"quack"]];
  245. [nsNode addAttribute:[NSXMLNode attributeWithName:@"swims" stringValue:@"YES"]];
  246. [nsNode addAttribute:[NSXMLNode attributeWithName:@"flys" stringValue:@"YES"]];
  247. DDXMLElement *ddNode = [DDXMLElement elementWithName:@"duck"];
  248. [ddNode addAttribute:[DDXMLNode attributeWithName:@"sound" stringValue:@"quack"]];
  249. [ddNode addAttribute:[DDXMLNode attributeWithName:@"swims" stringValue:@"YES"]];
  250. [ddNode addAttribute:[DDXMLNode attributeWithName:@"flys" stringValue:@"YES"]];
  251. NSXMLNode *nsAttr = [nsNode attributeForName:@"swims"];
  252. DDXMLNode *ddAttr = [ddNode attributeForName:@"swims"];
  253. NSXMLNode *nsTest1 = [nsAttr previousNode];
  254. DDXMLNode *ddTest1 = [ddAttr previousNode];
  255. NSAssert((!nsTest1 && !ddTest1), @"Failed test 1");
  256. NSXMLNode *nsTest2 = [nsAttr nextNode];
  257. DDXMLNode *ddTest2 = [ddAttr nextNode];
  258. NSAssert((!nsTest2 && !ddTest2), @"Failed test 2");
  259. // Notes: Attributes play no part in the document order.
  260. }
  261. + (void)testAttrChildren
  262. {
  263. NSLog(@"Starting %@...", NSStringFromSelector(_cmd));
  264. NSXMLNode *nsAttr1 = [NSXMLNode attributeWithName:@"deusty" stringValue:@"designs"];
  265. DDXMLNode *ddAttr1 = [DDXMLNode attributeWithName:@"deusty" stringValue:@"designs"];
  266. NSXMLNode *nsTest1 = [nsAttr1 childAtIndex:0];
  267. DDXMLNode *ddTest1 = [ddAttr1 childAtIndex:0];
  268. NSAssert((!nsTest1 && !ddTest1), @"Failed test 1");
  269. NSUInteger nsTest2 = [nsAttr1 childCount];
  270. NSUInteger ddTest2 = [ddAttr1 childCount];
  271. NSAssert((nsTest2 == ddTest2), @"Failed test 2");
  272. NSArray *nsTest3 = [nsAttr1 children];
  273. NSArray *ddTest3 = [ddAttr1 children];
  274. NSAssert((!nsTest3 && !ddTest3), @"Failed test 3");
  275. // Notes: Attributes aren't supposed to have children, although in libxml they technically do.
  276. // The child is simply a pointer to a text node, which contains the attribute value.
  277. }
  278. + (void)testString
  279. {
  280. NSLog(@"Starting %@...", NSStringFromSelector(_cmd));
  281. // <pizza>
  282. // <toppings>
  283. // <pepperoni/>
  284. // <sausage>
  285. // <mild/>
  286. // <spicy/>
  287. // </sausage>
  288. // </toppings>
  289. // <crust>
  290. // <thin/>
  291. // <thick/>
  292. // </crust>
  293. // </pizza>
  294. NSXMLElement *nsNode0 = [NSXMLElement elementWithName:@"pizza"];
  295. NSXMLElement *nsNode1 = [NSXMLElement elementWithName:@"toppings"];
  296. NSXMLElement *nsNode2 = [NSXMLElement elementWithName:@"pepperoni"];
  297. NSXMLElement *nsNode3 = [NSXMLElement elementWithName:@"sausage"];
  298. NSXMLElement *nsNode4 = [NSXMLElement elementWithName:@"mild"];
  299. NSXMLElement *nsNode5 = [NSXMLElement elementWithName:@"spicy"];
  300. NSXMLElement *nsNode6 = [NSXMLElement elementWithName:@"crust"];
  301. NSXMLElement *nsNode7 = [NSXMLElement elementWithName:@"thin"];
  302. NSXMLElement *nsNode8 = [NSXMLElement elementWithName:@"thick"];
  303. [nsNode0 addChild:nsNode1];
  304. [nsNode0 addChild:nsNode6];
  305. [nsNode1 addChild:nsNode2];
  306. [nsNode1 addChild:nsNode3];
  307. [nsNode3 addChild:nsNode4];
  308. [nsNode3 addChild:nsNode5];
  309. [nsNode6 addChild:nsNode7];
  310. [nsNode6 addChild:nsNode8];
  311. DDXMLElement *ddNode0 = [DDXMLElement elementWithName:@"pizza"];
  312. DDXMLElement *ddNode1 = [DDXMLElement elementWithName:@"toppings"];
  313. DDXMLElement *ddNode2 = [DDXMLElement elementWithName:@"pepperoni"];
  314. DDXMLElement *ddNode3 = [DDXMLElement elementWithName:@"sausage"];
  315. DDXMLElement *ddNode4 = [DDXMLElement elementWithName:@"mild"];
  316. DDXMLElement *ddNode5 = [DDXMLElement elementWithName:@"spicy"];
  317. DDXMLElement *ddNode6 = [DDXMLElement elementWithName:@"crust"];
  318. DDXMLElement *ddNode7 = [DDXMLElement elementWithName:@"thin"];
  319. DDXMLElement *ddNode8 = [DDXMLElement elementWithName:@"thick"];
  320. [ddNode0 addChild:ddNode1];
  321. [ddNode0 addChild:ddNode6];
  322. [ddNode1 addChild:ddNode2];
  323. [ddNode1 addChild:ddNode3];
  324. [ddNode3 addChild:ddNode4];
  325. [ddNode3 addChild:ddNode5];
  326. [ddNode6 addChild:ddNode7];
  327. [ddNode6 addChild:ddNode8];
  328. NSXMLNode *nsAttr1 = [NSXMLNode attributeWithName:@"price" stringValue:@"1.00"];
  329. DDXMLNode *ddAttr1 = [DDXMLNode attributeWithName:@"price" stringValue:@"1.00"];
  330. [nsNode1 addAttribute:nsAttr1];
  331. [ddNode1 addAttribute:ddAttr1];
  332. [nsNode4 setStringValue:@"<just right>"];
  333. [ddNode4 setStringValue:@"<just right>"];
  334. [nsNode5 setStringValue:@"too hot"];
  335. [ddNode5 setStringValue:@"too hot"];
  336. NSString *nsTest1 = [nsNode0 stringValue]; // Returns "<just right>too hot"
  337. NSString *ddTest1 = [ddNode0 stringValue];
  338. NSAssert([nsTest1 isEqualToString:ddTest1], @"Failed test 1");
  339. NSString *nsTest2 = [nsAttr1 stringValue]; // Returns "1.00"
  340. NSString *ddTest2 = [ddAttr1 stringValue];
  341. NSAssert([nsTest2 isEqualToString:ddTest2], @"Failed test 2");
  342. [nsAttr1 setStringValue:@"1.25"];
  343. [ddAttr1 setStringValue:@"1.25"];
  344. NSString *nsTest3 = [nsAttr1 stringValue]; // Returns "1.25"
  345. NSString *ddTest3 = [ddAttr1 stringValue];
  346. NSAssert([nsTest3 isEqualToString:ddTest3], @"Failed test 3");
  347. [nsNode0 setStringValue:@"<wtf>ESCAPE</wtf>"];
  348. [ddNode0 setStringValue:@"<wtf>ESCAPE</wtf>"];
  349. NSString *nsTest4 = [nsNode0 stringValue]; // Returns "<wtf>ESCAPE</wtf>"
  350. NSString *ddTest4 = [ddNode0 stringValue];
  351. NSAssert([nsTest4 isEqualToString:ddTest4], @"Failed test 4");
  352. // NSString *nsTest5 = [nsNode0 XMLString]; // Returns "<pizza>&lt;wtf>ESCAPE&lt;/wtf></pizza>"
  353. // NSString *ddTest5 = [ddNode0 XMLString]; // Returns "<pizza>&lt;wtf&gt;ESCAPE&lt;/wtf&gt;</pizza>"
  354. //
  355. // NSAssert([nsTest5 isEqualToString:ddTest5], @"Failed test 5");
  356. //
  357. // The DDXML version is actually more accurate, so we'll accept the difference.
  358. }
  359. + (void)testPreviousNextNode
  360. {
  361. NSLog(@"Starting %@...", NSStringFromSelector(_cmd));
  362. // <pizza>
  363. // <toppings>
  364. // <pepperoni/>
  365. // <sausage>
  366. // <mild/>
  367. // <spicy/>
  368. // </sausage>
  369. // </toppings>
  370. // <crust>
  371. // <thin/>
  372. // <thick/>
  373. // </crust>
  374. // </pizza>
  375. NSXMLElement *nsNode0 = [NSXMLElement elementWithName:@"pizza"];
  376. NSXMLElement *nsNode1 = [NSXMLElement elementWithName:@"toppings"];
  377. NSXMLElement *nsNode2 = [NSXMLElement elementWithName:@"pepperoni"];
  378. NSXMLElement *nsNode3 = [NSXMLElement elementWithName:@"sausage"];
  379. NSXMLElement *nsNode4 = [NSXMLElement elementWithName:@"mild"];
  380. NSXMLElement *nsNode5 = [NSXMLElement elementWithName:@"spicy"];
  381. NSXMLElement *nsNode6 = [NSXMLElement elementWithName:@"crust"];
  382. NSXMLElement *nsNode7 = [NSXMLElement elementWithName:@"thin"];
  383. NSXMLElement *nsNode8 = [NSXMLElement elementWithName:@"thick"];
  384. [nsNode0 addChild:nsNode1];
  385. [nsNode0 addChild:nsNode6];
  386. [nsNode1 addChild:nsNode2];
  387. [nsNode1 addChild:nsNode3];
  388. [nsNode3 addChild:nsNode4];
  389. [nsNode3 addChild:nsNode5];
  390. [nsNode6 addChild:nsNode7];
  391. [nsNode6 addChild:nsNode8];
  392. DDXMLElement *ddNode0 = [DDXMLElement elementWithName:@"pizza"];
  393. DDXMLElement *ddNode1 = [DDXMLElement elementWithName:@"toppings"];
  394. DDXMLElement *ddNode2 = [DDXMLElement elementWithName:@"pepperoni"];
  395. DDXMLElement *ddNode3 = [DDXMLElement elementWithName:@"sausage"];
  396. DDXMLElement *ddNode4 = [DDXMLElement elementWithName:@"mild"];
  397. DDXMLElement *ddNode5 = [DDXMLElement elementWithName:@"spicy"];
  398. DDXMLElement *ddNode6 = [DDXMLElement elementWithName:@"crust"];
  399. DDXMLElement *ddNode7 = [DDXMLElement elementWithName:@"thin"];
  400. DDXMLElement *ddNode8 = [DDXMLElement elementWithName:@"thick"];
  401. [ddNode0 addChild:ddNode1];
  402. [ddNode0 addChild:ddNode6];
  403. [ddNode1 addChild:ddNode2];
  404. [ddNode1 addChild:ddNode3];
  405. [ddNode3 addChild:ddNode4];
  406. [ddNode3 addChild:ddNode5];
  407. [ddNode6 addChild:ddNode7];
  408. [ddNode6 addChild:ddNode8];
  409. NSString *nsTest1 = [[nsNode2 nextNode] name];
  410. NSString *ddTest1 = [[ddNode2 nextNode] name];
  411. NSAssert2([nsTest1 isEqualToString:ddTest1], @"Failed test 1: ns(%@) dd(%@)", nsTest1, ddTest1);
  412. NSString *nsTest2 = [[nsNode3 nextNode] name];
  413. NSString *ddTest2 = [[ddNode3 nextNode] name];
  414. NSAssert2([nsTest2 isEqualToString:ddTest2], @"Failed test 2: ns(%@) dd(%@)", nsTest2, ddTest2);
  415. NSString *nsTest3 = [[nsNode5 nextNode] name];
  416. NSString *ddTest3 = [[ddNode5 nextNode] name];
  417. NSAssert2([nsTest3 isEqualToString:ddTest3], @"Failed test 3: ns(%@) dd(%@)", nsTest3, ddTest3);
  418. NSString *nsTest4 = [[nsNode5 previousNode] name];
  419. NSString *ddTest4 = [[ddNode5 previousNode] name];
  420. NSAssert2([nsTest4 isEqualToString:ddTest4], @"Failed test 4: ns(%@) dd(%@)", nsTest4, ddTest4);
  421. NSString *nsTest5 = [[nsNode6 previousNode] name];
  422. NSString *ddTest5 = [[ddNode6 previousNode] name];
  423. NSAssert2([nsTest5 isEqualToString:ddTest5], @"Failed test 5: ns(%@) dd(%@)", nsTest5, ddTest5);
  424. NSString *nsTest6 = [[nsNode8 nextNode] name];
  425. NSString *ddTest6 = [[ddNode8 nextNode] name];
  426. NSAssert2((!nsTest6 && !ddTest6), @"Failed test 6: ns(%@) dd(%@)", nsTest6, ddTest6);
  427. NSString *nsTest7 = [[nsNode0 previousNode] name];
  428. NSString *ddTest7 = [[ddNode0 previousNode] name];
  429. NSAssert2((!nsTest7 && !ddTest7), @"Failed test 7: ns(%@) dd(%@)", nsTest7, ddTest7);
  430. }
  431. + (void)testPrefix
  432. {
  433. NSLog(@"Starting %@...", NSStringFromSelector(_cmd));
  434. // <root xmlns:a="beagle" xmlns:b="lab">
  435. // <dog/>
  436. // <a:dog/>
  437. // <a:b:dog/>
  438. // <dog xmlns="beagle"/>
  439. // </root>
  440. NSXMLElement *nsNode1 = [NSXMLElement elementWithName:@"dog"];
  441. NSXMLElement *nsNode2 = [NSXMLElement elementWithName:@"a:dog"];
  442. NSXMLElement *nsNode3 = [NSXMLElement elementWithName:@"a:b:dog"];
  443. NSXMLElement *nsNode4 = [NSXMLElement elementWithName:@"dog" URI:@"beagle"];
  444. DDXMLElement *ddNode1 = [DDXMLElement elementWithName:@"dog"];
  445. DDXMLElement *ddNode2 = [DDXMLElement elementWithName:@"a:dog"];
  446. DDXMLElement *ddNode3 = [DDXMLElement elementWithName:@"a:b:dog"];
  447. DDXMLElement *ddNode4 = [DDXMLElement elementWithName:@"dog" URI:@"beagle"];
  448. NSString *nsTest1 = [nsNode1 prefix];
  449. NSString *ddTest1 = [ddNode1 prefix];
  450. NSAssert([nsTest1 isEqualToString:ddTest1], @"Failed test 1");
  451. NSString *nsTest2 = [nsNode2 prefix];
  452. NSString *ddTest2 = [ddNode2 prefix];
  453. NSAssert([nsTest2 isEqualToString:ddTest2], @"Failed test 2");
  454. NSString *nsTest3 = [nsNode3 prefix];
  455. NSString *ddTest3 = [ddNode3 prefix];
  456. NSAssert([nsTest3 isEqualToString:ddTest3], @"Failed test 3");
  457. NSString *nsTest4 = [nsNode4 prefix];
  458. NSString *ddTest4 = [ddNode4 prefix];
  459. NSAssert([nsTest4 isEqualToString:ddTest4], @"Failed test 4");
  460. }
  461. + (void)testURI
  462. {
  463. NSLog(@"Starting %@...", NSStringFromSelector(_cmd));
  464. // <root xmlns:a="deusty.com" xmlns:b="robbiehanson.com">
  465. // <test test="1"/>
  466. // <a:test test="2"/>
  467. // <b:test test="3"/>
  468. // <test xmlns="deusty.com" test="4"/>
  469. // <test xmlns="quack.com" test="5"/>
  470. // </root>
  471. NSXMLElement *nsRoot = [NSXMLElement elementWithName:@"root"];
  472. [nsRoot addNamespace:[NSXMLNode namespaceWithName:@"a" stringValue:@"deusty.com"]];
  473. [nsRoot addNamespace:[NSXMLNode namespaceWithName:@"b" stringValue:@"robbiehanson.com"]];
  474. NSXMLElement *nsNode1 = [NSXMLElement elementWithName:@"test"];
  475. [nsNode1 addAttribute:[NSXMLNode attributeWithName:@"test" stringValue:@"1"]];
  476. NSXMLElement *nsNode2 = [NSXMLElement elementWithName:@"a:test"];
  477. [nsNode2 addAttribute:[NSXMLNode attributeWithName:@"test" stringValue:@"2"]];
  478. NSXMLElement *nsNode3 = [NSXMLElement elementWithName:@"b:test"];
  479. [nsNode3 addAttribute:[NSXMLNode attributeWithName:@"test" stringValue:@"3"]];
  480. NSXMLElement *nsNode4 = [NSXMLElement elementWithName:@"test" URI:@"deusty.com"];
  481. [nsNode4 addAttribute:[NSXMLNode attributeWithName:@"test" stringValue:@"4"]];
  482. NSXMLElement *nsNode5 = [NSXMLElement elementWithName:@"test" URI:@"quack.com"];
  483. [nsNode5 addAttribute:[NSXMLNode attributeWithName:@"test" stringValue:@"5"]];
  484. [nsRoot addChild:nsNode1];
  485. [nsRoot addChild:nsNode2];
  486. [nsRoot addChild:nsNode3];
  487. [nsRoot addChild:nsNode4];
  488. [nsRoot addChild:nsNode5];
  489. DDXMLElement *ddRoot = [DDXMLElement elementWithName:@"root"];
  490. [ddRoot addNamespace:[DDXMLNode namespaceWithName:@"a" stringValue:@"deusty.com"]];
  491. [ddRoot addNamespace:[DDXMLNode namespaceWithName:@"b" stringValue:@"robbiehanson.com"]];
  492. DDXMLElement *ddNode1 = [DDXMLElement elementWithName:@"test"];
  493. [ddNode1 addAttribute:[DDXMLNode attributeWithName:@"test" stringValue:@"1"]];
  494. DDXMLElement *ddNode2 = [DDXMLElement elementWithName:@"a:test"];
  495. [ddNode2 addAttribute:[DDXMLNode attributeWithName:@"test" stringValue:@"2"]];
  496. DDXMLElement *ddNode3 = [DDXMLElement elementWithName:@"b:test"];
  497. [ddNode3 addAttribute:[DDXMLNode attributeWithName:@"test" stringValue:@"3"]];
  498. DDXMLElement *ddNode4 = [DDXMLElement elementWithName:@"test" URI:@"deusty.com"];
  499. [ddNode4 addAttribute:[DDXMLNode attributeWithName:@"test" stringValue:@"4"]];
  500. DDXMLElement *ddNode5 = [DDXMLElement elementWithName:@"test" URI:@"quack.com"];
  501. [ddNode5 addAttribute:[DDXMLNode attributeWithName:@"test" stringValue:@"5"]];
  502. [ddRoot addChild:ddNode1];
  503. [ddRoot addChild:ddNode2];
  504. [ddRoot addChild:ddNode3];
  505. [ddRoot addChild:ddNode4];
  506. [ddRoot addChild:ddNode5];
  507. NSString *nsTest1 = [[nsNode1 resolveNamespaceForName:[nsNode1 name]] stringValue];
  508. NSString *ddTest1 = [[ddNode1 resolveNamespaceForName:[ddNode1 name]] stringValue];
  509. NSAssert(!nsTest1 && !ddTest1, @"Failed test 1");
  510. NSString *nsTest2 = [[nsNode2 resolveNamespaceForName:[nsNode2 name]] stringValue];
  511. NSString *ddTest2 = [[ddNode2 resolveNamespaceForName:[ddNode2 name]] stringValue];
  512. NSAssert2([nsTest2 isEqualToString:ddTest2], @"Failed test 2: ns(%@) dd(%@)", nsTest2, ddTest2);
  513. NSString *nsTest3 = [[nsNode3 resolveNamespaceForName:[nsNode3 name]] stringValue];
  514. NSString *ddTest3 = [[ddNode3 resolveNamespaceForName:[ddNode3 name]] stringValue];
  515. NSAssert([nsTest3 isEqualToString:ddTest3], @"Failed test 3");
  516. NSString *nsTest4 = [[nsNode4 resolveNamespaceForName:[nsNode4 name]] stringValue];
  517. NSString *ddTest4 = [[ddNode4 resolveNamespaceForName:[ddNode4 name]] stringValue];
  518. NSAssert2(!nsTest4 && !ddTest4, @"Failed test 4: ns(%@) dd(%@)", nsTest4, ddTest4);
  519. NSString *nsTest5 = [nsNode4 resolvePrefixForNamespaceURI:@"deusty.com"];
  520. NSString *ddTest5 = [ddNode4 resolvePrefixForNamespaceURI:@"deusty.com"];
  521. NSAssert2([nsTest5 isEqualToString:ddTest5], @"Failed test 5: ns(%@) dd(%@)", nsTest5, ddTest5);
  522. NSString *nsTest6 = [nsNode4 resolvePrefixForNamespaceURI:@"robbiehanson.com"];
  523. NSString *ddTest6 = [ddNode4 resolvePrefixForNamespaceURI:@"robbiehanson.com"];
  524. NSAssert([nsTest6 isEqualToString:ddTest6], @"Failed test 6");
  525. NSString *nsTest7 = [nsNode4 resolvePrefixForNamespaceURI:@"quack.com"];
  526. NSString *ddTest7 = [ddNode4 resolvePrefixForNamespaceURI:@"quack.com"];
  527. NSAssert(!nsTest7 && !ddTest7, @"Failed test 7");
  528. NSString *nsTest8 = [nsNode4 resolvePrefixForNamespaceURI:nil];
  529. NSString *ddTest8 = [ddNode4 resolvePrefixForNamespaceURI:nil];
  530. NSAssert(!nsTest8 && !ddTest8, @"Failed test 8");
  531. NSUInteger nsTest9 = [[nsRoot elementsForName:@"test"] count]; // Returns test1, test4, test5
  532. NSUInteger ddTest9 = [[ddRoot elementsForName:@"test"] count]; // Returns test1, test4, test5
  533. NSAssert(nsTest9 == ddTest9, @"Failed test 9");
  534. NSUInteger nsTest10 = [[nsRoot elementsForName:@"a:test"] count]; // Returns node2 and node4
  535. NSUInteger ddTest10 = [[ddRoot elementsForName:@"a:test"] count]; // Returns node2 and node4
  536. NSAssert(nsTest10 == ddTest10, @"Failed test 10");
  537. NSUInteger nsTest11 = [[nsRoot elementsForLocalName:@"test" URI:@"deusty.com"] count]; // Returns node2 and node4
  538. NSUInteger ddTest11 = [[ddRoot elementsForLocalName:@"test" URI:@"deusty.com"] count]; // Returns node2 and node4
  539. NSAssert(nsTest11 == ddTest11, @"Failed test 11");
  540. NSUInteger nsTest12 = [[nsRoot elementsForLocalName:@"a:test" URI:@"deusty.com"] count]; // Returns nothing
  541. NSUInteger ddTest12 = [[ddRoot elementsForLocalName:@"a:test" URI:@"deusty.com"] count]; // Returns nothing
  542. NSAssert(nsTest12 == ddTest12, @"Failed test 12");
  543. NSUInteger nsTest13 = [[nsRoot elementsForLocalName:@"test" URI:@"quack.com"] count]; // Returns node5
  544. NSUInteger ddTest13 = [[ddRoot elementsForLocalName:@"test" URI:@"quack.com"] count]; // Returns node5
  545. NSAssert(nsTest13 == ddTest13, @"Failed test 13");
  546. }
  547. + (void)testXmlns
  548. {
  549. NSLog(@"Starting %@...", NSStringFromSelector(_cmd));
  550. NSString *parseMe = @"<query xmlns=\"jabber:iq:roster\"></query>";
  551. NSData *data = [parseMe dataUsingEncoding:NSUTF8StringEncoding];
  552. NSXMLDocument *nsDoc = [[NSXMLDocument alloc] initWithData:data options:0 error:nil];
  553. NSXMLElement *nsRootElement = [nsDoc rootElement];
  554. DDXMLDocument *ddDoc = [[DDXMLDocument alloc] initWithData:data options:0 error:nil];
  555. DDXMLElement *ddRootElement = [ddDoc rootElement];
  556. // Both URI and namespaceForPrefix:@"" should return "jabber:iq:roster"
  557. NSString *nsTest1 = [nsRootElement URI];
  558. NSString *ddTest1 = [ddRootElement URI];
  559. NSAssert([nsTest1 isEqualToString:ddTest1], @"Failed test 1");
  560. NSString *nsTest2 = [[nsRootElement namespaceForPrefix:@""] stringValue];
  561. NSString *ddTest2 = [[ddRootElement namespaceForPrefix:@""] stringValue];
  562. NSAssert([nsTest2 isEqualToString:ddTest2], @"Failed test 2");
  563. // In NSXML namespaceForPrefix:nil returns nil
  564. // In DDXML namespaceForPrefix:nil returns the same as namespaceForPrefix:@""
  565. //
  566. // This actually makes more sense, as many users would consider a prefix of nil or an empty string to be the same.
  567. // Plus many XML documents state that a prefix of nil or "" should be treated equally.
  568. //
  569. // This difference comes into play in other areas.
  570. //
  571. // In NSXML creating a namespace with prefix:nil doesn't work.
  572. // In DDXML creating a namespace with prefix:nil acts as if you had passed an empty string.
  573. NSUInteger nsTest3 = [[nsRootElement namespaces] count];
  574. NSUInteger ddTest3 = [[ddRootElement namespaces] count];
  575. NSAssert(nsTest3 == ddTest3, @"Failed test 3");
  576. // An odd quirk of NSXML is that if the data is parsed, then the namespaces array contains the default namespace.
  577. // However, if the XML tree is generated in code, and the default namespace was set via setting the URI,
  578. // then the namespaces array doesn't contain that default namespace.
  579. // If instead the addNamespace method is used to add the default namespace, then it is contained in the array,
  580. // and the URI is also properly set.
  581. //
  582. // I consider this to be a bug in NSXML.
  583. NSString *nsTest4 = [[nsRootElement resolveNamespaceForName:@""] stringValue];
  584. NSString *ddTest4 = [[ddRootElement resolveNamespaceForName:@""] stringValue];
  585. NSAssert([nsTest4 isEqualToString:ddTest4], @"Failed test 4");
  586. // Oddly enough, even though NSXML seems completely resistant to nil namespace prefixes, this works fine
  587. NSString *nsTest5 = [[nsRootElement resolveNamespaceForName:nil] stringValue];
  588. NSString *ddTest5 = [[ddRootElement resolveNamespaceForName:nil] stringValue];
  589. NSAssert([nsTest5 isEqualToString:ddTest5], @"Failed test 5");
  590. NSXMLElement *nsNode = [NSXMLElement elementWithName:@"query"];
  591. [nsNode addNamespace:[NSXMLNode namespaceWithName:@"" stringValue:@"jabber:iq:auth"]];
  592. DDXMLElement *ddNode = [DDXMLElement elementWithName:@"query"];
  593. [ddNode addNamespace:[DDXMLNode namespaceWithName:@"" stringValue:@"jabber:iq:auth"]];
  594. NSString *nsTest6 = [[nsNode resolveNamespaceForName:@""] stringValue];
  595. NSString *ddTest6 = [[ddNode resolveNamespaceForName:@""] stringValue];
  596. NSAssert([nsTest6 isEqualToString:ddTest6], @"Failed test 6");
  597. NSString *nsTest7 = [[nsNode resolveNamespaceForName:nil] stringValue];
  598. NSString *ddTest7 = [[ddNode resolveNamespaceForName:nil] stringValue];
  599. NSAssert([nsTest7 isEqualToString:ddTest7], @"Failed test 7");
  600. NSString *nsTest8 = [nsNode URI];
  601. NSString *ddTest8 = [ddNode URI];
  602. NSAssert([nsTest8 isEqualToString:ddTest8], @"Failed test 8");
  603. NSUInteger nsTest9 = [[nsNode namespaces] count];
  604. NSUInteger ddTest9 = [[ddNode namespaces] count];
  605. NSAssert(nsTest9 == ddTest9, @"Failed test 9");
  606. }
  607. @end