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 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2024 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
//
extension ABI {
/// A type implementing the JSON encoding of ``Test`` for the ABI entry point
/// and event stream output.
///
/// The properties and members of this type are documented in ABI/JSON.md.
///
/// This type is not part of the public interface of the testing library. It
/// assists in converting values to JSON; clients that consume this JSON are
/// expected to write their own decoders.
struct EncodedTest<V>: Sendable where V: ABI.Version {
/// An enumeration describing the various kinds of test.
enum Kind: String, Sendable {
/// A test suite.
case suite
/// A test function.
case function
}
/// The kind of test.
var kind: Kind
/// The programmatic name of the test, such as its corresponding Swift
/// function or type name.
var name: String
/// The developer-supplied human-readable name of the test.
var displayName: String?
/// The source location of this test.
var sourceLocation: SourceLocation
/// A type implementing the JSON encoding of ``Test/ID`` for the ABI entry
/// point and event stream output.
struct ID: Codable {
/// The string value representing the corresponding test ID.
var stringValue: String
init(encoding testID: borrowing Test.ID) {
stringValue = String(describing: copy testID)
}
func encode(to encoder: any Encoder) throws {
try stringValue.encode(to: encoder)
}
init(from decoder: any Decoder) throws {
stringValue = try String(from: decoder)
}
}
/// The unique identifier of this test.
var id: ID
/// The test cases in this test, if it is a parameterized test function.
///
/// - Warning: Test cases are not yet part of the JSON schema.
var _testCases: [EncodedTestCase<V>]?
/// Whether or not the test is parameterized.
///
/// If this instance represents a test _suite_, the value of this property
/// is `nil`.
var isParameterized: Bool?
/// The tags associated with the test.
///
/// - Warning: Tags are not yet part of the JSON schema.
///
/// @Metadata {
/// @Available("Swift Testing ABI", introduced: 1)
/// }
var _tags: [String]?
init(encoding test: borrowing Test) {
if test.isSuite {
kind = .suite
} else {
kind = .function
let testIsParameterized = test.isParameterized
isParameterized = testIsParameterized
if testIsParameterized {
_testCases = test.uncheckedTestCases?.map(EncodedTestCase.init(encoding:))
}
}
name = test.name
displayName = test.displayName
sourceLocation = test.sourceLocation
id = ID(encoding: test.id)
if V.versionNumber >= ABI.v1.versionNumber {
let tags = test.tags
if !tags.isEmpty {
_tags = tags.map(String.init(describing:))
}
}
}
}
}
extension ABI {
/// A type implementing the JSON encoding of ``Test/Case`` for the ABI entry
/// point and event stream output.
///
/// The properties and members of this type are documented in ABI/JSON.md.
///
/// This type is not part of the public interface of the testing library. It
/// assists in converting values to JSON; clients that consume this JSON are
/// expected to write their own decoders.
///
/// - Warning: Test cases are not yet part of the JSON schema.
struct EncodedTestCase<V>: Sendable where V: ABI.Version {
var id: String
var displayName: String
init(encoding testCase: borrowing Test.Case) {
guard let arguments = testCase.arguments else {
preconditionFailure("Attempted to initialize an EncodedTestCase encoding a test case which is not parameterized: \(testCase). Please file a bug report at https://github.com/swiftlang/swift-testing/issues/new")
}
// TODO: define an encodable form of Test.Case.ID
id = String(describing: testCase.id)
displayName = arguments.lazy
.map(\.value)
.map(String.init(describingForTest:))
.joined(separator: ", ")
}
}
}
// MARK: - Codable
extension ABI.EncodedTest: Codable {}
extension ABI.EncodedTest.Kind: Codable {}
extension ABI.EncodedTestCase: Codable {}
|