on develop help sign in
add tests for matchResponsesWithRequests
commitd9f7dec6e53b96ddc8d25ee505c8c8616e87ee87 authorJoe Betz <joebetz91@gmail.com> dateThu 16 Jan 2020, 18:34 (7 years ago) parentd1539af
1 file changed+65−2
test/RequesterT.hs+65−2
test/RequesterT.hs+65−2
@@ -1,22 +1,35 @@
11{-# LANGUAGE CPP #-}
22{-# LANGUAGE BangPatterns #-}
33{-# LANGUAGE FlexibleContexts #-}
4+{-# LANGUAGE FlexibleInstances #-}
45{-# LANGUAGE GADTs #-}
6+{-# LANGUAGE LambdaCase #-}
7+{-# LANGUAGE MultiParamTypeClasses #-}
58{-# LANGUAGE RankNTypes #-}
69{-# LANGUAGE RecursiveDo #-}
710{-# LANGUAGE ScopedTypeVariables #-}
11+{-# LANGUAGE TemplateHaskell #-}
12+{-# LANGUAGE TypeApplications #-}
13+{-# LANGUAGE TypeFamilies #-}
814module Main where
915
10−import Control.Lens
16+import Control.Lens hiding (has)
1117import Control.Monad
18+import Control.Monad.Fail (MonadFail)
1219import Control.Monad.Fix
20+import Control.Monad.IO.Class (MonadIO, liftIO)
1321import Control.Monad.Primitive
22+import Data.Constraint.Extras
23+import Data.Constraint.Extras.TH
24+import Data.Constraint.Forall
1425import qualified Data.Dependent.Map as DMap
1526import Data.Dependent.Sum
1627import Data.Functor.Misc
28+import Data.Map (Map)
1729import qualified Data.Map as M
1830import Data.These
1931import Data.List.NonEmpty.Deferred
32+import Text.Read (readMaybe)
2033
2134#if defined(MIN_VERSION_these_lens) || (MIN_VERSION_these(0,8,0) && !MIN_VERSION_these(0,9,0))
2235import Data.These.Lens
@@ -27,6 +40,8 @@ import Reflex.Requester.Base
2740import Reflex.Requester.Class
2841import Test.Run
2942
43+import Debug.Trace hiding (traceEvent)
44+
3045data RequestInt a where
3146 RequestInt :: Int -> RequestInt Int
3247
@@ -35,7 +50,7 @@ main = do
3550 os1 <- runApp' (unwrapApp testOrdering) $
3651 [ Just ()
3752 ]
38− print os1
53+ --print os1
3954 os2 <- runApp' (unwrapApp testSimultaneous) $ map Just $
4055 [ This ()
4156 , That ()
@@ -51,12 +66,18 @@ main = do
5166 print os5
5267 os6 <- runApp' (unwrapApp delayedPulse) [Just ()]
5368 print os6
69+ os7 <- runApp' testMatchRequestsWithResponses $ map Just [ TestRequest_Increment 1, TestRequest_Increment 2 ]
70+ print os7
71+ os8 <- runApp' testMatchRequestsWithResponses [ Just $ TestRequest_Reverse "abcd" ]
72+ print os8
5473 let ![[Just [10,9,8,7,6,5,4,3,2,1]]] = os1
5574 let ![[Just [1,3,5,7,9]],[Nothing,Nothing],[Just [2,4,6,8,10]],[Just [2,4,6,8,10],Nothing]] = os2
5675 let ![[Nothing, Just [2]]] = os3
5776 let ![[Nothing, Just [2]]] = os4
5877 let ![[Nothing, Just [1, 2]]] = os5
5978 let ![[Nothing, Nothing]] = os6 -- TODO re-enable this test after issue #233 has been resolved
79+ let !(Just [(-9223372036854775808,"2")]) = M.toList <$> head (head os7)
80+ let !(Just [(-9223372036854775808,"dcba")]) = M.toList <$> head (head os8)
6081 return ()
6182
6283unwrapApp :: forall t m a.
@@ -177,3 +198,45 @@ delayedPulse pulse = void $ flip runWithReplace (pure () <$ pulse) $ do
177198 -- This has the effect of delaying pulse' from pulse
178199 (_, pulse') <- runWithReplace (pure ()) $ pure (RequestInt 1) <$ pulse
179200 requestingIdentity pulse'
201+
202+data TestRequest a where
203+ TestRequest_Reverse :: String -> TestRequest String
204+ TestRequest_Increment :: Int -> TestRequest Int
205+
206+testMatchRequestsWithResponses
207+ :: forall m t req a
208+ . ( MonadFix m
209+ , MonadHold t m
210+ , Reflex t
211+ , PerformEvent t m
212+ , MonadIO (Performable m)
213+ , ForallF Show req
214+ , Has Read req
215+ , PrimMonad m
216+ , Show (req a)
217+ , Show a
218+ , MonadIO m
219+ )
220+ => Event t (req a) -> m (Event t (Map Int String))
221+testMatchRequestsWithResponses pulse = mdo
222+ (_, requests) <- runRequesterT (requesting pulse) responses
223+ let rawResponseMap = M.map (\v ->
224+ case words v of
225+ ["reverse", str] -> reverse str
226+ ["increment", i] -> show $ succ $ (read i :: Int)
227+ ) <$> rawRequestMap
228+ (rawRequestMap, responses) <- matchResponsesWithRequests reqEncoder requests (head . M.toList <$> rawResponseMap)
229+ pure rawResponseMap
230+ where
231+ reqEncoder :: forall a. req a -> (String, String -> Maybe a)
232+ reqEncoder r =
233+ ( whichever @Show @req @a $ show r
234+ , \x -> has @Read r $ readMaybe x
235+ )
236+
237+deriveArgDict ''TestRequest
238+
239+instance Show (TestRequest a) where
240+ show = \case
241+ TestRequest_Reverse str -> "reverse " <> str
242+ TestRequest_Increment i -> "increment " <> show i