Skip to content

Commit 3ba3ee7

Browse files
[NFC] add tests for all sorts of Version.init
1 parent 43a199a commit 3ba3ee7

File tree

1 file changed

+199
-2
lines changed

1 file changed

+199
-2
lines changed

Tests/PackageDescriptionTests/VersionTests.swift

Lines changed: 199 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,88 @@ class VersionTests: XCTestCase {
2424
XCTAssertEqual(Version("1.2.3-alpha.beta.2").description, "1.2.3-alpha.beta.2")
2525
}
2626

27+
func testVersionInitialization() {
28+
let v0 = Version(0, 0, 0, prereleaseIdentifiers: [], buildMetadataIdentifiers: [])
29+
XCTAssertEqual(v0.minor, 0)
30+
XCTAssertEqual(v0.minor, 0)
31+
XCTAssertEqual(v0.patch, 0)
32+
XCTAssertEqual(v0.prereleaseIdentifiers, [])
33+
XCTAssertEqual(v0.buildMetadataIdentifiers, [])
34+
35+
let v1 = Version(1, 1, 2, prereleaseIdentifiers: ["3", "5"], buildMetadataIdentifiers: ["8", "13"])
36+
XCTAssertEqual(v1.minor, 1)
37+
XCTAssertEqual(v1.minor, 1)
38+
XCTAssertEqual(v1.patch, 2)
39+
XCTAssertEqual(v1.prereleaseIdentifiers, ["3", "5"])
40+
XCTAssertEqual(v1.buildMetadataIdentifiers, ["8", "13"])
41+
42+
XCTAssertEqual(
43+
Version(3, 5, 8),
44+
Version(3, 5, 8, prereleaseIdentifiers: [], buildMetadataIdentifiers: [])
45+
)
46+
47+
XCTAssertEqual(
48+
Version(13, 21, 34, prereleaseIdentifiers: ["55"]),
49+
Version(13, 21, 34, prereleaseIdentifiers: ["55"], buildMetadataIdentifiers: [])
50+
)
51+
52+
XCTAssertEqual(
53+
Version(89, 144, 233, buildMetadataIdentifiers: ["377"]),
54+
Version(89, 144, 233, prereleaseIdentifiers: [], buildMetadataIdentifiers: ["377"])
55+
)
56+
}
57+
2758

