diff --git a/Frameworks/RSParser/OPML/RSOPMLItem.h b/Frameworks/RSParser/OPML/RSOPMLItem.h index e77ff008c..3a66d7e99 100755 --- a/Frameworks/RSParser/OPML/RSOPMLItem.h +++ b/Frameworks/RSParser/OPML/RSOPMLItem.h @@ -14,7 +14,7 @@ @interface RSOPMLItem : NSObject @property (nonatomic) NSDictionary *attributes; -@property (nonatomic) NSArray *children; +@property (nonatomic) NSArray *children; - (void)addChild:(RSOPMLItem *)child; diff --git a/Frameworks/RSParser/RSParserTests/OPMLTests.swift b/Frameworks/RSParser/RSParserTests/OPMLTests.swift index 768fb1b75..9d48e58da 100644 --- a/Frameworks/RSParser/RSParserTests/OPMLTests.swift +++ b/Frameworks/RSParser/RSParserTests/OPMLTests.swift @@ -11,12 +11,56 @@ import RSParser class OPMLTests: XCTestCase { + let subsData = parserData("Subs", "opml", "http://example.org/") + func testOPMLParsingPerformance() { - let d = parserData("Subs", "opml", "http://example.org/") + // 0.002 sec on my 2012 iMac. self.measure { - let _ = try! RSOPMLParser.parseOPML(with: d) + let _ = try! RSOPMLParser.parseOPML(with: self.subsData) } } + func testNotOPML() { + + let d = parserData("DaringFireball", "rss", "http://daringfireball.net/") + XCTAssertThrowsError(try RSOPMLParser.parseOPML(with: d)) + } + + func testSubsStructure() { + + let opmlDocument = try! RSOPMLParser.parseOPML(with: subsData) + recursivelyCheckOPMLStructure(opmlDocument) + } + + func recursivelyCheckOPMLStructure(_ item: RSOPMLItem) { + + let feedSpecifier = item.opmlFeedSpecifier + if !(item is RSOPMLDocument) { + XCTAssertNotNil((item.attributes as NSDictionary).opml_text) + } + + // If it has no children, it should have a feed specifier. The converse is also true. + var isFolder = item.children != nil && item.children.count > 0 + if !isFolder && (item.attributes as NSDictionary).opml_title == "Skip" { + isFolder = true + } + + if !isFolder { + XCTAssertNotNil(feedSpecifier!.title) + XCTAssertNotNil(feedSpecifier!.feedURL) + } + else { + XCTAssertNil(feedSpecifier) + if !(item is RSOPMLDocument) { + XCTAssertNotNil((item.attributes as NSDictionary).opml_title) + } + } + + if item.children != nil && item.children.count > 0 { + for oneItem in item.children { + recursivelyCheckOPMLStructure(oneItem) + } + } + } }