aboutsummaryrefslogtreecommitdiff
path: root/specs/TestUtils.hs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--specs/TestUtils.hs61
1 files changed, 15 insertions, 46 deletions
diff --git a/specs/TestUtils.hs b/specs/TestUtils.hs
index 59a59c7..d6f3cd2 100644
--- a/specs/TestUtils.hs
+++ b/specs/TestUtils.hs
@@ -4,71 +4,40 @@ import Chelleport.AppShell (MonadAppShell (..))
import Chelleport.Control (MonadControl (..))
import Chelleport.Draw (MonadDraw (..))
import Chelleport.OCR (MonadOCR (..))
-import Chelleport.Types
import Control.Monad (void)
import Control.Monad.IO.Class (MonadIO)
-import Control.Monad.State (MonadState (state), StateT (runStateT))
-import qualified Data.Text as Text
+import Control.Monad.State (StateT (runStateT), gets)
+import Data.Typeable (cast)
import Foreign.C (CInt)
import Mock
-import Test.Hspec
+import Unsafe.Coerce (unsafeCoerce)
$(generateMock [''MonadDraw, ''MonadControl, ''MonadAppShell, ''MonadOCR])
-newtype MockCalls = MockCalls {calls :: [Call]}
- deriving (Show)
-
-shouldHaveCalled :: (HasCallStack) => MockCalls -> Call -> Expectation
-shouldHaveCalled mock call = calls mock `shouldContain` [call]
-
-runWithMocks :: (MonadIO m) => TestM m a -> m (a, MockCalls)
-runWithMocks action = runStateT (runTestM action) (MockCalls [])
-
-newtype TestM m a = TestM {runTestM :: StateT MockCalls m a}
- deriving (Functor, Applicative, Monad, MonadIO, MonadState MockCalls)
-
mockWindowWidth :: CInt
mockWindowWidth = 1920
mockWindowHeight :: CInt
mockWindowHeight = 1080
+mockWindowSize :: (CInt, CInt)
+mockWindowSize = (mockWindowWidth, mockWindowHeight)
+
mockWindowOffsetX :: CInt
mockWindowOffsetX = 200
mockWindowOffsetY :: CInt
mockWindowOffsetY = 100
+mockWindowPosition :: (CInt, CInt)
+mockWindowPosition = (mockWindowOffsetX, mockWindowOffsetY)
+
mockTextWidth :: Int
mockTextWidth = 10
-registerMockCall :: (MonadState MockCalls m) => Call -> m ()
-registerMockCall call =
- void $ state (\mock -> ((), MockCalls {calls = calls mock ++ [call]}))
-
-instance (MonadIO m) => MonadControl (TestM m) where
- clickMouseButton btn = registerMockCall $ Mock_clickMouseButton btn
- moveMousePointer x y = registerMockCall $ Mock_moveMousePointer x y
- getMousePointerPosition = (42, 42) <$ registerMockCall Mock_getMousePointerPosition
- pressMouseButton = registerMockCall Mock_pressMouseButton
- releaseMouseButton = registerMockCall Mock_releaseMouseButton
-
-instance (MonadIO m) => MonadDraw (TestM m) where
- drawLine p1 p2 = registerMockCall $ Mock_drawLine p1 p2
- fillRect p size = registerMockCall $ Mock_fillRect p size
- drawText p color size text = (fromIntegral $ mockTextWidth * Text.length text, 0) <$ registerMockCall (Mock_drawText p color size text)
- drawCircle radius p = registerMockCall $ Mock_drawCircle radius p
- setDrawColor color = registerMockCall $ Mock_setDrawColor color
- windowSize = (mockWindowWidth, mockWindowHeight) <$ registerMockCall Mock_windowSize
- windowPosition = (mockWindowOffsetX, mockWindowOffsetY) <$ registerMockCall Mock_windowPosition
-
-instance (MonadIO m) => MonadAppShell (TestM m) where
- hideWindow = registerMockCall Mock_hideWindow
- showWindow = registerMockCall Mock_showWindow
- shutdownApp = registerMockCall Mock_shutdownApp
-
-instance (MonadIO m) => MonadOCR (TestM m) where
- captureScreenshot p size = "" <$ registerMockCall (Mock_captureScreenshot p size)
- getWordsInImage filePath = [match] <$ registerMockCall (Mock_getWordsInImage filePath)
- where
- match = OCRMatch {matchStartX = 40, matchStartY = 5, matchEndX = 100, matchEndY = 20, matchText = "Wow"}
+runWithMocks :: (MonadIO m) => TestM x m a -> m (a, MockCalls)
+runWithMocks act = runTestMWithMocks $ do
+ -- Default mocks
+ Mock_windowSize `mockReturns` mockWindowSize
+ Mock_windowPosition `mockReturns` mockWindowPosition
+ act