File: ObjCInteropTests.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (110 lines) | stat: -rw-r--r-- 3,375 bytes parent folder | download
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