tinytools-vty-0.1.0.0: test/Potato/Flow/ParamsSpec.hs
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE TemplateHaskell #-}
module Potato.Flow.ParamsSpec
( spec
)
where
import Relude hiding (Type)
import Test.Hspec
import Test.Hspec.Contrib.HUnit (fromHUnitTest)
import Test.HUnit
import Potato.Flow.Vty.Params
import Potato.Flow
import Potato.Flow.Vty.PotatoReader
import Data.Default
import qualified Graphics.Vty as V
import Reflex
import Reflex.Host.Class
import Reflex.Vty
import Reflex.Vty.Test.Monad.Host
import Reflex.Vty.Test.Monad.Host.TH
import Reflex.Vty.Test.Common
$(declareStuff "ParamsNetwork"
[("setSelection", [t|Selection|])
, ("setCanvas", [t|SCanvas|])]
[("paramsWidget", [t|ParamsWidget $(tv)|])]
[|
do
setSelectionDyn <- holdDyn isParliament_empty $(tinput "ParamsNetwork" "setSelection")
setCanvasDyn <- holdDyn (SCanvas (LBox (V2 0 0) (V2 100 100))) $(tinput "ParamsNetwork" "setCanvas")
paramsWidget <- flip runPotatoReader def $ holdParamsWidget $ ParamsWidgetConfig {
_paramsWidgetConfig_selectionDyn = setSelectionDyn
, _paramsWidgetConfig_canvasDyn = setCanvasDyn
, _paramsWidgetConfig_defaultParamsDyn = constDyn def
, _paramsWidgetConfig_toolDyn = constDyn Tool_Select
, _paramsWidgetConfig_loseFocusEv = never
}
return $ $(toutputcon "ParamsNetwork") paramsWidget
|]
)
test_params_set_canvas_size :: Test
test_params_set_canvas_size = TestLabel "set canvas size" $ TestCase $ runSpiderHost $
runReflexVtyTestApp @(ParamsNetwork (SpiderTimeline Global) (SpiderHost Global)) (100,100) $ do
-- get our app's input triggers
ParamsNetwork_InputTriggerRefs {..} <- userInputTriggerRefs
-- get our app's output events and subscribe to them
ParamsNetwork_Output (ParamsWidget {..}) <- userOutputs
canvasSizeH <- subscribeEvent _paramsWidget_canvasSizeEvent
let
readCanvasSize = sequence =<< readEvent canvasSizeH
-- fire an empty event and ensure there is no canvas change event
fireQueuedEventsAndRead readCanvasSize >>= \a -> liftIO (checkNothing a)
-- set the canvas size and ensure there is no canvas change event
queueEventTriggerRef _paramsNetwork_InputTriggerRefs_setCanvas (SCanvas (LBox (V2 0 0) (V2 50 50)))
fireQueuedEventsAndRead readCanvasSize >>= \a -> liftIO (checkNothing a)
-- we have nothing selected so canvas size should be first thing in ParamsWidget
queueVtyEvent (V.EvMouseDown 10 1 V.BLeft []) >> fireQueuedEvents
queueVtyEvent (V.EvMouseUp 10 1 Nothing) >> fireQueuedEvents
queueVtyEvent (V.EvKey V.KBS []) >> fireQueuedEvents
queueVtyEvent (V.EvKey V.KBS []) >> fireQueuedEvents
queueVtyEvent (V.EvKey (V.KChar '2') []) >> fireQueuedEvents
queueVtyEvent (V.EvKey (V.KChar '0') []) >> fireQueuedEvents
queueVtyEvent (V.EvKey V.KEnter [])
fireQueuedEventsAndRead readCanvasSize >>= \a -> liftIO (checkSingleMaybe a (V2 (-30) 0))
queueVtyEvent (V.EvKey V.KBS []) >> fireQueuedEvents
queueVtyEvent (V.EvKey V.KBS []) >> fireQueuedEvents
queueVtyEvent (V.EvKey (V.KChar '3') []) >> fireQueuedEvents
queueVtyEvent (V.EvKey (V.KChar '0') []) >> fireQueuedEvents
queueVtyEvent (V.EvKey V.KEnter [])
fireQueuedEventsAndRead readCanvasSize >>= \a -> liftIO (checkSingleMaybe a (V2 0 (-20)))
-- TODO test other stuff 😥
$(declareStuff "SuperStyleWidgetNetwork"
[("setSelection", [t|Selection|])]
[("height", [t|Dynamic $(tv) Int|])
, ("capture", [t|Event $(tv) ()|])
, ("output", [t|Event $(tv) (Either Llama SetPotatoDefaultParameters)|])]
[|
initManager_ $ col $ do
selectionDyn <- holdDyn isParliament_empty $(tinput "SuperStyleWidgetNetwork" "setSelection")
let
selectFn s = case selectParamsFromSelection (getSEltLabelSuperStyle . superOwl_toSEltLabel_hack) s of
Nothing -> (isParliament_empty, Nothing, Tool_Select)
Just (a,b) -> (a,b,Tool_Select)
mSuperStyleInputDyn = fmap selectFn selectionDyn
(heightDyn, captureEv, outputEv) <- flip runPotatoReader def $ networkParamsWidgetOutputDynForTesting (holdSuperStyleWidget (constDyn def) mSuperStyleInputDyn)
-- TODO consider convert outputEv back to Event t SuperStyle...
return $ $(toutputcon "SuperStyleWidgetNetwork") heightDyn captureEv outputEv
|]
)
test_superStyleWidget_basic :: Test
test_superStyleWidget_basic = TestLabel "set canvas size" $ TestCase $ runSpiderHost $
runReflexVtyTestApp @(SuperStyleWidgetNetwork (SpiderTimeline Global) (SpiderHost Global)) (100,100) $ do
--let queueVtyEventAndFire x = queueVtyEvent x >> fireQueuedEvents
-- get our app's input triggers
SuperStyleWidgetNetwork_InputTriggerRefs {..} <- userInputTriggerRefs
-- get our app's output events and subscribe to them
SuperStyleWidgetNetwork_Output heightDyn captureEv outputEv <- userOutputs
heightDynH <- subscribeDynamic heightDyn
captureEvH <- subscribeEvent captureEv
outputEvH <- subscribeEvent outputEv
let
--readHeightDyn = readDynamic heightDynH
readCaptureEv = sequence =<< readEvent captureEvH
readOutputEv = sequence =<< readEvent outputEvH
-- fire an empty event and ensure there is no output or capture ev
fireQueuedEventsAndRead readCaptureEv >>= \a -> liftIO (checkNothing a)
fireQueuedEventsAndRead readOutputEv >>= \a -> liftIO (checkNothing a)
-- set the canvas size and ensure there is no canvas change event
--queueEventTriggerRef _paramsNetwork_InputTriggerRefs_setCanvas (SCanvas (LBox (V2 0 0) (V2 50 50)))
--fireQueuedEventsAndRead readCanvasSize >>= \a -> liftIO (checkNothing a)
-- TODO test other stuff 😥
spec :: Spec
spec = do
fromHUnitTest test_params_set_canvas_size
fromHUnitTest test_superStyleWidget_basic