59+
func testCustomConversionFromVersionToString() {
60+
61+
// MARK: Version.description
62+
63+
XCTAssertEqual(Version(0, 0, 0).description, "0.0.0" as String)
64+
XCTAssertEqual(Version(1, 2, 3).description, "1.2.3" as String)
65+
XCTAssertEqual(Version(1, 2, 3, prereleaseIdentifiers: [""]).description, "1.2.3-" as String)
66+
XCTAssertEqual(Version(1, 2, 3, prereleaseIdentifiers: ["", ""]).description, "1.2.3-." as String)
67+
XCTAssertEqual(Version(1, 2, 3, prereleaseIdentifiers: ["beta1"]).description, "1.2.3-beta1" as String)
68+
XCTAssertEqual(Version(1, 2, 3, prereleaseIdentifiers: ["beta", "1"]).description, "1.2.3-beta.1" as String)
69+
XCTAssertEqual(Version(1, 2, 3, prereleaseIdentifiers: ["beta", "", "1"]).description, "1.2.3-beta..1" as String)
70+
XCTAssertEqual(Version(1, 2, 3, prereleaseIdentifiers: ["be-ta", "", "1"]).description, "1.2.3-be-ta..1" as String)
71+
XCTAssertEqual(Version(1, 2, 3, buildMetadataIdentifiers: [""]).description, "1.2.3+" as String)
72+
XCTAssertEqual(Version(1, 2, 3, buildMetadataIdentifiers: ["", ""]).description, "1.2.3+." as String)
73+
XCTAssertEqual(Version(1, 2, 3, buildMetadataIdentifiers: ["beta1"]).description, "1.2.3+beta1" as String)
74+
XCTAssertEqual(Version(1, 2, 3, buildMetadataIdentifiers: ["beta", "1"]).description, "1.2.3+beta.1" as String)
75+
XCTAssertEqual(Version(1, 2, 3, buildMetadataIdentifiers: ["beta", "", "1"]).description, "1.2.3+beta..1" as String)
76+
XCTAssertEqual(Version(1, 2, 3, buildMetadataIdentifiers: ["be-ta", "", "1"]).description, "1.2.3+be-ta..1" as String)
77+
XCTAssertEqual(Version(1, 2, 3, prereleaseIdentifiers: [""], buildMetadataIdentifiers: [""]).description, "1.2.3-+" as String)
78+
XCTAssertEqual(Version(1, 2, 3, prereleaseIdentifiers: ["", ""], buildMetadataIdentifiers: ["", "-", ""]).description, "1.2.3-.+.-." as String)
79+
XCTAssertEqual(Version(1, 2, 3, prereleaseIdentifiers: ["beta1"], buildMetadataIdentifiers: ["alpha1"]).description, "1.2.3-beta1+alpha1" as String)
80+
XCTAssertEqual(Version(1, 2, 3, prereleaseIdentifiers: ["beta", "1"], buildMetadataIdentifiers: ["alpha", "1"]).description, "1.2.3-beta.1+alpha.1" as String)
81+
XCTAssertEqual(Version(1, 2, 3, prereleaseIdentifiers: ["beta", "", "1"], buildMetadataIdentifiers: ["alpha", "", "1"]).description, "1.2.3-beta..1+alpha..1" as String)
82+
XCTAssertEqual(Version(1, 2, 3, prereleaseIdentifiers: ["be-ta", "", "1"], buildMetadataIdentifiers: ["al-pha", "", "1"]).description, "1.2.3-be-ta..1+al-pha..1" as String)
83+
84+
// MARK: String interpolation
85+
86+
XCTAssertEqual("\(Version(0, 0, 0))", "0.0.0" as String)
87+
XCTAssertEqual("\(Version(1, 2, 3))", "1.2.3" as String)
88+
XCTAssertEqual("\(Version(1, 2, 3, prereleaseIdentifiers: [""]))", "1.2.3-" as String)
89+
XCTAssertEqual("\(Version(1, 2, 3, prereleaseIdentifiers: ["", ""]))", "1.2.3-." as String)
90+
XCTAssertEqual("\(Version(1, 2, 3, prereleaseIdentifiers: ["beta1"]))", "1.2.3-beta1" as String)
91+
XCTAssertEqual("\(Version(1, 2, 3, prereleaseIdentifiers: ["beta", "1"]))", "1.2.3-beta.1" as String)
92+
XCTAssertEqual("\(Version(1, 2, 3, prereleaseIdentifiers: ["beta", "", "1"]))", "1.2.3-beta..1" as String)
93+
XCTAssertEqual("\(Version(1, 2, 3, prereleaseIdentifiers: ["be-ta", "", "1"]))", "1.2.3-be-ta..1" as String)
94+
XCTAssertEqual("\(Version(1, 2, 3, buildMetadataIdentifiers: [""]))", "1.2.3+" as String)
95+
XCTAssertEqual("\(Version(1, 2, 3, buildMetadataIdentifiers: ["", ""]))", "1.2.3+." as String)
96+
XCTAssertEqual("\(Version(1, 2, 3, buildMetadataIdentifiers: ["beta1"]))", "1.2.3+beta1" as String)
97+
XCTAssertEqual("\(Version(1, 2, 3, buildMetadataIdentifiers: ["beta", "1"]))", "1.2.3+beta.1" as String)
98+
XCTAssertEqual("\(Version(1, 2, 3, buildMetadataIdentifiers: ["beta", "", "1"]))", "1.2.3+beta..1" as String)
99+
XCTAssertEqual("\(Version(1, 2, 3, buildMetadataIdentifiers: ["be-ta", "", "1"]))", "1.2.3+be-ta..1" as String)
100+
XCTAssertEqual("\(Version(1, 2, 3, prereleaseIdentifiers: [""], buildMetadataIdentifiers: [""]))", "1.2.3-+" as String)
101+
XCTAssertEqual("\(Version(1, 2, 3, prereleaseIdentifiers: ["", ""], buildMetadataIdentifiers: ["", "-", ""]))", "1.2.3-.+.-." as String)
102+
XCTAssertEqual("\(Version(1, 2, 3, prereleaseIdentifiers: ["beta1"], buildMetadataIdentifiers: ["alpha1"]))", "1.2.3-beta1+alpha1" as String)
103+
XCTAssertEqual("\(Version(1, 2, 3, prereleaseIdentifiers: ["beta", "1"], buildMetadataIdentifiers: ["alpha", "1"]))", "1.2.3-beta.1+alpha.1" as String)
104+
XCTAssertEqual("\(Version(1, 2, 3, prereleaseIdentifiers: ["beta", "", "1"], buildMetadataIdentifiers: ["alpha", "", "1"]))", "1.2.3-beta..1+alpha..1" as String)
105+
XCTAssertEqual("\(Version(1, 2, 3, prereleaseIdentifiers: ["be-ta", "", "1"], buildMetadataIdentifiers: ["al-pha", "", "1"]))", "1.2.3-be-ta..1+al-pha..1" as String)
28106

29-
107+
}
108+
30109
func testLosslessConversionFromStringToVersion() {
31110

32111
// We use type coercion `as String` in `Version(_:)` because there is a pair of overloaded initializers: `init(_ version: Version)` and `init?(_ versionString: String)`, and we want to test the latter in this function.
@@ -79,7 +158,7 @@ class VersionTests: XCTestCase {
79158
XCTAssertNil(Version("1597.2584.4181.6765-a.whole.lot.of.pre-release.identifiers" as String))
80159
XCTAssertNil(Version("6 x 9 = 42-" as String))
81160
XCTAssertNil(Version("forty-two" as String))
82-
//
161+
83162
// MARK: Well-formed version core, well-formed build metadata identifiers
84163

85164
XCTAssertNotNil(Version("0.0.0+some-metadata" as String))
@@ -142,5 +221,123 @@ class VersionTests: XCTestCase {
142221
XCTAssertNil(Version("5702887.9227465-bètá1+±" as String))
143222

144223
}
224+
225+
func testExpressingVersionByStringLiteral() {
226+
227+
// MARK: Well-formed version core
228+
229+
XCTAssertEqual("0.0.0" as Version, Version(0, 0, 0))
230+
XCTAssertEqual("1.1.2" as Version, Version(1, 1, 2))
231+
232+
// MARK: Malformed version core
233+
234+
XCTAssertEqual("" as Version, Version(0, 0, 0))
235+
XCTAssertEqual("3" as Version, Version(0, 0, 0))
236+
XCTAssertEqual("3 5" as Version, Version(0, 0, 0))
237+
XCTAssertEqual("5.8" as Version, Version(0, 0, 0))
238+
XCTAssertEqual("-5.8.13" as Version, Version(0, 0, 0))
239+
XCTAssertEqual("8.-13.21" as Version, Version(0, 0, 0))
240+
XCTAssertEqual("13.21.-34" as Version, Version(0, 0, 0))
241+
XCTAssertEqual("-0.0.0" as Version, Version(0, 0, 0))
242+
XCTAssertEqual("0.-0.0" as Version, Version(0, 0, 0))
243+
XCTAssertEqual("0.0.-0" as Version, Version(0, 0, 0))
244+
XCTAssertEqual("21.34.55.89" as Version, Version(0, 0, 0))
245+
XCTAssertEqual("6 x 9 = 42" as Version, Version(0, 0, 0))
246+
XCTAssertEqual("forty two" as Version, Version(0, 0, 0))
247+
248+
// MARK: Well-formed version core, well-formed pre-release identifiers
249+
250+
XCTAssertEqual("0.0.0-pre-alpha" as Version, Version(0, 0, 0, prereleaseIdentifiers: ["pre-alpha"]))
251+
XCTAssertEqual("55.89.144-beta.1" as Version, Version(55, 89, 144, prereleaseIdentifiers: ["beta", "1"]))
252+
XCTAssertEqual("89.144.233-a.whole..lot.of.pre-release.identifiers" as Version, Version(89, 144, 233, prereleaseIdentifiers: ["a", "whole", "", "lot", "of", "pre-release", "identifiers"]))
253+
XCTAssertEqual("144.233.377-" as Version, Version(144, 233, 377, prereleaseIdentifiers: [""]))
254+
255+
// MARK: Well-formed version core, malformed pre-release identifiers
256+
257+
XCTAssertEqual("233.377.610-hello world" as Version, Version(0, 0, 0))
258+
259+
// MARK: Malformed version core, well-formed pre-release identifiers
260+
261+
XCTAssertEqual("-Hello.world--------" as Version, Version(0, 0, 0))
262+
XCTAssertEqual("987-Hello.world--------" as Version, Version(0, 0, 0))
263+
XCTAssertEqual("987.1597-half-life.3" as Version, Version(0, 0, 0))
264+
XCTAssertEqual("1597.2584.4181.6765-a.whole.lot.of.pre-release.identifiers" as Version, Version(0, 0, 0))
265+
XCTAssertEqual("6 x 9 = 42-" as Version, Version(0, 0, 0))
266+
XCTAssertEqual("forty-two" as Version, Version(0, 0, 0))
267+
268+
// MARK: Well-formed version core, well-formed build metadata identifiers
269+
270+
XCTAssertEqual("0.0.0+some-metadata" as Version, Version(0, 0, 0, buildMetadataIdentifiers: ["some-metadata"]))
271+
XCTAssertEqual("4181.6765.10946+more.meta..more.data" as Version, Version(4181, 6765, 10946, buildMetadataIdentifiers: ["more", "meta", "", "more", "data"]))
272+
XCTAssertEqual("6765.10946.17711+-a-very--long---build-----metadata--------identifier-------------with---------------------many----------------------------------hyphens-------------------------------------------------------" as Version, Version(6765, 10946, 17711, buildMetadataIdentifiers: ["-a-very--long---build-----metadata--------identifier-------------with---------------------many----------------------------------hyphens-------------------------------------------------------"]))
273+
XCTAssertEqual("10946.17711.28657+" as Version, Version(10946, 17711, 28657, buildMetadataIdentifiers: [""]))
274+
275+
// MARK: Well-formed version core, malformed build metadata identifiers
276+
277+
XCTAssertEqual("17711.28657.46368+hello world" as Version, Version(0, 0, 0))
278+
XCTAssertEqual("28657.46368.75025+hello+world" as Version, Version(0, 0, 0))
279+
280+
// MARK: Malformed version core, well-formed build metadata identifiers
281+
282+
XCTAssertEqual("+Hello.world--------" as Version, Version(0, 0, 0))
283+
XCTAssertEqual("121393+Hello.world--------" as Version, Version(0, 0, 0))
284+
XCTAssertEqual("121393.196418+half-life.3" as Version, Version(0, 0, 0))
285+
XCTAssertEqual("196418.317811.514229.832040+a.whole.lot.of.build.metadata.identifiers" as Version, Version(0, 0, 0))
286+
XCTAssertEqual("196418.317811.514229.832040+a.whole.lot.of.build.metadata.identifiers" as Version, Version(0, 0, 0))
287+
XCTAssertEqual("6 x 9 = 42+" as Version, Version(0, 0, 0))
288+
XCTAssertEqual("forty two+a-very-long-build-metadata-identifier-with-many-hyphens" as Version, Version(0, 0, 0))
289+
290+
// MARK: Well-formed version core, well-formed pre-release identifiers, well-formed build metadata identifiers
291+
292+
XCTAssertEqual("0.0.0-beta.-42+42-42.42" as Version, Version(0, 0, 0, prereleaseIdentifiers: ["beta", "-42"], buildMetadataIdentifiers: ["42-42", "42"]))
293+
294+
// MARK: Well-formed version core, well-formed pre-release identifiers, malformed build metadata identifiers
295+
296+
XCTAssertEqual("514229.832040.1346269-beta1+ " as Version, Version(0, 0, 0))
297+
298+
// MARK: Well-formed version core, malformed pre-release identifiers, well-formed build metadata identifiers
299+
300+
XCTAssertEqual("832040.1346269.2178309-beta 1+-" as Version, Version(0, 0, 0))
301+
302+
// MARK: Well-formed version core, malformed pre-release identifiers, malformed build metadata identifiers
303+
304+
XCTAssertEqual("1346269.2178309.3524578-beta 1++" as Version, Version(0, 0, 0))
305+
306+
// MARK: malformed version core, well-formed pre-release identifiers, well-formed build metadata identifiers
307+
308+
XCTAssertEqual(" 832040.1346269.3524578-beta1+abc" as Version, Version(0, 0, 0))
309+
310+
// MARK: malformed version core, well-formed pre-release identifiers, malformed build metadata identifiers
311+
312+
XCTAssertEqual("1346269.3524578.5702887-beta1+😀" as Version, Version(0, 0, 0))
313+
314+
// MARK: malformed version core, malformed pre-release identifiers, well-formed build metadata identifiers
315+
316+
XCTAssertEqual("3524578.5702887.9227465-beta!@#$%^&*1+asdfghjkl123456789" as Version, Version(0, 0, 0))
317+
318+
// MARK: malformed version core, malformed pre-release identifiers, malformed build metadata identifiers
319+
320+
XCTAssertEqual("5702887.9227465-bètá1+±" as Version, Version(0, 0, 0))
321+
322+
}
323+
324+
// A semantic version string is always longer than 1 character, so the only way to test these 2 initialisers is by calling them directly.
325+
326+
func testExpressingVersionByExtendedGraphemeClusterLiteral() {
327+
XCTAssertEqual(Version(extendedGraphemeClusterLiteral: "版⃣"), Version(0, 0, 0))
328+
}
329+
330+
func testExpressingVersionByUnicodeScalarLiteral() {
331+
XCTAssertEqual(Version(unicodeScalarLiteral: "a"), Version(0, 0, 0))
332+
}
333+
334+
func testInitializingVersionFromVersion() {
335+
XCTAssertEqual(Version(Version(0, 0, 0)), Version(0, 0, 0))
336+
XCTAssertEqual(Version(Version(1, 1, 2)), Version(1, 1, 2))
337+
XCTAssertEqual(Version(Version(55, 89, 144, prereleaseIdentifiers: ["beta", "1"])), Version(55, 89, 144, prereleaseIdentifiers: ["beta", "1"]))
338+
XCTAssertEqual(Version(Version(4181, 6765, 10946, buildMetadataIdentifiers: ["more", "meta", "", "more", "data"])), Version(4181, 6765, 10946, buildMetadataIdentifiers: ["more", "meta", "", "more", "data"]))
339+
XCTAssertEqual(Version(Version(0, 0, 0, prereleaseIdentifiers: ["beta", "-42"], buildMetadataIdentifiers: ["42-42", "42"])), Version(0, 0, 0, prereleaseIdentifiers: ["beta", "-42"], buildMetadataIdentifiers: ["42-42", "42"]))
340+
}
341+
145342
}
146343

0 commit comments

Comments
 (0)