Skip to content

Commit 0636400

Browse files
author
kamoii
committed
Adds test for purescript-concur-react #45 issue
1 parent f654427 commit 0636400

File tree

7 files changed

+101
-6
lines changed

7 files changed

+101
-6
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
},
1111
"files": [],
1212
"scripts": {
13-
"build": "spago build"
13+
"build": "spago build",
14+
"test": "spago -x test.dhall test"
1415
},
1516
"devDependencies": {
1617
"parcel-bundler": "^1.12.4",

packages.dhall

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,8 @@ let additions =
108108
-------------------------------
109109
-}
110110

111-
let mkPackage =
112-
https://raw.githubusercontent.com/purescript/package-sets/psc-0.13.0-20190626/src/mkPackage.dhall sha256:0b197efa1d397ace6eb46b243ff2d73a3da5638d8d0ac8473e8e4a8fc528cf57
113-
114111
let upstream =
115-
https://github.com/purescript/package-sets/releases/download/psc-0.13.4-20191110/packages.dhall sha256:563a7f694e18e6399f7f6d01f5b7e3c3345781655d99945768f48e458feb93a4
112+
https://github.com/purescript/package-sets/releases/download/psc-0.13.6-20200507/packages.dhall sha256:9c1e8951e721b79de1de551f31ecb5a339e82bbd43300eb5ccfb1bf8cf7bbd62
116113

117114
let overrides = {=}
118115

spago.dhall

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@ You can edit this file as you like.
1818
, packages =
1919
./packages.dhall
2020
, sources =
21-
[ "src/**/*.purs", "test/**/*.purs" ]
21+
[ "src/**/*.purs" ]
2222
}

test.dhall

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
let conf = ./spago.dhall
2+
3+
in conf
4+
{ sources = conf.sources # [ "test/**/*.purs" ]
5+
, dependencies = conf.dependencies # [ "aff", "spec", "js-timers" ]
6+
}

test/Test/Main.purs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module Test.Main where
2+
3+
import Prelude
4+
5+
import Effect (Effect)
6+
import Effect.Aff (launchAff_)
7+
import Test.Spec (describe)
8+
import Test.Spec.Reporter.Console (consoleReporter)
9+
import Test.Spec.Runner (runSpec)
10+
import Test.WidgetSpec (widgetSpec)
11+
12+
main :: Effect Unit
13+
main = launchAff_ $ runSpec [consoleReporter] do
14+
describe "Concur.Core" do
15+
widgetSpec

test/Test/Utils.purs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
module Test.Utils where
2+
3+
import Prelude
4+
5+
import Concur.Core (Widget)
6+
import Concur.Core.Event (Observer(..))
7+
import Concur.Core.Types (WidgetStep(..), unWidget)
8+
import Control.Monad.Free (runFreeM)
9+
import Control.Monad.Writer.Trans (runWriterT, tell)
10+
import Data.Array (singleton)
11+
import Data.Either (Either(..))
12+
import Data.Int (round)
13+
import Data.Newtype (wrap)
14+
import Data.Time.Duration (Milliseconds(..))
15+
import Data.Tuple (Tuple(..))
16+
import Effect.Aff (Aff, makeAff)
17+
import Effect.Aff.Class (liftAff)
18+
import Effect.Class (liftEffect)
19+
import Effect.Timer (clearTimeout, setTimeout)
20+
21+
-- Evalutates Widget to Aff
22+
-- Be carefull that never ending Widget will convert to never ending Aff.
23+
runWidgetAsAff :: forall v a. Widget v a -> Aff { result :: a, views :: Array v }
24+
runWidgetAsAff widget = do
25+
Tuple result views <- runWriterT $ runFreeM interpret (unWidget widget)
26+
pure { result, views }
27+
where
28+
interpret (WidgetStepEff eff) =
29+
liftEffect eff
30+
31+
interpret (WidgetStepView rec) = do
32+
tell $ singleton rec.view
33+
liftAff $ observerToAff rec.cont
34+
35+
-- Converts an Observer to an Aff.
36+
-- Observer can't return an Error, so we always wrap with Right.
37+
observerToAff :: forall a. Observer a -> Aff a
38+
observerToAff (Observer ob) =
39+
makeAff \cont -> do
40+
obsCanceller <- ob (cont <<< Right)
41+
affCanceller <- pure $ wrap $ const $ liftEffect obsCanceller
42+
pure affCanceller
43+
44+
delayObserver :: Milliseconds -> Observer Unit
45+
delayObserver (Milliseconds msec) =
46+
Observer \cont -> do
47+
timeoutId <- setTimeout (round msec) (cont unit)
48+
pure $ clearTimeout timeoutId

test/Test/WidgetSpec.purs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
module Test.WidgetSpec where
2+
3+
import Prelude
4+
5+
import Concur.Core.Event (effMap)
6+
import Concur.Core.Types (affAction)
7+
import Control.MultiAlternative (orr)
8+
import Data.Time.Duration (Milliseconds(..))
9+
import Effect.Aff (delay)
10+
import Effect.Class (liftEffect)
11+
import Effect.Ref as Ref
12+
import Test.Spec (Spec, describe, it)
13+
import Test.Spec.Assertions (shouldReturn)
14+
import Test.Utils (delayObserver, runWidgetAsAff)
15+
16+
widgetSpec :: Spec Unit
17+
widgetSpec =
18+
describe "Widget" do
19+
describe "orr" do
20+
it "should cancel running effects when the widget returns a value" do
21+
ref <- liftEffect (Ref.new "")
22+
_ <- runWidgetAsAff $ orr
23+
[ affAction "a" $ delayObserver (Milliseconds 100.0) `effMap` const (Ref.write "a" ref)
24+
, affAction "b" $ delayObserver (Milliseconds 150.0) `effMap` const (Ref.write "b" ref)
25+
]
26+
liftEffect (Ref.read ref) `shouldReturn` "a"
27+
delay (Milliseconds 100.0)
28+
liftEffect (Ref.read ref) `shouldReturn` "a"

0 commit comments

Comments
 (0)