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
|
//
// 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
//
extension Test.Case {
/// The ID of a test case.
///
/// Instances of this type are considered unique within the scope of a given
/// parameterized test function. They are not necessarily unique across two
/// different ``Test`` instances.
@_spi(ForToolsIntegrationOnly)
public struct ID: Sendable, Equatable, Hashable {
/// The IDs of the arguments of this instance's associated ``Test/Case``, in
/// the order they appear in ``Test/Case/arguments``.
///
/// The value of this property is `nil` if _any_ of the associated test
/// case's arguments has a `nil` ID.
public var argumentIDs: [Argument.ID]?
public init(argumentIDs: [Argument.ID]?) {
self.argumentIDs = argumentIDs
}
}
@_spi(ForToolsIntegrationOnly)
public var id: ID {
let argumentIDs = arguments.compactMap(\.id)
guard argumentIDs.count == arguments.count else {
return ID(argumentIDs: nil)
}
return ID(argumentIDs: argumentIDs)
}
}
// MARK: - CustomStringConvertible
extension Test.Case.ID: CustomStringConvertible {
public var description: String {
"argumentIDs: \(String(describing: argumentIDs))"
}
}
// MARK: - Codable
extension Test.Case.ID: Codable {}
// MARK: - Equatable
// We cannot safely implement Equatable for Test.Case because its values are
// type-erased. It does conform to `Identifiable`, but its ID type is composed
// of the IDs of its arguments, and those IDs are not always available (for
// example, if the type of an argument is not Codable). Thus, we cannot check
// for equality of test cases based on this, because if two test cases had
// different arguments, but the type of those arguments is not Codable, they
// both will have a `nil` ID and would incorrectly be considered equal.
//
// `Test.Case.ID` is Equatable, however.
|