@@ -33,6 +33,18 @@ class ToolsVersionLoaderTests: XCTestCase {
33
33
func testBasics( ) throws {
34
34
35
35
let validVersions = [
36
+ // No space between "//" and "swift-tools-version":
37
+ " //swift-tools-version:3.1 " : ( 3 , 1 , 0 , " 3.1.0 " ) ,
38
+ " //swift-tools-version:3.1-dev " : ( 3 , 1 , 0 , " 3.1.0 " ) ,
39
+ " //swift-tools-version:5.8.0 " : ( 5 , 8 , 0 , " 5.8.0 " ) ,
40
+ " //swift-tools-version:5.8.0-dev.al+sha.x " : ( 5 , 8 , 0 , " 5.8.0 " ) ,
41
+ " //swift-tools-version:3.1.2 " : ( 3 , 1 , 2 , " 3.1.2 " ) ,
42
+ " //swift-tools-version:3.1.2; " : ( 3 , 1 , 2 , " 3.1.2 " ) ,
43
+ " //swift-tools-vErsion:3.1.2;;;;; " : ( 3 , 1 , 2 , " 3.1.2 " ) ,
44
+ " //swift-tools-version:3.1.2;x;x;x;x;x; " : ( 3 , 1 , 2 , " 3.1.2 " ) ,
45
+ " //swift-toolS-version:3.5.2;hello " : ( 3 , 5 , 2 , " 3.5.2 " ) ,
46
+ " //sWiFt-tOoLs-vErSiOn:3.5.2 \n kkk \n " : ( 3 , 5 , 2 , " 3.5.2 " ) ,
47
+ // 1 space character (" ") between "//" and "swift-tools-version":
36
48
" // swift-tools-version:3.1 " : ( 3 , 1 , 0 , " 3.1.0 " ) ,
37
49
" // swift-tools-version:3.1-dev " : ( 3 , 1 , 0 , " 3.1.0 " ) ,
38
50
" // swift-tools-version:5.8.0 " : ( 5 , 8 , 0 , " 5.8.0 " ) ,
@@ -43,6 +55,39 @@ class ToolsVersionLoaderTests: XCTestCase {
43
55
" // swift-tools-version:3.1.2;x;x;x;x;x; " : ( 3 , 1 , 2 , " 3.1.2 " ) ,
44
56
" // swift-toolS-version:3.5.2;hello " : ( 3 , 5 , 2 , " 3.5.2 " ) ,
45
57
" // sWiFt-tOoLs-vErSiOn:3.5.2 \n kkk \n " : ( 3 , 5 , 2 , " 3.5.2 " ) ,
58
+ // 1 horizontal tab character (" ") between "//" and "swift-tools-version":
59
+ " // \t swift-tools-version:3.1 " : ( 3 , 1 , 0 , " 3.1.0 " ) ,
60
+ " // \t swift-tools-version:3.1-dev " : ( 3 , 1 , 0 , " 3.1.0 " ) ,
61
+ " // \t swift-tools-version:5.8.0 " : ( 5 , 8 , 0 , " 5.8.0 " ) ,
62
+ " // \t swift-tools-version:5.8.0-dev.al+sha.x " : ( 5 , 8 , 0 , " 5.8.0 " ) ,
63
+ " // \t swift-tools-version:3.1.2 " : ( 3 , 1 , 2 , " 3.1.2 " ) ,
64
+ " // \t swift-tools-version:3.1.2; " : ( 3 , 1 , 2 , " 3.1.2 " ) ,
65
+ " // \t swift-tools-vErsion:3.1.2;;;;; " : ( 3 , 1 , 2 , " 3.1.2 " ) ,
66
+ " // \t swift-tools-version:3.1.2;x;x;x;x;x; " : ( 3 , 1 , 2 , " 3.1.2 " ) ,
67
+ " // \t swift-toolS-version:3.5.2;hello " : ( 3 , 5 , 2 , " 3.5.2 " ) ,
68
+ " // \t sWiFt-tOoLs-vErSiOn:3.5.2 \n kkk \n " : ( 3 , 5 , 2 , " 3.5.2 " ) ,
69
+ // 1 horizontal tab character followed by 1 space character (" ") between "//" and "swift-tools-version":
70
+ " // \t swift-tools-version:3.1 " : ( 3 , 1 , 0 , " 3.1.0 " ) ,
71
+ " // \t swift-tools-version:3.1-dev " : ( 3 , 1 , 0 , " 3.1.0 " ) ,
72
+ " // \t swift-tools-version:5.8.0 " : ( 5 , 8 , 0 , " 5.8.0 " ) ,
73
+ " // \t swift-tools-version:5.8.0-dev.al+sha.x " : ( 5 , 8 , 0 , " 5.8.0 " ) ,
74
+ " // \t swift-tools-version:3.1.2 " : ( 3 , 1 , 2 , " 3.1.2 " ) ,
75
+ " // \t swift-tools-version:3.1.2; " : ( 3 , 1 , 2 , " 3.1.2 " ) ,
76
+ " // \t swift-tools-vErsion:3.1.2;;;;; " : ( 3 , 1 , 2 , " 3.1.2 " ) ,
77
+ " // \t swift-tools-version:3.1.2;x;x;x;x;x; " : ( 3 , 1 , 2 , " 3.1.2 " ) ,
78
+ " // \t swift-toolS-version:3.5.2;hello " : ( 3 , 5 , 2 , " 3.5.2 " ) ,
79
+ " // \t sWiFt-tOoLs-vErSiOn:3.5.2 \n kkk \n " : ( 3 , 5 , 2 , " 3.5.2 " ) ,
80
+ // An assortment of horizontal whitespace characters between "//" and "swift-tools-version":
81
+ " // \u{A0} \u{1680} \t \u{2000} \u{2001} \u{2002} \u{202F} \u{3000} swift-tools-version:3.1 " : ( 3 , 1 , 0 , " 3.1.0 " ) ,
82
+ " // \u{A0} \u{1680} \t \u{2000} \u{2001} \u{2002} \u{202F} \u{3000} swift-tools-version:3.1-dev " : ( 3 , 1 , 0 , " 3.1.0 " ) ,
83
+ " // \u{A0} \u{1680} \t \u{2000} \u{2001} \u{2002} \u{202F} \u{3000} swift-tools-version:5.8.0 " : ( 5 , 8 , 0 , " 5.8.0 " ) ,
84
+ " // \u{A0} \u{1680} \t \u{2000} \u{2001} \u{2002} \u{202F} \u{3000} swift-tools-version:5.8.0-dev.al+sha.x " : ( 5 , 8 , 0 , " 5.8.0 " ) ,
85
+ " // \u{A0} \u{1680} \t \u{2000} \u{2001} \u{2002} \u{202F} \u{3000} swift-tools-version:3.1.2 " : ( 3 , 1 , 2 , " 3.1.2 " ) ,
86
+ " // \u{A0} \u{1680} \t \u{2000} \u{2001} \u{2002} \u{202F} \u{3000} swift-tools-version:3.1.2; " : ( 3 , 1 , 2 , " 3.1.2 " ) ,
87
+ " // \u{A0} \u{1680} \t \u{2000} \u{2001} \u{2002} \u{202F} \u{3000} swift-tools-vErsion:3.1.2;;;;; " : ( 3 , 1 , 2 , " 3.1.2 " ) ,
88
+ " // \u{A0} \u{1680} \t \u{2000} \u{2001} \u{2002} \u{202F} \u{3000} swift-tools-version:3.1.2;x;x;x;x;x; " : ( 3 , 1 , 2 , " 3.1.2 " ) ,
89
+ " // \u{A0} \u{1680} \t \u{2000} \u{2001} \u{2002} \u{202F} \u{3000} swift-toolS-version:3.5.2;hello " : ( 3 , 5 , 2 , " 3.5.2 " ) ,
90
+ " // \u{A0} \u{1680} \t \u{2000} \u{2001} \u{2002} \u{202F} \u{3000} sWiFt-tOoLs-vErSiOn:3.5.2 \n kkk \n " : ( 3 , 5 , 2 , " 3.5.2 " ) ,
46
91
]
47
92
48
93
for (version, result) in validVersions {
@@ -105,6 +150,29 @@ class ToolsVersionLoaderTests: XCTestCase {
105
150
assertFailure ( " // swift-tools-version:6.1.2.0 \n " , " 6.1.2.0 " )
106
151
assertFailure ( " // swift-tools-version:-1.1.2 \n " , " -1.1.2 " )
107
152
assertFailure ( " // swift-tools-version:3.1hello " , " 3.1hello " )
153
+
154
+ // FIXME: Newline and line feed characters following "//" cause test failures.
155
+
156
+ // Verify no matching for vertical white space charaters between "//" and "swift-tools-version":
157
+ assertFailure ( " // \n swift-tools-version:5.3 \n " , " // \n swift-tools-version:5.3 " )
158
+ assertFailure ( " // \n swift-tools-version:5.3 \n " , " // \n swift-tools-version:5.3 " )
159
+ assertFailure ( " // \n swift-tools-version:5.3 \n " , " // \n swift-tools-version:5.3 " )
160
+ assertFailure ( " // \r swift-tools-version:5.3 \n " , " // \r swift-tools-version:5.3 " )
161
+ assertFailure ( " // \r swift-tools-version:5.3 \n " , " // \r swift-tools-version:5.3 " )
162
+ assertFailure ( " // \r swift-tools-version:5.3 \n " , " // \r swift-tools-version:5.3 " )
163
+ assertFailure ( " // \r \n swift-tools-version:5.3 \n " , " // \r \n swift-tools-version:5.3 " )
164
+ assertFailure ( " // \n \r swift-tools-version:5.3 \n " , " // \n \r swift-tools-version:5.3 " )
165
+ assertFailure ( " // \u{B} swift-tools-version:5.3 \n " , " // \u{B} swift-tools-version:5.3 " )
166
+ assertFailure ( " // \u{2028} swift-tools-version:5.3 \n " , " // \u{2028} swift-tools-version:5.3 " )
167
+ assertFailure ( " // \u{2029} swift-tools-version:5.3 \n " , " // \u{2029} swift-tools-version:5.3 " )
168
+
169
+ // Verify no matching for related Unicode characters without `White_Space` property, between "//" and "swift-tools-version":
170
+ assertFailure ( " // \u{180E} swift-tools-version:5.3 \n " , " // \u{180E} swift-tools-version:5.3 " )
171
+ assertFailure ( " // \u{200B} swift-tools-version:5.3 \n " , " // \u{200B} swift-tools-version:5.3 " )
172
+ assertFailure ( " // \u{200C} swift-tools-version:5.3 \n " , " // \u{200C} swift-tools-version:5.3 " )
173
+ assertFailure ( " // \u{200D} swift-tools-version:5.3 \n " , " // \u{200D} swift-tools-version:5.3 " )
174
+ assertFailure ( " // \u{2060} swift-tools-version:5.3 \n " , " // \u{2060} swift-tools-version:5.3 " )
175
+ assertFailure ( " // \u{FEFF} swift-tools-version:5.3 \n " , " // \u{FEFF} swift-tools-version:5.3 " )
108
176
}
109
177
110
178
func testVersionSpecificManifest( ) throws {
0 commit comments