XCTest+SwiftyMarkdown.swift 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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 attributedString : NSAttributedString
  15. let foundStyles : [[CharacterStyle]]
  16. let expectedStyles : [[CharacterStyle]]
  17. }
  18. class SwiftyMarkdownCharacterTests : XCTestCase {
  19. let defaultRules = SwiftyMarkdown.characterRules
  20. var challenge : TokenTest!
  21. var results : ChallengeReturn!
  22. var rules : [CharacterRule]? = nil
  23. func attempt( _ challenge : TokenTest, rules : [CharacterRule]? = nil ) -> ChallengeReturn {
  24. if let validRules = rules {
  25. SwiftyMarkdown.characterRules = validRules
  26. } else {
  27. SwiftyMarkdown.characterRules = self.defaultRules
  28. }
  29. let md = SwiftyMarkdown(string: challenge.input)
  30. let tokeniser = SwiftyTokeniser(with: SwiftyMarkdown.characterRules)
  31. let tokens = tokeniser.process(challenge.input)
  32. let stringTokens = tokens.filter({ $0.type == .string && !$0.isMetadata })
  33. let existentTokenStyles = stringTokens.compactMap({ $0.characterStyles as? [CharacterStyle] })
  34. let expectedStyles = challenge.tokens.compactMap({ $0.characterStyles as? [CharacterStyle] })
  35. let linkTokens = tokens.filter({ $0.type == .string && (($0.characterStyles as? [CharacterStyle])?.contains(.link) ?? false) })
  36. return ChallengeReturn(tokens: tokens, stringTokens: stringTokens, links : linkTokens, attributedString: md.attributedString(), foundStyles: existentTokenStyles, expectedStyles : expectedStyles)
  37. }
  38. }
  39. extension XCTestCase {
  40. func resourceURL(for filename : String ) -> URL {
  41. let thisSourceFile = URL(fileURLWithPath: #file)
  42. let thisDirectory = thisSourceFile.deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent()
  43. return thisDirectory.appendingPathComponent("Resources", isDirectory: true).appendingPathComponent(filename)
  44. }
  45. }