1+ // ***************************************************************************
2+ // This is free and unencumbered software released into the public domain.
3+ //
4+ // Anyone is free to copy, modify, publish, use, compile, sell, or
5+ // distribute this software, either in source code form or as a compiled
6+ // binary, for any purpose, commercial or non-commercial, and by any
7+ // means.
8+ //
9+ // In jurisdictions that recognize copyright laws, the author or authors
10+ // of this software dedicate any and all copyright interest in the
11+ // software to the public domain. We make this dedication for the benefit
12+ // of the public at large and to the detriment of our heirs and
13+ // successors. We intend this dedication to be an overt act of
14+ // relinquishment in perpetuity of all present and future rights to this
15+ // software under copyright law.
16+ //
17+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20+ // IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21+ // OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22+ // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23+ // OTHER DEALINGS IN THE SOFTWARE.
24+ //
25+ // For more information, please refer to <http://unlicense.org>
26+ // ***************************************************************************
27+
28+ using System ;
29+ using NUnit . Framework ;
30+
31+ namespace StateMachine . NUnitTests
32+ {
33+ public class FluentTests
34+ {
35+ private enum State
36+ {
37+ IDLE ,
38+ OVER ,
39+ PRESSED ,
40+ REFRESHING
41+ }
42+
43+ private enum Trigger
44+ {
45+ MOUSE_CLICKED ,
46+ MOUSE_RELEASED ,
47+ MOUSE_OVER ,
48+ MOUSE_LEAVE
49+ }
50+
51+ private class Button
52+ {
53+ public bool IsActivated { get ; set ; }
54+ public State BtnState { get ; set ; }
55+ public State OldState { get ; set ; } = State . IDLE ;
56+ public float RefreshTimer { get ; set ; } = 1F ;
57+
58+ public int UpdateCounter { get ; set ; }
59+ }
60+
61+ [ Test ]
62+ [ Category ( "StateMachine.FluentTests.OnMethods" ) ]
63+ public void OnMethodTests ( )
64+ {
65+ var button = new Button ( ) ;
66+
67+ var m = Fsm < State , Trigger > . Builder ( State . IDLE )
68+ . State ( State . IDLE )
69+ . TransitionTo ( State . OVER ) . On ( Trigger . MOUSE_OVER )
70+ . OnEnter ( t => button . BtnState = State . IDLE )
71+ . OnExit ( t => button . OldState = button . BtnState )
72+ . State ( State . OVER )
73+ . TransitionTo ( State . IDLE ) . On ( Trigger . MOUSE_LEAVE )
74+ . TransitionTo ( State . PRESSED ) . On ( Trigger . MOUSE_CLICKED )
75+ . OnEnter ( t => button . BtnState = State . OVER )
76+ . OnExit ( t => button . OldState = button . BtnState )
77+ . Update ( a => button . UpdateCounter = button . UpdateCounter + 1 )
78+ . State ( State . PRESSED )
79+ . TransitionTo ( State . IDLE ) . On ( Trigger . MOUSE_LEAVE )
80+ . TransitionTo ( State . REFRESHING ) . On ( Trigger . MOUSE_RELEASED ) . If ( a => button . IsActivated )
81+ . OnEnter ( t => button . BtnState = State . PRESSED )
82+ . OnExit ( t => button . OldState = button . BtnState )
83+ . State ( State . REFRESHING )
84+ . OnEnter ( t => button . BtnState = State . REFRESHING )
85+ . OnExit ( t => button . OldState = button . BtnState )
86+ . Update ( a =>
87+ {
88+ button . RefreshTimer -= a . Data ;
89+ if ( button . RefreshTimer <= 0F )
90+ {
91+ button . RefreshTimer = 0F ;
92+ a . Machine . JumpTo ( State . IDLE ) ; // or m.JumpTo(State.IDLE);
93+ }
94+ button . UpdateCounter = button . UpdateCounter + 1 ;
95+ } )
96+ . Build ( ) ;
97+
98+ m . Update ( 2F ) ; // Should do nothing.
99+ Assert . That ( m . Current . Identifier , Is . EqualTo ( State . IDLE ) ) ;
100+ m . Trigger ( Trigger . MOUSE_CLICKED ) ;
101+ Assert . That ( m . Current . Identifier , Is . EqualTo ( State . IDLE ) ) ;
102+ m . Trigger ( Trigger . MOUSE_LEAVE ) ;
103+ Assert . That ( m . Current . Identifier , Is . EqualTo ( State . IDLE ) ) ;
104+ m . Trigger ( Trigger . MOUSE_RELEASED ) ;
105+ Assert . That ( m . Current . Identifier , Is . EqualTo ( State . IDLE ) ) ;
106+ m . Trigger ( Trigger . MOUSE_OVER ) ;
107+ Assert . That ( m . Current . Identifier , Is . EqualTo ( State . OVER ) ) ;
108+ Assert . That ( button . BtnState , Is . EqualTo ( State . OVER ) ) ;
109+ Assert . That ( button . OldState , Is . EqualTo ( State . IDLE ) ) ;
110+ m . Trigger ( Trigger . MOUSE_CLICKED ) ;
111+ Assert . That ( m . Current . Identifier , Is . EqualTo ( State . PRESSED ) ) ;
112+ Assert . That ( button . BtnState , Is . EqualTo ( State . PRESSED ) ) ;
113+ Assert . That ( button . OldState , Is . EqualTo ( State . OVER ) ) ;
114+ m . Trigger ( Trigger . MOUSE_RELEASED ) ; // Button is deactivated.
115+ Assert . That ( m . Current . Identifier , Is . EqualTo ( State . PRESSED ) ) ;
116+ Assert . That ( button . BtnState , Is . EqualTo ( State . PRESSED ) ) ;
117+ Assert . That ( button . OldState , Is . EqualTo ( State . OVER ) ) ;
118+ button . IsActivated = true ;
119+ m . Trigger ( Trigger . MOUSE_RELEASED ) ; // Now it's activated.
120+ Assert . That ( m . Current . Identifier , Is . EqualTo ( State . REFRESHING ) ) ;
121+ Assert . That ( button . BtnState , Is . EqualTo ( State . REFRESHING ) ) ;
122+ Assert . That ( button . OldState , Is . EqualTo ( State . PRESSED ) ) ;
123+ m . Update ( .5F ) ; // No transition yet...
124+ Assert . That ( m . Current . Identifier , Is . EqualTo ( State . REFRESHING ) ) ;
125+ Assert . That ( button . BtnState , Is . EqualTo ( State . REFRESHING ) ) ;
126+ Assert . That ( button . OldState , Is . EqualTo ( State . PRESSED ) ) ;
127+ m . Update ( .5F ) ; // But now.
128+ Assert . That ( m . Current . Identifier , Is . EqualTo ( State . IDLE ) ) ;
129+ Assert . That ( button . BtnState , Is . EqualTo ( State . IDLE ) ) ;
130+ Assert . That ( button . OldState , Is . EqualTo ( State . REFRESHING ) ) ;
131+
132+ // Update was triggered twice over all states.
133+ Assert . That ( button . UpdateCounter , Is . EqualTo ( 2F ) ) ;
134+ }
135+ }
136+ }
0 commit comments