Skip to content

Commit 4aea999

Browse files
committed
Merge pull request #32 from rasmusth/swift/2.0
Fix for transitioning of routes w/ multiple from-states
2 parents f9a9a72 + 78f12cc commit 4aea999

File tree

3 files changed

+55
-7
lines changed

3 files changed

+55
-7
lines changed

SwiftState.xcodeproj/project.pbxproj

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@
5555
48797D6319B42CD40085D80F /* StateType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FA6201F1996606300460108 /* StateType.swift */; };
5656
48797D6419B42CD40085D80F /* StateEventType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FA620191996606200460108 /* StateEventType.swift */; };
5757
48797D6519B42CD40085D80F /* String+SwiftState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FB1EC8E199E60F800ABD937 /* String+SwiftState.swift */; };
58+
C662B6F51B861CC400479524 /* RasmusTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C662B6F41B861CC400479524 /* RasmusTest.swift */; };
59+
C662B6F61B861CC400479524 /* RasmusTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C662B6F41B861CC400479524 /* RasmusTest.swift */; };
5860
/* End PBXBuildFile section */
5961

6062
/* Begin PBXContainerItemProxy section */
@@ -97,6 +99,7 @@
9799
1FD01B6219EC2B6700DA1C91 /* HierarchicalStateMachineTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HierarchicalStateMachineTests.swift; sourceTree = "<group>"; };
98100
4822F0A619D0085E00F5F572 /* SwiftStateTests-iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SwiftStateTests-iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
99101
4872D5AC19B4211900F326B5 /* SwiftState.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftState.framework; sourceTree = BUILT_PRODUCTS_DIR; };
102+
C662B6F41B861CC400479524 /* RasmusTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RasmusTest.swift; sourceTree = "<group>"; };
100103
/* End PBXFileReference section */
101104

102105
/* Begin PBXFrameworksBuildPhase section */
@@ -181,18 +184,19 @@
181184
isa = PBXGroup;
182185
children = (
183186
1FA62027199660CA00460108 /* _TestCase.swift */,
184-
1FB1EC8D199E609900ABD937 /* Type */,
185187
1FA62028199660CA00460108 /* BasicTests.swift */,
188+
1FB4B39B1AAB3B190072E65D /* BugFixTests.swift */,
189+
1FD01B6219EC2B6700DA1C91 /* HierarchicalStateMachineTests.swift */,
186190
1F198C5B19972320001C3700 /* QiitaTests.swift */,
187-
1FA6202C199660CA00460108 /* StateMachineTests.swift */,
191+
C662B6F41B861CC400479524 /* RasmusTest.swift */,
188192
1FA6202A199660CA00460108 /* StateMachineChainTests.swift */,
189193
1FA6202B199660CA00460108 /* StateMachineEventTests.swift */,
190-
1FA6202F199660CA00460108 /* StateTransitionTests.swift */,
191-
1FA6202E199660CA00460108 /* StateTransitionChainTests.swift */,
194+
1FA6202C199660CA00460108 /* StateMachineTests.swift */,
192195
1FA6202D199660CA00460108 /* StateRouteTests.swift */,
193-
1FD01B6219EC2B6700DA1C91 /* HierarchicalStateMachineTests.swift */,
194-
1FB4B39B1AAB3B190072E65D /* BugFixTests.swift */,
196+
1FA6202E199660CA00460108 /* StateTransitionChainTests.swift */,
197+
1FA6202F199660CA00460108 /* StateTransitionTests.swift */,
195198
1FA6200D1996601000460108 /* Supporting Files */,
199+
1FB1EC8D199E609900ABD937 /* Type */,
196200
);
197201
path = SwiftStateTests;
198202
sourceTree = "<group>";
@@ -422,6 +426,7 @@
422426
1FB4B39C1AAB3B190072E65D /* BugFixTests.swift in Sources */,
423427
1FA62035199660CA00460108 /* StateMachineTests.swift in Sources */,
424428
1FA62037199660CA00460108 /* StateTransitionChainTests.swift in Sources */,
429+
C662B6F51B861CC400479524 /* RasmusTest.swift in Sources */,
425430
1FA62032199660CA00460108 /* MyState.swift in Sources */,
426431
);
427432
runOnlyForDeploymentPostprocessing = 0;
@@ -442,6 +447,7 @@
442447
1FB4B39D1AAB3B190072E65D /* BugFixTests.swift in Sources */,
443448
4822F0B219D008EB00F5F572 /* StateRouteTests.swift in Sources */,
444449
4822F0B119D008EB00F5F572 /* StateTransitionChainTests.swift in Sources */,
450+
C662B6F61B861CC400479524 /* RasmusTest.swift in Sources */,
445451
4822F0AD19D008EB00F5F572 /* StateMachineTests.swift in Sources */,
446452
);
447453
runOnlyForDeploymentPostprocessing = 0;

SwiftState/StateMachine.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,9 @@ public class StateMachine<S: StateType, E: StateEventType>
314314
for (transition, routeKeyDict) in transitionDict {
315315
if transition.fromState == self.state || transition.fromState == nil {
316316
for (_, condition) in routeKeyDict {
317-
if self._canPassCondition(condition, transition: transition) {
317+
// Pass current state as from-state to avoid passing nil by mistake when
318+
// transition has multiple from-states that will be evaluated in its condition closure
319+
if self._canPassCondition(condition, transition: self.state => transition.toState) {
318320
return transition.toState
319321
}
320322
}

SwiftStateTests/RasmusTest.swift

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
//
2+
// RasmusTest.swift
3+
// SwiftState
4+
//
5+
// Created by Rasmus Taulborg Hummelmose on 20/08/15.
6+
// Copyright © 2015 Yasuhiro Inami. All rights reserved.
7+
//
8+
9+
import SwiftState
10+
import XCTest
11+
12+
enum RasmusTestState: StateType {
13+
case Any
14+
case State1, State2, State3, State4
15+
init(nilLiteral: Void) {
16+
self = Any
17+
}
18+
}
19+
20+
enum RasmusTestEvent: StateEventType {
21+
case Any
22+
case State2FromState1
23+
case State4FromState2OrState3
24+
init(nilLiteral: Void) {
25+
self = Any
26+
}
27+
}
28+
29+
class RasmusTest: _TestCase {
30+
func testStateRoute() {
31+
let stateMachine = StateMachine<RasmusTestState, RasmusTestEvent>(state: .State1)
32+
stateMachine.addRouteEvent(.State2FromState1, transitions: [ .State1 => .State2 ])
33+
stateMachine.addRouteEvent(.State4FromState2OrState3, routes: [ [ .State2, .State3 ] => .State4 ])
34+
XCTAssertEqual(stateMachine.state, RasmusTestState.State1)
35+
stateMachine <-! .State2FromState1
36+
XCTAssertEqual(stateMachine.state, RasmusTestState.State2)
37+
stateMachine <-! .State4FromState2OrState3
38+
XCTAssertEqual(stateMachine.state, RasmusTestState.State4)
39+
}
40+
}

0 commit comments

Comments
 (0)