Skip to content

Commit 9b6fa32

Browse files
authored
Merge pull request #385 from reflex-frp/add-requester-tests
Add test case for matchRequestsWithResponses in RequesterT
2 parents d807171 + cd57e1b commit 9b6fa32

3 files changed

Lines changed: 70 additions & 6 deletions

File tree

reflex.cabal

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -306,16 +306,19 @@ test-suite RequesterT
306306
main-is: RequesterT.hs
307307
hs-source-dirs: test
308308
build-depends: base
309+
, constraints
310+
, constraints-extras
309311
, containers
310312
, deepseq
311-
, dependent-sum
312313
, dependent-map
314+
, dependent-sum
313315
, lens
314316
, mtl
317+
, ref-tf
318+
, reflex
319+
, text
315320
, these
316321
, transformers
317-
, reflex
318-
, ref-tf
319322

320323
if flag(split-these)
321324
build-depends: these-lens

src/Reflex/Class.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ import Data.IntMap.Strict (IntMap)
210210
import qualified Data.IntMap.Strict as IntMap
211211
import Data.List.NonEmpty (NonEmpty (..))
212212
import Data.Map (Map)
213-
import Data.Semigroup (Semigroup, sconcat, stimes, (<>))
213+
import Data.Semigroup (Semigroup (..))
214214
import Data.Some (Some(Some))
215215
import Data.String
216216
import Data.These

test/RequesterT.hs

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,36 @@
11
{-# LANGUAGE CPP #-}
22
{-# LANGUAGE BangPatterns #-}
33
{-# LANGUAGE FlexibleContexts #-}
4+
{-# LANGUAGE FlexibleInstances #-}
45
{-# LANGUAGE GADTs #-}
5-
{-# LANGUAGE RankNTypes #-}
6+
{-# LANGUAGE LambdaCase #-}
7+
{-# LANGUAGE MultiParamTypeClasses #-}
68
{-# LANGUAGE RecursiveDo #-}
79
{-# LANGUAGE ScopedTypeVariables #-}
10+
{-# LANGUAGE TemplateHaskell #-}
11+
{-# LANGUAGE TypeApplications #-}
12+
{-# LANGUAGE TypeFamilies #-}
813
module Main where
914

10-
import Control.Lens
15+
import Control.Lens hiding (has)
1116
import Control.Monad
1217
import Control.Monad.Fix
18+
import Control.Monad.IO.Class (MonadIO)
19+
import Data.Constraint.Extras
20+
import Data.Constraint.Extras.TH
21+
import Data.Constraint.Forall
1322
import qualified Data.Dependent.Map as DMap
1423
import Data.Dependent.Sum
1524
import Data.Functor.Misc
25+
import Data.List (words)
26+
import Data.Map (Map)
1627
import qualified Data.Map as M
28+
#if !MIN_VERSION_these(4,11,0)
29+
import Data.Semigroup ((<>))
30+
#endif
31+
import Data.Text (Text)
1732
import Data.These
33+
import Text.Read (readMaybe)
1834

1935
#if defined(MIN_VERSION_these_lens) || (MIN_VERSION_these(0,8,0) && !MIN_VERSION_these(0,9,0))
2036
import Data.These.Lens
@@ -49,12 +65,19 @@ main = do
4965
print os5
5066
os6 <- runApp' (unwrapApp delayedPulse) [Just ()]
5167
print os6
68+
os7 <- runApp' testMatchRequestsWithResponses [ Just $ TestRequest_Increment 1 ]
69+
print os7
70+
os8 <- runApp' testMatchRequestsWithResponses [ Just $ TestRequest_Reverse "yoyo" ]
71+
print os8
5272
let ![[Just [1,2,3,4,5,6,7,8,9,10]]] = os1 -- The order is reversed here: see the documentation for 'runRequesterT'
5373
let ![[Just [9,7,5,3,1]],[Nothing,Nothing],[Just [10,8,6,4,2]],[Just [10,8,6,4,2],Nothing]] = os2
5474
let ![[Nothing, Just [2]]] = os3
5575
let ![[Nothing, Just [2]]] = os4
5676
let ![[Nothing, Just [1, 2]]] = os5
5777
-- let ![[Nothing, Nothing]] = os6 -- TODO re-enable this test after issue #233 has been resolved
78+
let !(Just [(1,"2")]) = M.toList <$> head (head os7)
79+
let !(Just [(1,"oyoy")]) = M.toList <$> head (head os8)
80+
5881
return ()
5982

6083
unwrapRequest :: DSum tag RequestInt -> Int
@@ -172,3 +195,41 @@ delayedPulse pulse = void $ flip runWithReplace (pure () <$ pulse) $ do
172195
-- This has the effect of delaying pulse' from pulse
173196
(_, pulse') <- runWithReplace (pure ()) $ pure (RequestInt 1) <$ pulse
174197
requestingIdentity pulse'
198+
199+
data TestRequest a where
200+
TestRequest_Reverse :: String -> TestRequest String
201+
TestRequest_Increment :: Int -> TestRequest Int
202+
203+
testMatchRequestsWithResponses
204+
:: forall m t req a
205+
. ( MonadFix m
206+
, MonadHold t m
207+
, Reflex t
208+
, PerformEvent t m
209+
, MonadIO (Performable m)
210+
, ForallF Show req
211+
, Has Read req
212+
)
213+
=> Event t (req a) -> m (Event t (Map Int String))
214+
testMatchRequestsWithResponses pulse = mdo
215+
(_, requests) <- runRequesterT (requesting pulse) responses
216+
let rawResponses = M.map (\v ->
217+
case words v of
218+
["reverse", str] -> reverse str
219+
["increment", i] -> show $ succ $ (read i :: Int)
220+
) <$> rawRequestMap
221+
(rawRequestMap, responses) <- matchResponsesWithRequests reqEncoder requests (head . M.toList <$> rawResponses)
222+
pure rawResponses
223+
where
224+
reqEncoder :: forall a. req a -> (String, String -> Maybe a)
225+
reqEncoder r =
226+
( whichever @Show @req @a $ show r
227+
, \x -> has @Read r $ readMaybe x
228+
)
229+
230+
deriveArgDict ''TestRequest
231+
232+
instance Show (TestRequest a) where
233+
show = \case
234+
TestRequest_Reverse str -> "reverse " <> str
235+
TestRequest_Increment i -> "increment " <> show i

0 commit comments

Comments
 (0)