Skip to content

Commit ff86a69

Browse files
authored
Add a StdlibUnitTest modifier for requiring a stdlib version (swiftlang#79838)
It would be great if this could also set the availability for the `code:` block, but this at least cuts out some boilerplate.
1 parent 50531f2 commit ff86a69

File tree

5 files changed

+55
-48
lines changed

5 files changed

+55
-48
lines changed

Diff for: stdlib/private/StdlibUnittest/StdlibUnittest.swift

+42
Original file line numberDiff line numberDiff line change
@@ -2112,6 +2112,11 @@ public final class TestSuite {
21122112
return self
21132113
}
21142114

2115+
public func require(_ stdlibVersion: StdLibVersion) -> _TestBuilder {
2116+
_data._skip.append(.minimumStdlib(stdlibVersion))
2117+
return self
2118+
}
2119+
21152120
public func stdin(_ stdinText: String, eof: Bool = false) -> _TestBuilder {
21162121
_data._stdinText = stdinText
21172122
_data._stdinEndsWithEOF = eof
@@ -2203,6 +2208,35 @@ func _getSystemVersionPlistProperty(_ propertyName: String) -> String? {
22032208
#endif
22042209
#endif
22052210

2211+
public enum StdLibVersion: String {
2212+
case stdlib_5_7 = "5.7"
2213+
case stdlib_5_8 = "5.8"
2214+
case stdlib_5_9 = "5.9"
2215+
case stdlib_5_10 = "5.10"
2216+
case stdlib_6_0 = "6.0"
2217+
case stdlib_6_1 = "6.1"
2218+
case stdlib_6_2 = "6.2"
2219+
2220+
var isAvailable: Bool {
2221+
switch self {
2222+
case .stdlib_5_7:
2223+
return if #available(SwiftStdlib 5.7, *) { true } else { false }
2224+
case .stdlib_5_8:
2225+
return if #available(SwiftStdlib 5.8, *) { true } else { false }
2226+
case .stdlib_5_9:
2227+
return if #available(SwiftStdlib 5.9, *) { true } else { false }
2228+
case .stdlib_5_10:
2229+
return if #available(SwiftStdlib 5.10, *) { true } else { false }
2230+
case .stdlib_6_0:
2231+
return if #available(SwiftStdlib 6.0, *) { true } else { false }
2232+
case .stdlib_6_1:
2233+
return if #available(SwiftStdlib 6.1, *) { true } else { false }
2234+
case .stdlib_6_2:
2235+
return if #available(SwiftStdlib 6.2, *) { true } else { false }
2236+
}
2237+
}
2238+
}
2239+
22062240
public enum OSVersion : CustomStringConvertible {
22072241
case osx(major: Int, minor: Int, bugFix: Int)
22082242
case iOS(major: Int, minor: Int, bugFix: Int)
@@ -2413,6 +2447,8 @@ public enum TestRunPredicate : CustomStringConvertible {
24132447
case objCRuntime(/*reason:*/ String)
24142448
case nativeRuntime(/*reason:*/ String)
24152449

2450+
case minimumStdlib(StdLibVersion)
2451+
24162452
public var description: String {
24172453
switch self {
24182454
case .custom(_, let reason):
@@ -2533,6 +2569,9 @@ public enum TestRunPredicate : CustomStringConvertible {
25332569
return "Objective-C runtime, reason: \(reason))"
25342570
case .nativeRuntime(let reason):
25352571
return "Native runtime (no ObjC), reason: \(reason))"
2572+
2573+
case .minimumStdlib(let version):
2574+
return "Requires Swift \(version.rawValue)'s standard library"
25362575
}
25372576
}
25382577

@@ -2921,6 +2960,9 @@ public enum TestRunPredicate : CustomStringConvertible {
29212960
#else
29222961
return true
29232962
#endif
2963+
2964+
case .minimumStdlib(let version):
2965+
return !version.isAvailable
29242966
}
29252967
}
29262968
}

Diff for: test/Casting/Casts.swift

+1-3
Original file line numberDiff line numberDiff line change
@@ -981,9 +981,7 @@ CastsTests.test("Recursive AnyHashable") {
981981
// https://github.com/apple/swift/issues/56987
982982
#if _runtime(_ObjC)
983983
CastsTests.test("Do not overuse __SwiftValue")
984-
.skip(.custom({
985-
if #available(SwiftStdlib 5.9, *) { return false } else { return true }
986-
}, reason: "Requires stdlib from Swift 5.9 or later"))
984+
.require(.stdlib_5_9)
987985
.code {
988986
struct Bar {}
989987
// This used to succeed because of overeager __SwiftValue

Diff for: test/stdlib/StringCreate.swift

+5-20
Original file line numberDiff line numberDiff line change
@@ -148,10 +148,7 @@ let s1 = "Long string containing the characters é, ß, 🦆, and 👨‍👧‍
148148
let s2 = "Long ascii string with no accented characters (obviously)."
149149

150150
StringCreateTests.test("Validating.utf8")
151-
.skip(.custom(
152-
{ if #available(SwiftStdlib 6.0, *) { false } else { true } },
153-
reason: "Requires Swift 6.0's standard library"
154-
))
151+
.require(.stdlib_6_0)
155152
.code {
156153
guard #available(SwiftStdlib 6.0, *) else { return }
157154

@@ -182,10 +179,7 @@ StringCreateTests.test("Validating.utf8")
182179
}
183180

184181
StringCreateTests.test("Validating.utf8.from.int8")
185-
.skip(.custom(
186-
{ if #available(SwiftStdlib 6.0, *) { false } else { true } },
187-
reason: "Requires Swift 6.0's standard library"
188-
))
182+
.require(.stdlib_6_0)
189183
.code {
190184
guard #available(SwiftStdlib 6.0, *) else { return }
191185

@@ -209,10 +203,7 @@ StringCreateTests.test("Validating.utf8.from.int8")
209203
}
210204

211205
StringCreateTests.test("Validating.ascii")
212-
.skip(.custom(
213-
{ if #available(SwiftStdlib 6.0, *) { false } else { true } },
214-
reason: "Requires Swift 6.0's standard library"
215-
))
206+
.require(.stdlib_6_0)
216207
.code {
217208
guard #available(SwiftStdlib 6.0, *) else { return }
218209

@@ -236,10 +227,7 @@ StringCreateTests.test("Validating.ascii")
236227
}
237228

238229
StringCreateTests.test("Validating.utf16")
239-
.skip(.custom(
240-
{ if #available(SwiftStdlib 6.0, *) { false } else { true } },
241-
reason: "Requires Swift 6.0's standard library"
242-
))
230+
.require(.stdlib_6_0)
243231
.code {
244232
guard #available(SwiftStdlib 6.0, *) else { return }
245233

@@ -263,10 +251,7 @@ StringCreateTests.test("Validating.utf16")
263251
}
264252

265253
StringCreateTests.test("Validating.utf32")
266-
.skip(.custom(
267-
{ if #available(SwiftStdlib 6.0, *) { false } else { true } },
268-
reason: "Requires Swift 6.0's standard library"
269-
))
254+
.require(.stdlib_6_0)
270255
.code {
271256
guard #available(SwiftStdlib 6.0, *) else { return }
272257

Diff for: test/stdlib/UnsafeRawBufferPointer.swift

+3-10
Original file line numberDiff line numberDiff line change
@@ -578,9 +578,7 @@ UnsafeRawBufferPointerTestSuite.test("load.invalid")
578578
}
579579

580580
UnsafeRawBufferPointerTestSuite.test("load.unaligned")
581-
.skip(.custom({ // require SwiftStdlib 5.7
582-
if #available(SwiftStdlib 5.7, *) { return false } else { return true }
583-
}, reason: "Requires stdlib from Swift 5.7"))
581+
.require(.stdlib_5_7)
584582
.code {
585583
guard #available(SwiftStdlib 5.7, *) else { return }
586584
var data: [UInt8] = [0, 0, 0, .max, .max, .max, .max, 0]
@@ -619,10 +617,7 @@ UnsafeRawBufferPointerTestSuite.test("store.after")
619617
}
620618

621619
UnsafeRawBufferPointerTestSuite.test("store.unaligned")
622-
.skip(.custom({
623-
if #available(SwiftStdlib 5.7, *) { return false }
624-
return true
625-
}, reason: "Requires Swift 5.7's stdlib"))
620+
.require(.stdlib_5_7)
626621
.code {
627622
let count = MemoryLayout<UInt>.stride * 2
628623
let p1 = UnsafeMutableRawBufferPointer.allocate(
@@ -648,9 +643,7 @@ UnsafeRawBufferPointerTestSuite.test("store.unaligned")
648643
UnsafeRawBufferPointerTestSuite.test("store.invalid")
649644
.skip(.custom({ !_isDebugAssertConfiguration() }, // require debugAssert
650645
reason: "This tests a debug precondition.."))
651-
.skip(.custom({ // require SwiftStdlib 5.7
652-
if #available(SwiftStdlib 5.7, *) { return false } else { return true }
653-
}, reason: "Requires stdlib from Swift 5.7"))
646+
.require(.stdlib_5_7)
654647
.code {
655648
let t = "Text that is longer than fits in a small String."
656649
let p1 = UnsafeMutableRawPointer.allocate(

Diff for: test/stdlib/UnsafeRawPointer.swift

+4-15
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,7 @@ UnsafeMutableRawPointerExtraTestSuite.test("initializeMemory") {
5555
}
5656

5757
UnsafeMutableRawPointerExtraTestSuite.test("initializeMemorySingleElement")
58-
.skip(.custom({
59-
if #available(SwiftStdlib 5.8, *) { return false } else { return true }
60-
}, reason: "Requires standard library from Swift 5.8"))
58+
.require(.stdlib_5_8)
6159
.code {
6260
Missile.missilesLaunched = 0
6361
let p1 = UnsafeMutableRawPointer.allocate(
@@ -112,10 +110,7 @@ UnsafeMutableRawPointerExtraTestSuite.test("load/store") {
112110
}
113111

114112
UnsafeMutableRawPointerExtraTestSuite.test("load.unaligned")
115-
.skip(.custom({
116-
if #available(SwiftStdlib 5.7, *) { return false }
117-
return true
118-
}, reason: "Requires Swift 5.7's stdlib"))
113+
.require(.stdlib_5_7)
119114
.code {
120115
guard #available(SwiftStdlib 5.7, *) else { return }
121116
var data: [UInt8] = [0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0]
@@ -158,10 +153,7 @@ UnsafeMutableRawPointerExtraTestSuite.test("load.invalid.mutable")
158153
#endif
159154

160155
UnsafeMutableRawPointerExtraTestSuite.test("store.unaligned")
161-
.skip(.custom({
162-
if #available(SwiftStdlib 5.7, *) { return false }
163-
return true
164-
}, reason: "Requires Swift 5.7's stdlib"))
156+
.require(.stdlib_5_7)
165157
.code {
166158
let count = MemoryLayout<UInt>.stride * 2
167159
let p1 = UnsafeMutableRawPointer.allocate(
@@ -190,10 +182,7 @@ UnsafeMutableRawPointerExtraTestSuite.test("store.unaligned")
190182
UnsafeMutableRawPointerExtraTestSuite.test("store.invalid")
191183
.skip(.custom({ !_isDebugAssertConfiguration() },
192184
reason: "This tests a debug precondition.."))
193-
.skip(.custom({
194-
if #available(SwiftStdlib 5.7, *) { return false }
195-
return true
196-
}, reason: "Requires Swift 5.7's stdlib"))
185+
.require(.stdlib_5_7)
197186
.code {
198187
Missile.missilesLaunched = 0
199188
let m = Missile(0)

0 commit comments

Comments
 (0)