|
@@ -9,26 +9,90 @@
|
|
|
@testable import SwiftyMarkdown
|
|
|
import XCTest
|
|
|
|
|
|
-class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
+class SwiftyMarkdownStylingTests: SwiftyMarkdownCharacterTests {
|
|
|
|
|
|
- func testIsolatedCase() {
|
|
|
- let challenge = TokenTest(input: "\\~\\~removed\\~\\~crossed-out string. ~This should be ignored~", output: "~~removed~~crossed-out string. ~This should be ignored~", tokens: [
|
|
|
- Token(type: .string, inputString: "~~removed~~crossed-out string. ~This should be ignored~", characterStyles: [])
|
|
|
+ func off_testIsolatedCase() {
|
|
|
+
|
|
|
+ challenge = TokenTest(input: "*\\***\\****b*\\***\\****\\", output: "***b***\\", tokens : [
|
|
|
+ Token(type: .string, inputString: "*", characterStyles: [CharacterStyle.italic]),
|
|
|
+ Token(type: .string, inputString: "*b**", characterStyles: [CharacterStyle.bold, CharacterStyle.italic]),
|
|
|
+ Token(type: .string, inputString: "\\", characterStyles: [])
|
|
|
])
|
|
|
- let results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ results = self.attempt(challenge)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
+ XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
+ return
|
|
|
+
|
|
|
+ challenge = TokenTest(input: """
|
|
|
+ An asterisk: *
|
|
|
+ Line break
|
|
|
+ """, output: """
|
|
|
+ An asterisk: *
|
|
|
+ Line break
|
|
|
+ """, tokens: [
|
|
|
+ Token(type: .string, inputString: "An asterisk: *", characterStyles: []),
|
|
|
+ Token(type: .string, inputString: "Line break", characterStyles: [])
|
|
|
+ ])
|
|
|
+ results = self.attempt(challenge)
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count )
|
|
|
+ XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
+ XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
+
|
|
|
+ return
|
|
|
+
|
|
|
+ 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)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
+ XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
+ XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
+ if results.links.count == 1 {
|
|
|
+ XCTAssertEqual(results.links[0].metadataStrings.first, "https://www.neverendingvoyage.com/")
|
|
|
+ } else {
|
|
|
+ XCTFail("Incorrect link count. Expecting 1, found \(results.links.count)")
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ challenge = TokenTest(input: "A [referenced link][link]\n[notLink]: https://www.neverendingvoyage.com/", output: "A [referenced link][link]", tokens: [
|
|
|
+ Token(type: .string, inputString: "A [referenced link][link]", characterStyles: [])
|
|
|
+ ])
|
|
|
+ results = self.attempt(challenge, rules: [.links, .images, .referencedLinks])
|
|
|
+ XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
+ XCTAssertEqual(results.links.count, 0)
|
|
|
|
|
|
}
|
|
|
|
|
|
func testThatBoldTraitsAreRecognised() {
|
|
|
- var challenge = TokenTest(input: "**A bold string**", output: "A bold string", tokens: [
|
|
|
+ challenge = TokenTest(input: "**A bold string**", output: "A bold string", tokens: [
|
|
|
Token(type: .string, inputString: "A bold string", characterStyles: [CharacterStyle.bold])
|
|
|
])
|
|
|
- var results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ results = self.attempt(challenge)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
@@ -38,8 +102,14 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
Token(type: .string, inputString: " word", characterStyles: [])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
@@ -47,8 +117,29 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
Token(type: .string, inputString: "**A normal string**", characterStyles: [])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
+ XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
+ XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
+
|
|
|
+ challenge = TokenTest(input: "\\\\*\\*A normal \\\\ string\\*\\*", output: "\\**A normal \\\\ string**", tokens: [
|
|
|
+ Token(type: .string, inputString: "\\**A normal \\\\ string**", characterStyles: [])
|
|
|
+ ])
|
|
|
+ results = self.attempt(challenge)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
@@ -56,8 +147,14 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
Token(type: .string, inputString: "A string with double **escaped** asterisks", characterStyles: [])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
@@ -66,8 +163,14 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
Token(type: .string, inputString: "One escaped, one not at either end*", characterStyles: [CharacterStyle.italic]),
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
@@ -77,19 +180,31 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
Token(type: .string, inputString: " asterisk, one not at either end", characterStyles: [])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
}
|
|
|
|
|
|
func testThatCodeTraitsAreRecognised() {
|
|
|
- var challenge = TokenTest(input: "`Code (**should** not process internal tags)`", output: "Code (**should** not process internal tags)", tokens: [
|
|
|
- Token(type: .string, inputString: "Code (**should** not process internal tags) ", characterStyles: [CharacterStyle.code])
|
|
|
+ challenge = TokenTest(input: "`Code (**should** not process internal tags)`", output: "Code (**should** not process internal tags)", tokens: [
|
|
|
+ Token(type: .string, inputString: "Code (**should** not process internal tags)", characterStyles: [CharacterStyle.code])
|
|
|
])
|
|
|
- var results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ results = self.attempt(challenge)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
@@ -99,8 +214,14 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
Token(type: .string, inputString: " (should not be indented)", characterStyles: [])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
@@ -112,8 +233,14 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
Token(type: .string, inputString: "instances", characterStyles: [CharacterStyle.code])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
@@ -121,8 +248,14 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
Token(type: .string, inputString: "`A normal string`", characterStyles: [])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
@@ -130,8 +263,14 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
Token(type: .string, inputString: "A string with `escaped` backticks", characterStyles: [])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
@@ -139,20 +278,47 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
Token(type: .string, inputString: "A lonely backtick: `", characterStyles: [])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
+ XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
+ XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
+
|
|
|
+ challenge = TokenTest(input: "Two backticks followed by a full stop ``.", output: "Two backticks followed by a full stop ``.", tokens: [
|
|
|
+ Token(type: .string, inputString: "Two backticks followed by a full stop ``.", characterStyles: [])
|
|
|
+ ])
|
|
|
+ results = self.attempt(challenge)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
}
|
|
|
|
|
|
func testThatItalicTraitsAreParsedCorrectly() {
|
|
|
|
|
|
- var challenge = TokenTest(input: "*An italicised string*", output: "An italicised string", tokens : [
|
|
|
+ challenge = TokenTest(input: "*An italicised string*", output: "An italicised string", tokens : [
|
|
|
Token(type: .string, inputString: "An italicised string", characterStyles: [CharacterStyle.italic])
|
|
|
])
|
|
|
- var results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ results = self.attempt(challenge)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
@@ -162,8 +328,14 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
Token(type: .string, inputString: " text", characterStyles: [])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
@@ -178,8 +350,14 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
Token(type: .string, inputString: "styles", characterStyles: [CharacterStyle.italic])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
@@ -188,8 +366,14 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
Token(type: .string, inputString: "_A normal string_", characterStyles: [])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
@@ -197,8 +381,14 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
Token(type: .string, inputString: "A string with _escaped_ underscores", characterStyles: [])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
@@ -213,21 +403,26 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
Token(type: .string, inputString: "Line break", characterStyles: [])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count )
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
|
}
|
|
|
|
|
|
func testThatStrikethroughTraitsAreRecognised() {
|
|
|
- var challenge = TokenTest(input: "~~An~~A crossed-out string", output: "AnA crossed-out string", tokens: [
|
|
|
+ challenge = TokenTest(input: "~~An~~A crossed-out string", output: "AnA crossed-out string", tokens: [
|
|
|
Token(type: .string, inputString: "An", characterStyles: [CharacterStyle.strikethrough]),
|
|
|
Token(type: .string, inputString: "A crossed-out string", characterStyles: [])
|
|
|
])
|
|
|
- var results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ results = self.attempt(challenge)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
|
|
|
challenge = TokenTest(input: "A **Bold** string and a ~~removed~~crossed-out string", output: "A Bold string and a removedcrossed-out string", tokens: [
|
|
@@ -238,38 +433,56 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
Token(type: .string, inputString: "crossed-out string", characterStyles: [])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
|
|
|
challenge = TokenTest(input: "\\~\\~removed\\~\\~crossed-out string. ~This should be ignored~", output: "~~removed~~crossed-out string. ~This should be ignored~", tokens: [
|
|
|
Token(type: .string, inputString: "~~removed~~crossed-out string. ~This should be ignored~", characterStyles: [])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
|
|
|
}
|
|
|
|
|
|
func testThatMixedTraitsAreRecognised() {
|
|
|
|
|
|
- var challenge = TokenTest(input: "__A bold string__ with a **mix** **of** bold __styles__", output: "A bold string with a mix of bold styles", tokens : [
|
|
|
+ challenge = TokenTest(input: "__A bold string__ with a **mix** **of** bold __styles__", output: "A bold string with a mix of bold styles", tokens : [
|
|
|
Token(type: .string, inputString: "A bold string", characterStyles: [CharacterStyle.bold]),
|
|
|
- Token(type: .string, inputString: "with a ", characterStyles: []),
|
|
|
+ Token(type: .string, inputString: " with a ", characterStyles: []),
|
|
|
Token(type: .string, inputString: "mix", characterStyles: [CharacterStyle.bold]),
|
|
|
Token(type: .string, inputString: " ", characterStyles: []),
|
|
|
Token(type: .string, inputString: "of", characterStyles: [CharacterStyle.bold]),
|
|
|
Token(type: .string, inputString: " bold ", characterStyles: []),
|
|
|
Token(type: .string, inputString: "styles", characterStyles: [CharacterStyle.bold])
|
|
|
])
|
|
|
- var results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ results = self.attempt(challenge)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
|
- challenge = TokenTest(input: "_An italic string_, **follwed by a bold one**, `with some code`, \\*\\*and some\\*\\* \\_escaped\\_ \\`characters\\`, `ending` *with* __more__ variety.", output: "An italic string, follwed by a bold one, with some code, **and some** _escaped_ `characters`, ending with more variety.", tokens : [
|
|
|
+ challenge = TokenTest(input: "_An italic string_, **followed by a bold one**, `with some code`, \\*\\*and some\\*\\* \\_escaped\\_ \\`characters\\`, `ending` *with* __more__ variety.", output: "An italic string, followed by a bold one, with some code, **and some** _escaped_ `characters`, ending with more variety.", tokens : [
|
|
|
Token(type: .string, inputString: "An italic string", characterStyles: [CharacterStyle.italic]),
|
|
|
Token(type: .string, inputString: ", ", characterStyles: []),
|
|
|
Token(type: .string, inputString: "followed by a bold one", characterStyles: [CharacterStyle.bold]),
|
|
@@ -284,30 +497,103 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
Token(type: .string, inputString: " variety.", characterStyles: [])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
+ XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
+ XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
+ }
|
|
|
+
|
|
|
+ func testForExtremeEscapeCombinations() {
|
|
|
+
|
|
|
+ challenge = TokenTest(input: "\\****b\\****", output: "*b*", tokens : [
|
|
|
+ Token(type: .string, inputString: "*", characterStyles: []),
|
|
|
+ Token(type: .string, inputString: "b*", characterStyles: [CharacterStyle.bold, CharacterStyle.italic])
|
|
|
+ ])
|
|
|
+ results = self.attempt(challenge)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
+
|
|
|
+ challenge = TokenTest(input: "**\\**b*\\***", output: "*b*", tokens : [
|
|
|
+ Token(type: .string, inputString: "*", characterStyles: [CharacterStyle.bold]),
|
|
|
+ Token(type: .string, inputString: "b", characterStyles: [CharacterStyle.italic, CharacterStyle.bold]),
|
|
|
+ Token(type: .string, inputString: "*", characterStyles: [CharacterStyle.bold]),
|
|
|
+ ])
|
|
|
+ results = self.attempt(challenge)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
+ XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
+ XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
+
|
|
|
+// challenge = TokenTest(input: "Before *\\***\\****A bold string*\\***\\****\\ After", output: "Before ***A bold string***\\ After", tokens : [
|
|
|
+// Token(type: .string, inputString: "Before ", characterStyles: []),
|
|
|
+// Token(type: .string, inputString: "*", characterStyles: [CharacterStyle.italic]),
|
|
|
+// Token(type: .string, inputString: "**", characterStyles: [CharacterStyle.bold]),
|
|
|
+// Token(type: .string, inputString: "A bold string**", characterStyles: [CharacterStyle.bold, CharacterStyle.italic]),
|
|
|
+// Token(type: .string, inputString: "\\ After", characterStyles: [])
|
|
|
+// ])
|
|
|
+// results = self.attempt(challenge)
|
|
|
+// if results.stringTokens.count == challenge.tokens.count {
|
|
|
+// for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+// XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+// XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+// }
|
|
|
+// } else {
|
|
|
+// XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+// }
|
|
|
+// XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
+// XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
}
|
|
|
|
|
|
func testThatExtraCharactersAreHandles() {
|
|
|
- var challenge = TokenTest(input: "***A bold italic string***", output: "A bold italic string", tokens: [
|
|
|
+ challenge = TokenTest(input: "***A bold italic string***", output: "A bold italic string", tokens: [
|
|
|
Token(type: .string, inputString: "A bold italic string", characterStyles: [CharacterStyle.bold, CharacterStyle.italic])
|
|
|
])
|
|
|
- var results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ results = self.attempt(challenge)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
|
- challenge = TokenTest(input: "A string with a ****bold italic**** word", output: "A string with a *bold italic* word", tokens: [
|
|
|
+ challenge = TokenTest(input: "A string with a ****bold**** word", output: "A string with a bold word", tokens: [
|
|
|
Token(type: .string, inputString: "A string with a ", characterStyles: []),
|
|
|
- Token(type: .string, inputString: "*bold italic*", characterStyles: [CharacterStyle.bold, CharacterStyle.italic]),
|
|
|
+ Token(type: .string, inputString: "bold", characterStyles: [CharacterStyle.bold]),
|
|
|
Token(type: .string, inputString: " word", characterStyles: [])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
@@ -317,8 +603,14 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
Token(type: .string, inputString: " word", characterStyles: [])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
@@ -329,21 +621,64 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
Token(type: .string, inputString: " word", characterStyles: [])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
|
challenge = TokenTest(input: "A string with a **bold*italic*bold** word", output: "A string with a bolditalicbold word", tokens: [
|
|
|
Token(type: .string, inputString: "A string with a ", characterStyles: []),
|
|
|
Token(type: .string, inputString: "bold", characterStyles: [CharacterStyle.bold]),
|
|
|
- Token(type: .string, inputString: "italic", characterStyles: [CharacterStyle.bold, CharacterStyle.italic]),
|
|
|
+ Token(type: .string, inputString: "italic", characterStyles: [CharacterStyle.italic, CharacterStyle.bold]),
|
|
|
Token(type: .string, inputString: "bold", characterStyles: [CharacterStyle.bold]),
|
|
|
Token(type: .string, inputString: " word", characterStyles: [])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
+ XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
+ XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
+
|
|
|
+ challenge = TokenTest(input: "A string with ```code`", output: "A string with ```code`", tokens : [
|
|
|
+ Token(type: .string, inputString: "A string with ```code`", characterStyles: [])
|
|
|
+ ])
|
|
|
+ results = self.attempt(challenge)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
+ XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
+ XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
+
|
|
|
+ challenge = TokenTest(input: "A string with ```code```", output: "A string with code", tokens : [
|
|
|
+ Token(type: .string, inputString: "A string with ", characterStyles: []),
|
|
|
+ Token(type: .string, inputString: "code", characterStyles: [CharacterStyle.code])
|
|
|
+ ])
|
|
|
+ results = self.attempt(challenge)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
@@ -365,14 +700,20 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
|
|
|
func offtestAdvancedEscaping() {
|
|
|
|
|
|
- var challenge = TokenTest(input: "\\***A normal string*\\**", output: "**A normal string*", tokens: [
|
|
|
+ challenge = TokenTest(input: "\\***A normal string*\\**", output: "**A normal string*", tokens: [
|
|
|
Token(type: .string, inputString: "**", characterStyles: []),
|
|
|
Token(type: .string, inputString: "A normal string", characterStyles: [CharacterStyle.italic]),
|
|
|
Token(type: .string, inputString: "**", characterStyles: [])
|
|
|
])
|
|
|
- var results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ results = self.attempt(challenge)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
|
|
@@ -382,8 +723,14 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
Token(type: .string, inputString: "** asterisks", characterStyles: [])
|
|
|
])
|
|
|
results = self.attempt(challenge)
|
|
|
- XCTAssertEqual(challenge.tokens.count, results.stringTokens.count)
|
|
|
- XCTAssertEqual(results.tokens.map({ $0.outputString }).joined(), challenge.output)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
}
|
|
@@ -396,10 +743,9 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
let asteriskComma = "An asterisk followed by a full stop: *, *"
|
|
|
|
|
|
let backtickSpace = "A backtick followed by a space: `"
|
|
|
- let backtickFullStop = "Two backticks followed by a full stop: ``."
|
|
|
|
|
|
let underscoreSpace = "An underscore followed by a space: _"
|
|
|
-
|
|
|
+
|
|
|
let backtickComma = "A backtick followed by a space: `, `"
|
|
|
let underscoreComma = "An underscore followed by a space: _, _"
|
|
|
|
|
@@ -407,6 +753,7 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
let underscoreWithItalic = "An _italic_ word followed by an underscore _ "
|
|
|
|
|
|
var md = SwiftyMarkdown(string: backtickSpace)
|
|
|
+ SwiftyMarkdown.characterRules = self.defaultRules
|
|
|
XCTAssertEqual(md.attributedString().string, backtickSpace)
|
|
|
|
|
|
md = SwiftyMarkdown(string: underscoreSpace)
|
|
@@ -415,9 +762,6 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
md = SwiftyMarkdown(string: asteriskFullStop)
|
|
|
XCTAssertEqual(md.attributedString().string, asteriskFullStop)
|
|
|
|
|
|
- md = SwiftyMarkdown(string: backtickFullStop)
|
|
|
- XCTAssertEqual(md.attributedString().string, backtickFullStop)
|
|
|
-
|
|
|
md = SwiftyMarkdown(string: underscoreFullStop)
|
|
|
XCTAssertEqual(md.attributedString().string, underscoreFullStop)
|
|
|
|
|
@@ -441,6 +785,22 @@ class SwiftyMarkdownCharacterTests: XCTestCase {
|
|
|
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+ func testReportedCrashingStrings() {
|
|
|
+ challenge = TokenTest(input: "[**\\!bang**](https://duckduckgo.com/bang)", output: "\\!bang", tokens: [
|
|
|
+ Token(type: .string, inputString: "\\!bang", characterStyles: [CharacterStyle.link, CharacterStyle.bold])
|
|
|
+ ])
|
|
|
+ results = self.attempt(challenge)
|
|
|
+ if results.stringTokens.count == challenge.tokens.count {
|
|
|
+ for (idx, token) in results.stringTokens.enumerated() {
|
|
|
+ XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
|
|
|
+ XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as? [CharacterStyle])
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
|
|
|
+ }
|
|
|
+ XCTAssertEqual(results.foundStyles, results.expectedStyles)
|
|
|
+ XCTAssertEqual(results.attributedString.string, challenge.output)
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|