Skip to content

Commit 16140bd

Browse files
committedAug 17, 2022
project: improve code coverage for tests
1 parent b82510a commit 16140bd

18 files changed

+289
-214
lines changed
 

‎.swiftpm/xcode/xcshareddata/xcschemes/AsyncStateMachine.xcscheme

-24
Original file line numberDiff line numberDiff line change
@@ -34,20 +34,6 @@
3434
ReferencedContainer = "container:">
3535
</BuildableReference>
3636
</BuildActionEntry>
37-
<BuildActionEntry
38-
buildForTesting = "YES"
39-
buildForRunning = "YES"
40-
buildForProfiling = "YES"
41-
buildForArchiving = "YES"
42-
buildForAnalyzing = "YES">
43-
<BuildableReference
44-
BuildableIdentifier = "primary"
45-
BlueprintIdentifier = "AsyncAlgorithms"
46-
BuildableName = "AsyncAlgorithms"
47-
BlueprintName = "AsyncAlgorithms"
48-
ReferencedContainer = "container:">
49-
</BuildableReference>
50-
</BuildActionEntry>
5137
</BuildActionEntries>
5238
</BuildAction>
5339
<TestAction
@@ -76,16 +62,6 @@
7662
ReferencedContainer = "container:">
7763
</BuildableReference>
7864
</TestableReference>
79-
<TestableReference
80-
skipped = "NO">
81-
<BuildableReference
82-
BuildableIdentifier = "primary"
83-
BlueprintIdentifier = "AsyncAlgorithmsTests"
84-
BuildableName = "AsyncAlgorithmsTests"
85-
BlueprintName = "AsyncAlgorithmsTests"
86-
ReferencedContainer = "container:">
87-
</BuildableReference>
88-
</TestableReference>
8965
</Testables>
9066
</TestAction>
9167
<LaunchAction

‎Sources/Engine.swift

+12-5
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ where S: DSLCompatible, E: DSLCompatible & Sendable, O: DSLCompatible {
3838
self.onDeinit = onDeinit
3939
}
4040

41+
@discardableResult
42+
func register(
43+
taskInProgress task: Task<Void, Never>
44+
) -> Task<Void, Never> {
45+
self.register(taskInProgress: task, cancelOn: { _ in false })
46+
}
47+
4148
@discardableResult
4249
func register(
4350
taskInProgress task: Task<Void, Never>,
@@ -84,7 +91,9 @@ where S: DSLCompatible, E: DSLCompatible & Sendable, O: DSLCompatible {
8491
self
8592
.tasksInProgress
8693
.values
87-
.forEach { taskInProgress in taskInProgress.task.cancel() }
94+
.forEach { taskInProgress in
95+
taskInProgress.task.cancel()
96+
}
8897

8998
self.removeTasksInProgress()
9099
}
@@ -139,10 +148,7 @@ where S: DSLCompatible, E: DSLCompatible & Sendable, O: DSLCompatible {
139148
}
140149

141150
// middlewares are not cancelled on any specific state
142-
let removeTaskInProgressTask = self.register(
143-
taskInProgress: task,
144-
cancelOn: { _ in false }
145-
)
151+
let removeTaskInProgressTask = self.register(taskInProgress: task)
146152
removeTaskInProgressTasks.append(removeTaskInProgressTask)
147153
}
148154

