Fixed bugs: canParse & expected type error & html entities method name
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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)}];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user