Skip to content
This repository was archived by the owner on Sep 20, 2023. It is now read-only.

Commit fe5ec6a

Browse files
BrianLitwinrnystrom
authored andcommitted
updates/tests detectShortlink method (#1971)
* updates/tests detectShortlink * Updates Int character check * deleted redundant Unit Tests
1 parent 4be9a93 commit fe5ec6a

File tree

2 files changed

+141
-1
lines changed

2 files changed

+141
-1
lines changed

Classes/Issues/Comments/Markdown/String+DetectShortlink.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ extension NSRange {
1616
}
1717
}
1818

19-
private let regex = try! NSRegularExpression(pattern: "(^|\\s)((\\w+)/(\\w+))?#([0-9]+)", options: [])
19+
private let regex = try! NSRegularExpression(pattern: "(^|\\s|[^a-zA-Z])((\\w+)/(\\w+))?#([0-9]+)([^a-zA-Z0-9]|$)", options: [])
2020
extension String {
2121
func detectAndHandleShortlink(owner: String, repo: String, builder: StyledTextBuilder) {
2222
let matches = regex.matches(in: self, options: [], range: nsrange)
@@ -59,6 +59,13 @@ extension String {
5959
)
6060
])
6161
.restore()
62+
63+
//if match's trailing character is not a number, include that
64+
if let right = substring(with: NSRange(location: match.range.right - 1, length: 1)) {
65+
if Int(right) == nil {
66+
builder.add(text: right)
67+
}
68+
}
6269

