123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- //
- // SwiftyMarkdownCharacterTests.swift
- // SwiftyMarkdownTests
- //
- // Created by Simon Fairbairn on 17/12/2019.
- // Copyright © 2019 Voyage Travel Apps. All rights reserved.
- //
- @testable import SwiftyMarkdown
- import XCTest
- class SwiftyMarkdownLinkTests: SwiftyMarkdownCharacterTests {
-
- func testForLinks() {
-
- challenge = TokenTest(input: "[Link at start](http://voyagetravelapps.com/)", output: "Link at start", tokens: [
- Token(type: .string, inputString: "Link at start", characterStyles: [CharacterStyle.link])
- ])
- results = self.attempt(challenge)
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
- XCTAssertEqual(results.foundStyles, results.expectedStyles)
- XCTAssertEqual(results.attributedString.string, challenge.output)
- if let existentOpen = results.tokens.filter({ $0.type == .string && (($0.characterStyles as? [CharacterStyle])?.contains(.link) ?? false) }).first {
- XCTAssertEqual(existentOpen.metadataString, "http://voyagetravelapps.com/")
- } else {
- XCTFail("Failed to find an open link tag")
- }
-
- challenge = TokenTest(input: "A [Link](http://voyagetravelapps.com/)", output: "A Link", tokens: [
- Token(type: .string, inputString: "A ", characterStyles: []),
- Token(type: .string, inputString: "Link", characterStyles: [CharacterStyle.link])
- ])
- results = self.attempt(challenge)
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
- XCTAssertEqual(results.foundStyles, results.expectedStyles)
- XCTAssertEqual(results.attributedString.string, challenge.output)
-
-
- challenge = TokenTest(input: "[Link 1](http://voyagetravelapps.com/), [Link 2](https://www.neverendingvoyage.com/)", output: "Link 1, Link 2", tokens: [
- Token(type: .string, inputString: "Link 1", characterStyles: [CharacterStyle.link]),
- Token(type: .string, inputString: ", ", characterStyles: []),
- Token(type: .string, inputString: "Link 2", characterStyles: [CharacterStyle.link])
- ])
-
- results = self.attempt(challenge)
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
- XCTAssertEqual(results.foundStyles, results.expectedStyles)
- XCTAssertEqual(results.attributedString.string, challenge.output)
- var links = results.tokens.filter({ $0.type == .string && (($0.characterStyles as? [CharacterStyle])?.contains(.link) ?? false) })
-
- if links.count == 2 {
- XCTAssertEqual(links[0].metadataString, "http://voyagetravelapps.com/")
- XCTAssertEqual(links[1].metadataString, "https://www.neverendingvoyage.com/")
- } else {
- XCTFail("Incorrect number of links found. Expecting 2, found \(links.count)")
- }
-
- challenge = TokenTest(input: "Email us at [simon@voyagetravelapps.com](mailto:simon@voyagetravelapps.com) Twitter [@VoyageTravelApp](twitter://user?screen_name=VoyageTravelApp)", output: "Email us at simon@voyagetravelapps.com Twitter @VoyageTravelApp", tokens: [
- Token(type: .string, inputString: "Email us at ", characterStyles: []),
- Token(type: .string, inputString: "simon@voyagetravelapps.com", characterStyles: [CharacterStyle.link]),
- Token(type: .string, inputString: " Twitter", characterStyles: []),
- Token(type: .string, inputString: "@VoyageTravelApp", characterStyles: [CharacterStyle.link])
- ])
-
- results = self.attempt(challenge)
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
- XCTAssertEqual(results.foundStyles, results.expectedStyles)
- XCTAssertEqual(results.attributedString.string, challenge.output)
- links = results.tokens.filter({ $0.type == .string && (($0.characterStyles as? [CharacterStyle])?.contains(.link) ?? false) })
-
- if links.count == 2 {
- XCTAssertEqual(links[0].metadataString, "mailto:simon@voyagetravelapps.com")
- XCTAssertEqual(links[1].metadataString, "twitter://user?screen_name=VoyageTravelApp")
- } else {
- XCTFail("Incorrect number of links found. Expecting 2, found \(links.count)")
- }
-
-
- }
-
- func testMalformedLinks() {
-
- challenge = TokenTest(input: "[Link with missing parenthesis](http://voyagetravelapps.com/", output: "[Link with missing parenthesis](http://voyagetravelapps.com/", tokens: [
- Token(type: .string, inputString: "[Link with missing parenthesis](", characterStyles: []),
- Token(type: .string, inputString: "http://voyagetravelapps.com/", characterStyles: [])
- ])
- results = self.attempt(challenge)
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
- XCTAssertEqual(results.foundStyles, results.expectedStyles)
- XCTAssertEqual(results.attributedString.string, challenge.output)
-
- challenge = TokenTest(input: "A [Link](http://voyagetravelapps.com/", output: "A [Link](http://voyagetravelapps.com/", tokens: [
- Token(type: .string, inputString: "A ", characterStyles: []),
- Token(type: .string, inputString: "[Link](", characterStyles: []),
- Token(type: .string, inputString: "http://voyagetravelapps.com/", characterStyles: [])
- ])
- results = self.attempt(challenge)
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
- XCTAssertEqual(results.foundStyles, results.expectedStyles)
- XCTAssertEqual(results.attributedString.string, challenge.output)
-
- challenge = TokenTest(input: "[A link](((url)", output: "A link", tokens: [
- Token(type: .string, inputString: "A link", characterStyles: [CharacterStyle.link])
- ])
- rules = [
- CharacterRule(openTag: "", escapeCharacter: "\\", styles: [1 : [CharacterStyle.image]]),
- CharacterRule(openTag: "[", intermediateTag: "](", closingTag: ")", escapeCharacter: "\\", styles: [1 : [CharacterStyle.link]]),
- ]
- results = self.attempt(challenge, rules: rules)
-
-
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
- XCTAssertEqual(results.foundStyles, results.expectedStyles)
- XCTAssertEqual(results.attributedString.string, challenge.output)
- XCTAssertEqual(results.links.count, 1)
- if results.links.count == 1 {
- XCTAssertEqual(results.links[0].metadataString, "((url")
- } else {
- XCTFail("Incorrect link count. Expecting 1, found \(results.links.count)")
- }
-
- challenge = TokenTest(input: "[Link with missing square(http://voyagetravelapps.com/)", output: "[Link with missing square(http://voyagetravelapps.com/)", tokens: [
- Token(type: .string, inputString: "Link with missing square(http://voyagetravelapps.com/)", characterStyles: [])
- ])
- results = self.attempt(challenge)
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
- XCTAssertEqual(results.foundStyles, results.expectedStyles)
- XCTAssertEqual(results.attributedString.string, challenge.output)
-
- challenge = TokenTest(input: "[Link with [second opening](http://voyagetravelapps.com/)", output: "[Link with second opening", tokens: [
- Token(type: .string, inputString: "Link with ", characterStyles: []),
- Token(type: .string, inputString: "second opening", characterStyles: [CharacterStyle.link])
- ])
- results = self.attempt(challenge)
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
- XCTAssertEqual(results.foundStyles, results.expectedStyles)
- XCTAssertEqual(results.attributedString.string, challenge.output)
- XCTAssertEqual(results.links.count, 1)
- if results.links.count == 1 {
- XCTAssertEqual(results.links[0].metadataString, "http://voyagetravelapps.com/")
- } else {
- XCTFail("Incorrect link count. Expecting 1, found \(results.links.count)")
- }
-
- challenge = TokenTest(input: "A [Link(http://voyagetravelapps.com/)", output: "A [Link(http://voyagetravelapps.com/)", tokens: [
- Token(type: .string, inputString: "A [Link(http://voyagetravelapps.com/)", characterStyles: [])
- ])
- results = self.attempt(challenge)
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
- XCTAssertEqual(results.foundStyles, results.expectedStyles)
- XCTAssertEqual(results.attributedString.string, challenge.output)
-
- }
-
- func testLinksWithOtherStyles() {
- var challenge = TokenTest(input: "A **Bold [Link](http://voyagetravelapps.com/)**", output: "A Bold Link", tokens: [
- Token(type: .string, inputString: "A ", characterStyles: []),
- Token(type: .string, inputString: "Bold ", characterStyles: [CharacterStyle.bold]),
- Token(type: .string, inputString: "Link", characterStyles: [CharacterStyle.link, CharacterStyle.bold])
- ])
- var results = self.attempt(challenge)
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
- XCTAssertEqual(results.foundStyles, results.expectedStyles)
- // XCTAssertEqual(results.attributedString.string, challenge.output)
- var links = results.tokens.filter({ $0.type == .string && (($0.characterStyles as? [CharacterStyle])?.contains(.link) ?? false) })
- XCTAssertEqual(links.count, 1)
- if links.count == 1 {
- XCTAssertEqual(links[0].metadataString, "http://voyagetravelapps.com/")
- } else {
- XCTFail("Incorrect link count. Expecting 1, found \(links.count)")
- }
-
- challenge = TokenTest(input: "A Bold [**Link**](http://voyagetravelapps.com/)", output: "A Bold Link", tokens: [
- Token(type: .string, inputString: "A Bold ", characterStyles: []),
- Token(type: .string, inputString: "Link", characterStyles: [CharacterStyle.bold, CharacterStyle.link])
- ])
- results = self.attempt(challenge)
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
- XCTAssertEqual(results.foundStyles, results.expectedStyles)
- XCTAssertEqual(results.attributedString.string, challenge.output)
- links = results.tokens.filter({ $0.type == .string && (($0.characterStyles as? [CharacterStyle])?.contains(.link) ?? false) })
- XCTAssertEqual(links.count, 1)
- if links.count == 1 {
- XCTAssertEqual(links[0].metadataString, "http://voyagetravelapps.com/")
- } else {
- XCTFail("Incorrect link count. Expecting 1, found \(links.count)")
- }
-
- challenge = TokenTest(input: "[Link1](http://voyagetravelapps.com/) **bold** [Link2](http://voyagetravelapps.com/)", output: "Link1 bold Link2", tokens: [
- Token(type: .string, inputString: "Link1", characterStyles: [CharacterStyle.link]),
- Token(type: .string, inputString: " ", characterStyles: []),
- Token(type: .string, inputString: "bold", characterStyles: [CharacterStyle.bold]),
- Token(type: .string, inputString: " ", characterStyles: []),
- Token(type: .string, inputString: "Link2", characterStyles: [CharacterStyle.link])
- ])
- results = self.attempt(challenge)
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
- XCTAssertEqual(results.foundStyles, results.expectedStyles)
- XCTAssertEqual(results.attributedString.string, challenge.output)
- }
-
- func testForImages() {
- let challenge = TokenTest(input: "An ", output: "An Image", tokens: [
- Token(type: .string, inputString: "An Image", characterStyles: []),
- Token(type: .string, inputString: "", characterStyles: [CharacterStyle.image])
- ])
- let results = self.attempt(challenge)
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
- XCTAssertEqual(results.foundStyles, results.expectedStyles)
- let links = results.tokens.filter({ $0.type == .string && (($0.characterStyles as? [CharacterStyle])?.contains(.image) ?? false) })
- XCTAssertEqual(links.count, 1)
- if links.count == 1 {
- XCTAssertEqual(links[0].metadataString, "imageName")
- } else {
- XCTFail("Incorrect link count. Expecting 1, found \(links.count)")
- }
- }
-
- func testForReferencedLinks() {
- var challenge = TokenTest(input: "A [referenced link][link]\n[link]: https://www.neverendingvoyage.com/", output: "A referenced link", tokens: [
- Token(type: .string, inputString: "A ", characterStyles: []),
- Token(type: .string, inputString: "referenced link", characterStyles: [CharacterStyle.link])
- ])
- var results = self.attempt(challenge)
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
- XCTAssertEqual(results.foundStyles, results.expectedStyles)
- var links = results.tokens.filter({ $0.type == .string && (($0.characterStyles as? [CharacterStyle])?.contains(.link) ?? false) })
-
- if links.count == 1 {
- XCTAssertEqual(links[0].metadataString, "https://www.neverendingvoyage.com/")
- } else {
- XCTFail("Incorrect link count. Expecting 1, found \(links.count)")
- }
-
- challenge = TokenTest(input: "A [referenced link][link]\n [link]: https://www.neverendingvoyage.com/", output: "A referenced link", tokens: [
- Token(type: .string, inputString: "A ", characterStyles: []),
- Token(type: .string, inputString: "referenced link", characterStyles: [CharacterStyle.link])
- ])
- results = self.attempt(challenge)
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
- XCTAssertEqual(results.foundStyles, results.expectedStyles)
- links = results.tokens.filter({ $0.type == .string && (($0.characterStyles as? [CharacterStyle])?.contains(.link) ?? false) })
-
- if links.count == 1 {
- XCTAssertEqual(links[0].metadataString, "https://www.neverendingvoyage.com/")
- } else {
- XCTFail("Incorrect link count. Expecting 1, found \(links.count)")
- }
-
- }
-
-
- }
|