Skip to content

Commit ced504d

Browse files
authored
Report an error when attempting to use --filter or --skip in unsupported environments (#163)
Resolves rdar://119837856
1 parent f955de6 commit ced504d

File tree

2 files changed

+44
-16
lines changed

2 files changed

+44
-16
lines changed

Sources/Testing/Running/EntryPoint.swift

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -172,26 +172,31 @@ func configurationForSwiftPMEntryPoint(withArguments args: [String]) throws -> C
172172
// constructed solely from a string, they are safe to send across isolation
173173
// boundaries.
174174
var filters = [Configuration.TestFilter]()
175-
if #available(_regexAPI, *) {
176-
if let filterArgIndex = args.firstIndex(of: "--filter"), filterArgIndex < args.endIndex {
177-
let filterArg = args[args.index(after: filterArgIndex)]
178-
179-
let regex = try UncheckedSendable(rawValue: Regex(filterArg))
180-
filters.append { test in
181-
let id = String(describing: test.id)
182-
return id.contains(regex.rawValue)
183-
}
175+
if let filterArgIndex = args.firstIndex(of: "--filter"), filterArgIndex < args.endIndex {
176+
guard #available(_regexAPI, *) else {
177+
throw _EntryPointError.featureUnavailable("The '--filter' option is not supported on this OS version.")
184178
}
185-
if let skipArgIndex = args.firstIndex(of: "--skip"), skipArgIndex < args.endIndex {
186-
let skipArg = args[args.index(after: skipArgIndex)]
187179

188-
let regex = try UncheckedSendable(rawValue: Regex(skipArg))
189-
filters.append { test in
190-
let id = String(describing: test.id)
191-
return !id.contains(regex.rawValue)
192-
}
180+
let filterArg = args[args.index(after: filterArgIndex)]
181+
let regex = try UncheckedSendable(rawValue: Regex(filterArg))
182+
filters.append { test in
183+
let id = String(describing: test.id)
184+
return id.contains(regex.rawValue)
193185
}
194186
}
187+
if let skipArgIndex = args.firstIndex(of: "--skip"), skipArgIndex < args.endIndex {
188+
guard #available(_regexAPI, *) else {
189+
throw _EntryPointError.featureUnavailable("The '--skip' option is not supported on this OS version.")
190+
}
191+
192+
let skipArg = args[args.index(after: skipArgIndex)]
193+
let regex = try UncheckedSendable(rawValue: Regex(skipArg))
194+
filters.append { test in
195+
let id = String(describing: test.id)
196+
return !id.contains(regex.rawValue)
197+
}
198+
}
199+
195200
configuration.testFilter = { [filters] test in
196201
filters.allSatisfy { filter in
197202
filter(test)
@@ -329,3 +334,23 @@ extension [Event.ConsoleOutputRecorder.Option] {
329334
}
330335
#endif
331336
}
337+
338+
// MARK: - Error reporting
339+
340+
/// A type describing an error encountered in the entry point.
341+
private enum _EntryPointError: Error {
342+
/// A feature is unavailable.
343+
///
344+
/// - Parameters:
345+
/// - explanation: An explanation of the problem.
346+
case featureUnavailable(_ explanation: String)
347+
}
348+
349+
extension _EntryPointError: CustomStringConvertible {
350+
var description: String {
351+
switch self {
352+
case let .featureUnavailable(explanation):
353+
explanation
354+
}
355+
}
356+
}

Tests/TestingTests/SwiftPMTests.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ struct SwiftPMTests {
4242
}
4343

4444
@Test("--filter argument")
45+
@available(_regexAPI, *)
4546
func filter() throws {
4647
let configuration = try configurationForSwiftPMEntryPoint(withArguments: ["PATH", "--filter", "hello"])
4748
let testFilter = try #require(configuration.testFilter)
@@ -62,6 +63,7 @@ struct SwiftPMTests {
6263
}
6364

6465
@Test("--skip argument")
66+
@available(_regexAPI, *)
6567
func skip() throws {
6668
let configuration = try configurationForSwiftPMEntryPoint(withArguments: ["PATH", "--skip", "hello"])
6769
let testFilter = try #require(configuration.testFilter)
@@ -82,6 +84,7 @@ struct SwiftPMTests {
8284
}
8385

8486
@Test("--filter/--skip arguments and .hidden trait")
87+
@available(_regexAPI, *)
8588
func filterAndSkipAndHidden() throws {
8689
let configuration = try configurationForSwiftPMEntryPoint(withArguments: ["PATH", "--filter", "hello", "--skip", "hello2"])
8790
let testFilter = try #require(configuration.testFilter)

0 commit comments

Comments
 (0)