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
112
113
114
115
116
117
118
119
120
121
122
123
|
module Specs.AppStateUpdateSpec where
import Chelleport (initialState, update)
import Chelleport.Types
import Mock
import qualified SDL
import Test.Hspec
test :: SpecWith ()
test = do
describe "#initialState" $ do
it "returns the initial state of the app" $ do
(initState, _) <- runWithMocks initialState
length (stateGrid initState) `shouldBe` 9
stateGrid initState `shouldSatisfy` all ((== 16) . length)
stateGrid initState `shouldSatisfy` all (all ((== 2) . length))
stateKeySequence initState `shouldBe` []
stateIsMatched initState `shouldBe` False
stateIsShiftPressed initState `shouldBe` False
describe "#update" $ do
let defaultState =
State
{ stateKeySequence = [],
stateIsShiftPressed = False,
stateIsMatched = False,
stateGrid = [["ABC", "DEF"], ["DJK", "JKL"]]
}
context "with action HandleKeyInput" $ do
context "when there are no matches" $ do
let currentState = defaultState {stateKeySequence = "D"}
context "when input key sequence has matching values in grid" $ do
it "does not update" $ do
((nextState, action), _) <- runWithMocks $ update currentState $ HandleKeyInput SDL.KeycodeZ
action `shouldBe` Nothing
nextState `shouldBe` currentState
context "when input key sequence does not have matching values in grid" $ do
it "adds key to key sequence" $ do
((nextState, action), _) <- runWithMocks $ update currentState $ HandleKeyInput SDL.KeycodeE
action `shouldBe` Nothing
nextState `shouldBe` currentState {stateKeySequence = "DE"}
context "when there is a matches" $ do
let currentState = defaultState {stateKeySequence = "DE"}
context "when input key sequence does not have matching values in grid" $ do
it "adds key to key sequence and enables isMatched" $ do
((nextState, _), _) <- runWithMocks $ update currentState $ HandleKeyInput SDL.KeycodeF
nextState `shouldBe` currentState {stateKeySequence = "DEF", stateIsMatched = True}
it "continues with MoveMousePosition action" $ do
((_, action), _) <- runWithMocks $ update currentState $ HandleKeyInput SDL.KeycodeF
action `shouldBe` Just (MoveMousePosition (0, 1))
context "with action TriggerLeftClick" $ do
let currentState = defaultState
it "hides window and triggers left clicks" $ do
(_, mock) <- runWithMocks $ update currentState TriggerLeftClick
calls mock `shouldContain` [CallHideWindow, CallPressMouseButton LeftClick]
it "continues with action ShutdownApp without updating state" $ do
((nextState, action), _) <- runWithMocks $ update currentState TriggerLeftClick
-- handleMocks
-- [ CallPressMouseButton LeftClick `returns` (1, 2),
-- CallHideWindow `returns` ()
-- ]
action `shouldBe` Just ShutdownApp
nextState `shouldBe` currentState
context "with action MoveMousePosition" $ do
let currentState = defaultState
-- TODO: Test with inline mocked values
it "moves mouse pointer to center of cell of given coordinates" $ do
(_, mock) <- runWithMocks $ update currentState $ MoveMousePosition (0, 0)
mock `shouldHaveCalled` CallMoveMousePosition 25 25
it "does not continue or update state" $ do
(result, _) <- runWithMocks $ update currentState $ MoveMousePosition (0, 0)
result `shouldBe` (currentState, Nothing)
context "with action ResetKeys" $ do
let currentState = defaultState
it "resets state without any action" $ do
((nextState, action), _) <- runWithMocks $ update currentState ResetKeys
action `shouldBe` Nothing
nextState `shouldBe` currentState {stateKeySequence = [], stateIsMatched = False}
context "with action IncrementMouseCursor" $ do
let currentState = defaultState
-- TODO: Test with inline mocked values
it "hides window and triggers left clicks" $ do
(_, mock) <- runWithMocks $ update currentState $ IncrementMouseCursor (10, -20)
mock `shouldHaveCalled` CallMoveMousePosition 52 22
it "does not continue or update state" $ do
(result, _) <- runWithMocks $ update currentState $ IncrementMouseCursor (0, 0)
result `shouldBe` (currentState, Nothing)
context "with action ShutdownApp" $ do
let currentState = defaultState
it "hides window and triggers left clicks" $ do
(_, mock) <- runWithMocks $ update currentState ShutdownApp
mock `shouldHaveCalled` CallShutdownApp
it "does not continue or update state" $ do
(result, _) <- runWithMocks $ update currentState ShutdownApp
result `shouldBe` (currentState, Nothing)
context "with action UpdateShiftState" $ do
let currentState = defaultState
it "updates shift state without any action" $ do
((nextState, action), _) <- runWithMocks $ update currentState $ UpdateShiftState True
action `shouldBe` Nothing
nextState `shouldBe` currentState {stateIsShiftPressed = True}
|