Skip to content
This repository was archived by the owner on Oct 4, 2020. It is now read-only.

Commit 1f6f0d3

Browse files
authored
Merge pull request #109 from purescript/gen
Add generators for `Map` and `StrMap`
2 parents 2cd994e + 654cf90 commit 1f6f0d3

File tree

5 files changed

+58
-11
lines changed

5 files changed

+58
-11
lines changed

bower.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
"purescript-arrays": "^4.0.0",
2525
"purescript-functions": "^3.0.0",
2626
"purescript-lists": "^4.0.0",
27-
"purescript-st": "^3.0.0"
27+
"purescript-st": "^3.0.0",
28+
"purescript-gen": "^1.1.0"
2829
},
2930
"devDependencies": {
3031
"purescript-quickcheck": "^4.0.0"

src/Data/Map/Gen.purs

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
module Data.Map.Gen where
2+
3+
import Prelude
4+
5+
import Control.Monad.Gen (class MonadGen, chooseInt, resize, sized, unfoldable)
6+
import Control.Monad.Rec.Class (class MonadRec)
7+
import Data.Map (Map, fromFoldable)
8+
import Data.Tuple (Tuple(..))
9+
import Data.List (List)
10+
11+
-- | Generates a `Map` using the specified key and value generators.
12+
genMap
13+
:: forall m a b
14+
. MonadRec m
15+
=> MonadGen m
16+
=> Ord a
17+
=> m a
18+
-> m b
19+
-> m (Map a b)
20+
genMap genKey genValue = sized \size -> do
21+
newSize <- chooseInt 0 size
22+
resize (const newSize) $
23+
(fromFoldable :: List (Tuple a b) -> Map a b)
24+
<$> unfoldable (Tuple <$> genKey <*> genValue)

src/Data/StrMap/Gen.purs

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
module Data.StrMap.Gen where
2+
3+
import Prelude
4+
5+
import Control.Monad.Gen (class MonadGen, chooseInt, resize, sized, unfoldable)
6+
import Control.Monad.Rec.Class (class MonadRec)
7+
import Data.StrMap (StrMap, fromFoldable)
8+
import Data.Tuple (Tuple(..))
9+
import Data.List (List)
10+
11+
-- | Generates a `StrMap` using the specified key and value generators.
12+
genStrMap
13+
:: forall m a
14+
. MonadRec m
15+
=> MonadGen m
16+
=> m String
17+
-> m a
18+
-> m (StrMap a)
19+
genStrMap genKey genValue = sized \size -> do
20+
newSize <- chooseInt 0 size
21+
resize (const newSize) $
22+
(fromFoldable :: List (Tuple String a) -> StrMap a)
23+
<$> unfoldable (Tuple <$> genKey <*> genValue)

test/Test/Data/Map.purs

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,30 @@
11
module Test.Data.Map where
22

33
import Prelude
4-
import Data.List.NonEmpty as NEL
5-
import Data.Map as M
64
import Control.Alt ((<|>))
75
import Control.Monad.Eff (Eff)
86
import Control.Monad.Eff.Console (log, CONSOLE)
97
import Control.Monad.Eff.Exception (EXCEPTION)
108
import Control.Monad.Eff.Random (RANDOM)
119
import Data.Array as A
12-
import Data.NonEmpty ((:|))
1310
import Data.Foldable (foldl, for_, all)
1411
import Data.Function (on)
1512
import Data.List (List(Cons), groupBy, length, nubBy, singleton, sort, sortBy)
13+
import Data.List.NonEmpty as NEL
14+
import Data.Map as M
15+
import Data.Map.Gen (genMap)
1616
import Data.Maybe (Maybe(..), fromMaybe)
17+
import Data.NonEmpty ((:|))
1718
import Data.Tuple (Tuple(..), fst, uncurry)
1819
import Partial.Unsafe (unsafePartial)
1920
import Test.QuickCheck ((<?>), (===), quickCheck, quickCheck')
20-
import Test.QuickCheck.Gen (elements, oneOf)
2121
import Test.QuickCheck.Arbitrary (class Arbitrary, arbitrary)
22+
import Test.QuickCheck.Gen (elements, oneOf)
2223

2324
newtype TestMap k v = TestMap (M.Map k v)
2425

2526
instance arbTestMap :: (Eq k, Ord k, Arbitrary k, Arbitrary v) => Arbitrary (TestMap k v) where
26-
arbitrary = TestMap <<< (M.fromFoldable :: List (Tuple k v) -> M.Map k v) <$> arbitrary
27+
arbitrary = TestMap <$> genMap arbitrary arbitrary
2728

2829
data SmallKey = A | B | C | D | E | F | G | H | I | J
2930
derive instance eqSmallKey :: Eq SmallKey

test/Test/Data/StrMap.purs

+3-5
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import Control.Monad.Eff (Eff)
66
import Control.Monad.Eff.Console (log, CONSOLE)
77
import Control.Monad.Eff.Exception (EXCEPTION)
88
import Control.Monad.Eff.Random (RANDOM)
9-
109
import Data.Array as A
1110
import Data.Foldable (foldl)
1211
import Data.Function (on)
@@ -15,19 +14,18 @@ import Data.List.NonEmpty as NEL
1514
import Data.Maybe (Maybe(..))
1615
import Data.NonEmpty ((:|))
1716
import Data.StrMap as M
18-
import Data.Tuple (Tuple(..), fst, uncurry)
17+
import Data.StrMap.Gen (genStrMap)
1918
import Data.Traversable (sequence)
20-
19+
import Data.Tuple (Tuple(..), fst, uncurry)
2120
import Partial.Unsafe (unsafePartial)
22-
2321
import Test.QuickCheck ((<?>), quickCheck, quickCheck', (===))
2422
import Test.QuickCheck.Arbitrary (class Arbitrary, arbitrary)
2523
import Test.QuickCheck.Gen as Gen
2624

2725
newtype TestStrMap v = TestStrMap (M.StrMap v)
2826

2927
instance arbTestStrMap :: (Arbitrary v) => Arbitrary (TestStrMap v) where
30-
arbitrary = TestStrMap <<< (M.fromFoldable :: L.List (Tuple String v) -> M.StrMap v) <$> arbitrary
28+
arbitrary = TestStrMap <$> genStrMap arbitrary arbitrary
3129

3230
newtype SmallArray v = SmallArray (Array v)
3331

0 commit comments

Comments
 (0)