Skip to content

Commit 5834968

Browse files
committed
Merge pull request #29 from ReactKit/fix/event-without-transition
Fix tryEvent() by never tryState(.AnyState)
2 parents 7631a0d + 9f98bb0 commit 5834968

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

SwiftState/StateMachine.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,13 @@ public class StateMachine<S: StateType, E: StateEventType>
329329

330330
public func tryEvent(event: Event, userInfo: Any? = nil) -> Bool
331331
{
332-
if let toState = self.canTryEvent(event) {
332+
if var toState = self.canTryEvent(event) {
333+
334+
// current state should not be changed if `toState == nil`
335+
if toState == nil {
336+
toState = self.state
337+
}
338+
333339
self._tryState(toState, userInfo: userInfo, forEvent: event)
334340
return true
335341
}

SwiftStateTests/StateMachineEventTests.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,31 @@ class StateMachineEventTests: _TestCase
8686
XCTAssertEqual(machine.state, MyState.State0)
8787
}
8888

89+
/// https://github.com/ReactKit/SwiftState/issues/28
90+
func testTryEvent_issue28()
91+
{
92+
var eventCount = 0
93+
let machine = StateMachine<MyState, MyEvent>(state: .State0) { machine in
94+
machine.addRoute(.State0 => .State1)
95+
machine.addRouteEvent(.Event0, transitions: [nil => nil]) { _ in
96+
eventCount++
97+
}
98+
}
99+
100+
XCTAssertEqual(eventCount, 0)
101+
102+
machine <-! .Event0
103+
XCTAssertEqual(eventCount, 1)
104+
XCTAssertEqual(machine.state, MyState.State0, "State should NOT be changed")
105+
106+
machine <- .State1
107+
XCTAssertEqual(machine.state, MyState.State1, "State should be changed")
108+
109+
machine <-! .Event0
110+
XCTAssertEqual(eventCount, 2)
111+
XCTAssertEqual(machine.state, MyState.State1, "State should NOT be changed")
112+
}
113+
89114
func testTryEvent_string()
90115
{
91116
let machine = StateMachine<MyState, String>(state: .State0)

0 commit comments

Comments
 (0)