From 8e5938972d28cc6d245925f058ad3c715425f1f2 Mon Sep 17 00:00:00 2001 From: relikd Date: Tue, 15 Jan 2019 22:08:23 +0100 Subject: [PATCH] Fixed bugs: canParse & expected type error & html entities method name --- RSXML/RSXMLError.h | 2 +- RSXML/RSXMLError.m | 12 +++++----- RSXML/RSXMLParser.m | 10 ++++----- RSXMLTests/RSEntityTests.m | 22 +++++++++---------- RSXMLTests/RSXMLTests.m | 45 +++++++++++++++++++++++++------------- 5 files changed, 53 insertions(+), 38 deletions(-) diff --git a/RSXML/RSXMLError.h b/RSXML/RSXMLError.h index 8c6f373..a1e7c23 100644 --- a/RSXML/RSXMLError.h +++ b/RSXML/RSXMLError.h @@ -42,4 +42,4 @@ typedef NS_ERROR_ENUM(kRSXMLParserErrorDomain, RSXMLError) { }; NSError * RSXMLMakeError(RSXMLError code); -NSError * RSXMLMakeErrorWrongParser(RSXMLError code, RSXMLError expected); +NSError * RSXMLMakeErrorWrongParser(RSXMLError expected, RSXMLError other); diff --git a/RSXML/RSXMLError.m b/RSXML/RSXMLError.m index 398688c..6ec44c2 100644 --- a/RSXML/RSXMLError.m +++ b/RSXML/RSXMLError.m @@ -36,8 +36,8 @@ const char * parserDescriptionForError(RSXMLError code) { } } -NSString * getErrorMessageForRSXMLError(RSXMLError code, RSXMLError expected); -NSString * getErrorMessageForRSXMLError(RSXMLError code, RSXMLError expected) { +NSString * getErrorMessageForRSXMLError(RSXMLError code, RSXMLError other); +NSString * getErrorMessageForRSXMLError(RSXMLError code, RSXMLError other) { switch (code) { // switch statement will warn if an enum value is missing case RSXMLErrorNoData: return @"Can't parse data. Empty data."; @@ -53,7 +53,7 @@ NSString * getErrorMessageForRSXMLError(RSXMLError code, RSXMLError expected) { case RSXMLErrorExpectingOPML: case RSXMLErrorExpectingFeed: return [NSString stringWithFormat:@"Can't parse XML. %s expected, but %s found.", - parserDescriptionForError(code), parserDescriptionForError(expected)]; + parserDescriptionForError(code), parserDescriptionForError(other)]; } } @@ -61,7 +61,7 @@ NSError * RSXMLMakeError(RSXMLError code) { return RSXMLMakeErrorWrongParser(code, RSXMLErrorNoData); } -NSError * RSXMLMakeErrorWrongParser(RSXMLError code, RSXMLError expected) { - return [NSError errorWithDomain:kRSXMLParserErrorDomain code:code - userInfo:@{NSLocalizedDescriptionKey: getErrorMessageForRSXMLError(code, expected)}]; +NSError * RSXMLMakeErrorWrongParser(RSXMLError expected, RSXMLError other) { + return [NSError errorWithDomain:kRSXMLParserErrorDomain code:expected + userInfo:@{NSLocalizedDescriptionKey: getErrorMessageForRSXMLError(expected, other)}]; } diff --git a/RSXML/RSXMLParser.m b/RSXML/RSXMLParser.m index 1deafd5..de3791c 100644 --- a/RSXML/RSXMLParser.m +++ b/RSXML/RSXMLParser.m @@ -118,9 +118,9 @@ }); } -/// @return @c YES if @c .xmlInputError is not @c nil. +/// @return @c YES if @c .xmlInputError is @c nil. - (BOOL)canParse { - return (self.xmlInputError != nil); + return (self.xmlInputError == nil); } @@ -150,10 +150,10 @@ if (!xmlParserClass) return NO; if (xmlParserClass != [self class]) { // && !_xmlInputError - RSXMLError current = [self getExpectedErrorForClass:[self class]]; - RSXMLError expected = [self getExpectedErrorForClass:xmlParserClass]; + RSXMLError current = [self getExpectedErrorForClass:xmlParserClass]; + RSXMLError expected = [self getExpectedErrorForClass:[self class]]; if (current != expected) { - _xmlInputError = RSXMLMakeErrorWrongParser(current, expected); + _xmlInputError = RSXMLMakeErrorWrongParser(expected, current); return NO; } } diff --git a/RSXMLTests/RSEntityTests.m b/RSXMLTests/RSEntityTests.m index 00e14bf..23eaa23 100644 --- a/RSXMLTests/RSEntityTests.m +++ b/RSXMLTests/RSEntityTests.m @@ -34,56 +34,56 @@ NSString *expectedResult = @"A&P"; - NSString *result = [@"A&P" rs_stringByDecodingHTMLEntities]; + NSString *result = [@"A&P" rsxml_stringByDecodingHTMLEntities]; XCTAssertEqualObjects(result, expectedResult); - result = [@"A&P" rs_stringByDecodingHTMLEntities]; + result = [@"A&P" rsxml_stringByDecodingHTMLEntities]; XCTAssertEqualObjects(result, expectedResult); - result = [@"A&P" rs_stringByDecodingHTMLEntities]; + result = [@"A&P" rsxml_stringByDecodingHTMLEntities]; XCTAssertEqualObjects(result, expectedResult); } - (void)testSingleEntity { - NSString *result = [@"∞" rs_stringByDecodingHTMLEntities]; + NSString *result = [@"∞" rsxml_stringByDecodingHTMLEntities]; XCTAssertEqualObjects(result, @"∞"); - result = [@"&" rs_stringByDecodingHTMLEntities]; + result = [@"&" rsxml_stringByDecodingHTMLEntities]; XCTAssertEqualObjects(result, @"&"); - result = [@"’" rs_stringByDecodingHTMLEntities]; + result = [@"’" rsxml_stringByDecodingHTMLEntities]; XCTAssertEqualObjects(result, @"’"); } - (void)testNotEntities { NSString *s = @"&&\t\nFoo & Bar &0; Baz & 1238 4948 More things &foobar;&"; - XCTAssertEqualObjects([s rs_stringByDecodingHTMLEntities], s); + XCTAssertEqualObjects([s rsxml_stringByDecodingHTMLEntities], s); } - (void)testURLs { NSString *s = @"http://www.nytimes.com/2015/09/05/us/at-west-point-annual-pillow-fight-becomes-weaponized.html?mwrsm=Email&_r=1&pagewanted=all"; NSString *expectedResult = @"http://www.nytimes.com/2015/09/05/us/at-west-point-annual-pillow-fight-becomes-weaponized.html?mwrsm=Email&_r=1&pagewanted=all"; - XCTAssertEqualObjects([s rs_stringByDecodingHTMLEntities], expectedResult); + XCTAssertEqualObjects([s rsxml_stringByDecodingHTMLEntities], expectedResult); } - (void)testEntityPlusWhitespace { NSString *s = @"∞ Permalink"; NSString *expectedResult = @"∞ Permalink"; - XCTAssertEqualObjects([s rs_stringByDecodingHTMLEntities], expectedResult); + XCTAssertEqualObjects([s rsxml_stringByDecodingHTMLEntities], expectedResult); } - (void)testNonBreakingSpace { NSString *s = @"   -- just some spaces"; NSString *expectedResult = [NSString stringWithFormat:@"%C%C -- just some spaces", 160, 160]; - XCTAssertEqualObjects([s rs_stringByDecodingHTMLEntities], expectedResult); + XCTAssertEqualObjects([s rsxml_stringByDecodingHTMLEntities], expectedResult); } - (void)test39encoding { NSString *s = @"These are the times that try men's souls."; NSString *expectedResult = @"These are the times that try men's souls."; - XCTAssertEqualObjects([s rs_stringByDecodingHTMLEntities], expectedResult); + XCTAssertEqualObjects([s rsxml_stringByDecodingHTMLEntities], expectedResult); } @end diff --git a/RSXMLTests/RSXMLTests.m b/RSXMLTests/RSXMLTests.m index 94b1b9a..352fbc1 100644 --- a/RSXMLTests/RSXMLTests.m +++ b/RSXMLTests/RSXMLTests.m @@ -95,9 +95,8 @@ RSXMLData *xmlData = [self xmlFile:@"OneFootTsunami" extension:@"atom"]; XCTAssertEqual(xmlData.parserClass, [RSAtomParser class]); - RSFeedParser *parser = [RSFeedParser parserWithXMLData:xmlData]; NSError *error = nil; - RSParsedFeed *parsedFeed = [parser parseSync:&error]; + RSParsedFeed *parsedFeed = [[xmlData getParser] parseSync:&error]; XCTAssertEqualObjects(parsedFeed.title, @"One Foot Tsunami"); XCTAssertEqualObjects(parsedFeed.subtitle, @"Slightly less disappointing than it sounds"); XCTAssertEqualObjects(parsedFeed.link, @"http://onefoottsunami.com"); @@ -237,6 +236,35 @@ #pragma mark - Variety Test & Other +- (void)testCorrectParserSelection { + RSXMLData *xmlData = [self xmlFile:@"OneFootTsunami" extension:@"atom"]; + RSFeedParser *rightParser = [RSFeedParser parserWithXMLData:xmlData]; + RSOPMLParser *wrongParser = [RSOPMLParser parserWithXMLData:xmlData]; + XCTAssertTrue([rightParser canParse]); + XCTAssertFalse([wrongParser canParse]); + NSError *error; + [rightParser parseSync:&error]; + XCTAssertNil(error); + [wrongParser parseSync:&error]; + XCTAssertNotNil(error); + XCTAssertEqual(error.code, RSXMLErrorExpectingOPML); + XCTAssertEqualObjects(error, RSXMLMakeErrorWrongParser(RSXMLErrorExpectingOPML, RSXMLErrorExpectingFeed)); + XCTAssertEqualObjects(error.localizedDescription, @"Can't parse XML. OPML data expected, but RSS or Atom feed found."); +} + +- (void)testDetermineParserClassPerformance { + + RSXMLData *xmlData = [self xmlFile:@"DaringFireball" extension:@"atom"]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wundeclared-selector" + [self measureBlock:^{ + for (NSInteger i = 0; i < 100; i++) { + [xmlData performSelector:@selector(determineParserClass)]; + } + }]; +#pragma clang diagnostic pop +} + - (void)testDownloadedFeeds { NSError *error = nil; int i = 0; @@ -268,17 +296,4 @@ XCTAssertNil(error); } -- (void)testDetermineParserClassPerformance { - - RSXMLData *xmlData = [self xmlFile:@"DaringFireball" extension:@"atom"]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wundeclared-selector" - [self measureBlock:^{ - for (NSInteger i = 0; i < 100; i++) { - [xmlData performSelector:@selector(determineParserClass)]; - } - }]; -#pragma clang diagnostic pop -} - @end