Skip to content

Instantly share code, notes, and snippets.

@modestman
Created April 2, 2021 11:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save modestman/00516d932f6054f8f635a0a69d7dfa1a to your computer and use it in GitHub Desktop.
Save modestman/00516d932f6054f8f635a0a69d7dfa1a to your computer and use it in GitHub Desktop.
SemVer Parsing
import Foundation
/// https://semver.org/
struct Version: Comparable, CustomStringConvertible {
let major: Int
let minor: Int
let patch: Int
var description: String {
return "\(major).\(minor).\(patch)"
}
init(major: Int, minor: Int, patch: Int) {
self.major = major
self.minor = minor
self.patch = patch
}
init(_ str: String) {
let parts = str.split(on: ".")
if parts.count >= 3 {
major = Int(parts[0]) ?? 0
minor = Int(parts[1]) ?? 0
patch = Int(parts[2]) ?? 0
} else if parts.count == 2 {
major = Int(parts[0]) ?? 0
minor = Int(parts[1]) ?? 0
patch = 0
} else if parts.count == 1 {
major = Int(parts[0]) ?? 0
minor = 0
patch = 0
} else {
major = 0
minor = 0
patch = 0
}
}
public static func < (lhs: Version, rhs: Version) -> Bool {
if lhs.major != rhs.major {
return lhs.major < rhs.major
} else if lhs.minor != rhs.minor {
return lhs.minor < rhs.minor
} else {
return lhs.patch < rhs.patch
}
}
public static func == (lhs: Version, rhs: Version) -> Bool {
return lhs.major == rhs.major && lhs.minor == rhs.minor && lhs.patch == rhs.patch
}
}
@testable import SoglasieLK
import XCTest
final class VersionTests: XCTestCase {
func testCompare() {
XCTAssertEqual(Version("1"), Version("1"))
XCTAssertEqual(Version("1.1"), Version("1.1"))
XCTAssertEqual(Version("1.1.1"), Version("1.1.1"))
XCTAssertEqual(Version("1"), Version("1.0"))
XCTAssertEqual(Version("1"), Version("1.0.0"))
XCTAssertEqual(Version("1.0"), Version("1.0.0"))
XCTAssertGreaterThan(Version("1.0.1"), Version("1.0.0"))
XCTAssertGreaterThan(Version("1.1.0"), Version("1.0.0"))
XCTAssertGreaterThan(Version("2.0.0"), Version("1.0.0"))
XCTAssertGreaterThan(Version("1.10.0"), Version("1.5.0"))
XCTAssertGreaterThan(Version("1.1"), Version("1.0"))
XCTAssertGreaterThan(Version("1.10"), Version("1.5"))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment