Skip to content

Commit c7da888

Browse files
author
kamoii
committed
Adds test for purescript-concur-react #45 issue
1 parent 2df5b5b commit c7da888

File tree

7 files changed

+85
-6
lines changed

7 files changed

+85
-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
@@ -20,5 +20,5 @@ You can edit this file as you like.
2020
, packages =
2121
./packages.dhall
2222
, sources =
23-
[ "src/**/*.purs", "test/**/*.purs" ]
23+
[ "src/**/*.purs" ]
2424
}

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: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
module Test.Utils where
2+
3+
import Prelude
4+
5+
import Concur.Core (Widget)
6+
import Concur.Core.Types (WidgetStep(..), unWidget)
7+
import Control.Monad.Free (runFreeM)
8+
import Control.Monad.Writer.Trans (runWriterT, tell)
9+
import Data.Array (singleton)
10+
import Data.Tuple (Tuple(..))
11+
import Effect.Aff (Aff)
12+
import Effect.Aff.Class (liftAff)
13+
import Effect.Class (liftEffect)
14+
15+
16+
-- Evalutates Widget to Aff
17+
-- Be carefull that never ending Widget will convert to never ending Aff.
18+
runWidgetAsAff :: forall v a. Widget v a -> Aff { result :: a, views :: Array v }
19+
runWidgetAsAff widget = do
20+
Tuple result views <- runWriterT $ runFreeM interpret (unWidget widget)
21+
pure { result, views }
22+
where
23+
interpret (WidgetStepEff eff) =
24+
liftEffect eff
25+
26+
interpret (WidgetStepView rec) = do
27+
tell $ singleton rec.view
28+
liftAff rec.cont

test/Test/WidgetSpec.purs

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

0 commit comments

Comments
 (0)