1
- {-# LANGUAGE CPP #-}
2
- {-# LANGUAGE RankNTypes #-}
3
- {-# LANGUAGE TypeApplications #-}
1
+ {-# LANGUAGE CPP #-}
4
2
5
3
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}
6
4
{-# HLINT ignore "Use camelCase" #-}
7
5
6
+ -- | Test whether functions on 'StrictMVar's correctly force values to WHNF
7
+ -- before they are put inside the 'StrictMVar'.
8
8
module Test.Control.Concurrent.Class.MonadMVar.Strict.WHNF (tests ) where
9
9
10
- #if CHECKED
10
+ #if TEST_CHECKED
11
11
import Control.Concurrent.Class.MonadMVar.Strict.Checked
12
12
#else
13
13
import Control.Concurrent.Class.MonadMVar.Strict
14
14
#endif
15
15
import Control.Monad (void )
16
- import Data.Typeable (Proxy ( .. ), Typeable )
16
+ import Data.Typeable (Typeable )
17
17
import NoThunks.Class (OnlyCheckWhnf (OnlyCheckWhnf ), unsafeNoThunks )
18
18
import Test.QuickCheck.Monadic (PropertyM , monadicIO , monitor , run )
19
19
import Test.Tasty (TestTree , testGroup )
@@ -26,7 +26,7 @@ import Test.Utils (monadicSim)
26
26
-------------------------------------------------------------------------------}
27
27
28
28
name :: String
29
- #if CHECKED
29
+ #if TEST_CHECKED
30
30
name = " Strict.Checked"
31
31
#else
32
32
name = " Strict"
@@ -37,43 +37,43 @@ tests = testGroup ("Test.Control.Concurrent.Class.MonadMVar." <> name) [
37
37
testGroup " WHNF" [
38
38
testGroup " IO" [
39
39
testProperty " prop_newMVar" $
40
- monadicIO .: prop_newMVar ( Proxy @ Int )
40
+ monadicIO .: prop_newMVar
41
41
, testProperty " prop_newMVarWithInvariant" $
42
- monadicIO .: prop_newMVarWithInvariant ( Proxy @ Int )
42
+ monadicIO .: prop_newMVarWithInvariant
43
43
, testProperty " prop_putMVar" $
44
- monadicIO .: prop_putMVar ( Proxy @ Int )
44
+ monadicIO .: prop_putMVar
45
45
, testProperty " prop_swapMVar" $
46
- monadicIO .: prop_swapMVar ( Proxy @ Int )
46
+ monadicIO .: prop_swapMVar
47
47
, testProperty " prop_tryPutMVar" $
48
- monadicIO .: prop_tryPutMVar ( Proxy @ Int )
48
+ monadicIO .: prop_tryPutMVar
49
49
, testProperty " prop_modifyMVar_" $
50
- monadicIO .: prop_modifyMVar_ ( Proxy @ Int )
50
+ monadicIO .: prop_modifyMVar_
51
51
, testProperty " prop_modifyMVar" $
52
- monadicIO .: prop_modifyMVar ( Proxy @ Int ) ( Proxy @ Char )
52
+ monadicIO .: prop_modifyMVar
53
53
, testProperty " prop_modifyMVarMasked_" $
54
- monadicIO .: prop_modifyMVarMasked_ ( Proxy @ Int )
54
+ monadicIO .: prop_modifyMVarMasked_
55
55
, testProperty " prop_modifyMVarMasked" $
56
- monadicIO .: prop_modifyMVarMasked ( Proxy @ Int ) ( Proxy @ Char )
56
+ monadicIO .: prop_modifyMVarMasked
57
57
]
58
58
, testGroup " IOSim" [
59
59
testProperty " prop_newMVar" $ \ x f ->
60
- monadicSim $ prop_newMVar ( Proxy @ Int ) x f
60
+ monadicSim $ prop_newMVar x f
61
61
, testProperty " prop_newMVarWithInvariant" $ \ x f ->
62
- monadicSim $ prop_newMVarWithInvariant ( Proxy @ Int ) x f
62
+ monadicSim $ prop_newMVarWithInvariant x f
63
63
, testProperty " prop_putMVar" $ \ x f ->
64
- monadicSim $ prop_putMVar ( Proxy @ Int ) x f
64
+ monadicSim $ prop_putMVar x f
65
65
, testProperty " prop_swapMVar" $ \ x f ->
66
- monadicSim $ prop_swapMVar ( Proxy @ Int ) x f
66
+ monadicSim $ prop_swapMVar x f
67
67
, testProperty " prop_tryPutMVar" $ \ x f ->
68
- monadicSim $ prop_tryPutMVar ( Proxy @ Int ) x f
68
+ monadicSim $ prop_tryPutMVar x f
69
69
, testProperty " prop_modifyMVar_" $ \ x f ->
70
- monadicSim $ prop_modifyMVar_ ( Proxy @ Int ) x f
70
+ monadicSim $ prop_modifyMVar_ x f
71
71
, testProperty " prop_modifyMVar" $ \ x f ->
72
- monadicSim $ prop_modifyMVar ( Proxy @ Int ) ( Proxy @ Char ) x f
72
+ monadicSim $ prop_modifyMVar x f
73
73
, testProperty " prop_modifyMVarMasked_" $ \ x f ->
74
- monadicSim $ prop_modifyMVarMasked_ ( Proxy @ Int ) x f
74
+ monadicSim $ prop_modifyMVarMasked_ x f
75
75
, testProperty " prop_modifyMVarMasked" $ \ x f ->
76
- monadicSim $ prop_modifyMVarMasked ( Proxy @ Int ) ( Proxy @ Char ) x f
76
+ monadicSim $ prop_modifyMVarMasked x f
77
77
]
78
78
]
79
79
]
@@ -90,112 +90,100 @@ infixr 9 .:
90
90
isInWHNF :: (MonadMVar m , Typeable a ) => StrictMVar m a -> PropertyM m Bool
91
91
isInWHNF v = do
92
92
x <- run $ readMVar v
93
- let tinfoMay = unsafeNoThunks (OnlyCheckWhnf x)
94
- case tinfoMay of
93
+ case unsafeNoThunks (OnlyCheckWhnf x) of
95
94
Nothing -> pure True
96
- Just tinfo -> monitor (counterexample $ " Thunk found : " ++ show tinfo)
95
+ Just tinfo -> monitor (counterexample $ " Not in WHNF : " ++ show tinfo)
97
96
>> pure False
98
97
99
98
{- ------------------------------------------------------------------------------
100
99
Properties
101
100
-------------------------------------------------------------------------------}
102
101
103
102
prop_newMVar ::
104
- (MonadMVar m , Typeable a )
105
- => proxy a
106
- -> a
107
- -> Fun a a
103
+ MonadMVar m
104
+ => Int
105
+ -> Fun Int Int
108
106
-> PropertyM m Bool
109
- prop_newMVar _ x f = do
107
+ prop_newMVar x f = do
110
108
v <- run $ newMVar (applyFun f x)
111
109
isInWHNF v
112
110
113
111
prop_newMVarWithInvariant ::
114
- (MonadMVar m , Typeable a )
115
- => proxy a
116
- -> a
117
- -> Fun a a
112
+ MonadMVar m
113
+ => Int
114
+ -> Fun Int Int
118
115
-> PropertyM m Bool
119
- prop_newMVarWithInvariant _ x f = do
116
+ prop_newMVarWithInvariant x f = do
120
117
v <- run $ newMVarWithInvariant (const Nothing ) (applyFun f x)
121
118
isInWHNF v
122
119
123
120
prop_putMVar ::
124
- (MonadMVar m , Typeable a )
125
- => proxy a
126
- -> a
127
- -> Fun a a
121
+ MonadMVar m
122
+ => Int
123
+ -> Fun Int Int
128
124
-> PropertyM m Bool
129
- prop_putMVar _ x f = do
125
+ prop_putMVar x f = do
130
126
v <- run newEmptyMVar
131
127
run $ putMVar v (applyFun f x)
132
128
isInWHNF v
133
129
134
130
prop_swapMVar ::
135
- (MonadMVar m , Typeable a )
136
- => proxy a
137
- -> a
138
- -> Fun a a
131
+ MonadMVar m
132
+ => Int
133
+ -> Fun Int Int
139
134
-> PropertyM m Bool
140
- prop_swapMVar _ x f = do
135
+ prop_swapMVar x f = do
141
136
v <- run $ newMVar x
142
137
void $ run $ swapMVar v (applyFun f x)
143
138
isInWHNF v
144
139
145
140
prop_tryPutMVar ::
146
- (MonadMVar m , Typeable a )
147
- => proxy a
148
- -> a
149
- -> Fun a a
141
+ MonadMVar m
142
+ => Int
143
+ -> Fun Int Int
150
144
-> PropertyM m Bool
151
- prop_tryPutMVar _ x f = do
145
+ prop_tryPutMVar x f = do
152
146
v <- run newEmptyMVar
153
147
b <- run $ tryPutMVar v (applyFun f x)
154
148
b' <- isInWHNF v
155
149
pure (b && b')
156
150
157
151
prop_modifyMVar_ ::
158
- (MonadMVar m , Typeable a )
159
- => Proxy a
160
- -> a
161
- -> Fun a a
152
+ MonadMVar m
153
+ => Int
154
+ -> Fun Int Int
162
155
-> PropertyM m Bool
163
- prop_modifyMVar_ _ x f = do
156
+ prop_modifyMVar_ x f = do
164
157
v <- run $ newMVar x
165
158
run $ modifyMVar_ v (pure . applyFun f)
166
159
isInWHNF v
167
160
168
161
prop_modifyMVar ::
169
- (MonadMVar m , Typeable a )
170
- => Proxy a
171
- -> Proxy b
172
- -> a
173
- -> Fun a (a , b )
162
+ MonadMVar m
163
+ => Int
164
+ -> Fun Int (Int , Char )
174
165
-> PropertyM m Bool
175
- prop_modifyMVar _ _ x f = do
166
+ prop_modifyMVar x f = do
176
167
v <- run $ newMVar x
177
168
void $ run $ modifyMVar v (pure . applyFun f)
178
169
isInWHNF v
179
170
180
171
prop_modifyMVarMasked_ ::
181
- (MonadMVar m , Typeable a )
182
- => Proxy a
183
- -> a
184
- -> Fun a a
172
+ MonadMVar m
173
+ => Int
174
+ -> Fun Int Int
185
175
-> PropertyM m Bool
186
- prop_modifyMVarMasked_ _ x f = do
176
+ prop_modifyMVarMasked_ x f = do
187
177
v <- run $ newMVar x
188
178
void $ run $ modifyMVarMasked_ v (pure . applyFun f)
189
179
isInWHNF v
190
180
191
181
prop_modifyMVarMasked ::
192
- (MonadMVar m , Typeable a )
193
- => Proxy a
194
- -> Proxy b
195
- -> a
196
- -> Fun a (a , b )
182
+ MonadMVar m
183
+ => Int
184
+ -> Fun Int (Int , Char )
197
185
-> PropertyM m Bool
198
- prop_modifyMVarMasked _ _ x f = do
186
+ prop_modifyMVarMasked x f = do
199
187
v <- run $ newMVar x
200
188
void $ run $ modifyMVarMasked v (pure . applyFun f)
201
189
isInWHNF v
0 commit comments