Fixed bugs: canParse & expected type error & html entities method name

This commit is contained in:
relikd
2019-01-15 22:08:23 +01:00
parent ca9452bc18
commit 8e5938972d
5 changed files with 53 additions and 38 deletions

View File

@@ -42,4 +42,4 @@ typedef NS_ERROR_ENUM(kRSXMLParserErrorDomain, RSXMLError) {
}; };
NSError * RSXMLMakeError(RSXMLError code); NSError * RSXMLMakeError(RSXMLError code);
NSError * RSXMLMakeErrorWrongParser(RSXMLError code, RSXMLError expected); NSError * RSXMLMakeErrorWrongParser(RSXMLError expected, RSXMLError other);

View File

@@ -36,8 +36,8 @@ const char * parserDescriptionForError(RSXMLError code) {
} }
} }
NSString * getErrorMessageForRSXMLError(RSXMLError code, RSXMLError expected); NSString * getErrorMessageForRSXMLError(RSXMLError code, RSXMLError other);
NSString * getErrorMessageForRSXMLError(RSXMLError code, RSXMLError expected) { NSString * getErrorMessageForRSXMLError(RSXMLError code, RSXMLError other) {
switch (code) { // switch statement will warn if an enum value is missing switch (code) { // switch statement will warn if an enum value is missing
case RSXMLErrorNoData: case RSXMLErrorNoData:
return @"Can't parse data. Empty data."; return @"Can't parse data. Empty data.";
@@ -53,7 +53,7 @@ NSString * getErrorMessageForRSXMLError(RSXMLError code, RSXMLError expected) {
case RSXMLErrorExpectingOPML: case RSXMLErrorExpectingOPML:
case RSXMLErrorExpectingFeed: case RSXMLErrorExpectingFeed:
return [NSString stringWithFormat:@"Can't parse XML. %s expected, but %s found.", 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); return RSXMLMakeErrorWrongParser(code, RSXMLErrorNoData);
} }
NSError * RSXMLMakeErrorWrongParser(RSXMLError code, RSXMLError expected) { NSError * RSXMLMakeErrorWrongParser(RSXMLError expected, RSXMLError other) {
return [NSError errorWithDomain:kRSXMLParserErrorDomain code:code return [NSError errorWithDomain:kRSXMLParserErrorDomain code:expected
userInfo:@{NSLocalizedDescriptionKey: getErrorMessageForRSXMLError(code, expected)}]; userInfo:@{NSLocalizedDescriptionKey: getErrorMessageForRSXMLError(expected, other)}];
} }

View File

@@ -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 { - (BOOL)canParse {
return (self.xmlInputError != nil); return (self.xmlInputError == nil);
} }
@@ -150,10 +150,10 @@
if (!xmlParserClass) if (!xmlParserClass)
return NO; return NO;
if (xmlParserClass != [self class]) { // && !_xmlInputError if (xmlParserClass != [self class]) { // && !_xmlInputError
RSXMLError current = [self getExpectedErrorForClass:[self class]]; RSXMLError current = [self getExpectedErrorForClass:xmlParserClass];
RSXMLError expected = [self getExpectedErrorForClass:xmlParserClass]; RSXMLError expected = [self getExpectedErrorForClass:[self class]];
if (current != expected) { if (current != expected) {
_xmlInputError = RSXMLMakeErrorWrongParser(current, expected); _xmlInputError = RSXMLMakeErrorWrongParser(expected, current);
return NO; return NO;
} }
} }

View File

@@ -34,56 +34,56 @@
NSString *expectedResult = @"A&P"; NSString *expectedResult = @"A&P";
NSString *result = [@"A&P" rs_stringByDecodingHTMLEntities]; NSString *result = [@"A&P" rsxml_stringByDecodingHTMLEntities];
XCTAssertEqualObjects(result, expectedResult); XCTAssertEqualObjects(result, expectedResult);
result = [@"A&P" rs_stringByDecodingHTMLEntities]; result = [@"A&P" rsxml_stringByDecodingHTMLEntities];
XCTAssertEqualObjects(result, expectedResult); XCTAssertEqualObjects(result, expectedResult);
result = [@"A&P" rs_stringByDecodingHTMLEntities]; result = [@"A&P" rsxml_stringByDecodingHTMLEntities];
XCTAssertEqualObjects(result, expectedResult); XCTAssertEqualObjects(result, expectedResult);
} }
- (void)testSingleEntity { - (void)testSingleEntity {
NSString *result = [@"∞" rs_stringByDecodingHTMLEntities]; NSString *result = [@"∞" rsxml_stringByDecodingHTMLEntities];
XCTAssertEqualObjects(result, @"∞"); XCTAssertEqualObjects(result, @"∞");
result = [@"&" rs_stringByDecodingHTMLEntities]; result = [@"&" rsxml_stringByDecodingHTMLEntities];
XCTAssertEqualObjects(result, @"&"); XCTAssertEqualObjects(result, @"&");
result = [@"’" rs_stringByDecodingHTMLEntities]; result = [@"’" rsxml_stringByDecodingHTMLEntities];
XCTAssertEqualObjects(result, @""); XCTAssertEqualObjects(result, @"");
} }
- (void)testNotEntities { - (void)testNotEntities {
NSString *s = @"&&\t\nFoo & Bar &0; Baz & 1238 4948 More things &foobar;&"; NSString *s = @"&&\t\nFoo & Bar &0; Baz & 1238 4948 More things &foobar;&";
XCTAssertEqualObjects([s rs_stringByDecodingHTMLEntities], s); XCTAssertEqualObjects([s rsxml_stringByDecodingHTMLEntities], s);
} }
- (void)testURLs { - (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 *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"; 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 { - (void)testEntityPlusWhitespace {
NSString *s = @"∞ Permalink"; NSString *s = @"∞ Permalink";
NSString *expectedResult = @"∞ Permalink"; NSString *expectedResult = @"∞ Permalink";
XCTAssertEqualObjects([s rs_stringByDecodingHTMLEntities], expectedResult); XCTAssertEqualObjects([s rsxml_stringByDecodingHTMLEntities], expectedResult);
} }
- (void)testNonBreakingSpace { - (void)testNonBreakingSpace {
NSString *s = @"   -- just some spaces"; NSString *s = @"   -- just some spaces";
NSString *expectedResult = [NSString stringWithFormat:@"%C%C -- just some spaces", 160, 160]; NSString *expectedResult = [NSString stringWithFormat:@"%C%C -- just some spaces", 160, 160];
XCTAssertEqualObjects([s rs_stringByDecodingHTMLEntities], expectedResult); XCTAssertEqualObjects([s rsxml_stringByDecodingHTMLEntities], expectedResult);
} }
- (void)test39encoding { - (void)test39encoding {
NSString *s = @"These are the times that try men's souls."; NSString *s = @"These are the times that try men's souls.";
NSString *expectedResult = @"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 @end

View File

@@ -95,9 +95,8 @@
RSXMLData *xmlData = [self xmlFile:@"OneFootTsunami" extension:@"atom"]; RSXMLData *xmlData = [self xmlFile:@"OneFootTsunami" extension:@"atom"];
XCTAssertEqual(xmlData.parserClass, [RSAtomParser class]); XCTAssertEqual(xmlData.parserClass, [RSAtomParser class]);
RSFeedParser *parser = [RSFeedParser parserWithXMLData:xmlData];
NSError *error = nil; NSError *error = nil;
RSParsedFeed *parsedFeed = [parser parseSync:&error]; RSParsedFeed *parsedFeed = [[xmlData getParser] parseSync:&error];
XCTAssertEqualObjects(parsedFeed.title, @"One Foot Tsunami"); XCTAssertEqualObjects(parsedFeed.title, @"One Foot Tsunami");
XCTAssertEqualObjects(parsedFeed.subtitle, @"Slightly less disappointing than it sounds"); XCTAssertEqualObjects(parsedFeed.subtitle, @"Slightly less disappointing than it sounds");
XCTAssertEqualObjects(parsedFeed.link, @"http://onefoottsunami.com"); XCTAssertEqualObjects(parsedFeed.link, @"http://onefoottsunami.com");
@@ -237,6 +236,35 @@
#pragma mark - Variety Test & Other #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 { - (void)testDownloadedFeeds {
NSError *error = nil; NSError *error = nil;
int i = 0; int i = 0;
@@ -268,17 +296,4 @@
XCTAssertNil(error); 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 @end