2011-02-16 08:21:17 +00:00
# import "ObjectTesting.h"
# import < Foundation / NSAutoreleasePool . h >
# import < Foundation / NSFileManager . h >
2020-05-05 14:27:32 +00:00
# import < Foundation / NSStream . h >
2011-02-16 08:21:17 +00:00
# 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
{
2015-05-26 10:53:48 +00:00
[ s appendString : string ] ;
2011-02-16 08:21:17 +00:00
}
- ( 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
{
2018-01-11 13:50:39 +00:00
[ s appendFormat : @ "%@ %@ at %ld on %ld\n" , NSStringFromSelector ( _cmd ) ,
parseError , ( long ) [ parser columnNumber ] , ( long ) [ parser lineNumber ] ] ;
2011-02-16 08:21:17 +00:00
}
- ( void ) parser : ( NSXMLParser * ) parser
validationErrorOccurred : ( NSError * ) validationError
{
2018-01-11 13:50:39 +00:00
[ s appendFormat : @ "%@ %@ at %ld on %ld\n" , NSStringFromSelector ( _cmd ) ,
validationError , ( long ) [ parser columnNumber ] , ( long ) [ parser lineNumber ] ] ;
2011-02-16 08:21:17 +00:00
}
- ( 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
2020-05-05 14:27:32 +00:00
testParser ( NSXMLParser * parser , NSString * expect )
2011-02-16 08:21:17 +00:00
{
2020-05-05 14:27:32 +00:00
Handler * handler ;
2011-02-16 08:21:17 +00:00
[ parser setShouldProcessNamespaces : setShouldProcessNamespaces ] ;
[ parser setShouldReportNamespacePrefixes : setShouldReportNamespacePrefixes ] ;
[ parser setShouldResolveExternalEntities : setShouldResolveExternalEntities ] ;
handler = [ [ Handler new ] autorelease ] ;
[ parser setDelegate : handler ] ;
if ( NO = = [ parser parse ] )
{
2021-02-09 21:29:40 +00:00
NSLog ( @ "Parsing failed: %@ at %ld on %ld with %@" , [ parser parserError ] ,
( long ) [ parser columnNumber ] , ( long ) [ parser lineNumber ] ,
[ handler description ] ) ;
2011-02-16 08:21:17 +00:00
return NO ;
}
else
{
if ( NO = = [ [ handler description ] isEqual : expect ] )
{
NSLog ( @ "######## Expected:\n%@\n######## Parsed:\n%@\n########\n" ,
2020-05-05 14:27:32 +00:00
expect , [ handler description ] ) ;
2011-02-16 08:21:17 +00:00
return NO ;
}
}
2020-05-05 14:27:32 +00:00
2011-02-16 08:21:17 +00:00
return YES ;
}
2020-05-05 14:27:32 +00:00
static BOOL
2020-05-06 14:23:18 +00:00
testParseData ( NSData * xml , NSString * expect , BOOL strict )
2020-05-05 14:27:32 +00:00
{
NSAutoreleasePool * arp = [ NSAutoreleasePool new ] ;
NSXMLParser * parser ;
Class c = NSClassFromString ( @ "GSSloppyXMLParser" ) ;
BOOL result ;
2020-05-06 14:23:18 +00:00
if ( strict ) c = Nil ;
2020-05-05 14:27:32 +00:00
if ( Nil = = c ) c = [ NSXMLParser class ] ;
parser = [ [ c alloc ] initWithData : xml ] ;
result = testParser ( parser , expect ) ;
[ arp release ] ;
return result ;
}
2011-02-16 08:21:17 +00:00
static BOOL
2020-05-06 14:23:18 +00:00
testParseCString ( const char * xmlBytes , NSString * expect , BOOL strict )
2011-02-16 08:21:17 +00:00
{
NSData * xml ;
xml = [ NSData dataWithBytes : xmlBytes length : strlen ( xmlBytes ) ] ;
2020-05-06 14:23:18 +00:00
return testParseData ( xml , expect , strict ) ;
2020-05-05 14:27:32 +00:00
}
static BOOL
2020-05-06 14:23:18 +00:00
testParseStream ( NSInputStream * stream , NSString * expect , BOOL strict )
2020-05-05 14:27:32 +00:00
{
NSAutoreleasePool * arp = [ NSAutoreleasePool new ] ;
NSXMLParser * parser ;
Class c = NSClassFromString ( @ "GSSloppyXMLParser" ) ;
BOOL result ;
2020-05-06 14:23:18 +00:00
if ( strict ) c = Nil ;
2020-05-05 14:27:32 +00:00
if ( Nil = = c ) c = [ NSXMLParser class ] ;
parser = [ [ c alloc ] initWithStream : stream ] ;
result = testParser ( parser , expect ) ;
[ arp release ] ;
2020-05-06 14:23:18 +00:00
return result ;
2011-02-16 08:21:17 +00:00
}
int main ( )
{
NSAutoreleasePool * arp = [ NSAutoreleasePool new ] ;
NSFileManager * mgr = [ NSFileManager defaultManager ] ;
NSDirectoryEnumerator * dir ;
2018-01-11 13:50:39 +00:00
NSString * str ;
2011-02-16 08:21:17 +00:00
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" ;
2020-05-06 14:23:18 +00:00
PASS ( ( testParseCString ( x1 , e1 , YES ) ) , "simple document 1 (strict)" )
PASS ( ( testParseCString ( x1 , e1 , NO ) ) , "simple document 1 (sloppy)" )
PASS ( ( testParseCString ( x1e , e1 , YES ) ) ,
"simple document 1 (strict) without header" )
PASS ( ( testParseCString ( x1e , e1 , NO ) ) ,
"simple document 1 (sloppy) without header" )
2011-02-16 08:21:17 +00:00
/ * 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" ] )
2020-05-05 14:27:32 +00:00
{
NSString * xmlPath ;
2011-02-16 08:21:17 +00:00
NSData * xmlData ;
NSString * result ;
2020-05-05 14:27:32 +00:00
NSInputStream * stream ;
2011-02-16 08:21:17 +00:00
2020-05-05 14:27:32 +00:00
xmlPath = [ @ "ParseData" stringByAppendingPathComponent : xmlName ] ;
str = [ xmlPath stringByDeletingPathExtension ] ;
str = [ str stringByAppendingPathExtension : @ "result" ] ;
2011-02-16 08:21:17 +00:00
xmlData = [ NSData dataWithContentsOfFile : xmlPath ] ;
2020-05-06 14:23:18 +00:00
2011-02-16 08:21:17 +00:00
result = [ NSString stringWithContentsOfFile : str ] ;
2020-05-06 14:23:18 +00:00
PASS ( ( testParseData ( xmlData , result , YES ) ) ,
"parse data (strict): %s" , [ xmlName UTF8String ] )
result = [ NSString stringWithContentsOfFile : str ] ;
PASS ( ( testParseData ( xmlData , result , NO ) ) ,
"parse data (sloppy): %s" , [ xmlName UTF8String ] )
2020-05-05 14:27:32 +00:00
stream = [ NSInputStream inputStreamWithFileAtPath : xmlPath ] ;
2020-05-06 14:23:18 +00:00
PASS ( ( testParseStream ( stream , result , YES ) ) ,
"parse stream (strict): %s" , [ xmlName UTF8String ] )
2020-05-09 13:46:32 +00:00
testHopeful = YES ;
2021-02-09 21:29:40 +00:00
// Stream parse not yet supported
2020-05-06 14:23:18 +00:00
stream = [ NSInputStream inputStreamWithFileAtPath : xmlPath ] ;
PASS ( ( testParseStream ( stream , result , NO ) ) ,
"parse stream (sloppy): %s" , [ xmlName UTF8String ] )
2020-05-09 13:46:32 +00:00
testHopeful = NO ;
2020-05-05 14:27:32 +00:00
}
2011-02-16 08:21:17 +00:00
}
2018-01-11 13:50:39 +00:00
{
NSString * exp ;
NSData * dat ;
exp = @ " parserDidStartDocument : \ n \
parser : didStartElement : namespaceURI : qualifiedName : attributes : file file { \ n } \ n \
& Aparser : didEndElement : namespaceURI : qualifiedName : file file \ n \
parserDidEndDocument : \ n \
" ;
str = [ NSString stringWithFormat :
@ "<?xml version=\" 1.0 \ " encoding=\" UTF -8 \ " ?>\n"
@ "<!DOCTYPE file [<!ENTITY foo SYSTEM \" file : // % @ / GNUmakefile \ ">]>\n"
@ "<file>&&foo;A</file>" , [ mgr currentDirectoryPath ] ] ;
dat = [ str dataUsingEncoding : NSUTF8StringEncoding ] ;
2020-05-06 14:23:18 +00:00
PASS ( ( testParseData ( dat , exp , YES ) ) , "external entity (strict)" )
PASS ( ( testParseData ( dat , exp , YES ) ) , "external entity (sloppy)" )
2018-01-11 13:50:39 +00:00
}
2011-02-16 08:21:17 +00:00
[ arp release ] ; arp = nil ;
return 0 ;
}