Skip to content

Commit 3bd4e35

Browse files
fix: check to see if prefix is before build and visa versa in isBuild isPr… (#358)
* check to see if prefix is before build and visa versa in isBuild isPreRelease * add more tests and fix split * take out extra call to contains
1 parent 15df439 commit 3bd4e35

File tree

2 files changed

+50
-8
lines changed

2 files changed

+50
-8
lines changed

Sources/Data Model/Audience/SemanticVersion.swift

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ extension SemanticVersion {
4040
} else if !versionParts[idx].isNumber {
4141
//Compare strings
4242
if versionParts[idx] < targetedVersionParts[idx] {
43-
return -1;
43+
return targetedVersion.isPreRelease && !self.isPreRelease ? 1: -1;
4444
}
4545
else if versionParts[idx] > targetedVersionParts[idx] {
46-
return 1;
46+
return !targetedVersion.isPreRelease && self.isPreRelease ? -1: 1;
4747
}
4848

4949
} else if let part = Int(versionParts[idx]), let target = Int(targetedVersionParts[idx]){
@@ -74,7 +74,8 @@ extension SemanticVersion {
7474
}
7575

7676
if isPreRelease || isBuild {
77-
targetParts = split(separator: isPreRelease ? preReleaseSeperator : buildSeperator)
77+
targetParts = split(separator: isPreRelease ? preReleaseSeperator : buildSeperator,
78+
maxSplits: 1)
7879
guard let targetParts = targetParts, targetParts.count > 1 else {
7980
throw OptimizelyError.attributeFormatInvalid
8081
}
@@ -106,11 +107,11 @@ extension SemanticVersion {
106107
}
107108

108109
var isPreRelease: Bool {
109-
return contains("-")
110+
return firstIndex(of: "-")?.utf16Offset(in: self) ?? Int.max < firstIndex(of: "+")?.utf16Offset(in: self) ?? Int.max
110111
}
111112

112113
var isBuild: Bool {
113-
return contains("+")
114+
return firstIndex(of: "+")?.utf16Offset(in: self) ?? Int.max < firstIndex(of: "-")?.utf16Offset(in: self) ?? Int.max
114115
}
115116

116117
var buildSeperator:Character {
@@ -127,11 +128,11 @@ extension Substring {
127128
}
128129

129130
var isPreRelease: Bool {
130-
return contains("-")
131+
return firstIndex(of: "-")?.utf16Offset(in: self) ?? Int.max < firstIndex(of: "+")?.utf16Offset(in: self) ?? Int.max
131132
}
132133

133134
var isBuild: Bool {
134-
return contains("+")
135+
return firstIndex(of: "+")?.utf16Offset(in: self) ?? Int.max < firstIndex(of: "-")?.utf16Offset(in: self) ?? Int.max
135136
}
136137

137138
}

Tests/OptimizelyTests-DataModel/SemanticVersionTests.swift

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,20 @@ class SemanticVersionTests: XCTestCase {
154154
XCTAssert(try version.compareVersion(targetedVersion: target) > 0)
155155
}
156156

157+
func testTargetBetaComplex() {
158+
let target = "2.1.3-beta+1"
159+
let version = "2.1.3-beta+1.2.3"
160+
161+
XCTAssert(try version.compareVersion(targetedVersion: target) > 0)
162+
}
163+
164+
func testTargetBuildComplex() {
165+
let target = "2.1.3+build-1.2.3"
166+
let version = "2.1.3+build-1"
167+
168+
XCTAssert(try version.compareVersion(targetedVersion: target) < 0)
169+
}
170+
157171
func testOtherTests() {
158172
let targets = ["2.1", "2.1", "2", "2"]
159173
let versions = ["2.1.0", "2.1.215", "2.12", "2.785.13"]
@@ -162,7 +176,34 @@ class SemanticVersionTests: XCTestCase {
162176
XCTAssert(try versions[idx].compareVersion(targetedVersion: target) == 0)
163177
}
164178
}
165-
179+
func testDifferentAttributeAgainstBuild() {
180+
let target = "3.7.0"
181+
let version = "3.7.0+build"
182+
183+
XCTAssert(try (version.compareVersion(targetedVersion: target)) == 0)
184+
}
185+
186+
func testDifferentAttributeAgainstPreRelease() {
187+
let target = "3.7.0"
188+
let version = "3.7.0-prerelease"
189+
190+
XCTAssert(try (version.compareVersion(targetedVersion: target)) < 0)
191+
}
192+
193+
func testDifferentAttributeAgainstPreReleaseToBuild() {
194+
let target = "3.7.0-prerelease"
195+
let version = "3.7.0+build"
196+
197+
XCTAssert(try (version.compareVersion(targetedVersion: target)) > 0)
198+
}
199+
200+
func testDifferentAttributeAgainstPreReleaseToPreRelease() {
201+
let target = "3.7.0-prerelease+build"
202+
let version = "3.7.0-prerelease-prelrease+rc"
203+
204+
XCTAssert(try (version.compareVersion(targetedVersion: target)) > 0)
205+
}
206+
166207
func testInvalidAttributes() {
167208
let target = "2.1.0"
168209
let versions = ["-", ".", "..", "+", "+test", " ", "2 .3. 0", "2.", ".2.2", "3.7.2.2", "3.x",

0 commit comments

Comments
 (0)