-
Notifications
You must be signed in to change notification settings - Fork 102
/
Copy pathABI.EncodedEvent.swift
111 lines (100 loc) · 3.68 KB
/
ABI.EncodedEvent.swift
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
//
// 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 ``Event`` for the ABI entry point
/// and event stream output.
///
/// 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 EncodedEvent<V>: Sendable where V: ABI.Version {
/// An enumeration describing the various kinds of event.
///
/// Note that the set of encodable events is a subset of all events
/// generated at runtime by the testing library.
///
/// For descriptions of individual cases, see ``Event/Kind``.
enum Kind: String, Sendable {
case runStarted
case testStarted
case testCaseStarted
case issueRecorded
case valueAttached
case testCaseEnded
case testEnded
case testSkipped
case runEnded
}
/// The kind of event.
var kind: Kind
/// The instant at which the event occurred.
var instant: EncodedInstant<V>
/// The issue that occurred, if any.
///
/// The value of this property is `nil` unless the value of the
/// ``kind-swift.property`` property is ``Kind-swift.enum/issueRecorded``.
var issue: EncodedIssue<V>?
/// The value that was attached, if any.
///
/// The value of this property is `nil` unless the value of the
/// ``kind-swift.property`` property is ``Kind-swift.enum/valueAttached``.
var attachment: EncodedAttachment<V>?
/// Human-readable messages associated with this event that can be presented
/// to the user.
var messages: [EncodedMessage<V>]
/// The ID of the test associated with this event, if any.
var testID: EncodedTest<V>.ID?
/// The ID of the test case associated with this event, if any.
///
/// - Warning: Test cases are not yet part of the JSON schema.
var _testCase: EncodedTestCase<V>?
init?(encoding event: borrowing Event, in eventContext: borrowing Event.Context, messages: borrowing [Event.HumanReadableOutputRecorder.Message]) {
switch event.kind {
case .runStarted:
kind = .runStarted
case .testStarted:
kind = .testStarted
case .testCaseStarted:
if eventContext.test?.isParameterized == false {
return nil
}
kind = .testCaseStarted
case let .issueRecorded(recordedIssue):
kind = .issueRecorded
issue = EncodedIssue(encoding: recordedIssue, in: eventContext)
case let .valueAttached(attachment):
kind = .valueAttached
self.attachment = EncodedAttachment(encoding: attachment, in: eventContext)
case .testCaseEnded:
if eventContext.test?.isParameterized == false {
return nil
}
kind = .testCaseEnded
case .testEnded:
kind = .testEnded
case .testSkipped:
kind = .testSkipped
case .runEnded:
kind = .runEnded
default:
return nil
}
instant = EncodedInstant(encoding: event.instant)
self.messages = messages.map(EncodedMessage.init)
testID = event.testID.map(EncodedTest.ID.init)
if eventContext.test?.isParameterized == true {
_testCase = eventContext.testCase.map(EncodedTestCase.init)
}
}
}
}
// MARK: - Codable
extension ABI.EncodedEvent: Codable {}
extension ABI.EncodedEvent.Kind: Codable {}