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

Commit 67e3bb2

Browse files
committed
Fixes regex for consecutive shortlinks
- updated unit tests
1 parent e84f3e4 commit 67e3bb2

File tree

2 files changed

+45
-17
lines changed

2 files changed

+45
-17
lines changed

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

Lines changed: 1 addition & 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|[^a-zA-Z])((\\w+)/(\\w+))?#([0-9]+)([^a-zA-Z0-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)

FreetimeTests/DetectShortlinkTests.swift

Lines changed: 44 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,10 @@ class DetectShortlinkTests: XCTestCase {
2222
return builder.build()
2323
}
2424

25-
func checkForIssueLink(_ styledTexts: [StyledText]) -> (linkText: String, issueNumber: Int)? {
25+
func checkForIssueLink(_ styledTexts: [StyledText]) -> [(linkText: String, issueNumber: Int)] {
2626
// scanning for a styledText unit that has been formatted with blue font and
2727
// contains an Issue MarkdownAttribute
28+
var links = [(linkText: String, issueNumber: Int)]()
2829
for styledText in styledTexts {
2930
let style = styledText.style
3031
guard style.attributes[.foregroundColor] != nil,
@@ -34,11 +35,11 @@ class DetectShortlinkTests: XCTestCase {
3435
if case let .text(text) = styledText.storage {
3536
let issueModel = style.attributes[MarkdownAttribute.issue] as! IssueDetailsModel
3637
let issueNumber = issueModel.number
37-
return (text, issueNumber)
38+
links.append((text, issueNumber))
3839
}
3940
}
4041
}
41-
return nil
42+
return links
4243
}
4344

4445
func test_positiveMatches() {
@@ -50,83 +51,110 @@ class DetectShortlinkTests: XCTestCase {
5051

5152
var testString = "#1234"
5253
var builder: StyledTextString = setupBuilder(with: testString)
53-
var containsLink = checkForIssueLink(builder.styledTexts)!
54+
var containsLink = checkForIssueLink(builder.styledTexts)[0]
5455
XCTAssertEqual(containsLink.linkText, "#1234")
5556
XCTAssertEqual(containsLink.issueNumber, 1234)
5657
XCTAssertEqual(builder.allText, testString)
5758

5859
testString = "with a space preceding #1235"
5960
builder = setupBuilder(with: testString)
60-
containsLink = checkForIssueLink(builder.styledTexts)!
61+
containsLink = checkForIssueLink(builder.styledTexts)[0]
6162
XCTAssertEqual(containsLink.linkText, "#1235")
6263
XCTAssertEqual(containsLink.issueNumber, 1235)
6364
XCTAssertEqual(builder.allText, testString)
6465

6566
testString = "with a newline preceding \n#345"
6667
builder = setupBuilder(with: testString)
67-
containsLink = checkForIssueLink(builder.styledTexts)!
68+
containsLink = checkForIssueLink(builder.styledTexts)[0]
69+
XCTAssertEqual(containsLink.linkText, "#345")
70+
XCTAssertEqual(containsLink.issueNumber, 345)
71+
XCTAssertEqual(builder.allText, testString)
72+
73+
testString =
74+
"""
75+
#345
76+
newLine
77+
"""
78+
79+
builder = setupBuilder(with: testString)
80+
containsLink = checkForIssueLink(builder.styledTexts)[0]
6881
XCTAssertEqual(containsLink.linkText, "#345")
6982
XCTAssertEqual(containsLink.issueNumber, 345)
7083
XCTAssertEqual(builder.allText, testString)
7184

7285
testString = "embedded in parentheses (#1900)"
7386
builder = setupBuilder(with: testString)
74-
containsLink = checkForIssueLink(builder.styledTexts)!
87+
containsLink = checkForIssueLink(builder.styledTexts)[0]
7588
XCTAssertEqual(containsLink.linkText, "#1900")
7689
XCTAssertEqual(containsLink.issueNumber, 1900)
7790
XCTAssertEqual(builder.allText, testString)
7891

7992
testString = "with owner and repo preceding rnystrom/githawk#4321"
8093
builder = setupBuilder(with: testString)
81-
containsLink = checkForIssueLink(builder.styledTexts)!
94+
containsLink = checkForIssueLink(builder.styledTexts)[0]
8295
XCTAssertEqual(containsLink.linkText, "rnystrom/githawk#4321")
8396
XCTAssertEqual(containsLink.issueNumber, 4321)
8497
XCTAssertEqual(builder.allText, testString)
8598

8699
testString = "Fixes (#1"
87100
builder = setupBuilder(with: testString)
88-
containsLink = checkForIssueLink(builder.styledTexts)!
101+
containsLink = checkForIssueLink(builder.styledTexts)[0]
89102
XCTAssertEqual(containsLink.linkText, "#1")
90103
XCTAssertEqual(containsLink.issueNumber, 1)
91104
XCTAssertEqual(builder.allText, testString)
92105

93106
testString = "Fixes #12)"
94107
builder = setupBuilder(with: testString)
95-
containsLink = checkForIssueLink(builder.styledTexts)!
108+
containsLink = checkForIssueLink(builder.styledTexts)[0]
96109
XCTAssertEqual(containsLink.linkText, "#12")
97110
XCTAssertEqual(containsLink.issueNumber, 12)
98111
XCTAssertEqual(builder.allText, testString)
99112

100113
testString = "Fixes(#432)"
101114
builder = setupBuilder(with: testString)
102-
containsLink = checkForIssueLink(builder.styledTexts)!
115+
containsLink = checkForIssueLink(builder.styledTexts)[0]
103116
XCTAssertEqual(containsLink.linkText, "#432")
104117
XCTAssertEqual(containsLink.issueNumber, 432)
105118
XCTAssertEqual(builder.allText, testString)
106119

107120
testString = "!#4 yada yada"
108121
builder = setupBuilder(with: testString)
109-
containsLink = checkForIssueLink(builder.styledTexts)!
122+
containsLink = checkForIssueLink(builder.styledTexts)[0]
110123
XCTAssertEqual(containsLink.linkText, "#4")
111124
XCTAssertEqual(containsLink.issueNumber, 4)
112125
XCTAssertEqual(builder.allText, testString)
113126
}
127+
128+
func test_ConsecutivePositiveMatches() {
129+
var testString = "#100 #150 #200"
130+
var builder = setupBuilder(with: testString)
131+
var links = checkForIssueLink(builder.styledTexts)
132+
133+
XCTAssertEqual(links[0].issueNumber, 100)
134+
XCTAssertEqual(links[0].linkText, "#100")
135+
136+
XCTAssertEqual(links[1].issueNumber, 150)
137+
XCTAssertEqual(links[1].linkText, "#150")
138+
139+
XCTAssertEqual(links[2].issueNumber, 200)
140+
XCTAssertEqual(links[2].linkText, "#200")
141+
}
114142

115143
func test_negativeMatches() {
116144
var builder = setupBuilder(with: "!1234")
117145
var containsLink = checkForIssueLink(builder.styledTexts)
118-
XCTAssertNil(containsLink)
146+
XCTAssertEqual(containsLink.count, 0)
119147

120148
builder = setupBuilder(with: "imo the best pr so far is prob # 1906")
121149
containsLink = checkForIssueLink(builder.styledTexts)
122-
XCTAssertNil(containsLink)
150+
XCTAssertEqual(containsLink.count, 0)
123151

124152
builder = setupBuilder(with: "#123F")
125153
containsLink = checkForIssueLink(builder.styledTexts)
126-
XCTAssertNil(containsLink)
154+
XCTAssertEqual(containsLink.count, 0)
127155

128156
builder = setupBuilder(with: "f#123")
129157
containsLink = checkForIssueLink(builder.styledTexts)
130-
XCTAssertNil(containsLink)
158+
XCTAssertEqual(containsLink.count, 0)
131159
}
132160
}

0 commit comments

Comments
 (0)