1#import "ObjectTesting.h" 2#import <Foundation/NSAutoreleasePool.h> 3#import <Foundation/NSFileManager.h> 4#import <Foundation/NSUserDefaults.h> 5#import <Foundation/NSXMLParser.h> 6#include <string.h> 7 8@interface Handler : NSObject 9{ 10 NSMutableString *s; 11} 12 13- (void)parserDidStartDocument: (NSXMLParser *)parser; 14- (void)parserDidEndDocument: (NSXMLParser *)parser; 15- (void)parser: (NSXMLParser *)parser foundNotationDeclarationWithName: (NSString *)name publicID: (NSString *)publicID systemID: (NSString *)systemID; 16- (void)parser: (NSXMLParser *)parser foundUnparsedEntityDeclarationWithName: (NSString *)name publicID: (NSString *)publicID systemID: (NSString *)systemID notationName: (NSString *)notationName; 17- (void)parser: (NSXMLParser *)parser foundAttributeDeclarationWithName: (NSString *)attributeName forElement: (NSString *)elementName type: (NSString *)type defaultValue: (NSString *)defaultValue; 18- (void)parser: (NSXMLParser *)parser foundElementDeclarationWithName: (NSString *)elementName model: (NSString *)model; 19 20- (void)parser: (NSXMLParser *)parser foundInternalEntityDeclarationWithName: (NSString *)name value: (NSString *)value; 21 22- (void)parser: (NSXMLParser *)parser foundExternalEntityDeclarationWithName: (NSString *)name publicID: (NSString *)publicID systemID: (NSString *)systemID; 23 24- (void)parser: (NSXMLParser *)parser didStartElement: (NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName: (NSString *)qName attributes: (NSDictionary *)attributeDict; 25- (void)parser: (NSXMLParser *)parser didEndElement: (NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName: (NSString *)qName; 26- (void)parser: (NSXMLParser *)parser didStartMappingPrefix: (NSString *)prefix toURI: (NSString *)namespaceURI; 27- (void)parser: (NSXMLParser *)parser didEndMappingPrefix: (NSString *)prefix; 28- (void)parser: (NSXMLParser *)parser foundCharacters: (NSString *)string; 29- (void)parser: (NSXMLParser *)parser foundIgnorableWhitespace: (NSString *)whitespaceString; 30- (void)parser: (NSXMLParser *)parser foundProcessingInstructionWithTarget: (NSString *)target data: (NSString *)data; 31- (void)parser: (NSXMLParser *)parser foundComment: (NSString *)comment; 32- (void)parser: (NSXMLParser *)parser foundCDATA: (NSData *)CDATABlock; 33- (NSData *)parser: (NSXMLParser *)parser resolveExternalEntityName: (NSString *)name systemID: (NSString *)systemID; 34- (void)parser: (NSXMLParser *)parser parseErrorOccurred: (NSError *)parseError; 35- (void)parser: (NSXMLParser *)parser validationErrorOccurred: (NSError *)validationError; 36@end 37 38@implementation Handler 39 40- (void) dealloc 41{ 42 [s release]; 43 [super dealloc]; 44} 45 46- (NSString*) description 47{ 48 return s; 49} 50 51- (id) init 52{ 53 s = [NSMutableString new]; 54 return self; 55} 56 57- (void) parserDidStartDocument: (NSXMLParser *)parser 58{ 59 [s appendFormat: @"%@\n", NSStringFromSelector(_cmd)]; 60} 61 62- (void) parserDidEndDocument: (NSXMLParser *)parser 63{ 64 [s appendFormat: @"%@\n", NSStringFromSelector(_cmd)]; 65} 66 67- (void) parser: (NSXMLParser *)parser 68 foundNotationDeclarationWithName: (NSString *)name 69 publicID: (NSString *)publicID 70 systemID: (NSString *)systemID 71{ 72 [s appendFormat: @"%@ %@ %@ %@\n", NSStringFromSelector(_cmd), name, 73 publicID, systemID]; 74} 75 76- (void) parser: (NSXMLParser *)parser 77 foundUnparsedEntityDeclarationWithName: (NSString *)name 78 publicID: (NSString *)publicID 79 systemID: (NSString *)systemID 80 notationName: (NSString *)notationName 81{ 82 [s appendFormat: @"%@ %@ %@ %@ %@\n", NSStringFromSelector(_cmd), name, 83 publicID, systemID, notationName]; 84} 85 86- (void) parser: (NSXMLParser *)parser 87 foundAttributeDeclarationWithName: (NSString *)attributeName 88 forElement: (NSString *)elementName 89 type: (NSString *)type 90 defaultValue: (NSString *)defaultValue 91{ 92 [s appendFormat: @"%@ %@ %@ %@ %@\n", NSStringFromSelector(_cmd), 93 attributeName, elementName, type, defaultValue]; 94} 95 96- (void) parser: (NSXMLParser *)parser 97 foundElementDeclarationWithName: (NSString *)elementName 98 model: (NSString *)model 99{ 100 [s appendFormat: @"%@ %@ %@\n", NSStringFromSelector(_cmd), 101 elementName, model]; 102} 103 104 105- (void) parser: (NSXMLParser *)parser 106 foundInternalEntityDeclarationWithName: (NSString *)name 107 value: (NSString *)value 108{ 109 [s appendFormat: @"%@ %@ %@\n", NSStringFromSelector(_cmd), 110 name, value]; 111} 112 113 114- (void) parser: (NSXMLParser *)parser 115 foundExternalEntityDeclarationWithName: (NSString *)name 116 publicID: (NSString *)publicID 117 systemID: (NSString *)systemID 118{ 119 [s appendFormat: @"%@ %@ %@ %@\n", NSStringFromSelector(_cmd), 120 name, publicID, systemID]; 121} 122 123 124- (void) parser: (NSXMLParser *)parser 125 didStartElement: (NSString *)elementName 126 namespaceURI: (NSString *)namespaceURI 127 qualifiedName: (NSString *)qName 128 attributes: (NSDictionary *)attributeDict 129{ 130 static NSDictionary *locale = nil; 131 NSString *d; 132 133 if (nil == locale) 134 { 135 locale = [[[NSUserDefaults standardUserDefaults] 136 dictionaryRepresentation] retain]; 137 } 138 d = [attributeDict descriptionWithLocale: locale]; 139 [s appendFormat: @"%@ %@ %@ %@ %@\n", NSStringFromSelector(_cmd), 140 elementName, namespaceURI, qName, d]; 141} 142 143- (void) parser: (NSXMLParser *)parser 144 didEndElement: (NSString *)elementName 145 namespaceURI: (NSString *)namespaceURI 146 qualifiedName: (NSString *)qName 147{ 148 [s appendFormat: @"%@ %@ %@ %@\n", NSStringFromSelector(_cmd), 149 elementName, namespaceURI, qName]; 150} 151 152- (void) parser: (NSXMLParser *)parser 153 didStartMappingPrefix: (NSString *)prefix 154 toURI: (NSString *)namespaceURI 155{ 156 [s appendFormat: @"%@ %@ %@\n", NSStringFromSelector(_cmd), 157 prefix, namespaceURI]; 158} 159 160- (void) parser: (NSXMLParser *)parser 161 didEndMappingPrefix: (NSString *)prefix 162{ 163 [s appendFormat: @"%@ %@\n", NSStringFromSelector(_cmd), 164 prefix]; 165} 166 167- (void) parser: (NSXMLParser *)parser 168 foundCharacters: (NSString *)string 169{ 170 [s appendString: string]; 171} 172 173- (void) parser: (NSXMLParser *)parser 174 foundIgnorableWhitespace: (NSString *)whitespaceString 175{ 176 [s appendFormat: @"%@ %@\n", NSStringFromSelector(_cmd), 177 whitespaceString]; 178} 179 180- (void) parser: (NSXMLParser *)parser 181 foundProcessingInstructionWithTarget: (NSString *)target 182 data: (NSString *)data 183{ 184 [s appendFormat: @"%@ %@ %@\n", NSStringFromSelector(_cmd), 185 target, data]; 186} 187 188- (void) parser: (NSXMLParser *)parser 189 foundComment: (NSString *)comment 190{ 191 [s appendFormat: @"%@ %@\n", NSStringFromSelector(_cmd), 192 comment]; 193} 194 195- (void) parser: (NSXMLParser *)parser 196 foundCDATA: (NSData *)CDATABlock 197{ 198 [s appendFormat: @"%@ %@\n", NSStringFromSelector(_cmd), 199 CDATABlock]; 200} 201 202- (NSData *) parser: (NSXMLParser *)parser 203 resolveExternalEntityName: (NSString *)name 204 systemID: (NSString *)systemID 205{ 206 [s appendFormat: @"%@ %@ %@\n", NSStringFromSelector(_cmd), 207 name, systemID]; 208 return nil; 209} 210 211- (void) parser: (NSXMLParser *)parser 212 parseErrorOccurred: (NSError *)parseError 213{ 214 [s appendFormat: @"%@ %@ at %ld on %ld\n", NSStringFromSelector(_cmd), 215 parseError, (long)[parser columnNumber], (long)[parser lineNumber]]; 216} 217 218- (void) parser: (NSXMLParser *)parser 219 validationErrorOccurred: (NSError *)validationError 220{ 221 [s appendFormat: @"%@ %@ at %ld on %ld\n", NSStringFromSelector(_cmd), 222 validationError, (long)[parser columnNumber], (long)[parser lineNumber]]; 223} 224 225- (void) reset 226{ 227 [s setString: @""]; 228} 229 230@end 231 232/* Use these booleans to control parsing behavior. 233 */ 234static BOOL setShouldProcessNamespaces = YES; 235static BOOL setShouldReportNamespacePrefixes = YES; 236static BOOL setShouldResolveExternalEntities = NO; 237 238static BOOL 239testParse(NSData *xml, NSString *expect) 240{ 241 NSAutoreleasePool *arp = [NSAutoreleasePool new]; 242 Handler *handler; 243 NSXMLParser *parser; 244 Class c = NSClassFromString(@"GSSloppyXMLParser"); 245 246 c = Nil; 247 if (Nil == c) c = [NSXMLParser class]; 248 parser = [[c alloc] initWithData: xml]; 249 250 [parser setShouldProcessNamespaces: setShouldProcessNamespaces]; 251 [parser setShouldReportNamespacePrefixes: setShouldReportNamespacePrefixes]; 252 [parser setShouldResolveExternalEntities: setShouldResolveExternalEntities]; 253 254 handler = [[Handler new] autorelease]; 255 [parser setDelegate: handler]; 256 if (NO == [parser parse]) 257 { 258 NSLog(@"Parsing failed: %@ at %ld on %ld", [parser parserError], 259 (long)[parser columnNumber], (long)[parser lineNumber]); 260 [arp release]; 261 return NO; 262 } 263 else 264 { 265 if (NO == [[handler description] isEqual: expect]) 266 { 267 NSLog(@"######## Expected:\n%@\n######## Parsed:\n%@\n########\n", 268 expect, [handler description]); 269 [arp release]; 270 return NO; 271 } 272 } 273 [arp release]; 274 return YES; 275} 276 277static BOOL 278testParseCString(const char *xmlBytes, NSString *expect) 279{ 280 NSData *xml; 281 282 xml = [NSData dataWithBytes: xmlBytes length: strlen(xmlBytes)]; 283 return testParse(xml, expect); 284} 285 286int main() 287{ 288 NSAutoreleasePool *arp = [NSAutoreleasePool new]; 289 NSFileManager *mgr = [NSFileManager defaultManager]; 290 NSDirectoryEnumerator *dir; 291 NSString *str; 292 NSString *xmlName; 293 const char *x1 = "<?xml version=\"1.0\"?><test x = \"1\"></test>"; 294 const char *x1e = "<test x=\"1\"></test>"; 295 NSString *e1 = 296@"parserDidStartDocument:\nparser:didStartElement:namespaceURI:qualifiedName:attributes: test test {\n x = 1;\n}\nparser:didEndElement:namespaceURI:qualifiedName: test test\nparserDidEndDocument:\n"; 297 298 PASS((testParseCString(x1, e1)), "simple document 1") 299 PASS((testParseCString(x1e, e1)), "simple document 1 without header") 300 301 /* Now perform any tests using .xml and .result pairs of files in 302 * the ParseData subdirectory. 303 */ 304 dir = [mgr enumeratorAtPath: @"ParseData"]; 305 while ((xmlName = [dir nextObject]) != nil) 306 { 307 if ([[xmlName pathExtension] isEqualToString: @"xml"]) 308 { 309 NSString *xmlPath; 310 NSData *xmlData; 311 NSString *result; 312 313 xmlPath = [@"ParseData" stringByAppendingPathComponent: xmlName]; 314 str = [xmlPath stringByDeletingPathExtension]; 315 str = [str stringByAppendingPathExtension: @"result"]; 316 xmlData = [NSData dataWithContentsOfFile: xmlPath]; 317 result = [NSString stringWithContentsOfFile: str]; 318 PASS((testParse(xmlData, result)), "%s", [xmlName UTF8String]) 319 } 320 } 321 322 { 323 NSString *exp; 324 NSData *dat; 325 326 exp = @"parserDidStartDocument:\n\ 327parser:didStartElement:namespaceURI:qualifiedName:attributes: file file {\n}\n\ 328&Aparser:didEndElement:namespaceURI:qualifiedName: file file\n\ 329parserDidEndDocument:\n\ 330"; 331 332 str = [NSString stringWithFormat: 333@"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" 334@"<!DOCTYPE file [<!ENTITY foo SYSTEM \"file://%@/GNUmakefile\">]>\n" 335@"<file>&&foo;A</file>", [mgr currentDirectoryPath]]; 336 337 dat = [str dataUsingEncoding: NSUTF8StringEncoding]; 338 PASS((testParse(dat, exp)), "external entity") 339 } 340 341 [arp release]; arp = nil; 342 return 0; 343} 344