diff options
Diffstat (limited to '')
| -rw-r--r-- | specs/TestUtils.hs | 61 |
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 |
