XCTest+SwiftyMarkdown.swift 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. //
  2. // XCTest+SwiftyMarkdown.swift
  3. // SwiftyMarkdownTests
  4. //
  5. // Created by Simon Fairbairn on 17/12/2019.
  6. // Copyright © 2019 Voyage Travel Apps. All rights reserved.
  7. //
  8. import XCTest
  9. @testable import SwiftyMarkdown
  10. struct ChallengeReturn {
  11. let tokens : [Token]
  12. let stringTokens : [Token]
  13. let links : [Token]
  14. let images : [Token]
  15. let attributedString : NSAttributedString
  16. let foundStyles : [[CharacterStyle]]
  17. let expectedStyles : [[CharacterStyle]]
  18. }
  19. enum Rule {
  20. case asterisks
  21. case backticks
  22. case underscores
  23. case images
  24. case links
  25. case referencedLinks
  26. case referencedImages
  27. case tildes
  28. func asCharacterRule() -> CharacterRule {
  29. switch self {
  30. case .images:
  31. return SwiftyMarkdown.characterRules.filter({ $0.primaryTag.tag == "![" && !$0.metadataLookup }).first!
  32. case .links:
  33. return SwiftyMarkdown.characterRules.filter({ $0.primaryTag.tag == "[" && !$0.metadataLookup }).first!
  34. case .backticks:
  35. return SwiftyMarkdown.characterRules.filter({ $0.primaryTag.tag == "`" }).first!
  36. case .tildes:
  37. return SwiftyMarkdown.characterRules.filter({ $0.primaryTag.tag == "~" }).first!
  38. case .asterisks:
  39. return SwiftyMarkdown.characterRules.filter({ $0.primaryTag.tag == "*" }).first!
  40. case .underscores:
  41. return SwiftyMarkdown.characterRules.filter({ $0.primaryTag.tag == "_" }).first!
  42. case .referencedLinks:
  43. return SwiftyMarkdown.characterRules.filter({ $0.primaryTag.tag == "[" && $0.metadataLookup }).first!
  44. case .referencedImages:
  45. return SwiftyMarkdown.characterRules.filter({ $0.primaryTag.tag == "![" && $0.metadataLookup }).first!
  46. }
  47. }
  48. }
  49. class SwiftyMarkdownCharacterTests : XCTestCase {
  50. let defaultRules = SwiftyMarkdown.characterRules
  51. var challenge : TokenTest!
  52. var results : ChallengeReturn!
  53. func attempt( _ challenge : TokenTest, rules : [Rule]? = nil ) -> ChallengeReturn {
  54. if let validRules = rules {
  55. SwiftyMarkdown.characterRules = validRules.map({ $0.asCharacterRule() })
  56. } else {
  57. SwiftyMarkdown.characterRules = self.defaultRules
  58. }
  59. let md = SwiftyMarkdown(string: challenge.input)
  60. md.applyAttachments = false
  61. let attributedString = md.attributedString()
  62. let tokens : [Token] = md.previouslyFoundTokens
  63. let stringTokens = tokens.filter({ $0.type == .string && !$0.isMetadata })
  64. let existentTokenStyles = stringTokens.compactMap({ $0.characterStyles as? [CharacterStyle] })
  65. let expectedStyles = challenge.tokens.compactMap({ $0.characterStyles as? [CharacterStyle] })
  66. let linkTokens = tokens.filter({ $0.type == .string && (($0.characterStyles as? [CharacterStyle])?.contains(.link) ?? false) })
  67. let imageTokens = tokens.filter({ $0.type == .string && (($0.characterStyles as? [CharacterStyle])?.contains(.image) ?? false) })
  68. return ChallengeReturn(tokens: tokens, stringTokens: stringTokens, links : linkTokens, images: imageTokens, attributedString: attributedString, foundStyles: existentTokenStyles, expectedStyles : expectedStyles)
  69. }
  70. }
  71. extension XCTestCase {
  72. func resourceURL(for filename : String ) -> URL {
  73. let thisSourceFile = URL(fileURLWithPath: #file)
  74. let thisDirectory = thisSourceFile.deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent()
  75. return thisDirectory.appendingPathComponent("Resources", isDirectory: true).appendingPathComponent(filename)
  76. }
  77. }