@@ -24,9 +24,88 @@ class VersionTests: XCTestCase {
24
24
XCTAssertEqual ( Version ( " 1.2.3-alpha.beta.2 " ) . description, " 1.2.3-alpha.beta.2 " )
25
25
}
26
26
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
+
27
58
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 )
28
106
29
-
107
+ }
108
+
30
109
func testLosslessConversionFromStringToVersion( ) {
31
110
32
111
// 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 {
79
158
XCTAssertNil ( Version ( " 1597.2584.4181.6765-a.whole.lot.of.pre-release.identifiers " as String ) )
80
159
XCTAssertNil ( Version ( " 6 x 9 = 42- " as String ) )
81
160
XCTAssertNil ( Version ( " forty-two " as String ) )
82
- //
161
+
83
162
// MARK: Well-formed version core, well-formed build metadata identifiers
84
163
85
164
XCTAssertNotNil ( Version ( " 0.0.0+some-metadata " as String ) )
@@ -142,5 +221,123 @@ class VersionTests: XCTestCase {
142
221
XCTAssertNil ( Version ( " 5702887.9227465-bètá1+± " as String ) )
143
222
144
223
}
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
+
145
342
}
146
343
0 commit comments