mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-22 00:11:04 +00:00
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@38551 72102866-910b-0410-8b05-ffd578937521
320 lines
9.8 KiB
Objective-C
320 lines
9.8 KiB
Objective-C
#import "ObjectTesting.h"
|
|
#import <Foundation/NSAutoreleasePool.h>
|
|
#import <Foundation/NSFileManager.h>
|
|
#import <Foundation/NSUserDefaults.h>
|
|
#import <Foundation/NSXMLParser.h>
|
|
#include <string.h>
|
|
|
|
@interface Handler : NSObject
|
|
{
|
|
NSMutableString *s;
|
|
}
|
|
|
|
- (void)parserDidStartDocument: (NSXMLParser *)parser;
|
|
- (void)parserDidEndDocument: (NSXMLParser *)parser;
|
|
- (void)parser: (NSXMLParser *)parser foundNotationDeclarationWithName: (NSString *)name publicID: (NSString *)publicID systemID: (NSString *)systemID;
|
|
- (void)parser: (NSXMLParser *)parser foundUnparsedEntityDeclarationWithName: (NSString *)name publicID: (NSString *)publicID systemID: (NSString *)systemID notationName: (NSString *)notationName;
|
|
- (void)parser: (NSXMLParser *)parser foundAttributeDeclarationWithName: (NSString *)attributeName forElement: (NSString *)elementName type: (NSString *)type defaultValue: (NSString *)defaultValue;
|
|
- (void)parser: (NSXMLParser *)parser foundElementDeclarationWithName: (NSString *)elementName model: (NSString *)model;
|
|
|
|
- (void)parser: (NSXMLParser *)parser foundInternalEntityDeclarationWithName: (NSString *)name value: (NSString *)value;
|
|
|
|
- (void)parser: (NSXMLParser *)parser foundExternalEntityDeclarationWithName: (NSString *)name publicID: (NSString *)publicID systemID: (NSString *)systemID;
|
|
|
|
- (void)parser: (NSXMLParser *)parser didStartElement: (NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName: (NSString *)qName attributes: (NSDictionary *)attributeDict;
|
|
- (void)parser: (NSXMLParser *)parser didEndElement: (NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName: (NSString *)qName;
|
|
- (void)parser: (NSXMLParser *)parser didStartMappingPrefix: (NSString *)prefix toURI: (NSString *)namespaceURI;
|
|
- (void)parser: (NSXMLParser *)parser didEndMappingPrefix: (NSString *)prefix;
|
|
- (void)parser: (NSXMLParser *)parser foundCharacters: (NSString *)string;
|
|
- (void)parser: (NSXMLParser *)parser foundIgnorableWhitespace: (NSString *)whitespaceString;
|
|
- (void)parser: (NSXMLParser *)parser foundProcessingInstructionWithTarget: (NSString *)target data: (NSString *)data;
|
|
- (void)parser: (NSXMLParser *)parser foundComment: (NSString *)comment;
|
|
- (void)parser: (NSXMLParser *)parser foundCDATA: (NSData *)CDATABlock;
|
|
- (NSData *)parser: (NSXMLParser *)parser resolveExternalEntityName: (NSString *)name systemID: (NSString *)systemID;
|
|
- (void)parser: (NSXMLParser *)parser parseErrorOccurred: (NSError *)parseError;
|
|
- (void)parser: (NSXMLParser *)parser validationErrorOccurred: (NSError *)validationError;
|
|
@end
|
|
|
|
@implementation Handler
|
|
|
|
- (void) dealloc
|
|
{
|
|
[s release];
|
|
[super dealloc];
|
|
}
|
|
|
|
- (NSString*) description
|
|
{
|
|
return s;
|
|
}
|
|
|
|
- (id) init
|
|
{
|
|
s = [NSMutableString new];
|
|
return self;
|
|
}
|
|
|
|
- (void) parserDidStartDocument: (NSXMLParser *)parser
|
|
{
|
|
[s appendFormat: @"%@\n", NSStringFromSelector(_cmd)];
|
|
}
|
|
|
|
- (void) parserDidEndDocument: (NSXMLParser *)parser
|
|
{
|
|
[s appendFormat: @"%@\n", NSStringFromSelector(_cmd)];
|
|
}
|
|
|
|
- (void) parser: (NSXMLParser *)parser
|
|
foundNotationDeclarationWithName: (NSString *)name
|
|
publicID: (NSString *)publicID
|
|
systemID: (NSString *)systemID
|
|
{
|
|
[s appendFormat: @"%@ %@ %@ %@\n", NSStringFromSelector(_cmd), name,
|
|
publicID, systemID];
|
|
}
|
|
|
|
- (void) parser: (NSXMLParser *)parser
|
|
foundUnparsedEntityDeclarationWithName: (NSString *)name
|
|
publicID: (NSString *)publicID
|
|
systemID: (NSString *)systemID
|
|
notationName: (NSString *)notationName
|
|
{
|
|
[s appendFormat: @"%@ %@ %@ %@ %@\n", NSStringFromSelector(_cmd), name,
|
|
publicID, systemID, notationName];
|
|
}
|
|
|
|
- (void) parser: (NSXMLParser *)parser
|
|
foundAttributeDeclarationWithName: (NSString *)attributeName
|
|
forElement: (NSString *)elementName
|
|
type: (NSString *)type
|
|
defaultValue: (NSString *)defaultValue
|
|
{
|
|
[s appendFormat: @"%@ %@ %@ %@ %@\n", NSStringFromSelector(_cmd),
|
|
attributeName, elementName, type, defaultValue];
|
|
}
|
|
|
|
- (void) parser: (NSXMLParser *)parser
|
|
foundElementDeclarationWithName: (NSString *)elementName
|
|
model: (NSString *)model
|
|
{
|
|
[s appendFormat: @"%@ %@ %@\n", NSStringFromSelector(_cmd),
|
|
elementName, model];
|
|
}
|
|
|
|
|
|
- (void) parser: (NSXMLParser *)parser
|
|
foundInternalEntityDeclarationWithName: (NSString *)name
|
|
value: (NSString *)value
|
|
{
|
|
[s appendFormat: @"%@ %@ %@\n", NSStringFromSelector(_cmd),
|
|
name, value];
|
|
}
|
|
|
|
|
|
- (void) parser: (NSXMLParser *)parser
|
|
foundExternalEntityDeclarationWithName: (NSString *)name
|
|
publicID: (NSString *)publicID
|
|
systemID: (NSString *)systemID
|
|
{
|
|
[s appendFormat: @"%@ %@ %@ %@\n", NSStringFromSelector(_cmd),
|
|
name, publicID, systemID];
|
|
}
|
|
|
|
|
|
- (void) parser: (NSXMLParser *)parser
|
|
didStartElement: (NSString *)elementName
|
|
namespaceURI: (NSString *)namespaceURI
|
|
qualifiedName: (NSString *)qName
|
|
attributes: (NSDictionary *)attributeDict
|
|
{
|
|
static NSDictionary *locale = nil;
|
|
NSString *d;
|
|
|
|
if (nil == locale)
|
|
{
|
|
locale = [[[NSUserDefaults standardUserDefaults]
|
|
dictionaryRepresentation] retain];
|
|
}
|
|
d = [attributeDict descriptionWithLocale: locale];
|
|
[s appendFormat: @"%@ %@ %@ %@ %@\n", NSStringFromSelector(_cmd),
|
|
elementName, namespaceURI, qName, d];
|
|
}
|
|
|
|
- (void) parser: (NSXMLParser *)parser
|
|
didEndElement: (NSString *)elementName
|
|
namespaceURI: (NSString *)namespaceURI
|
|
qualifiedName: (NSString *)qName
|
|
{
|
|
[s appendFormat: @"%@ %@ %@ %@\n", NSStringFromSelector(_cmd),
|
|
elementName, namespaceURI, qName];
|
|
}
|
|
|
|
- (void) parser: (NSXMLParser *)parser
|
|
didStartMappingPrefix: (NSString *)prefix
|
|
toURI: (NSString *)namespaceURI
|
|
{
|
|
[s appendFormat: @"%@ %@ %@\n", NSStringFromSelector(_cmd),
|
|
prefix, namespaceURI];
|
|
}
|
|
|
|
- (void) parser: (NSXMLParser *)parser
|
|
didEndMappingPrefix: (NSString *)prefix
|
|
{
|
|
[s appendFormat: @"%@ %@\n", NSStringFromSelector(_cmd),
|
|
prefix];
|
|
}
|
|
|
|
- (void) parser: (NSXMLParser *)parser
|
|
foundCharacters: (NSString *)string
|
|
{
|
|
[s appendString: string];
|
|
}
|
|
|
|
- (void) parser: (NSXMLParser *)parser
|
|
foundIgnorableWhitespace: (NSString *)whitespaceString
|
|
{
|
|
[s appendFormat: @"%@ %@\n", NSStringFromSelector(_cmd),
|
|
whitespaceString];
|
|
}
|
|
|
|
- (void) parser: (NSXMLParser *)parser
|
|
foundProcessingInstructionWithTarget: (NSString *)target
|
|
data: (NSString *)data
|
|
{
|
|
[s appendFormat: @"%@ %@ %@\n", NSStringFromSelector(_cmd),
|
|
target, data];
|
|
}
|
|
|
|
- (void) parser: (NSXMLParser *)parser
|
|
foundComment: (NSString *)comment
|
|
{
|
|
[s appendFormat: @"%@ %@\n", NSStringFromSelector(_cmd),
|
|
comment];
|
|
}
|
|
|
|
- (void) parser: (NSXMLParser *)parser
|
|
foundCDATA: (NSData *)CDATABlock
|
|
{
|
|
[s appendFormat: @"%@ %@\n", NSStringFromSelector(_cmd),
|
|
CDATABlock];
|
|
}
|
|
|
|
- (NSData *) parser: (NSXMLParser *)parser
|
|
resolveExternalEntityName: (NSString *)name
|
|
systemID: (NSString *)systemID
|
|
{
|
|
[s appendFormat: @"%@ %@ %@\n", NSStringFromSelector(_cmd),
|
|
name, systemID];
|
|
return nil;
|
|
}
|
|
|
|
- (void) parser: (NSXMLParser *)parser
|
|
parseErrorOccurred: (NSError *)parseError
|
|
{
|
|
[s appendFormat: @"%@ %@\n", NSStringFromSelector(_cmd),
|
|
parseError];
|
|
}
|
|
|
|
- (void) parser: (NSXMLParser *)parser
|
|
validationErrorOccurred: (NSError *)validationError
|
|
{
|
|
[s appendFormat: @"%@ %@\n", NSStringFromSelector(_cmd),
|
|
validationError];
|
|
}
|
|
|
|
- (void) reset
|
|
{
|
|
[s setString: @""];
|
|
}
|
|
|
|
@end
|
|
|
|
/* Use these booleans to control parsing behavior.
|
|
*/
|
|
static BOOL setShouldProcessNamespaces = YES;
|
|
static BOOL setShouldReportNamespacePrefixes = YES;
|
|
static BOOL setShouldResolveExternalEntities = NO;
|
|
|
|
static BOOL
|
|
testParse(NSData *xml, NSString *expect)
|
|
{
|
|
NSAutoreleasePool *arp = [NSAutoreleasePool new];
|
|
Handler *handler;
|
|
NSXMLParser *parser;
|
|
|
|
parser = [[NSXMLParser alloc] initWithData: xml];
|
|
|
|
[parser setShouldProcessNamespaces: setShouldProcessNamespaces];
|
|
[parser setShouldReportNamespacePrefixes: setShouldReportNamespacePrefixes];
|
|
[parser setShouldResolveExternalEntities: setShouldResolveExternalEntities];
|
|
|
|
handler = [[Handler new] autorelease];
|
|
[parser setDelegate: handler];
|
|
if (NO == [parser parse])
|
|
{
|
|
NSLog(@"Parsing failed: %@", [parser parserError]);
|
|
[arp release];
|
|
return NO;
|
|
}
|
|
else
|
|
{
|
|
if (NO == [[handler description] isEqual: expect])
|
|
{
|
|
NSLog(@"######## Expected:\n%@\n######## Parsed:\n%@\n########\n",
|
|
expect, [handler description]);
|
|
[arp release];
|
|
return NO;
|
|
}
|
|
}
|
|
[arp release];
|
|
return YES;
|
|
}
|
|
|
|
static BOOL
|
|
testParseCString(const char *xmlBytes, NSString *expect)
|
|
{
|
|
NSData *xml;
|
|
|
|
xml = [NSData dataWithBytes: xmlBytes length: strlen(xmlBytes)];
|
|
return testParse(xml, expect);
|
|
}
|
|
|
|
int main()
|
|
{
|
|
NSAutoreleasePool *arp = [NSAutoreleasePool new];
|
|
NSFileManager *mgr = [NSFileManager defaultManager];
|
|
NSDirectoryEnumerator *dir;
|
|
NSString *xmlName;
|
|
const char *x1 = "<?xml version=\"1.0\"?><test x = \"1\"></test>";
|
|
const char *x1e = "<test x=\"1\"></test>";
|
|
NSString *e1 =
|
|
@"parserDidStartDocument:\nparser:didStartElement:namespaceURI:qualifiedName:attributes: test test {\n x = 1;\n}\nparser:didEndElement:namespaceURI:qualifiedName: test test\nparserDidEndDocument:\n";
|
|
|
|
PASS((testParseCString(x1, e1)), "simple document 1")
|
|
PASS((testParseCString(x1e, e1)), "simple document 1 without header")
|
|
|
|
/* Now perform any tests using .xml and .result pairs of files in
|
|
* the ParseData subdirectory.
|
|
*/
|
|
dir = [mgr enumeratorAtPath: @"ParseData"];
|
|
while ((xmlName = [dir nextObject]) != nil)
|
|
{
|
|
if ([[xmlName pathExtension] isEqualToString: @"xml"])
|
|
{
|
|
NSString *str;
|
|
NSString *xmlPath;
|
|
NSData *xmlData;
|
|
NSString *result;
|
|
|
|
xmlPath = [@"ParseData" stringByAppendingPathComponent: xmlName];
|
|
str = [xmlPath stringByDeletingPathExtension];
|
|
str = [str stringByAppendingPathExtension: @"result"];
|
|
xmlData = [NSData dataWithContentsOfFile: xmlPath];
|
|
result = [NSString stringWithContentsOfFile: str];
|
|
PASS((testParse(xmlData, result)), "%s", [xmlName UTF8String])
|
|
}
|
|
}
|
|
|
|
[arp release]; arp = nil;
|
|
return 0;
|
|
}
|