Get RSSParserTests working — comment out all the other tests which aren’t expected to work yet.
This commit is contained in:
parent
eeb27475de
commit
b23888a20b
@ -52,6 +52,7 @@ private extension RSSParser {
|
||||
|
||||
let saxParser = SAXParser(delegate: self, data: data)
|
||||
saxParser.parse()
|
||||
feed.articles = articles
|
||||
}
|
||||
|
||||
private struct XMLName {
|
||||
|
@ -7,101 +7,101 @@
|
||||
//
|
||||
|
||||
import XCTest
|
||||
import Parser
|
||||
import FeedParser
|
||||
|
||||
class AtomParserTests: XCTestCase {
|
||||
|
||||
func testDaringFireballPerformance() {
|
||||
|
||||
// 0.009 sec on my 2012 iMac.
|
||||
let d = parserData("DaringFireball", "atom", "http://daringfireball.net/") //It’s actually an Atom feed
|
||||
self.measure {
|
||||
let _ = try! FeedParser.parseSync(d)
|
||||
}
|
||||
}
|
||||
|
||||
func testAllThisPerformance() {
|
||||
|
||||
// 0.003 sec on my 2012 iMac.
|
||||
let d = parserData("allthis", "atom", "http://leancrew.com/all-this")
|
||||
self.measure {
|
||||
let _ = try! FeedParser.parseSync(d)
|
||||
}
|
||||
}
|
||||
|
||||
func testGettingHomePageLink() async {
|
||||
|
||||
let d = parserData("allthis", "atom", "http://leancrew.com/all-this")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
|
||||
XCTAssertTrue(parsedFeed.homePageURL == "http://leancrew.com/all-this")
|
||||
}
|
||||
|
||||
func testDaringFireball() async {
|
||||
|
||||
let d = parserData("DaringFireball", "atom", "http://daringfireball.net/") //It’s actually an Atom feed
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
|
||||
for article in parsedFeed.items {
|
||||
|
||||
XCTAssertNotNil(article.url)
|
||||
|
||||
XCTAssertTrue(article.uniqueID.hasPrefix("tag:daringfireball.net,2017:/"))
|
||||
|
||||
XCTAssertEqual(article.authors!.count, 1) // TODO: parse Atom authors
|
||||
let author = article.authors!.first!
|
||||
if author.name == "Daring Fireball Department of Commerce" {
|
||||
XCTAssertNil(author.url)
|
||||
}
|
||||
else {
|
||||
XCTAssertEqual(author.name, "John Gruber")
|
||||
XCTAssertEqual(author.url, "http://daringfireball.net/")
|
||||
}
|
||||
|
||||
XCTAssertNotNil(article.datePublished)
|
||||
XCTAssert(article.attachments == nil)
|
||||
|
||||
XCTAssertEqual(article.language, "en")
|
||||
}
|
||||
}
|
||||
|
||||
func test4fsodonlineAttachments() async {
|
||||
|
||||
// Thanks to Marco for finding me some Atom podcast feeds. Apparently they’re super-rare.
|
||||
|
||||
let d = parserData("4fsodonline", "atom", "http://4fsodonline.blogspot.com/")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
|
||||
for article in parsedFeed.items {
|
||||
|
||||
XCTAssertTrue(article.attachments!.count > 0)
|
||||
let attachment = article.attachments!.first!
|
||||
|
||||
XCTAssertTrue(attachment.url.hasPrefix("http://www.blogger.com/video-play.mp4?"))
|
||||
XCTAssertNil(attachment.sizeInBytes)
|
||||
XCTAssertEqual(attachment.mimeType!, "video/mp4")
|
||||
}
|
||||
}
|
||||
|
||||
func testExpertOpinionENTAttachments() async {
|
||||
|
||||
// Another from Marco.
|
||||
|
||||
let d = parserData("expertopinionent", "atom", "http://expertopinionent.typepad.com/my-blog/")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
|
||||
for article in parsedFeed.items {
|
||||
|
||||
guard let attachments = article.attachments else {
|
||||
continue
|
||||
}
|
||||
|
||||
XCTAssertEqual(attachments.count, 1)
|
||||
let attachment = attachments.first!
|
||||
|
||||
XCTAssertTrue(attachment.url.hasSuffix(".mp3"))
|
||||
XCTAssertNil(attachment.sizeInBytes)
|
||||
XCTAssertEqual(attachment.mimeType!, "audio/mpeg")
|
||||
}
|
||||
}
|
||||
}
|
||||
//class AtomParserTests: XCTestCase {
|
||||
//
|
||||
// func testDaringFireballPerformance() {
|
||||
//
|
||||
// // 0.009 sec on my 2012 iMac.
|
||||
// let d = parserData("DaringFireball", "atom", "http://daringfireball.net/") //It’s actually an Atom feed
|
||||
// self.measure {
|
||||
// let _ = try! FeedParser.parseSync(d)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func testAllThisPerformance() {
|
||||
//
|
||||
// // 0.003 sec on my 2012 iMac.
|
||||
// let d = parserData("allthis", "atom", "http://leancrew.com/all-this")
|
||||
// self.measure {
|
||||
// let _ = try! FeedParser.parseSync(d)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func testGettingHomePageLink() async {
|
||||
//
|
||||
// let d = parserData("allthis", "atom", "http://leancrew.com/all-this")
|
||||
// let parsedFeed = try! await FeedParser.parse(d)!
|
||||
//
|
||||
// XCTAssertTrue(parsedFeed.homePageURL == "http://leancrew.com/all-this")
|
||||
// }
|
||||
//
|
||||
// func testDaringFireball() async {
|
||||
//
|
||||
// let d = parserData("DaringFireball", "atom", "http://daringfireball.net/") //It’s actually an Atom feed
|
||||
// let parsedFeed = try! await FeedParser.parse(d)!
|
||||
//
|
||||
// for article in parsedFeed.items {
|
||||
//
|
||||
// XCTAssertNotNil(article.url)
|
||||
//
|
||||
// XCTAssertTrue(article.uniqueID.hasPrefix("tag:daringfireball.net,2017:/"))
|
||||
//
|
||||
// XCTAssertEqual(article.authors!.count, 1) // TODO: parse Atom authors
|
||||
// let author = article.authors!.first!
|
||||
// if author.name == "Daring Fireball Department of Commerce" {
|
||||
// XCTAssertNil(author.url)
|
||||
// }
|
||||
// else {
|
||||
// XCTAssertEqual(author.name, "John Gruber")
|
||||
// XCTAssertEqual(author.url, "http://daringfireball.net/")
|
||||
// }
|
||||
//
|
||||
// XCTAssertNotNil(article.datePublished)
|
||||
// XCTAssert(article.attachments == nil)
|
||||
//
|
||||
// XCTAssertEqual(article.language, "en")
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func test4fsodonlineAttachments() async {
|
||||
//
|
||||
// // Thanks to Marco for finding me some Atom podcast feeds. Apparently they’re super-rare.
|
||||
//
|
||||
// let d = parserData("4fsodonline", "atom", "http://4fsodonline.blogspot.com/")
|
||||
// let parsedFeed = try! await FeedParser.parse(d)!
|
||||
//
|
||||
// for article in parsedFeed.items {
|
||||
//
|
||||
// XCTAssertTrue(article.attachments!.count > 0)
|
||||
// let attachment = article.attachments!.first!
|
||||
//
|
||||
// XCTAssertTrue(attachment.url.hasPrefix("http://www.blogger.com/video-play.mp4?"))
|
||||
// XCTAssertNil(attachment.sizeInBytes)
|
||||
// XCTAssertEqual(attachment.mimeType!, "video/mp4")
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func testExpertOpinionENTAttachments() async {
|
||||
//
|
||||
// // Another from Marco.
|
||||
//
|
||||
// let d = parserData("expertopinionent", "atom", "http://expertopinionent.typepad.com/my-blog/")
|
||||
// let parsedFeed = try! await FeedParser.parse(d)!
|
||||
//
|
||||
// for article in parsedFeed.items {
|
||||
//
|
||||
// guard let attachments = article.attachments else {
|
||||
// continue
|
||||
// }
|
||||
//
|
||||
// XCTAssertEqual(attachments.count, 1)
|
||||
// let attachment = attachments.first!
|
||||
//
|
||||
// XCTAssertTrue(attachment.url.hasSuffix(".mp3"))
|
||||
// XCTAssertNil(attachment.sizeInBytes)
|
||||
// XCTAssertEqual(attachment.mimeType!, "audio/mpeg")
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
@ -7,41 +7,41 @@
|
||||
//
|
||||
|
||||
import XCTest
|
||||
import Parser
|
||||
import FeedParser
|
||||
|
||||
class EntityDecodingTests: XCTestCase {
|
||||
|
||||
func test39Decoding() {
|
||||
|
||||
// Bug found by Manton Reece — the ' entity was not getting decoded by NetNewsWire in JSON Feeds from micro.blog.
|
||||
|
||||
let s = "These are the times that try men's souls."
|
||||
let decoded = s.rsparser_stringByDecodingHTMLEntities()
|
||||
|
||||
XCTAssertEqual(decoded, "These are the times that try men's souls.")
|
||||
}
|
||||
|
||||
func testEntities() {
|
||||
var s = "…"
|
||||
var decoded = s.rsparser_stringByDecodingHTMLEntities()
|
||||
|
||||
XCTAssertEqual(decoded, "…")
|
||||
|
||||
s = "…"
|
||||
decoded = s.rsparser_stringByDecodingHTMLEntities()
|
||||
XCTAssertEqual(decoded, "…")
|
||||
|
||||
s = "'"
|
||||
decoded = s.rsparser_stringByDecodingHTMLEntities()
|
||||
XCTAssertEqual(decoded, "'")
|
||||
|
||||
s = "§"
|
||||
decoded = s.rsparser_stringByDecodingHTMLEntities()
|
||||
XCTAssertEqual(decoded, "§")
|
||||
|
||||
s = "£"
|
||||
decoded = s.rsparser_stringByDecodingHTMLEntities()
|
||||
XCTAssertEqual(decoded, "£")
|
||||
|
||||
}
|
||||
}
|
||||
//class EntityDecodingTests: XCTestCase {
|
||||
//
|
||||
// func test39Decoding() {
|
||||
//
|
||||
// // Bug found by Manton Reece — the ' entity was not getting decoded by NetNewsWire in JSON Feeds from micro.blog.
|
||||
//
|
||||
// let s = "These are the times that try men's souls."
|
||||
// let decoded = s.rsparser_stringByDecodingHTMLEntities()
|
||||
//
|
||||
// XCTAssertEqual(decoded, "These are the times that try men's souls.")
|
||||
// }
|
||||
//
|
||||
// func testEntities() {
|
||||
// var s = "…"
|
||||
// var decoded = s.rsparser_stringByDecodingHTMLEntities()
|
||||
//
|
||||
// XCTAssertEqual(decoded, "…")
|
||||
//
|
||||
// s = "…"
|
||||
// decoded = s.rsparser_stringByDecodingHTMLEntities()
|
||||
// XCTAssertEqual(decoded, "…")
|
||||
//
|
||||
// s = "'"
|
||||
// decoded = s.rsparser_stringByDecodingHTMLEntities()
|
||||
// XCTAssertEqual(decoded, "'")
|
||||
//
|
||||
// s = "§"
|
||||
// decoded = s.rsparser_stringByDecodingHTMLEntities()
|
||||
// XCTAssertEqual(decoded, "§")
|
||||
//
|
||||
// s = "£"
|
||||
// decoded = s.rsparser_stringByDecodingHTMLEntities()
|
||||
// XCTAssertEqual(decoded, "£")
|
||||
//
|
||||
// }
|
||||
//}
|
||||
|
@ -7,235 +7,235 @@
|
||||
//
|
||||
|
||||
import XCTest
|
||||
import Parser
|
||||
import ParserObjC
|
||||
import FeedParser
|
||||
import SAX
|
||||
|
||||
class FeedParserTypeTests: XCTestCase {
|
||||
|
||||
// MARK: HTML
|
||||
|
||||
func testDaringFireballHTMLType() {
|
||||
|
||||
let d = parserData("DaringFireball", "html", "http://daringfireball.net/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .notAFeed)
|
||||
}
|
||||
|
||||
func testFurboHTMLType() {
|
||||
|
||||
let d = parserData("furbo", "html", "http://furbo.org/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .notAFeed)
|
||||
}
|
||||
|
||||
func testInessentialHTMLType() {
|
||||
|
||||
let d = parserData("inessential", "html", "http://inessential.com/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .notAFeed)
|
||||
}
|
||||
|
||||
func testSixColorsHTMLType() {
|
||||
|
||||
let d = parserData("sixcolors", "html", "https://sixcolors.com/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .notAFeed)
|
||||
}
|
||||
|
||||
// MARK: RSS
|
||||
|
||||
func testEMarleyRSSType() {
|
||||
|
||||
let d = parserData("EMarley", "rss", "https://medium.com/@emarley")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .rss)
|
||||
}
|
||||
|
||||
func testScriptingNewsRSSType() {
|
||||
|
||||
let d = parserData("scriptingNews", "rss", "http://scripting.com/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .rss)
|
||||
}
|
||||
|
||||
func testKatieFloydRSSType() {
|
||||
|
||||
let d = parserData("KatieFloyd", "rss", "https://katiefloyd.com/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .rss)
|
||||
}
|
||||
|
||||
func testMantonRSSType() {
|
||||
|
||||
let d = parserData("manton", "rss", "http://manton.org/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .rss)
|
||||
}
|
||||
|
||||
func testDCRainmakerRSSType() {
|
||||
|
||||
let d = parserData("dcrainmaker", "xml", "https://www.dcrainmaker.com/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .rss)
|
||||
}
|
||||
|
||||
func testMacworldRSSType() {
|
||||
|
||||
let d = parserData("macworld", "rss", "https://www.macworld.com/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .rss)
|
||||
}
|
||||
|
||||
func testNatashaTheRobotRSSType() {
|
||||
|
||||
let d = parserData("natasha", "xml", "https://www.natashatherobot.com/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .rss)
|
||||
}
|
||||
|
||||
func testDontHitSaveRSSWithBOMType() {
|
||||
|
||||
let d = parserData("donthitsave", "xml", "http://donthitsave.com/donthitsavefeed.xml")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .rss)
|
||||
}
|
||||
|
||||
func testBioRDF() {
|
||||
let d = parserData("bio", "rdf", "http://connect.biorxiv.org/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .rss)
|
||||
}
|
||||
|
||||
func testPHPXML() {
|
||||
let d = parserData("phpxml", "rss", "https://www.fcutrecht.net/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .rss)
|
||||
}
|
||||
|
||||
// MARK: Atom
|
||||
|
||||
func testDaringFireballAtomType() {
|
||||
|
||||
// File extension is .rss, but it’s really an Atom feed.
|
||||
let d = parserData("DaringFireball", "rss", "http://daringfireball.net/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .atom)
|
||||
}
|
||||
|
||||
func testOneFootTsunamiAtomType() {
|
||||
|
||||
let d = parserData("OneFootTsunami", "atom", "http://onefoottsunami.com/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .atom)
|
||||
}
|
||||
|
||||
func testRussCoxAtomType() {
|
||||
let d = parserData("russcox", "atom", "https://research.swtch.com/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .atom)
|
||||
}
|
||||
|
||||
// MARK: RSS-in-JSON
|
||||
|
||||
func testScriptingNewsJSONType() {
|
||||
|
||||
let d = parserData("ScriptingNews", "json", "http://scripting.com/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .rssInJSON)
|
||||
}
|
||||
|
||||
// MARK: JSON Feed
|
||||
|
||||
func testInessentialJSONFeedType() {
|
||||
|
||||
let d = parserData("inessential", "json", "http://inessential.com/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .jsonFeed)
|
||||
}
|
||||
|
||||
func testAllThisJSONFeedType() {
|
||||
|
||||
let d = parserData("allthis", "json", "http://leancrew.com/allthis/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .jsonFeed)
|
||||
}
|
||||
|
||||
func testCurtJSONFeedType() {
|
||||
|
||||
let d = parserData("curt", "json", "http://curtclifton.net/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .jsonFeed)
|
||||
}
|
||||
|
||||
func testPixelEnvyJSONFeedType() {
|
||||
|
||||
let d = parserData("pxlnv", "json", "http://pxlnv.com/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .jsonFeed)
|
||||
}
|
||||
|
||||
func testRoseJSONFeedType() {
|
||||
|
||||
let d = parserData("rose", "json", "https://www.rosemaryorchard.com/")
|
||||
let type = feedType(d)
|
||||
XCTAssertTrue(type == .jsonFeed)
|
||||
}
|
||||
|
||||
// MARK: Unknown
|
||||
|
||||
func testPartialAllThisUnknownFeedType() {
|
||||
|
||||
// In the case of this feed, the partial data isn’t enough to detect that it’s a JSON Feed.
|
||||
// The type detector should return .unknown rather than .notAFeed.
|
||||
|
||||
let d = parserData("allthis-partial", "json", "http://leancrew.com/allthis/")
|
||||
let type = feedType(d, isPartialData: true)
|
||||
XCTAssertEqual(type, .unknown)
|
||||
}
|
||||
|
||||
// MARK: Performance
|
||||
|
||||
func testFeedTypePerformance() {
|
||||
|
||||
// 0.000 on my 2012 iMac.
|
||||
|
||||
let d = parserData("EMarley", "rss", "https://medium.com/@emarley")
|
||||
self.measure {
|
||||
let _ = feedType(d)
|
||||
}
|
||||
}
|
||||
|
||||
func testFeedTypePerformance2() {
|
||||
|
||||
// 0.000 on my 2012 iMac.
|
||||
|
||||
let d = parserData("inessential", "json", "http://inessential.com/")
|
||||
self.measure {
|
||||
let _ = feedType(d)
|
||||
}
|
||||
}
|
||||
|
||||
func testFeedTypePerformance3() {
|
||||
|
||||
// 0.000 on my 2012 iMac.
|
||||
|
||||
let d = parserData("DaringFireball", "html", "http://daringfireball.net/")
|
||||
self.measure {
|
||||
let _ = feedType(d)
|
||||
}
|
||||
}
|
||||
|
||||
func testFeedTypePerformance4() {
|
||||
|
||||
// 0.001 on my 2012 iMac.
|
||||
|
||||
let d = parserData("DaringFireball", "rss", "http://daringfireball.net/")
|
||||
self.measure {
|
||||
let _ = feedType(d)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
//class FeedParserTypeTests: XCTestCase {
|
||||
//
|
||||
// // MARK: HTML
|
||||
//
|
||||
// func testDaringFireballHTMLType() {
|
||||
//
|
||||
// let d = parserData("DaringFireball", "html", "http://daringfireball.net/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .notAFeed)
|
||||
// }
|
||||
//
|
||||
// func testFurboHTMLType() {
|
||||
//
|
||||
// let d = parserData("furbo", "html", "http://furbo.org/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .notAFeed)
|
||||
// }
|
||||
//
|
||||
// func testInessentialHTMLType() {
|
||||
//
|
||||
// let d = parserData("inessential", "html", "http://inessential.com/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .notAFeed)
|
||||
// }
|
||||
//
|
||||
// func testSixColorsHTMLType() {
|
||||
//
|
||||
// let d = parserData("sixcolors", "html", "https://sixcolors.com/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .notAFeed)
|
||||
// }
|
||||
//
|
||||
// // MARK: RSS
|
||||
//
|
||||
// func testEMarleyRSSType() {
|
||||
//
|
||||
// let d = parserData("EMarley", "rss", "https://medium.com/@emarley")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .rss)
|
||||
// }
|
||||
//
|
||||
// func testScriptingNewsRSSType() {
|
||||
//
|
||||
// let d = parserData("scriptingNews", "rss", "http://scripting.com/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .rss)
|
||||
// }
|
||||
//
|
||||
// func testKatieFloydRSSType() {
|
||||
//
|
||||
// let d = parserData("KatieFloyd", "rss", "https://katiefloyd.com/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .rss)
|
||||
// }
|
||||
//
|
||||
// func testMantonRSSType() {
|
||||
//
|
||||
// let d = parserData("manton", "rss", "http://manton.org/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .rss)
|
||||
// }
|
||||
//
|
||||
// func testDCRainmakerRSSType() {
|
||||
//
|
||||
// let d = parserData("dcrainmaker", "xml", "https://www.dcrainmaker.com/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .rss)
|
||||
// }
|
||||
//
|
||||
// func testMacworldRSSType() {
|
||||
//
|
||||
// let d = parserData("macworld", "rss", "https://www.macworld.com/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .rss)
|
||||
// }
|
||||
//
|
||||
// func testNatashaTheRobotRSSType() {
|
||||
//
|
||||
// let d = parserData("natasha", "xml", "https://www.natashatherobot.com/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .rss)
|
||||
// }
|
||||
//
|
||||
// func testDontHitSaveRSSWithBOMType() {
|
||||
//
|
||||
// let d = parserData("donthitsave", "xml", "http://donthitsave.com/donthitsavefeed.xml")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .rss)
|
||||
// }
|
||||
//
|
||||
// func testBioRDF() {
|
||||
// let d = parserData("bio", "rdf", "http://connect.biorxiv.org/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .rss)
|
||||
// }
|
||||
//
|
||||
// func testPHPXML() {
|
||||
// let d = parserData("phpxml", "rss", "https://www.fcutrecht.net/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .rss)
|
||||
// }
|
||||
//
|
||||
// // MARK: Atom
|
||||
//
|
||||
// func testDaringFireballAtomType() {
|
||||
//
|
||||
// // File extension is .rss, but it’s really an Atom feed.
|
||||
// let d = parserData("DaringFireball", "rss", "http://daringfireball.net/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .atom)
|
||||
// }
|
||||
//
|
||||
// func testOneFootTsunamiAtomType() {
|
||||
//
|
||||
// let d = parserData("OneFootTsunami", "atom", "http://onefoottsunami.com/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .atom)
|
||||
// }
|
||||
//
|
||||
// func testRussCoxAtomType() {
|
||||
// let d = parserData("russcox", "atom", "https://research.swtch.com/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .atom)
|
||||
// }
|
||||
//
|
||||
// // MARK: RSS-in-JSON
|
||||
//
|
||||
// func testScriptingNewsJSONType() {
|
||||
//
|
||||
// let d = parserData("ScriptingNews", "json", "http://scripting.com/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .rssInJSON)
|
||||
// }
|
||||
//
|
||||
// // MARK: JSON Feed
|
||||
//
|
||||
// func testInessentialJSONFeedType() {
|
||||
//
|
||||
// let d = parserData("inessential", "json", "http://inessential.com/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .jsonFeed)
|
||||
// }
|
||||
//
|
||||
// func testAllThisJSONFeedType() {
|
||||
//
|
||||
// let d = parserData("allthis", "json", "http://leancrew.com/allthis/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .jsonFeed)
|
||||
// }
|
||||
//
|
||||
// func testCurtJSONFeedType() {
|
||||
//
|
||||
// let d = parserData("curt", "json", "http://curtclifton.net/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .jsonFeed)
|
||||
// }
|
||||
//
|
||||
// func testPixelEnvyJSONFeedType() {
|
||||
//
|
||||
// let d = parserData("pxlnv", "json", "http://pxlnv.com/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .jsonFeed)
|
||||
// }
|
||||
//
|
||||
// func testRoseJSONFeedType() {
|
||||
//
|
||||
// let d = parserData("rose", "json", "https://www.rosemaryorchard.com/")
|
||||
// let type = feedType(d)
|
||||
// XCTAssertTrue(type == .jsonFeed)
|
||||
// }
|
||||
//
|
||||
// // MARK: Unknown
|
||||
//
|
||||
// func testPartialAllThisUnknownFeedType() {
|
||||
//
|
||||
// // In the case of this feed, the partial data isn’t enough to detect that it’s a JSON Feed.
|
||||
// // The type detector should return .unknown rather than .notAFeed.
|
||||
//
|
||||
// let d = parserData("allthis-partial", "json", "http://leancrew.com/allthis/")
|
||||
// let type = feedType(d, isPartialData: true)
|
||||
// XCTAssertEqual(type, .unknown)
|
||||
// }
|
||||
//
|
||||
// // MARK: Performance
|
||||
//
|
||||
// func testFeedTypePerformance() {
|
||||
//
|
||||
// // 0.000 on my 2012 iMac.
|
||||
//
|
||||
// let d = parserData("EMarley", "rss", "https://medium.com/@emarley")
|
||||
// self.measure {
|
||||
// let _ = feedType(d)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func testFeedTypePerformance2() {
|
||||
//
|
||||
// // 0.000 on my 2012 iMac.
|
||||
//
|
||||
// let d = parserData("inessential", "json", "http://inessential.com/")
|
||||
// self.measure {
|
||||
// let _ = feedType(d)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func testFeedTypePerformance3() {
|
||||
//
|
||||
// // 0.000 on my 2012 iMac.
|
||||
//
|
||||
// let d = parserData("DaringFireball", "html", "http://daringfireball.net/")
|
||||
// self.measure {
|
||||
// let _ = feedType(d)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func testFeedTypePerformance4() {
|
||||
//
|
||||
// // 0.001 on my 2012 iMac.
|
||||
//
|
||||
// let d = parserData("DaringFireball", "rss", "http://daringfireball.net/")
|
||||
// self.measure {
|
||||
// let _ = feedType(d)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//}
|
||||
|
||||
func parserData(_ filename: String, _ fileExtension: String, _ url: String) -> ParserData {
|
||||
let filename = "Resources/\(filename)"
|
||||
|
@ -7,37 +7,36 @@
|
||||
//
|
||||
|
||||
import XCTest
|
||||
import Parser
|
||||
import ParserObjC
|
||||
import FeedParser
|
||||
|
||||
class HTMLLinkTests: XCTestCase {
|
||||
|
||||
func testSixColorsPerformance() {
|
||||
|
||||
// 0.003 sec on my 2012 iMac
|
||||
let d = parserData("sixcolors", "html", "http://sixcolors.com/")
|
||||
self.measure {
|
||||
let _ = RSHTMLLinkParser.htmlLinks(with: d)
|
||||
}
|
||||
}
|
||||
|
||||
func testSixColorsLink() {
|
||||
|
||||
let d = parserData("sixcolors", "html", "http://sixcolors.com/")
|
||||
let links = RSHTMLLinkParser.htmlLinks(with: d)
|
||||
|
||||
let linkToFind = "https://www.theincomparable.com/theincomparable/290/index.php"
|
||||
let textToFind = "this week’s episode of The Incomparable"
|
||||
|
||||
var found = false
|
||||
for oneLink in links {
|
||||
if let urlString = oneLink.urlString, let text = oneLink.text, urlString == linkToFind, text == textToFind {
|
||||
found = true
|
||||
}
|
||||
}
|
||||
|
||||
XCTAssertTrue(found)
|
||||
XCTAssertEqual(links.count, 131)
|
||||
}
|
||||
|
||||
}
|
||||
//class HTMLLinkTests: XCTestCase {
|
||||
//
|
||||
// func testSixColorsPerformance() {
|
||||
//
|
||||
// // 0.003 sec on my 2012 iMac
|
||||
// let d = parserData("sixcolors", "html", "http://sixcolors.com/")
|
||||
// self.measure {
|
||||
// let _ = RSHTMLLinkParser.htmlLinks(with: d)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func testSixColorsLink() {
|
||||
//
|
||||
// let d = parserData("sixcolors", "html", "http://sixcolors.com/")
|
||||
// let links = RSHTMLLinkParser.htmlLinks(with: d)
|
||||
//
|
||||
// let linkToFind = "https://www.theincomparable.com/theincomparable/290/index.php"
|
||||
// let textToFind = "this week’s episode of The Incomparable"
|
||||
//
|
||||
// var found = false
|
||||
// for oneLink in links {
|
||||
// if let urlString = oneLink.urlString, let text = oneLink.text, urlString == linkToFind, text == textToFind {
|
||||
// found = true
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// XCTAssertTrue(found)
|
||||
// XCTAssertEqual(links.count, 131)
|
||||
// }
|
||||
//
|
||||
//}
|
||||
|
@ -7,148 +7,147 @@
|
||||
//
|
||||
|
||||
import XCTest
|
||||
import Parser
|
||||
import ParserObjC
|
||||
import FeedParser
|
||||
|
||||
class HTMLMetadataTests: XCTestCase {
|
||||
|
||||
func testDaringFireball() {
|
||||
|
||||
let d = parserData("DaringFireball", "html", "http://daringfireball.net/")
|
||||
let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
|
||||
XCTAssertEqual(metadata.favicons.first?.urlString, "http://daringfireball.net/graphics/favicon.ico?v=005")
|
||||
|
||||
XCTAssertEqual(metadata.feedLinks.count, 1)
|
||||
|
||||
let feedLink = metadata.feedLinks.first!
|
||||
XCTAssertNil(feedLink.title)
|
||||
XCTAssertEqual(feedLink.type, "application/atom+xml")
|
||||
XCTAssertEqual(feedLink.urlString, "http://daringfireball.net/feeds/main")
|
||||
}
|
||||
|
||||
func testDaringFireballPerformance() {
|
||||
|
||||
// 0.002 sec on my 2012 iMac
|
||||
let d = parserData("DaringFireball", "html", "http://daringfireball.net/")
|
||||
self.measure {
|
||||
let _ = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
}
|
||||
}
|
||||
|
||||
func testFurbo() {
|
||||
|
||||
let d = parserData("furbo", "html", "http://furbo.org/")
|
||||
let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
|
||||
XCTAssertEqual(metadata.favicons.first?.urlString, "http://furbo.org/favicon.ico")
|
||||
|
||||
XCTAssertEqual(metadata.feedLinks.count, 1)
|
||||
|
||||
let feedLink = metadata.feedLinks.first!
|
||||
XCTAssertEqual(feedLink.title, "Iconfactory News Feed")
|
||||
XCTAssertEqual(feedLink.type, "application/rss+xml")
|
||||
}
|
||||
|
||||
func testFurboPerformance() {
|
||||
|
||||
// 0.001 sec on my 2012 iMac
|
||||
let d = parserData("furbo", "html", "http://furbo.org/")
|
||||
self.measure {
|
||||
let _ = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
}
|
||||
}
|
||||
|
||||
func testInessential() {
|
||||
|
||||
let d = parserData("inessential", "html", "http://inessential.com/")
|
||||
let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
|
||||
XCTAssertNil(metadata.favicons.first?.urlString)
|
||||
|
||||
XCTAssertEqual(metadata.feedLinks.count, 1)
|
||||
let feedLink = metadata.feedLinks.first!
|
||||
XCTAssertEqual(feedLink.title, "RSS")
|
||||
XCTAssertEqual(feedLink.type, "application/rss+xml")
|
||||
XCTAssertEqual(feedLink.urlString, "http://inessential.com/xml/rss.xml")
|
||||
|
||||
XCTAssertEqual(metadata.appleTouchIcons.count, 0);
|
||||
}
|
||||
|
||||
func testInessentialPerformance() {
|
||||
|
||||
// 0.001 sec on my 2012 iMac
|
||||
let d = parserData("inessential", "html", "http://inessential.com/")
|
||||
self.measure {
|
||||
let _ = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
}
|
||||
}
|
||||
|
||||
func testCocoPerformance() {
|
||||
|
||||
// 0.004 sec on my 2012 iMac
|
||||
let d = parserData("coco", "html", "https://www.theatlantic.com/entertainment/archive/2017/11/coco-is-among-pixars-best-movies-in-years/546695/")
|
||||
self.measure {
|
||||
let _ = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
}
|
||||
}
|
||||
|
||||
func testSixColors() {
|
||||
|
||||
let d = parserData("sixcolors", "html", "http://sixcolors.com/")
|
||||
let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
|
||||
XCTAssertEqual(metadata.favicons.first?.urlString, "https://sixcolors.com/images/favicon.ico")
|
||||
|
||||
XCTAssertEqual(metadata.feedLinks.count, 1);
|
||||
let feedLink = metadata.feedLinks.first!
|
||||
XCTAssertEqual(feedLink.title, "RSS");
|
||||
XCTAssertEqual(feedLink.type, "application/rss+xml");
|
||||
XCTAssertEqual(feedLink.urlString, "http://feedpress.me/sixcolors");
|
||||
|
||||
XCTAssertEqual(metadata.appleTouchIcons.count, 6);
|
||||
let icon = metadata.appleTouchIcons[3];
|
||||
XCTAssertEqual(icon.rel, "apple-touch-icon");
|
||||
XCTAssertEqual(icon.sizes, "120x120");
|
||||
XCTAssertEqual(icon.urlString, "https://sixcolors.com/apple-touch-icon-120.png");
|
||||
}
|
||||
|
||||
func testSixColorsPerformance() {
|
||||
|
||||
// 0.002 sec on my 2012 iMac
|
||||
let d = parserData("sixcolors", "html", "http://sixcolors.com/")
|
||||
self.measure {
|
||||
let _ = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
}
|
||||
}
|
||||
|
||||
func testCocoOGImage() {
|
||||
|
||||
let d = parserData("coco", "html", "https://www.theatlantic.com/entertainment/archive/2017/11/coco-is-among-pixars-best-movies-in-years/546695/")
|
||||
let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
let openGraphData = metadata.openGraphProperties
|
||||
let image = openGraphData.images.first!
|
||||
XCTAssert(image.url == "https://cdn.theatlantic.com/assets/media/img/mt/2017/11/1033101_first_full_length_trailer_arrives_pixars_coco/facebook.jpg?1511382177")
|
||||
}
|
||||
|
||||
func testCocoTwitterImage() {
|
||||
|
||||
let d = parserData("coco", "html", "https://www.theatlantic.com/entertainment/archive/2017/11/coco-is-among-pixars-best-movies-in-years/546695/")
|
||||
let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
let twitterData = metadata.twitterProperties
|
||||
let imageURL = twitterData.imageURL!
|
||||
XCTAssert(imageURL == "https://cdn.theatlantic.com/assets/media/img/mt/2017/11/1033101_first_full_length_trailer_arrives_pixars_coco/facebook.jpg?1511382177")
|
||||
}
|
||||
|
||||
func testYouTube() {
|
||||
// YouTube is a special case — the feed links appear after the head section, in the body section.
|
||||
let d = parserData("YouTubeTheVolvoRocks", "html", "https://www.youtube.com/user/TheVolvorocks")
|
||||
let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
|
||||
XCTAssertEqual(metadata.feedLinks.count, 1);
|
||||
let feedLink = metadata.feedLinks.first!
|
||||
XCTAssertEqual(feedLink.title, "RSS");
|
||||
XCTAssertEqual(feedLink.type, "application/rss+xml");
|
||||
XCTAssertEqual(feedLink.urlString, "https://www.youtube.com/feeds/videos.xml?channel_id=UCct7QF2jcWRY6dhXWMSq9LQ");
|
||||
}
|
||||
}
|
||||
//class HTMLMetadataTests: XCTestCase {
|
||||
//
|
||||
// func testDaringFireball() {
|
||||
//
|
||||
// let d = parserData("DaringFireball", "html", "http://daringfireball.net/")
|
||||
// let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
//
|
||||
// XCTAssertEqual(metadata.favicons.first?.urlString, "http://daringfireball.net/graphics/favicon.ico?v=005")
|
||||
//
|
||||
// XCTAssertEqual(metadata.feedLinks.count, 1)
|
||||
//
|
||||
// let feedLink = metadata.feedLinks.first!
|
||||
// XCTAssertNil(feedLink.title)
|
||||
// XCTAssertEqual(feedLink.type, "application/atom+xml")
|
||||
// XCTAssertEqual(feedLink.urlString, "http://daringfireball.net/feeds/main")
|
||||
// }
|
||||
//
|
||||
// func testDaringFireballPerformance() {
|
||||
//
|
||||
// // 0.002 sec on my 2012 iMac
|
||||
// let d = parserData("DaringFireball", "html", "http://daringfireball.net/")
|
||||
// self.measure {
|
||||
// let _ = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func testFurbo() {
|
||||
//
|
||||
// let d = parserData("furbo", "html", "http://furbo.org/")
|
||||
// let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
//
|
||||
// XCTAssertEqual(metadata.favicons.first?.urlString, "http://furbo.org/favicon.ico")
|
||||
//
|
||||
// XCTAssertEqual(metadata.feedLinks.count, 1)
|
||||
//
|
||||
// let feedLink = metadata.feedLinks.first!
|
||||
// XCTAssertEqual(feedLink.title, "Iconfactory News Feed")
|
||||
// XCTAssertEqual(feedLink.type, "application/rss+xml")
|
||||
// }
|
||||
//
|
||||
// func testFurboPerformance() {
|
||||
//
|
||||
// // 0.001 sec on my 2012 iMac
|
||||
// let d = parserData("furbo", "html", "http://furbo.org/")
|
||||
// self.measure {
|
||||
// let _ = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func testInessential() {
|
||||
//
|
||||
// let d = parserData("inessential", "html", "http://inessential.com/")
|
||||
// let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
//
|
||||
// XCTAssertNil(metadata.favicons.first?.urlString)
|
||||
//
|
||||
// XCTAssertEqual(metadata.feedLinks.count, 1)
|
||||
// let feedLink = metadata.feedLinks.first!
|
||||
// XCTAssertEqual(feedLink.title, "RSS")
|
||||
// XCTAssertEqual(feedLink.type, "application/rss+xml")
|
||||
// XCTAssertEqual(feedLink.urlString, "http://inessential.com/xml/rss.xml")
|
||||
//
|
||||
// XCTAssertEqual(metadata.appleTouchIcons.count, 0);
|
||||
// }
|
||||
//
|
||||
// func testInessentialPerformance() {
|
||||
//
|
||||
// // 0.001 sec on my 2012 iMac
|
||||
// let d = parserData("inessential", "html", "http://inessential.com/")
|
||||
// self.measure {
|
||||
// let _ = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func testCocoPerformance() {
|
||||
//
|
||||
// // 0.004 sec on my 2012 iMac
|
||||
// let d = parserData("coco", "html", "https://www.theatlantic.com/entertainment/archive/2017/11/coco-is-among-pixars-best-movies-in-years/546695/")
|
||||
// self.measure {
|
||||
// let _ = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func testSixColors() {
|
||||
//
|
||||
// let d = parserData("sixcolors", "html", "http://sixcolors.com/")
|
||||
// let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
//
|
||||
// XCTAssertEqual(metadata.favicons.first?.urlString, "https://sixcolors.com/images/favicon.ico")
|
||||
//
|
||||
// XCTAssertEqual(metadata.feedLinks.count, 1);
|
||||
// let feedLink = metadata.feedLinks.first!
|
||||
// XCTAssertEqual(feedLink.title, "RSS");
|
||||
// XCTAssertEqual(feedLink.type, "application/rss+xml");
|
||||
// XCTAssertEqual(feedLink.urlString, "http://feedpress.me/sixcolors");
|
||||
//
|
||||
// XCTAssertEqual(metadata.appleTouchIcons.count, 6);
|
||||
// let icon = metadata.appleTouchIcons[3];
|
||||
// XCTAssertEqual(icon.rel, "apple-touch-icon");
|
||||
// XCTAssertEqual(icon.sizes, "120x120");
|
||||
// XCTAssertEqual(icon.urlString, "https://sixcolors.com/apple-touch-icon-120.png");
|
||||
// }
|
||||
//
|
||||
// func testSixColorsPerformance() {
|
||||
//
|
||||
// // 0.002 sec on my 2012 iMac
|
||||
// let d = parserData("sixcolors", "html", "http://sixcolors.com/")
|
||||
// self.measure {
|
||||
// let _ = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func testCocoOGImage() {
|
||||
//
|
||||
// let d = parserData("coco", "html", "https://www.theatlantic.com/entertainment/archive/2017/11/coco-is-among-pixars-best-movies-in-years/546695/")
|
||||
// let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
// let openGraphData = metadata.openGraphProperties
|
||||
// let image = openGraphData.images.first!
|
||||
// XCTAssert(image.url == "https://cdn.theatlantic.com/assets/media/img/mt/2017/11/1033101_first_full_length_trailer_arrives_pixars_coco/facebook.jpg?1511382177")
|
||||
// }
|
||||
//
|
||||
// func testCocoTwitterImage() {
|
||||
//
|
||||
// let d = parserData("coco", "html", "https://www.theatlantic.com/entertainment/archive/2017/11/coco-is-among-pixars-best-movies-in-years/546695/")
|
||||
// let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
// let twitterData = metadata.twitterProperties
|
||||
// let imageURL = twitterData.imageURL!
|
||||
// XCTAssert(imageURL == "https://cdn.theatlantic.com/assets/media/img/mt/2017/11/1033101_first_full_length_trailer_arrives_pixars_coco/facebook.jpg?1511382177")
|
||||
// }
|
||||
//
|
||||
// func testYouTube() {
|
||||
// // YouTube is a special case — the feed links appear after the head section, in the body section.
|
||||
// let d = parserData("YouTubeTheVolvoRocks", "html", "https://www.youtube.com/user/TheVolvorocks")
|
||||
// let metadata = RSHTMLMetadataParser.htmlMetadata(with: d)
|
||||
//
|
||||
// XCTAssertEqual(metadata.feedLinks.count, 1);
|
||||
// let feedLink = metadata.feedLinks.first!
|
||||
// XCTAssertEqual(feedLink.title, "RSS");
|
||||
// XCTAssertEqual(feedLink.type, "application/rss+xml");
|
||||
// XCTAssertEqual(feedLink.urlString, "https://www.youtube.com/feeds/videos.xml?channel_id=UCct7QF2jcWRY6dhXWMSq9LQ");
|
||||
// }
|
||||
//}
|
||||
|
@ -7,118 +7,118 @@
|
||||
//
|
||||
|
||||
import XCTest
|
||||
import Parser
|
||||
import FeedParser
|
||||
|
||||
class JSONFeedParserTests: XCTestCase {
|
||||
|
||||
func testInessentialPerformance() {
|
||||
|
||||
// 0.001 sec on my 2012 iMac.
|
||||
let d = parserData("inessential", "json", "http://inessential.com/")
|
||||
self.measure {
|
||||
let _ = try! FeedParser.parseSync(d)
|
||||
}
|
||||
}
|
||||
|
||||
func testDaringFireballPerformance() {
|
||||
|
||||
// 0.009 sec on my 2012 iMac.
|
||||
let d = parserData("DaringFireball", "json", "http://daringfireball.net/")
|
||||
self.measure {
|
||||
let _ = try! FeedParser.parseSync(d)
|
||||
}
|
||||
}
|
||||
|
||||
func testGettingFaviconAndIconURLs() async {
|
||||
|
||||
let d = parserData("DaringFireball", "json", "http://daringfireball.net/")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
|
||||
XCTAssert(parsedFeed.faviconURL == "https://daringfireball.net/graphics/favicon-64.png")
|
||||
XCTAssert(parsedFeed.iconURL == "https://daringfireball.net/graphics/apple-touch-icon.png")
|
||||
}
|
||||
|
||||
func testAllThis() async {
|
||||
|
||||
let d = parserData("allthis", "json", "http://leancrew.com/allthis/")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
|
||||
XCTAssertEqual(parsedFeed.items.count, 12)
|
||||
}
|
||||
|
||||
func testCurt() async {
|
||||
|
||||
let d = parserData("curt", "json", "http://curtclifton.net/")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
|
||||
XCTAssertEqual(parsedFeed.items.count, 26)
|
||||
|
||||
var didFindTwitterQuitterArticle = false
|
||||
for article in parsedFeed.items {
|
||||
if article.title == "Twitter Quitter" {
|
||||
didFindTwitterQuitterArticle = true
|
||||
XCTAssertTrue(article.contentHTML!.hasPrefix("<p>I’ve decided to close my Twitter account. William Van Hecke <a href=\"https://tinyletter.com/fet/letters/microcosmographia-xlxi-reasons-to-stay-on-twitter\">makes a convincing case</a>"))
|
||||
}
|
||||
}
|
||||
|
||||
XCTAssertTrue(didFindTwitterQuitterArticle)
|
||||
}
|
||||
|
||||
func testPixelEnvy() async {
|
||||
|
||||
let d = parserData("pxlnv", "json", "http://pxlnv.com/")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
XCTAssertEqual(parsedFeed.items.count, 20)
|
||||
|
||||
}
|
||||
|
||||
func testRose() async {
|
||||
let d = parserData("rose", "json", "http://www.rosemaryorchard.com/")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
XCTAssertEqual(parsedFeed.items.count, 84)
|
||||
}
|
||||
|
||||
func test3960() async {
|
||||
let d = parserData("3960", "json", "http://journal.3960.org/")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
XCTAssertEqual(parsedFeed.items.count, 20)
|
||||
XCTAssertEqual(parsedFeed.language, "de-DE")
|
||||
|
||||
for item in parsedFeed.items {
|
||||
XCTAssertEqual(item.language, "de-DE")
|
||||
}
|
||||
}
|
||||
|
||||
func testAuthors() async {
|
||||
let d = parserData("authors", "json", "https://example.com/")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
XCTAssertEqual(parsedFeed.items.count, 4)
|
||||
|
||||
let rootAuthors = Set([
|
||||
ParsedAuthor(name: "Root Author 1", url: nil, avatarURL: nil, emailAddress: nil),
|
||||
ParsedAuthor(name: "Root Author 2", url: nil, avatarURL: nil, emailAddress: nil)
|
||||
])
|
||||
let itemAuthors = Set([
|
||||
ParsedAuthor(name: "Item Author 1", url: nil, avatarURL: nil, emailAddress: nil),
|
||||
ParsedAuthor(name: "Item Author 2", url: nil, avatarURL: nil, emailAddress: nil)
|
||||
])
|
||||
let legacyItemAuthors = Set([
|
||||
ParsedAuthor(name: "Legacy Item Author", url: nil, avatarURL: nil, emailAddress: nil)
|
||||
])
|
||||
|
||||
XCTAssertEqual(parsedFeed.authors?.count, 2)
|
||||
XCTAssertEqual(parsedFeed.authors, rootAuthors)
|
||||
|
||||
let noAuthorsItem = parsedFeed.items.first { $0.uniqueID == "Item without authors" }!
|
||||
XCTAssertEqual(noAuthorsItem.authors, nil)
|
||||
|
||||
let legacyAuthorItem = parsedFeed.items.first { $0.uniqueID == "Item with legacy author" }!
|
||||
XCTAssertEqual(legacyAuthorItem.authors, legacyItemAuthors)
|
||||
|
||||
let modernAuthorsItem = parsedFeed.items.first { $0.uniqueID == "Item with modern authors" }!
|
||||
XCTAssertEqual(modernAuthorsItem.authors, itemAuthors)
|
||||
|
||||
let bothAuthorsItem = parsedFeed.items.first { $0.uniqueID == "Item with both" }!
|
||||
XCTAssertEqual(bothAuthorsItem.authors, itemAuthors)
|
||||
}
|
||||
}
|
||||
//class JSONFeedParserTests: XCTestCase {
|
||||
//
|
||||
// func testInessentialPerformance() {
|
||||
//
|
||||
// // 0.001 sec on my 2012 iMac.
|
||||
// let d = parserData("inessential", "json", "http://inessential.com/")
|
||||
// self.measure {
|
||||
// let _ = try! FeedParser.parseSync(d)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func testDaringFireballPerformance() {
|
||||
//
|
||||
// // 0.009 sec on my 2012 iMac.
|
||||
// let d = parserData("DaringFireball", "json", "http://daringfireball.net/")
|
||||
// self.measure {
|
||||
// let _ = try! FeedParser.parseSync(d)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func testGettingFaviconAndIconURLs() async {
|
||||
//
|
||||
// let d = parserData("DaringFireball", "json", "http://daringfireball.net/")
|
||||
// let parsedFeed = try! await FeedParser.parse(d)!
|
||||
//
|
||||
// XCTAssert(parsedFeed.faviconURL == "https://daringfireball.net/graphics/favicon-64.png")
|
||||
// XCTAssert(parsedFeed.iconURL == "https://daringfireball.net/graphics/apple-touch-icon.png")
|
||||
// }
|
||||
//
|
||||
// func testAllThis() async {
|
||||
//
|
||||
// let d = parserData("allthis", "json", "http://leancrew.com/allthis/")
|
||||
// let parsedFeed = try! await FeedParser.parse(d)!
|
||||
//
|
||||
// XCTAssertEqual(parsedFeed.items.count, 12)
|
||||
// }
|
||||
//
|
||||
// func testCurt() async {
|
||||
//
|
||||
// let d = parserData("curt", "json", "http://curtclifton.net/")
|
||||
// let parsedFeed = try! await FeedParser.parse(d)!
|
||||
//
|
||||
// XCTAssertEqual(parsedFeed.items.count, 26)
|
||||
//
|
||||
// var didFindTwitterQuitterArticle = false
|
||||
// for article in parsedFeed.items {
|
||||
// if article.title == "Twitter Quitter" {
|
||||
// didFindTwitterQuitterArticle = true
|
||||
// XCTAssertTrue(article.contentHTML!.hasPrefix("<p>I’ve decided to close my Twitter account. William Van Hecke <a href=\"https://tinyletter.com/fet/letters/microcosmographia-xlxi-reasons-to-stay-on-twitter\">makes a convincing case</a>"))
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// XCTAssertTrue(didFindTwitterQuitterArticle)
|
||||
// }
|
||||
//
|
||||
// func testPixelEnvy() async {
|
||||
//
|
||||
// let d = parserData("pxlnv", "json", "http://pxlnv.com/")
|
||||
// let parsedFeed = try! await FeedParser.parse(d)!
|
||||
// XCTAssertEqual(parsedFeed.items.count, 20)
|
||||
//
|
||||
// }
|
||||
//
|
||||
// func testRose() async {
|
||||
// let d = parserData("rose", "json", "http://www.rosemaryorchard.com/")
|
||||
// let parsedFeed = try! await FeedParser.parse(d)!
|
||||
// XCTAssertEqual(parsedFeed.items.count, 84)
|
||||
// }
|
||||
//
|
||||
// func test3960() async {
|
||||
// let d = parserData("3960", "json", "http://journal.3960.org/")
|
||||
// let parsedFeed = try! await FeedParser.parse(d)!
|
||||
// XCTAssertEqual(parsedFeed.items.count, 20)
|
||||
// XCTAssertEqual(parsedFeed.language, "de-DE")
|
||||
//
|
||||
// for item in parsedFeed.items {
|
||||
// XCTAssertEqual(item.language, "de-DE")
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func testAuthors() async {
|
||||
// let d = parserData("authors", "json", "https://example.com/")
|
||||
// let parsedFeed = try! await FeedParser.parse(d)!
|
||||
// XCTAssertEqual(parsedFeed.items.count, 4)
|
||||
//
|
||||
// let rootAuthors = Set([
|
||||
// ParsedAuthor(name: "Root Author 1", url: nil, avatarURL: nil, emailAddress: nil),
|
||||
// ParsedAuthor(name: "Root Author 2", url: nil, avatarURL: nil, emailAddress: nil)
|
||||
// ])
|
||||
// let itemAuthors = Set([
|
||||
// ParsedAuthor(name: "Item Author 1", url: nil, avatarURL: nil, emailAddress: nil),
|
||||
// ParsedAuthor(name: "Item Author 2", url: nil, avatarURL: nil, emailAddress: nil)
|
||||
// ])
|
||||
// let legacyItemAuthors = Set([
|
||||
// ParsedAuthor(name: "Legacy Item Author", url: nil, avatarURL: nil, emailAddress: nil)
|
||||
// ])
|
||||
//
|
||||
// XCTAssertEqual(parsedFeed.authors?.count, 2)
|
||||
// XCTAssertEqual(parsedFeed.authors, rootAuthors)
|
||||
//
|
||||
// let noAuthorsItem = parsedFeed.items.first { $0.uniqueID == "Item without authors" }!
|
||||
// XCTAssertEqual(noAuthorsItem.authors, nil)
|
||||
//
|
||||
// let legacyAuthorItem = parsedFeed.items.first { $0.uniqueID == "Item with legacy author" }!
|
||||
// XCTAssertEqual(legacyAuthorItem.authors, legacyItemAuthors)
|
||||
//
|
||||
// let modernAuthorsItem = parsedFeed.items.first { $0.uniqueID == "Item with modern authors" }!
|
||||
// XCTAssertEqual(modernAuthorsItem.authors, itemAuthors)
|
||||
//
|
||||
// let bothAuthorsItem = parsedFeed.items.first { $0.uniqueID == "Item with both" }!
|
||||
// XCTAssertEqual(bothAuthorsItem.authors, itemAuthors)
|
||||
// }
|
||||
//}
|
||||
|
@ -1,5 +1,5 @@
|
||||
import XCTest
|
||||
@testable import Parser
|
||||
import FeedParser
|
||||
|
||||
final class ParserTests: XCTestCase {
|
||||
func testExample() throws {
|
||||
|
@ -7,22 +7,22 @@
|
||||
//
|
||||
|
||||
import XCTest
|
||||
import Parser
|
||||
import FeedParser
|
||||
|
||||
class RSSInJSONParserTests: XCTestCase {
|
||||
|
||||
func testScriptingNewsPerformance() {
|
||||
|
||||
// 0.003 sec on my 2012 iMac.
|
||||
let d = parserData("ScriptingNews", "json", "http://scripting.com/")
|
||||
self.measure {
|
||||
let _ = try! FeedParser.parseSync(d)
|
||||
}
|
||||
}
|
||||
|
||||
func testFeedLanguage() {
|
||||
let d = parserData("ScriptingNews", "json", "http://scripting.com/")
|
||||
let parsedFeed = try! FeedParser.parseSync(d)!
|
||||
XCTAssertEqual(parsedFeed.language, "en-us")
|
||||
}
|
||||
}
|
||||
//class RSSInJSONParserTests: XCTestCase {
|
||||
//
|
||||
// func testScriptingNewsPerformance() {
|
||||
//
|
||||
// // 0.003 sec on my 2012 iMac.
|
||||
// let d = parserData("ScriptingNews", "json", "http://scripting.com/")
|
||||
// self.measure {
|
||||
// let _ = try! FeedParser.parseSync(d)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func testFeedLanguage() {
|
||||
// let d = parserData("ScriptingNews", "json", "http://scripting.com/")
|
||||
// let parsedFeed = try! FeedParser.parseSync(d)!
|
||||
// XCTAssertEqual(parsedFeed.language, "en-us")
|
||||
// }
|
||||
//}
|
||||
|
@ -7,7 +7,7 @@
|
||||
//
|
||||
|
||||
import XCTest
|
||||
import Parser
|
||||
import FeedParser
|
||||
|
||||
class RSSParserTests: XCTestCase {
|
||||
|
||||
@ -17,7 +17,7 @@ class RSSParserTests: XCTestCase {
|
||||
// 0.002 2022 Mac Studio
|
||||
let d = parserData("scriptingNews", "rss", "http://scripting.com/")
|
||||
self.measure {
|
||||
let _ = try! FeedParser.parseSync(d)
|
||||
let _ = try! FeedParser.parse(d)
|
||||
}
|
||||
}
|
||||
|
||||
@ -27,7 +27,7 @@ class RSSParserTests: XCTestCase {
|
||||
// 0.001 2022 Mac Studio
|
||||
let d = parserData("KatieFloyd", "rss", "http://katiefloyd.com/")
|
||||
self.measure {
|
||||
let _ = try! FeedParser.parseSync(d)
|
||||
let _ = try! FeedParser.parse(d)
|
||||
}
|
||||
}
|
||||
|
||||
@ -37,7 +37,7 @@ class RSSParserTests: XCTestCase {
|
||||
// 0.0004 2022 Mac Studio
|
||||
let d = parserData("EMarley", "rss", "https://medium.com/@emarley")
|
||||
self.measure {
|
||||
let _ = try! FeedParser.parseSync(d)
|
||||
let _ = try! FeedParser.parse(d)
|
||||
}
|
||||
}
|
||||
|
||||
@ -47,21 +47,23 @@ class RSSParserTests: XCTestCase {
|
||||
// 0.0006 2022 Mac Studio
|
||||
let d = parserData("manton", "rss", "http://manton.org/")
|
||||
self.measure {
|
||||
let _ = try! FeedParser.parseSync(d)
|
||||
let _ = try! FeedParser.parse(d)
|
||||
}
|
||||
}
|
||||
|
||||
func testNatashaTheRobot() async {
|
||||
|
||||
let d = parserData("natasha", "xml", "https://www.natashatherobot.com/")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
let parsedFeed = try! FeedParser.parse(d)!
|
||||
XCTAssertEqual(parsedFeed.items.count, 10)
|
||||
}
|
||||
|
||||
func testTheOmniShowAttachments() async {
|
||||
|
||||
let d = parserData("theomnishow", "rss", "https://theomnishow.omnigroup.com/")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
let parsedFeed = try! FeedParser.parse(d)!
|
||||
|
||||
XCTAssertTrue(parsedFeed.items.count > 0)
|
||||
|
||||
for article in parsedFeed.items {
|
||||
XCTAssertNotNil(article.attachments)
|
||||
@ -78,7 +80,9 @@ class RSSParserTests: XCTestCase {
|
||||
func testTheOmniShowUniqueIDs() async {
|
||||
|
||||
let d = parserData("theomnishow", "rss", "https://theomnishow.omnigroup.com/")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
let parsedFeed = try! FeedParser.parse(d)!
|
||||
|
||||
XCTAssertTrue(parsedFeed.items.count > 0)
|
||||
|
||||
for article in parsedFeed.items {
|
||||
XCTAssertNotNil(article.uniqueID)
|
||||
@ -91,7 +95,7 @@ class RSSParserTests: XCTestCase {
|
||||
// Macworld’s feed doesn’t have guids, so they should be calculated unique IDs.
|
||||
|
||||
let d = parserData("macworld", "rss", "https://www.macworld.com/")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
let parsedFeed = try! FeedParser.parse(d)!
|
||||
|
||||
for article in parsedFeed.items {
|
||||
XCTAssertNotNil(article.uniqueID)
|
||||
@ -104,7 +108,9 @@ class RSSParserTests: XCTestCase {
|
||||
// Macworld uses names instead of email addresses (despite the RSS spec saying they should be email addresses).
|
||||
|
||||
let d = parserData("macworld", "rss", "https://www.macworld.com/")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
let parsedFeed = try! FeedParser.parse(d)!
|
||||
|
||||
XCTAssertTrue(parsedFeed.items.count > 0)
|
||||
|
||||
for article in parsedFeed.items {
|
||||
|
||||
@ -123,7 +129,9 @@ class RSSParserTests: XCTestCase {
|
||||
// detect this situation, and every article in the feed should have a permalink.
|
||||
|
||||
let d = parserData("monkeydom", "rss", "https://coding.monkeydom.de/")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
let parsedFeed = try! FeedParser.parse(d)!
|
||||
|
||||
XCTAssertTrue(parsedFeed.items.count > 0)
|
||||
|
||||
for article in parsedFeed.items {
|
||||
XCTAssertNil(article.url)
|
||||
@ -136,7 +144,9 @@ class RSSParserTests: XCTestCase {
|
||||
// https://github.com/brentsimmons/NetNewsWire/issues/529
|
||||
|
||||
let d = parserData("atp", "rss", "http://atp.fm/")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
let parsedFeed = try! FeedParser.parse(d)!
|
||||
|
||||
XCTAssertTrue(parsedFeed.items.count > 0)
|
||||
|
||||
for article in parsedFeed.items {
|
||||
XCTAssertNotNil(article.contentHTML)
|
||||
@ -145,7 +155,10 @@ class RSSParserTests: XCTestCase {
|
||||
|
||||
func testFeedKnownToHaveGuidsThatArentPermalinks() async {
|
||||
let d = parserData("livemint", "xml", "https://www.livemint.com/rss/news")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
let parsedFeed = try! FeedParser.parse(d)!
|
||||
|
||||
XCTAssertTrue(parsedFeed.items.count > 0)
|
||||
|
||||
for article in parsedFeed.items {
|
||||
XCTAssertNil(article.url)
|
||||
}
|
||||
@ -155,7 +168,10 @@ class RSSParserTests: XCTestCase {
|
||||
// This feed uses atom authors, and we don’t want author/title to be used as item/title.
|
||||
// https://github.com/brentsimmons/NetNewsWire/issues/943
|
||||
let d = parserData("cloudblog", "rss", "https://cloudblog.withgoogle.com/")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
let parsedFeed = try! FeedParser.parse(d)!
|
||||
|
||||
XCTAssertTrue(parsedFeed.items.count > 0)
|
||||
|
||||
for article in parsedFeed.items {
|
||||
XCTAssertNotEqual(article.title, "Product Manager, Office of the CTO")
|
||||
XCTAssertNotEqual(article.title, "Developer Programs Engineer")
|
||||
@ -167,26 +183,29 @@ class RSSParserTests: XCTestCase {
|
||||
// This invalid feed has <image> elements inside <item>s.
|
||||
// 17 Jan 2021 bug report — we’re not parsing titles in this feed.
|
||||
let d = parserData("aktuality", "rss", "https://www.aktuality.sk/")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
for article in parsedFeed.items {
|
||||
let parsedFeed = try! FeedParser.parse(d)!
|
||||
|
||||
XCTAssertTrue(parsedFeed.items.count > 0)
|
||||
|
||||
for article in parsedFeed.items {
|
||||
XCTAssertNotNil(article.title)
|
||||
}
|
||||
}
|
||||
|
||||
func testFeedLanguage() async {
|
||||
let d = parserData("manton", "rss", "http://manton.org/")
|
||||
let parsedFeed = try! await FeedParser.parse(d)!
|
||||
let parsedFeed = try! FeedParser.parse(d)!
|
||||
XCTAssertEqual(parsedFeed.language, "en-US")
|
||||
}
|
||||
|
||||
// func testFeedWithGB2312Encoding() {
|
||||
// // This feed has an encoding we don’t run into very often.
|
||||
// // https://github.com/Ranchero-Software/NetNewsWire/issues/1477
|
||||
// let d = parserData("kc0011", "rss", "http://kc0011.net/")
|
||||
// let parsedFeed = try! FeedParser.parse(d)!
|
||||
// XCTAssert(parsedFeed.items.count > 0)
|
||||
// for article in parsedFeed.items {
|
||||
// XCTAssertNotNil(article.contentHTML)
|
||||
// }
|
||||
// }
|
||||
func testFeedWithGB2312Encoding() {
|
||||
// This feed has an encoding we don’t run into very often.
|
||||
// https://github.com/Ranchero-Software/NetNewsWire/issues/1477
|
||||
let d = parserData("kc0011", "rss", "http://kc0011.net/")
|
||||
let parsedFeed = try! FeedParser.parse(d)!
|
||||
XCTAssert(parsedFeed.items.count > 0)
|
||||
for article in parsedFeed.items {
|
||||
XCTAssertNotNil(article.contentHTML)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user