-
Notifications
You must be signed in to change notification settings - Fork 32
Expand file tree
/
Copy pathMemoSpec.purs
More file actions
106 lines (96 loc) · 4.12 KB
/
MemoSpec.purs
File metadata and controls
106 lines (96 loc) · 4.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
module Test.Spec.MemoSpec where
import Prelude
import Data.Function (on)
import Effect (Effect)
import Effect.Class (class MonadEffect, liftEffect)
import Effect.Ref (modify, new, read)
import React.Basic.DOM as R
import React.Basic.Hooks (ReactComponent, element, memo, memo', reactComponent, useEffectAlways)
import React.Basic.Hooks as Hooks
import React.TestingLibrary (cleanup, render)
import Test.Spec (Spec, after_, before, describe, it)
import Test.Spec.Assertions (shouldEqual)
spec ∷ Spec Unit
spec =
after_ cleanup do
before setup do
describe "memo" do
it "works with simple values" \{ memoTest } -> do
rendersRef <- liftEffect do new 0
let onRender = void $ modify (1 + _) rendersRef
let renders = liftEffect do read rendersRef
{ rerender } <- render do element memoTest { onRender, arg: 0 }
rerender do element memoTest { onRender, arg: 0 }
renders >>= (_ `shouldEqual` 1)
rerender do element memoTest { onRender, arg: 1 }
renders >>= (_ `shouldEqual` 2)
describe "memo'" do
it "never renders if the eq fn returns true" \{ memo'TestAlwaysEq } -> do
rendersRef <- liftEffect do new 0
let onRender = void $ modify (1 + _) rendersRef
let renders = liftEffect do read rendersRef
{ rerender } <- render do element memo'TestAlwaysEq { onRender, arg: 0 }
rerender do element memo'TestAlwaysEq { onRender, arg: 0 }
renders >>= (_ `shouldEqual` 1)
rerender do element memo'TestAlwaysEq { onRender, arg: 1 }
renders >>= (_ `shouldEqual` 1)
it "always renders if the eq fn returns false" \{ memo'TestNeverEq } -> do
rendersRef <- liftEffect do new 0
let onRender = void $ modify (1 + _) rendersRef
let renders = liftEffect do read rendersRef
{ rerender } <- render do element memo'TestNeverEq { onRender, arg: 0 }
rerender do element memo'TestNeverEq { onRender, arg: 0 }
renders >>= (_ `shouldEqual` 2)
rerender do element memo'TestNeverEq { onRender, arg: 1 }
renders >>= (_ `shouldEqual` 3)
it "renders correctly over eq on props.arg" \{ memo'TestArgEq } -> do
rendersRef <- liftEffect do new 0
let onRender = void $ modify (1 + _) rendersRef
let renders = liftEffect do read rendersRef
{ rerender } <- render do element memo'TestArgEq { onRender, arg: 0 }
rerender do element memo'TestArgEq { onRender, arg: 0 }
renders >>= (_ `shouldEqual` 1)
rerender do element memo'TestArgEq { onRender, arg: 1 }
renders >>= (_ `shouldEqual` 2)
rerender do element memo'TestArgEq { onRender, arg: 1 }
renders >>= (_ `shouldEqual` 2)
where
setup ::
forall m. MonadEffect m =>
m
{ memoTest :: ReactComponent { onRender :: Effect Unit, arg :: Int }
, memo'TestAlwaysEq :: ReactComponent { onRender :: Effect Unit, arg :: Int }
, memo'TestNeverEq :: ReactComponent { onRender :: Effect Unit, arg :: Int }
, memo'TestArgEq :: ReactComponent { onRender :: Effect Unit, arg :: Int }
}
setup = liftEffect do
memoTest <- memo do
reactComponent "MemoTest" \{ onRender } -> Hooks.do
useEffectAlways do
onRender
pure (pure unit)
pure $ R.div_ []
memo'TestAlwaysEq <- memo' (\_ _ -> true) do
reactComponent "MemoTest" \{ onRender } -> Hooks.do
useEffectAlways do
onRender
pure (pure unit)
pure $ R.div_ []
memo'TestNeverEq <- memo' (\_ _ -> false) do
reactComponent "MemoTest" \{ onRender } -> Hooks.do
useEffectAlways do
onRender
pure (pure unit)
pure $ R.div_ []
memo'TestArgEq <- memo' (eq `on` _.arg) do
reactComponent "MemoTest" \{ onRender } -> Hooks.do
useEffectAlways do
onRender
pure (pure unit)
pure $ R.div_ []
pure
{ memoTest
, memo'TestAlwaysEq
, memo'TestNeverEq
, memo'TestArgEq
}