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>&amp;&foo;&#65;</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