@@ -157,6 +163,7 @@ where S: DSLCompatible, E: DSLCompatible & Sendable, O: DSLCompatible {
157163
guard
158164
let output = self.resolveOutput(state),
159165
let sideEffect = self.resolveSideEffect(output),
166+
sideEffect.predicate(output),
160167
let events = sideEffect.execute(output) else { return nil }
161168

162169
let task: Task<Void, Never> = Task(priority: sideEffect.priority) {

‎Sources/Supporting/AsyncJustSequence.swift

+4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ public struct AsyncJustSequence<Element>: AsyncSequence {
88
self.element = element
99
}
1010

11+
public init(element: Element?) {
12+
self.init { element }
13+
}
14+
1115
public func makeAsyncIterator() -> Iterator {
1216
Iterator(self.element)
1317
}

‎Sources/XCTest/XCTStateMachine.swift

+4-4
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,12 @@ O: DSLCompatible & Equatable {
6767
public func assert(
6868
when states: S...,
6969
execute expectedOutput: O,
70-
fail: (String) -> Void = XCTFail
70+
onFail: (String) -> Void = XCTFail
7171
) -> Self {
7272
for state in states {
7373
let receivedOutput = self.stateMachine.output(for: state)
7474
guard receivedOutput == expectedOutput else {
75-
fail(
75+
onFail(
7676
"""
7777
The assertion failed for state \(state):
7878
expected output: \(expectedOutput),
@@ -88,11 +88,11 @@ O: DSLCompatible & Equatable {
8888
@discardableResult
8989
public func assertNoOutput(
9090
when states: S...,
91-
fail: (String) -> Void = XCTFail
91+
onFail: (String) -> Void = XCTFail
9292
) -> Self {
9393
for state in states {
9494
if let receivedOutput = self.stateMachine.output(for: state) {
95-
fail(
95+
onFail(
9696
"""
9797
The assertion failed for state \(state):
9898
expected no output,

‎Tests/AsyncStateMachineSequenceTests.swift

+53-72
Original file line numberDiff line numberDiff line change
@@ -47,22 +47,22 @@ enum Event: DSLCompatible, Equatable {
4747
case e11(value: String)
4848
case e12(value: String)
4949

50-
var value: String {
51-
switch self {
52-
case .e1(let value): return value
53-
case .e2(let value): return value
54-
case .e3(let value): return value
55-
case .e4(let value): return value
56-
case .e5(let value): return value
57-
case .e6(let value): return value
58-
case .e7(let value): return value
59-
case .e8(let value): return value
60-
case .e9(let value): return value
61-
case .e10(let value): return value
62-
case .e11(let value): return value
63-
case .e12(let value): return value
64-
}
65-
}
50+
// var value: String {
51+
// switch self {
52+
// case .e1(let value): return value
53+
// case .e2(let value): return value
54+
// case .e3(let value): return value
55+
// case .e4(let value): return value
56+
// case .e5(let value): return value
57+
// case .e6(let value): return value
58+
// case .e7(let value): return value
59+
// case .e8(let value): return value
60+
// case .e9(let value): return value
61+
// case .e10(let value): return value
62+
// case .e11(let value): return value
63+
// case .e12(let value): return value
64+
// }
65+
// }
6666
}
6767

6868
enum Output: DSLCompatible, Equatable {
@@ -71,46 +71,45 @@ enum Output: DSLCompatible, Equatable {
7171
case o3(value: String)
7272
}
7373

74-
let stateMachine = StateMachine<State, Event, Output>(initial: State.s1(value: "s1")) {
75-
When(states: OneOf {
76-
State.s1(value:)
77-
State.s2(value:)
78-
State.s3(value:)
79-
State.s4(value:)
80-
State.s5(value:)
81-
State.s6(value:)
82-
State.s7(value:)
83-
State.s8(value:)
84-
State.s9(value:)
85-
State.s10(value:)
86-
State.s11(value:)
87-
State.s12(value:)
88-
}) { state in
89-
Execute(output: Output.o1(value: state.value))
90-
} transitions: { state in
91-
On(events: OneOf {
92-
Event.e1(value:)
93-
Event.e2(value:)
94-
Event.e3(value:)
95-
Event.e4(value:)
96-
Event.e5(value:)
97-
Event.e6(value:)
98-
Event.e7(value:)
99-
Event.e8(value:)
100-
Event.e9(value:)
101-
Event.e10(value:)
102-
Event.e11(value:)
103-
Event.e12(value:)
104-
}) { _ in
105-
Guard(predicate: !state.value.isEmpty)
106-
} transition: { event in
107-
Transition(to: State.s2(value: state.value + event.value))
108-
}
109-
}
110-
}
111-
11274
final class AsyncStateMachineSequenceTests: XCTestCase {
11375
// func testPerformance() async {
76+
// let stateMachine = StateMachine<State, Event, Output>(initial: State.s1(value: "s1")) {
77+
// When(states: OneOf {
78+
// State.s1(value:)
79+
// State.s2(value:)
80+
// State.s3(value:)
81+
// State.s4(value:)
82+
// State.s5(value:)
83+
// State.s6(value:)
84+
// State.s7(value:)
85+
// State.s8(value:)
86+
// State.s9(value:)
87+
// State.s10(value:)
88+
// State.s11(value:)
89+
// State.s12(value:)
90+
// }) { state in
91+
// Execute(output: Output.o1(value: state.value))
92+
// } transitions: { state in
93+
// On(events: OneOf {
94+
// Event.e1(value:)
95+
// Event.e2(value:)
96+
// Event.e3(value:)
97+
// Event.e4(value:)
98+
// Event.e5(value:)
99+
// Event.e6(value:)
100+
// Event.e7(value:)
101+
// Event.e8(value:)
102+
// Event.e9(value:)
103+
// Event.e10(value:)
104+
// Event.e11(value:)
105+
// Event.e12(value:)
106+
// }) { _ in
107+
// Guard(predicate: !state.value.isEmpty)
108+
// } transition: { event in
109+
// Transition(to: State.s2(value: state.value + event.value))
110+
// }
111+
// }
112+
// }
114113
// measure {
115114
// let exp = expectation(description: "task")
116115
// let task = Task {
@@ -141,23 +140,11 @@ final class AsyncStateMachineSequenceTests: XCTestCase {
141140
} transition: { eventValue in
142141
Transition(to: State.s2(value: "new value"))
143142
}
144-
145-
On(event: Event.e2(value:)) { eventValue in
146-
Guard(predicate: !stateValue.isEmpty && !eventValue.isEmpty)
147-
} transition: { eventValue in
148-
Transition(to: State.s3(value: eventValue))
149-
}
150143
}
151144

152145
When(state: State.s2(value:)) { stateValue in
153146
Execute(output: Output.o2(value: stateValue))
154147
} transitions: { stateValue in
155-
On(event: Event.e3(value:)) { eventValue in
156-
Guard(predicate: stateValue.isEmpty || eventValue.isEmpty)
157-
} transition: { eventValue in
158-
Transition(to: State.s4(value: eventValue))
159-
}
160-
161148
On(event: Event.e4(value:)) { eventValue in
162149
Guard(predicate: !stateValue.isEmpty && !eventValue.isEmpty)
163150
} transition: { eventValue in
@@ -171,12 +158,6 @@ final class AsyncStateMachineSequenceTests: XCTestCase {
171158
}) { state in
172159
Execute(output: Output.o3(value: state.value))
173160
} transitions: { state in
174-
On(event: Event.e5(value:)) { eventValue in
175-
Guard(predicate: state.value.isEmpty || eventValue.isEmpty)
176-
} transition: { eventValue in
177-
Transition(to: State.s6(value: eventValue))
178-
}
179-
180161
On(event: Event.e6(value:)) { eventValue in
181162
Guard(predicate: !state.value.isEmpty && !eventValue.isEmpty)
182163
} transition: { eventValue in

0 commit comments

Comments
 (0)
Please sign in to comment.