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

Commit 1b00c68

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

File tree

2 files changed

+40
-17
lines changed

2 files changed

+40
-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: 39 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,105 @@ 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 = "#345\n"
74+
builder = setupBuilder(with: testString)
75+
containsLink = checkForIssueLink(builder.styledTexts)[0]
6876
XCTAssertEqual(containsLink.linkText, "#345")
6977
XCTAssertEqual(containsLink.issueNumber, 345)
7078
XCTAssertEqual(builder.allText, testString)
7179

7280
testString = "embedded in parentheses (#1900)"
7381
builder = setupBuilder(with: testString)
74-
containsLink = checkForIssueLink(builder.styledTexts)!
82+
containsLink = checkForIssueLink(builder.styledTexts)[0]
7583
XCTAssertEqual(containsLink.linkText, "#1900")
7684
XCTAssertEqual(containsLink.issueNumber, 1900)
7785
XCTAssertEqual(builder.allText, testString)
7886

7987
testString = "with owner and repo preceding rnystrom/githawk#4321"
8088
builder = setupBuilder(with: testString)
81-
containsLink = checkForIssueLink(builder.styledTexts)!
89+
containsLink = checkForIssueLink(builder.styledTexts)[0]
8290
XCTAssertEqual(containsLink.linkText, "rnystrom/githawk#4321")
8391
XCTAssertEqual(containsLink.issueNumber, 4321)
8492
XCTAssertEqual(builder.allText, testString)
8593

8694
testString = "Fixes (#1"
8795
builder = setupBuilder(with: testString)
88-
containsLink = checkForIssueLink(builder.styledTexts)!
96+
containsLink = checkForIssueLink(builder.styledTexts)[0]
8997
XCTAssertEqual(containsLink.linkText, "#1")
9098
XCTAssertEqual(containsLink.issueNumber, 1)
9199
XCTAssertEqual(builder.allText, testString)
92100

93101
testString = "Fixes #12)"
94102
builder = setupBuilder(with: testString)
95-
containsLink = checkForIssueLink(builder.styledTexts)!
103+
containsLink = checkForIssueLink(builder.styledTexts)[0]
96104
XCTAssertEqual(containsLink.linkText, "#12")
97105
XCTAssertEqual(containsLink.issueNumber, 12)
98106
XCTAssertEqual(builder.allText, testString)
99107

100108
testString = "Fixes(#432)"
101109
builder = setupBuilder(with: testString)
102-
containsLink = checkForIssueLink(builder.styledTexts)!
110+
containsLink = checkForIssueLink(builder.styledTexts)[0]
103111
XCTAssertEqual(containsLink.linkText, "#432")
104112
XCTAssertEqual(containsLink.issueNumber, 432)
105113
XCTAssertEqual(builder.allText, testString)
106114

107115
testString = "!#4 yada yada"
108116
builder = setupBuilder(with: testString)
109-
containsLink = checkForIssueLink(builder.styledTexts)!
117+
containsLink = checkForIssueLink(builder.styledTexts)[0]
110118
XCTAssertEqual(containsLink.linkText, "#4")
111119
XCTAssertEqual(containsLink.issueNumber, 4)
112120
XCTAssertEqual(builder.allText, testString)
113121
}
122+
123+
func test_ConsecutivePositiveMatches() {
124+
var testString = "#100 #150 #200"
125+
var builder = setupBuilder(with: testString)
126+
var links = checkForIssueLink(builder.styledTexts)
127+
128+
XCTAssertEqual(links[0].issueNumber, 100)
129+
XCTAssertEqual(links[0].linkText, "#100")
130+
131+
XCTAssertEqual(links[1].issueNumber, 150)
132+
XCTAssertEqual(links[1].linkText, "#150")
133+
134+
XCTAssertEqual(links[2].issueNumber, 200)
135+
XCTAssertEqual(links[2].linkText, "#200")
136+
}
114137

115138
func test_negativeMatches() {
116139
var builder = setupBuilder(with: "!1234")
117140
var containsLink = checkForIssueLink(builder.styledTexts)
118-
XCTAssertNil(containsLink)
141+
XCTAssertEqual(containsLink.count, 0)
119142

120143
builder = setupBuilder(with: "imo the best pr so far is prob # 1906")
121144
containsLink = checkForIssueLink(builder.styledTexts)
122-
XCTAssertNil(containsLink)
145+
XCTAssertEqual(containsLink.count, 0)
123146

124147
builder = setupBuilder(with: "#123F")
125148
containsLink = checkForIssueLink(builder.styledTexts)
126-
XCTAssertNil(containsLink)
149+
XCTAssertEqual(containsLink.count, 0)
127150

128151
builder = setupBuilder(with: "f#123")
129152
containsLink = checkForIssueLink(builder.styledTexts)
130-
XCTAssertNil(containsLink)
153+
XCTAssertEqual(containsLink.count, 0)
131154
}
132155
}

0 commit comments

Comments
 (0)