@testable import Models import XCTest final class HTMLStringTests: XCTestCase { func testURLInit() throws { XCTAssertNil(URL(string: "", encodePath: true)) let simpleUrl = URL(string: "https://www.google.com", encodePath: true) XCTAssertEqual("https://www.google.com", simpleUrl?.absoluteString) let urlWithTrailingSlash = URL(string: "https://www.google.com/", encodePath: true) XCTAssertEqual("https://www.google.com/", urlWithTrailingSlash?.absoluteString) let extendedCharPath = URL(string: "https://en.wikipedia.org/wiki/Elbbrücken_station", encodePath: true) XCTAssertEqual("https://en.wikipedia.org/wiki/Elbbr%C3%BCcken_station", extendedCharPath?.absoluteString) let extendedCharQuery = URL(string: "http://test.com/blah/city?name=京都市", encodePath: true) XCTAssertEqual("http://test.com/blah/city?name=%E4%BA%AC%E9%83%BD%E5%B8%82", extendedCharQuery?.absoluteString) // Double encoding will happen if you ask to encodePath on an already encoded string let alreadyEncodedPath = URL(string: "https://en.wikipedia.org/wiki/Elbbr%C3%BCcken_station", encodePath: true) XCTAssertEqual("https://en.wikipedia.org/wiki/Elbbr%25C3%25BCcken_station", alreadyEncodedPath?.absoluteString) } func testHTMLStringInit() throws { let decoder = JSONDecoder() let basicContent = "\"

This is a test

\"" var htmlString = try decoder.decode(HTMLString.self, from: Data(basicContent.utf8)) XCTAssertEqual("This is a test", htmlString.asRawText) XCTAssertEqual("

This is a test

", htmlString.htmlValue) XCTAssertEqual("This is a test", htmlString.asMarkdown) XCTAssertEqual(0, htmlString.statusesURLs.count) XCTAssertEqual(0, htmlString.links.count) let basicLink = "\"

This is a test

\"" htmlString = try decoder.decode(HTMLString.self, from: Data(basicLink.utf8)) XCTAssertEqual("This is a test", htmlString.asRawText) XCTAssertEqual("

This is a test

", htmlString.htmlValue) XCTAssertEqual("This is a [test](https://test.com)", htmlString.asMarkdown) XCTAssertEqual(0, htmlString.statusesURLs.count) XCTAssertEqual(1, htmlString.links.count) XCTAssertEqual("https://test.com", htmlString.links[0].url.absoluteString) XCTAssertEqual("test", htmlString.links[0].displayString) let extendedCharLink = "\"

This is a test

\"" htmlString = try decoder.decode(HTMLString.self, from: Data(extendedCharLink.utf8)) XCTAssertEqual("This is a test", htmlString.asRawText) XCTAssertEqual("

This is a test

", htmlString.htmlValue) XCTAssertEqual("This is a [test](https://test.com/go%C3%9F%C3%AB%C3%B1a)", htmlString.asMarkdown) XCTAssertEqual(0, htmlString.statusesURLs.count) XCTAssertEqual(1, htmlString.links.count) XCTAssertEqual("https://test.com/go%C3%9F%C3%AB%C3%B1a", htmlString.links[0].url.absoluteString) XCTAssertEqual("test", htmlString.links[0].displayString) let alreadyEncodedLink = "\"

This is a test

\"" htmlString = try decoder.decode(HTMLString.self, from: Data(alreadyEncodedLink.utf8)) XCTAssertEqual("This is a test", htmlString.asRawText) XCTAssertEqual("

This is a test

", htmlString.htmlValue) XCTAssertEqual("This is a [test](https://test.com/go%C3%9F%C3%AB%C3%B1a)", htmlString.asMarkdown) XCTAssertEqual(0, htmlString.statusesURLs.count) XCTAssertEqual(1, htmlString.links.count) XCTAssertEqual("https://test.com/go%C3%9F%C3%AB%C3%B1a", htmlString.links[0].url.absoluteString) XCTAssertEqual("test", htmlString.links[0].displayString) } func testHTMLStringInit_markdownEscaping() throws { let decoder = JSONDecoder() let stdMarkdownContent = "\"

This [*is*] `a`\\n**test**

\"" var htmlString = try decoder.decode(HTMLString.self, from: Data(stdMarkdownContent.utf8)) XCTAssertEqual("This [*is*] `a`\n**test**", htmlString.asRawText) XCTAssertEqual("

This [*is*] `a`\n**test**

", htmlString.htmlValue) XCTAssertEqual("This \\[\\*is\\*] \\`a\\` \\*\\*test\\*\\*", htmlString.asMarkdown) let underscoreContent = "\"

This _is_ an :emoji_maybe:

\"" htmlString = try decoder.decode(HTMLString.self, from: Data(underscoreContent.utf8)) XCTAssertEqual("This _is_ an :emoji_maybe:", htmlString.asRawText) XCTAssertEqual("

This _is_ an :emoji_maybe:

", htmlString.htmlValue) XCTAssertEqual("This \\_is\\_ an :emoji_maybe:", htmlString.asMarkdown) let strikeContent = "\"

This ~is~ a\\n`test`

\"" htmlString = try decoder.decode(HTMLString.self, from: Data(strikeContent.utf8)) XCTAssertEqual("This ~is~ a\n`test`", htmlString.asRawText) XCTAssertEqual("

This ~is~ a\n`test`

", htmlString.htmlValue) XCTAssertEqual("This \\~is\\~ a \\`test\\`", htmlString.asMarkdown) } }