6370
currentRight = match.range.right
6471
}
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
//
2+
// DetectShortlinkTests.swift
3+
// FreetimeTests
4+
//
5+
// Created by B_Litwin on 7/22/18.
6+
// Copyright © 2018 Ryan Nystrom. All rights reserved.
7+
//
8+
import XCTest
9+
@testable import Freetime
10+
import StyledTextKit
11+
12+
class DetectShortlinkTests: XCTestCase {
13+
// Test the String method detectAndHandleShortlink()
14+
15+
func setupBuilder(with text: String) -> StyledTextString {
16+
let builder = StyledTextBuilder(text: "")
17+
text.detectAndHandleShortlink(
18+
owner: "rnystrom",
19+
repo: "GitHawk",
20+
builder: builder
21+
)
22+
return builder.build()
23+
}
24+
25+
func checkForIssueLink(_ styledTexts: [StyledText]) -> (linkText: String, issueNumber: Int)? {
26+
// scanning for a styledText unit that has been formatted with blue font and
27+
// contains an Issue MarkdownAttribute
28+
for styledText in styledTexts {
29+
let style = styledText.style
30+
guard style.attributes[.foregroundColor] != nil,
31+
style.attributes[MarkdownAttribute.issue] != nil else { continue }
32+
let correctTextColor = style.attributes[.foregroundColor] as! UIColor == Styles.Colors.Blue.medium.color
33+
if correctTextColor {
34+
if case let .text(text) = styledText.storage {
35+
let issueModel = style.attributes[MarkdownAttribute.issue] as! IssueDetailsModel
36+
let issueNumber = issueModel.number
37+
return (text, issueNumber)
38+
}
39+
}
40+
}
41+
return nil
42+
}
43+
44+
45+
func test_positiveMatches() {
46+
// test 4 things:
47+
// 1) for positive text match
48+
// 2) that the correct text is blue/linked (eg the parentheses aren't blue also)
49+
// 3) that the MarkdownIssue is linked correctly with an issue number
50+
// 4) that the string displayed after reformatting == the original string
51+
52+
var testString = "#1234"
53+
var builder: StyledTextString = setupBuilder(with: testString)
54+
var containsLink = checkForIssueLink(builder.styledTexts)!
55+
XCTAssertEqual(containsLink.linkText, "#1234")
56+
XCTAssertEqual(containsLink.issueNumber, 1234)
57+
XCTAssertEqual(builder.allText, testString)
58+
59+
testString = "with a space preceding #1235"
60+
builder = setupBuilder(with: testString)
61+
containsLink = checkForIssueLink(builder.styledTexts)!
62+
XCTAssertEqual(containsLink.linkText, "#1235")
63+
XCTAssertEqual(containsLink.issueNumber, 1235)
64+
XCTAssertEqual(builder.allText, testString)
65+
66+
testString = "with a newline preceding \n#345"
67+
builder = setupBuilder(with: testString)
68+
containsLink = checkForIssueLink(builder.styledTexts)!
69+
XCTAssertEqual(containsLink.linkText, "#345")
70+
XCTAssertEqual(containsLink.issueNumber, 345)
71+
XCTAssertEqual(builder.allText, testString)
72+
73+
testString = "embedded in parentheses (#1900)"
74+
builder = setupBuilder(with: testString)
75+
containsLink = checkForIssueLink(builder.styledTexts)!
76+
XCTAssertEqual(containsLink.linkText, "#1900")
77+
XCTAssertEqual(containsLink.issueNumber, 1900)
78+
XCTAssertEqual(builder.allText, testString)
79+
80+
testString = "with owner and repo preceding rnystrom/githawk#4321"
81+
builder = setupBuilder(with: testString)
82+
containsLink = checkForIssueLink(builder.styledTexts)!
83+
XCTAssertEqual(containsLink.linkText, "rnystrom/githawk#4321")
84+
XCTAssertEqual(containsLink.issueNumber, 4321)
85+
XCTAssertEqual(builder.allText, testString)
86+
87+
testString = "Fixes (#1"
88+
builder = setupBuilder(with: testString)
89+
containsLink = checkForIssueLink(builder.styledTexts)!
90+
XCTAssertEqual(containsLink.linkText, "#1")
91+
XCTAssertEqual(containsLink.issueNumber, 1)
92+
XCTAssertEqual(builder.allText, testString)
93+
94+
testString = "Fixes #12)"
95+
builder = setupBuilder(with: testString)
96+
containsLink = checkForIssueLink(builder.styledTexts)!
97+
XCTAssertEqual(containsLink.linkText, "#12")
98+
XCTAssertEqual(containsLink.issueNumber, 12)
99+
XCTAssertEqual(builder.allText, testString)
100+
101+
testString = "Fixes(#432)"
102+
builder = setupBuilder(with: testString)
103+
containsLink = checkForIssueLink(builder.styledTexts)!
104+
XCTAssertEqual(containsLink.linkText, "#432")
105+
XCTAssertEqual(containsLink.issueNumber, 432)
106+
XCTAssertEqual(builder.allText, testString)
107+
108+
testString = "!#4 yada yada"
109+
builder = setupBuilder(with: testString)
110+
containsLink = checkForIssueLink(builder.styledTexts)!
111+
XCTAssertEqual(containsLink.linkText, "#4")
112+
XCTAssertEqual(containsLink.issueNumber, 4)
113+
XCTAssertEqual(builder.allText, testString)
114+
}
115+
116+
func test_negativeMatches() {
117+
var builder = setupBuilder(with: "!1234")
118+
var containsLink = checkForIssueLink(builder.styledTexts)
119+
XCTAssertNil(containsLink)
120+
121+
builder = setupBuilder(with: "imo the best pr so far is prob # 1906")
122+
containsLink = checkForIssueLink(builder.styledTexts)
123+
XCTAssertNil(containsLink)
124+
125+
builder = setupBuilder(with: "#123F")
126+
containsLink = checkForIssueLink(builder.styledTexts)
127+
XCTAssertNil(containsLink)
128+
129+
builder = setupBuilder(with: "f#123")
130+
containsLink = checkForIssueLink(builder.styledTexts)
131+
XCTAssertNil(containsLink)
132+
}
133+
}

0 commit comments

Comments
 (0)