1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
/*
This source file is part of the Swift.org open source project
Copyright (c) 2023 Apple Inc. and the Swift project authors
Licensed under Apache License v2.0 with Runtime Library Exception
See https://swift.org/LICENSE.txt for license information
See https://swift.org/CONTRIBUTORS.txt for Swift project authors
*/
#if canImport(XCTest)
import XCTest
@testable @_spi(ForToolsIntegrationOnly) import Testing
final class NonXCTestCaseClassTests: NSObject {
@Test("Methods on non-XCTestCase subclasses are supported")
func testFunctionThatLooksLikeXCTest() {
// By virtue of this test running without generating an issue, we can
// assert that it didn't hit the XCTestCase API misuse code path.
#if _runtime(_ObjC)
#expect(Test.current?.xcTestCompatibleSelector != nil)
#endif
}
}
class IndirectXCTestCase: XCTestCase {}
@Suite(.hidden, .enabled(if: ObjCAndXCTestInteropTests.areObjCClassTestsEnabled))
final class ObjCClassTests: IndirectXCTestCase {
#if !SWT_TARGET_OS_APPLE
convenience init() {
self.init(name: "") { _ in }
}
#endif
#if _runtime(_ObjC)
@Test(.hidden)
@objc(testExplicitName) func wrongAnswer() {}
@Test(.hidden)
@objc(testExplicitNameWithCompletionHandler:) func wrongAnswerAsync() async {}
@Test(.hidden)
@objc(testExplicitNameThrowsFunError:) func wrongAnswerThrows() throws {}
@Test(.hidden)
@objc(testExplicitNameAsyncThrowsWithCompletionHandler:) func wrongAnswerAsyncThrows() async throws {}
@Test(.hidden)
@objc(`testExplicitNameWithBackticks`) func wrongAnswerWithBackticks() {}
#endif
@Test(.hidden)
func testImplicitName() {}
@Test(.hidden)
func `testImplicitNameWithBackticks`() {}
@Test(.hidden)
func testAsynchronous() async {}
@Test(.hidden)
func testThrowing() throws {}
@Test(.hidden)
func testAsynchronousThrowing() async throws {}
}
@Suite("Objective-C/XCTest Interop Tests")
struct ObjCAndXCTestInteropTests {
@TaskLocal static var areObjCClassTestsEnabled = false
#if _runtime(_ObjC)
@Test("Objective-C selectors are discovered")
func objCSelectors() async throws {
let testPlan = await Runner.Plan(selecting: ObjCClassTests.self)
let steps = testPlan.steps.filter { !$0.test.isSuite }
#expect(steps.count > 0)
for step in steps {
let selector = try #require(step.test.xcTestCompatibleSelector)
let testCaseClass = try #require(step.test.containingTypeInfo?.type as? NSObject.Type)
#expect(testCaseClass.instancesRespond(to: selector))
}
}
#endif
@Test("XCTest test methods are currently unsupported")
func xctestMethodsCurrentlyUnsupported() async throws {
#if _runtime(_ObjC)
let expectedCount = 10
#else
let expectedCount = 5
#endif
await confirmation("XCTestCase issue recorded", expectedCount: expectedCount) { issueRecorded in
var configuration = Configuration()
configuration.eventHandler = { event, _ in
if case let .issueRecorded(issue) = event.kind,
case .apiMisused = issue.kind,
let comment = issue.comments.first,
comment == "The @Test attribute cannot be applied to methods on a subclass of XCTestCase." {
issueRecorded()
}
}
await Self.$areObjCClassTestsEnabled.withValue(true) {
await runTest(for: ObjCClassTests.self, configuration: configuration)
}
}
}
}
#endif
|