//
// RSHTMLTests.m
// RSXML
//
// Created by Brent Simmons on 3/5/16.
// Copyright © 2016 Ranchero Software, LLC. All rights reserved.
//
@import RSXML;
#import
@interface RSHTMLTests : XCTestCase
@end
@implementation RSHTMLTests
+ (RSXMLData *)xmlData:(NSString *)title urlString:(NSString *)urlString {
NSString *s = [[NSBundle bundleForClass:[self class]] pathForResource:title ofType:@"html"];
NSData *d = [[NSData alloc] initWithContentsOfFile:s];
return [[RSXMLData alloc] initWithData:d urlString:urlString];
}
+ (RSXMLData *)daringFireballData {
static RSXMLData *xmlData = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
xmlData = [self xmlData:@"DaringFireball" urlString:@"http://daringfireball.net/"];
});
return xmlData;
}
+ (RSXMLData *)furboData {
static RSXMLData *xmlData = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
xmlData = [self xmlData:@"furbo" urlString:@"http://furbo.org/"];
});
return xmlData;
}
+ (RSXMLData *)inessentialData {
static RSXMLData *xmlData = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
xmlData = [self xmlData:@"inessential" urlString:@"http://inessential.com/"];
});
return xmlData;
}
+ (RSXMLData *)sixcolorsData {
static RSXMLData *xmlData = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
xmlData = [self xmlData:@"sixcolors" urlString:@"https://sixcolors.com/"];
});
return xmlData;
}
- (void)testDaringFireball {
RSXMLData *xmlData = [[self class] daringFireballData];
RSHTMLMetadata *metadata = [RSHTMLMetadataParser HTMLMetadataWithXMLData:xmlData];
XCTAssertEqualObjects(metadata.faviconLink, @"http://daringfireball.net/graphics/favicon.ico?v=005");
XCTAssertTrue(metadata.feedLinks.count == 1);
RSHTMLMetadataFeedLink *feedLink = metadata.feedLinks[0];
XCTAssertNil(feedLink.title);
XCTAssertEqualObjects(feedLink.type, @"application/atom+xml");
XCTAssertEqualObjects(feedLink.urlString, @"http://daringfireball.net/feeds/main");
}
- (void)testDaringFireballPerformance {
RSXMLData *xmlData = [[self class] daringFireballData];
[self measureBlock:^{
(void)[RSHTMLMetadataParser HTMLMetadataWithXMLData:xmlData];
}];
}
- (void)testFurbo {
RSXMLData *xmlData = [[self class] furboData];
RSHTMLMetadata *metadata = [RSHTMLMetadataParser HTMLMetadataWithXMLData:xmlData];
XCTAssertEqualObjects(metadata.faviconLink, @"http://furbo.org/favicon.ico");
XCTAssertTrue(metadata.feedLinks.count == 1);
RSHTMLMetadataFeedLink *feedLink = metadata.feedLinks[0];
XCTAssertEqualObjects(feedLink.title, @"Iconfactory News Feed");
XCTAssertEqualObjects(feedLink.type, @"application/rss+xml");
}
- (void)testFurboPerformance {
RSXMLData *xmlData = [[self class] furboData];
[self measureBlock:^{
(void)[RSHTMLMetadataParser HTMLMetadataWithXMLData:xmlData];
}];
}
- (void)testInessential {
RSXMLData *xmlData = [[self class] inessentialData];
RSHTMLMetadata *metadata = [RSHTMLMetadataParser HTMLMetadataWithXMLData:xmlData];
XCTAssertNil(metadata.faviconLink);
XCTAssertTrue(metadata.feedLinks.count == 1);
RSHTMLMetadataFeedLink *feedLink = metadata.feedLinks[0];
XCTAssertEqualObjects(feedLink.title, @"RSS");
XCTAssertEqualObjects(feedLink.type, @"application/rss+xml");
XCTAssertEqualObjects(feedLink.urlString, @"http://inessential.com/xml/rss.xml");
XCTAssertEqual(metadata.appleTouchIcons.count, 0);
}
- (void)testInessentialPerformance {
RSXMLData *xmlData = [[self class] inessentialData];
[self measureBlock:^{
(void)[RSHTMLMetadataParser HTMLMetadataWithXMLData:xmlData];
}];
}
- (void)testSixcolors {
RSXMLData *xmlData = [[self class] sixcolorsData];
RSHTMLMetadata *metadata = [RSHTMLMetadataParser HTMLMetadataWithXMLData:xmlData];
XCTAssertEqualObjects(metadata.faviconLink, @"https://sixcolors.com/images/favicon.ico");
XCTAssertTrue(metadata.feedLinks.count == 1);
RSHTMLMetadataFeedLink *feedLink = metadata.feedLinks[0];
XCTAssertEqualObjects(feedLink.title, @"RSS");
XCTAssertEqualObjects(feedLink.type, @"application/rss+xml");
XCTAssertEqualObjects(feedLink.urlString, @"http://feedpress.me/sixcolors");
XCTAssertEqual(metadata.appleTouchIcons.count, 6);
RSHTMLMetadataAppleTouchIcon *icon = metadata.appleTouchIcons[3];
XCTAssertEqualObjects(icon.rel, @"apple-touch-icon");
XCTAssertEqualObjects(icon.sizes, @"120x120");
XCTAssertEqualObjects(icon.urlString, @"https://sixcolors.com/apple-touch-icon-120.png");
}
- (void)testSixcolorsPerformance {
RSXMLData *xmlData = [[self class] sixcolorsData];
[self measureBlock:^{
(void)[RSHTMLMetadataParser HTMLMetadataWithXMLData:xmlData];
}];
}
#pragma mark - Links
- (void)testSixColorsLinks {
RSXMLData *xmlData = [[self class] sixcolorsData];
NSArray *links = [RSHTMLLinkParser htmlLinksWithData:xmlData];
NSString *linkToFind = @"https://www.theincomparable.com/theincomparable/290/index.php";
NSString *textToFind = @"this week’s episode of The Incomparable";
BOOL found = NO;
for (RSHTMLLink *oneLink in links) {
if ([oneLink.urlString isEqualToString:linkToFind] && [oneLink.text isEqualToString:textToFind]) {
found = YES;
break;
}
}
XCTAssertTrue(found, @"Expected link should have been found.");
XCTAssertEqual(links.count, 131, @"Expected 131 links.");
}
- (void)testSixColorsLinksPerformance {
RSXMLData *xmlData = [[self class] sixcolorsData];
[self measureBlock:^{
(void)[RSHTMLLinkParser htmlLinksWithData:xmlData];
}];
}
@end