@@ -24,10 +24,11 @@ static OFString *module = @"OFXMLParser"; static int i = 0; enum event_type { + PROCESSING_INSTRUCTIONS, TAG_START, TAG_END, STRING, CDATA, COMMENT @@ -38,53 +39,60 @@ name: (OFString*)name prefix: (OFString*)prefix namespace: (OFString*)ns attributes: (OFArray*)attrs string: (OFString*)string - comment: (OFString*)comment { OFString *msg; i++; msg = [OFString stringWithFormat: @"Parsing part #%d", i]; switch (i) { case 1: + TEST(msg, et == PROCESSING_INSTRUCTIONS && + [string isEqual: @"xml version='1.0'"]) + break; + case 2: + TEST(msg, et == PROCESSING_INSTRUCTIONS && + [string isEqual: @"p?i"]) + break; + case 3: TEST(msg, et == TAG_START && [name isEqual: @"root"] && prefix == nil && ns == nil && [attrs count] == 0) break; - case 2: + case 4: TEST(msg, et == STRING && [string isEqual: @"\n "]) break; - case 3: + case 5: TEST(msg, et == CDATA && [string isEqual: @"f<]]]oo"]) break; - case 4: + case 6: TEST(msg, et == TAG_START && [name isEqual: @"bar"] && prefix == nil && ns == nil && attrs == nil) break; - case 5: + case 7: TEST(msg, et == TAG_END && [name isEqual: @"bar"] && prefix == nil && ns == nil && attrs == nil) break; - case 6: + case 8: TEST(msg, et == STRING && [string isEqual: @"\n "]) break; - case 7: + case 9: TEST(msg, et == TAG_START && [name isEqual: @"foobar"] && prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"] && [attrs count] == 1 && /* xmlns attr */ [[[attrs objectAtIndex: 0] name] isEqual: @"xmlns"] && [[attrs objectAtIndex: 0] namespace] == nil && [[[attrs objectAtIndex: 0] stringValue] isEqual: @"urn:objfw:test:foobar"]) break; - case 8: + case 10: TEST(msg, et == STRING && [string isEqual: @"\n "]) break; - case 9: + case 11: TEST(msg, et == TAG_START && [name isEqual: @"qux"] && prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"] && [attrs count] == 1 && /* xmlns:foo attr */ [[[attrs objectAtIndex: 0] name] isEqual: @"foo"] && @@ -91,14 +99,14 @@ [[[attrs objectAtIndex: 0] namespace] isEqual: @"http://www.w3.org/2000/xmlns/"] && [[[attrs objectAtIndex: 0] stringValue] isEqual: @"urn:objfw:test:foo"]) break; - case 10: + case 12: TEST(msg, et == STRING && [string isEqual: @"\n "]) break; - case 11: + case 13: TEST(msg, et == TAG_START && [name isEqual: @"bla"] && [prefix isEqual: @"foo"] && [ns isEqual: @"urn:objfw:test:foo"] && [attrs count] == 2 && /* foo:bla attr */ @@ -109,14 +117,14 @@ /* blafoo attr */ [[[attrs objectAtIndex: 1] name] isEqual: @"blafoo"] && [[attrs objectAtIndex: 1] namespace] == nil && [[[attrs objectAtIndex: 1] stringValue] isEqual: @"foo"]) break; - case 12: + case 14: TEST(msg, et == STRING && [string isEqual: @"\n "]) break; - case 13: + case 15: TEST(msg, et == TAG_START && [name isEqual: @"blup"] && prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"] && [attrs count] == 2 && /* foo:qux attr */ [[[attrs objectAtIndex: 0] name] isEqual: @"qux"] && @@ -126,18 +134,18 @@ /* quxqux attr */ [[[attrs objectAtIndex: 1] name] isEqual: @"quxqux"] && [[attrs objectAtIndex: 1] namespace] == nil && [[[attrs objectAtIndex: 1] stringValue] isEqual: @"test"]) break; - case 14: + case 16: TEST(msg, et == TAG_END && [name isEqual: @"blup"] && prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"]) break; - case 15: + case 17: TEST(msg, et == STRING && [string isEqual: @"\n "]) break; - case 16: + case 18: TEST(msg, et == TAG_START && [name isEqual: @"bla"] && [prefix isEqual: @"bla"] && [ns isEqual: @"urn:objfw:test:bla"] && [attrs count] == 3 && /* xmlns:bla attr */ [[[attrs objectAtIndex: 0] name] isEqual: @"bla"] && @@ -153,19 +161,19 @@ [[[attrs objectAtIndex: 2] name] isEqual: @"foo"] && [[[attrs objectAtIndex: 2] namespace] isEqual: @"urn:objfw:test:bla"] && [[[attrs objectAtIndex: 2] stringValue] isEqual: @"blafoo"]) break; - case 17: + case 19: TEST(msg, et == TAG_END && [name isEqual: @"bla"] && [prefix isEqual: @"bla"] && [ns isEqual: @"urn:objfw:test:bla"]) break; - case 18: + case 20: TEST(msg, et == STRING && [string isEqual: @"\n "]) break; - case 19: + case 21: TEST(msg, et == TAG_START && [name isEqual: @"abc"] && prefix == nil && [ns isEqual: @"urn:objfw:test:abc"] && [attrs count] == 3 && /* xmlns attr */ [[[attrs objectAtIndex: 0] name] isEqual: @"xmlns"] && @@ -180,51 +188,62 @@ [[[attrs objectAtIndex: 2] name] isEqual: @"abc"] && [[[attrs objectAtIndex: 2] namespace] isEqual: @"urn:objfw:test:foo"] && [[[attrs objectAtIndex: 2] stringValue] isEqual: @"abc"]) break; - case 20: + case 22: TEST(msg, et == TAG_END && [name isEqual: @"abc"] && prefix == nil && [ns isEqual: @"urn:objfw:test:abc"]) break; - case 21: - TEST(msg, et == STRING && [string isEqual: @"\n "]) - break; - case 22: - TEST(msg, et == TAG_END && [name isEqual: @"bla"] && - [prefix isEqual: @"foo"] && - [ns isEqual: @"urn:objfw:test:foo"]) - break; case 23: TEST(msg, et == STRING && [string isEqual: @"\n "]) break; case 24: - TEST(msg, et == COMMENT && [comment isEqual: @" commänt "]) + TEST(msg, et == TAG_END && [name isEqual: @"bla"] && + [prefix isEqual: @"foo"] && + [ns isEqual: @"urn:objfw:test:foo"]) break; case 25: - TEST(msg, et == STRING && [string isEqual: @"\n "]) + TEST(msg, et == STRING && [string isEqual: @"\n "]) break; case 26: - TEST(msg, et == TAG_END && [name isEqual: @"qux"] && - prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"]) + TEST(msg, et == COMMENT && [string isEqual: @" commänt "]) break; case 27: - TEST(msg, et == STRING && [string isEqual: @"\n "]) + TEST(msg, et == STRING && [string isEqual: @"\n "]) break; case 28: - TEST(msg, et == TAG_END && [name isEqual: @"foobar"] && + TEST(msg, et == TAG_END && [name isEqual: @"qux"] && prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"]) break; case 29: - TEST(msg, et == STRING && [string isEqual: @"\n"]) + TEST(msg, et == STRING && [string isEqual: @"\n "]) break; case 30: + TEST(msg, et == TAG_END && [name isEqual: @"foobar"] && + prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"]) + break; + case 31: + TEST(msg, et == STRING && [string isEqual: @"\n"]) + break; + case 32: TEST(msg, et == TAG_END && [name isEqual: @"root"] && prefix == nil && ns == nil); break; } } + +- (void)parser: (OFXMLParser*)parser + foundProcessingInstructions: (OFString*)pi +{ + [self parserCallbackWithEventType: PROCESSING_INSTRUCTIONS + name: nil + prefix: nil + namespace: nil + attributes: nil + string: pi]; +} - (void)parser: (OFXMLParser*)parser didStartElement: (OFString*)name withPrefix: (OFString*)prefix namespace: (OFString*)ns @@ -233,12 +252,11 @@ [self parserCallbackWithEventType: TAG_START name: name prefix: prefix namespace: ns attributes: attrs - string: nil - comment: nil]; + string: nil]; } - (void)parser: (OFXMLParser*)parser didEndElement: (OFString*)name withPrefix: (OFString*)prefix @@ -247,12 +265,11 @@ [self parserCallbackWithEventType: TAG_END name: name prefix: prefix namespace: ns attributes: nil - string: nil - comment: nil]; + string: nil]; } - (void)parser: (OFXMLParser*)parser foundCharacters: (OFString*)string { @@ -259,12 +276,11 @@ [self parserCallbackWithEventType: STRING name: nil prefix: nil namespace: nil attributes: nil - string: string - comment: nil]; + string: string]; } - (void)parser: (OFXMLParser*)parser foundCDATA: (OFString*)cdata { @@ -271,12 +287,11 @@ [self parserCallbackWithEventType: CDATA name: nil prefix: nil namespace: nil attributes: nil - string: cdata - comment: nil]; + string: cdata]; } - (void)parser: (OFXMLParser*)parser foundComment: (OFString*)comment { @@ -283,12 +298,11 @@ [self parserCallbackWithEventType: COMMENT name: nil prefix: nil namespace: nil attributes: nil - string: nil - comment: comment]; + string: comment]; } - (OFString*)parser: (OFXMLParser*)parser foundUnknownEntityNamed: (OFString*)entity { @@ -300,11 +314,12 @@ - (void)XMLParserTests { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; OFXMLParser *parser; - const char *str = "<<>>>>\n" + const char *str = "" + "<<>>>>\n" " \n" " \n" " \n" " \n" " \n" @@ -332,10 +347,10 @@ else [parser parseBuffer: str + j withSize: 2]; } - TEST(@"Checking if everything was parsed", i == 30) + TEST(@"Checking if everything was parsed", i == 32) [pool drain]; } @end