123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806 |
- //
- // 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 SwiftyMarkdownStylingTests: SwiftyMarkdownCharacterTests {
-
- 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: [])
- ])
- 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() {
- challenge = TokenTest(input: "**A bold string**", output: "A bold string", tokens: [
- Token(type: .string, inputString: "A bold string", 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: "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", characterStyles: [CharacterStyle.bold]),
- Token(type: .string, inputString: " word", 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 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)
-
- 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)
-
- challenge = TokenTest(input: "A string with double \\*\\*escaped\\*\\* asterisks", output: "A string with double **escaped** asterisks", tokens: [
- Token(type: .string, inputString: "A string with double **escaped** asterisks", 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: "\\**One escaped, one not at either end\\**", output: "*One escaped, one not at either end*", tokens: [
- Token(type: .string, inputString: "*", characterStyles: []),
- Token(type: .string, inputString: "One escaped, one not at either end*", characterStyles: [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: "A string with one \\**escaped\\** asterisk, one not at either end", output: "A string with one *escaped* asterisk, one not at either end", tokens: [
- Token(type: .string, inputString: "A string with one *", characterStyles: []),
- Token(type: .string, inputString: "escaped*", characterStyles: [CharacterStyle.italic]),
- Token(type: .string, inputString: " asterisk, one not at either end", 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 testThatCodeTraitsAreRecognised() {
- 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])
- ])
- 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` (should not be indented)", output: "A string with code (should not be indented)", tokens : [
- Token(type: .string, inputString: "A string with ", characterStyles: []),
- Token(type: .string, inputString: "code", characterStyles: [CharacterStyle.code]),
- Token(type: .string, inputString: " (should not be indented)", 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 code string` with multiple `code` `instances`", output: "A code string with multiple code instances", tokens : [
- Token(type: .string, inputString: "A code string", characterStyles: [CharacterStyle.code]),
- Token(type: .string, inputString: " with multiple ", characterStyles: []),
- Token(type: .string, inputString: "code", characterStyles: [CharacterStyle.code]),
- Token(type: .string, inputString: " ", characterStyles: []),
- Token(type: .string, inputString: "instances", 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)
-
- 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)
-
- challenge = TokenTest(input: "A string with \\`escaped\\` backticks", output: "A string with `escaped` backticks", tokens: [
- Token(type: .string, inputString: "A string with `escaped` backticks", 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 lonely backtick: `", output: "A lonely backtick: `", tokens: [
- Token(type: .string, inputString: "A lonely backtick: `", 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: "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() {
-
- challenge = TokenTest(input: "*An italicised string*", output: "An italicised string", tokens : [
- Token(type: .string, inputString: "An italicised string", characterStyles: [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: "A string with *italicised* text", output: "A string with italicised text", tokens : [
- Token(type: .string, inputString: "A string with ", characterStyles: []),
- Token(type: .string, inputString: "italicised", characterStyles: [CharacterStyle.italic]),
- Token(type: .string, inputString: " text", 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: "_An italic string_ with a *mix* _of_ italic *styles*", output: "An italic string with a mix of italic styles", tokens : [
- Token(type: .string, inputString: "An italic string", characterStyles: [CharacterStyle.italic]),
- Token(type: .string, inputString: " with a ", characterStyles: []),
- Token(type: .string, inputString: "mix", characterStyles: [CharacterStyle.italic]),
- Token(type: .string, inputString: " ", characterStyles: []),
- Token(type: .string, inputString: "of", characterStyles: [CharacterStyle.italic]),
- Token(type: .string, inputString: " italic ", characterStyles: []),
- Token(type: .string, inputString: "styles", characterStyles: [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: "\\_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)
-
- challenge = TokenTest(input: "A string with \\_escaped\\_ underscores", output: "A string with _escaped_ underscores", tokens: [
- Token(type: .string, inputString: "A string with _escaped_ underscores", 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: """
- 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)
-
- }
-
- func testThatStrikethroughTraitsAreRecognised() {
- 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: [])
- ])
- 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: [
- Token(type: .string, inputString: "A ", characterStyles: []),
- Token(type: .string, inputString: "Bold", characterStyles: [CharacterStyle.bold]),
- Token(type: .string, inputString: " string and a ", characterStyles: []),
- Token(type: .string, inputString: "removed", characterStyles: [CharacterStyle.strikethrough]),
- Token(type: .string, inputString: "crossed-out 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)
-
- 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)
- 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() {
-
- 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: "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])
- ])
- 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_, **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]),
- Token(type: .string, inputString: ", ", characterStyles: []),
- Token(type: .string, inputString: "with some code", characterStyles: [CharacterStyle.code]),
- Token(type: .string, inputString: ", **and some** _escaped_ `characters`, ", characterStyles: []),
- Token(type: .string, inputString: "ending", characterStyles: [CharacterStyle.code]),
- Token(type: .string, inputString: " ", characterStyles: []),
- Token(type: .string, inputString: "with", characterStyles: [CharacterStyle.italic]),
- Token(type: .string, inputString: " ", characterStyles: []),
- Token(type: .string, inputString: "more", characterStyles: [CharacterStyle.bold]),
- Token(type: .string, inputString: " variety.", 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 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() {
- 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])
- ])
- 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**** word", output: "A string with a bold word", tokens: [
- Token(type: .string, inputString: "A string with a ", characterStyles: []),
- Token(type: .string, inputString: "bold", characterStyles: [CharacterStyle.bold]),
- Token(type: .string, inputString: " word", 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 a ****bold italic*** word", output: "A string with a *bold italic 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: " word", 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 a ***bold** italic* word", output: "A string with a bold italic word", tokens: [
- Token(type: .string, inputString: "A string with a ", characterStyles: []),
- Token(type: .string, inputString: "bold", characterStyles: [CharacterStyle.bold, CharacterStyle.italic]),
- Token(type: .string, inputString: " italic", characterStyles: [CharacterStyle.italic]),
- Token(type: .string, inputString: " word", 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 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.italic, CharacterStyle.bold]),
- Token(type: .string, inputString: "bold", characterStyles: [CharacterStyle.bold]),
- Token(type: .string, inputString: " word", 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 ```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)
-
- }
-
-
- // The new version of SwiftyMarkdown is a lot more strict than the old version, although this may change in future
- func offtestThatMarkdownMistakesAreHandledAppropriately() {
- let mismatchedBoldCharactersAtStart = "**This should be bold*"
- let mismatchedBoldCharactersWithin = "A string *that should be italic**"
-
- var md = SwiftyMarkdown(string: mismatchedBoldCharactersAtStart)
- XCTAssertEqual(md.attributedString().string, "This should be bold")
-
- md = SwiftyMarkdown(string: mismatchedBoldCharactersWithin)
- XCTAssertEqual(md.attributedString().string, "A string that should be italic")
-
- }
-
- func offtestAdvancedEscaping() {
-
- 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: [])
- ])
- 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 randomly *\\**escaped**\\* asterisks", output: "A string with randomly **escaped** asterisks", tokens: [
- Token(type: .string, inputString: "A string with randomly **", characterStyles: []),
- Token(type: .string, inputString: "escaped", characterStyles: [CharacterStyle.italic]),
- Token(type: .string, inputString: "** asterisks", 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 testThatAsterisksAndUnderscoresNotAttachedToWordsAreNotRemoved() {
-
- let asteriskFullStop = "Two asterisks followed by a full stop: **."
- let asteriskWithBold = "A **bold** word followed by an asterisk * "
- let underscoreFullStop = "Two underscores followed by a full stop: __."
- let asteriskComma = "An asterisk followed by a full stop: *, *"
-
- let backtickSpace = "A backtick followed by a space: `"
-
- let underscoreSpace = "An underscore followed by a space: _"
-
- let backtickComma = "A backtick followed by a space: `, `"
- let underscoreComma = "An underscore followed by a space: _, _"
-
- let backtickWithCode = "A `code` word followed by a backtick ` "
- 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)
- XCTAssertEqual(md.attributedString().string, underscoreSpace)
-
- md = SwiftyMarkdown(string: asteriskFullStop)
- XCTAssertEqual(md.attributedString().string, asteriskFullStop)
-
- md = SwiftyMarkdown(string: underscoreFullStop)
- XCTAssertEqual(md.attributedString().string, underscoreFullStop)
-
- md = SwiftyMarkdown(string: asteriskComma)
- XCTAssertEqual(md.attributedString().string, asteriskComma)
-
- md = SwiftyMarkdown(string: backtickComma)
- XCTAssertEqual(md.attributedString().string, backtickComma)
-
- md = SwiftyMarkdown(string: underscoreComma)
- XCTAssertEqual(md.attributedString().string, underscoreComma)
-
- md = SwiftyMarkdown(string: asteriskWithBold)
- XCTAssertEqual(md.attributedString().string, "A bold word followed by an asterisk *")
-
- md = SwiftyMarkdown(string: backtickWithCode)
- XCTAssertEqual(md.attributedString().string, "A code word followed by a backtick `")
-
- md = SwiftyMarkdown(string: underscoreWithItalic)
- XCTAssertEqual(md.attributedString().string, "An italic word followed by an underscore _")
-
- }
-
- 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)
-
- }
-
- }
|