on main help sign in
[#87] Move tests to hspec (#88)

Resolves #87

commit5d78b489b24a0cac9f9ef0027d20242456cab9fc authorVeronika Romashkina <vrom911@gmail.com> dateSat 18 Apr 2020, 17:15 (6 years ago) parent0a43f5d
8 files changed+98−62
stack.yaml+1 test/Test.hs+21−1 test/Test/TypeRep/CMap.hs+8−6 test/Test/TypeRep/CacheMap.hs → test/Test/TypeRep/TypeRepMap.hs+7−4 test/Test/TypeRep/MapProperty.hs → test/Test/TypeRep/TypeRepMapProperty.hs+41−32 test/Test/TypeRep/Vector.hs+8−6 test/Test/TypeRep/VectorOpt.hs+8−6 typerep-map.cabal+4−7
stack.yaml+1
@@ -3,3 +3,4 @@ resolver: lts-15.8
33extra-deps:
44 - dependent-map-0.2.4.0
55 - dependent-sum-0.5
6+ - hspec-hedgehog-0.0.1.2
test/Test.hs+21−1
@@ -1 +1,21 @@
1−{-# OPTIONS_GHC -F -pgmF tasty-discover -optF --tree-display #-}
1+module Main
2+ ( main
3+ ) where
4+
5+import Test.Hspec (hspec)
6+
7+import Test.TypeRep.CMap (cMapSpec)
8+import Test.TypeRep.TypeRepMap (typeRepMapSpec)
9+import Test.TypeRep.TypeRepMapProperty (typeRepMapPropertySpec)
10+import Test.TypeRep.Vector (vectorSpec)
11+import Test.TypeRep.VectorOpt (optimalVectorSpec)
12+
13+
14+main :: IO ()
15+main = hspec $ do
16+ typeRepMapSpec
17+ cMapSpec
18+ vectorSpec
19+ optimalVectorSpec
20+ -- property
21+ typeRepMapPropertySpec
test/Test/TypeRep/CMap.hs+8−6
@@ -1,16 +1,18 @@
1−module Test.TypeRep.CMap where
1+module Test.TypeRep.CMap
2+ ( cMapSpec
3+ ) where
24
35import Prelude hiding (lookup)
46
57import Data.Functor.Identity (Identity (..))
8+import Test.Hspec (Spec, describe, it, shouldBe)
69
7−import Test.Tasty.Hspec
10+import Data.TypeRep.CMap (TypeRepMap, empty, insert, lookup, size)
811
9−import Data.TypeRep.CMap
1012
11−-- Simple test for 'lookup', 'insert' and 'size' functions.
12−spec_insertLookup :: Spec
13−spec_insertLookup = do
13+-- | Simple test for 'lookup', 'insert' and 'size' functions.
14+cMapSpec :: Spec
15+cMapSpec = describe "Containers Map TypeRep" $ do
1416 describe "Lookup Test" $ do
1517 it "returns the inserted element" $
1618 lookup (insert (Identity 'a') empty) `shouldBe` Just (Identity 'a')
test/Test/TypeRep/CacheMap.hs → test/Test/TypeRep/TypeRepMap.hsrenamed+7−4
@@ -1,17 +1,20 @@
1−module Test.TypeRep.CacheMap where
1+module Test.TypeRep.TypeRepMap
2+ ( typeRepMapSpec
3+ ) where
24
35import Prelude hiding (lookup)
46
57import Data.Functor.Identity (Identity (..))
68import GHC.Exts (fromList)
7−import Test.Tasty.Hspec (Spec, describe, it, shouldBe)
9+import Test.Hspec (Spec, describe, it, shouldBe)
810
911import Data.TMap (TMap, empty, insert, lookup, one, size, union)
1012import Data.TypeRepMap.Internal (WrapTypeable (..))
1113
14+
1215-- Simple test for 'lookup', 'insert' and 'size' functions.
13−spec_insertLookup :: Spec
14−spec_insertLookup = do
16+typeRepMapSpec :: Spec
17+typeRepMapSpec = describe "TypeRepMap" $ do
1518 describe "Lookup Test" $ do
1619 it "returns the inserted element" $
1720 lookup (fromList [WrapTypeable $ Identity 'a']) `shouldBe` Just 'a'
test/Test/TypeRep/MapProperty.hs → test/Test/TypeRep/TypeRepMapProperty.hsrenamed+41−32
@@ -6,7 +6,9 @@
66
77{-# OPTIONS_GHC -fplugin GHC.TypeLits.KnownNat.Solver #-}
88
9−module Test.TypeRep.MapProperty where
9+module Test.TypeRep.TypeRepMapProperty
10+ ( typeRepMapPropertySpec
11+ ) where
1012
1113import Prelude hiding (lookup)
1214
@@ -15,43 +17,50 @@ import Data.Semigroup (Semigroup (..))
1517import GHC.Exts (fromList)
1618import GHC.Stack (HasCallStack)
1719import GHC.TypeLits (Nat, SomeNat (..), someNatVal)
18−import Hedgehog (MonadGen, PropertyT, forAll, property, (===), assert)
19−import Test.Tasty (TestName, TestTree)
20−import Test.Tasty.Hedgehog (testProperty)
20+import Hedgehog (MonadGen, PropertyT, assert, forAll, property, (===))
21+import Test.Hspec (Arg, Expectation, Spec, SpecWith, describe, it)
22+import Test.Hspec.Hedgehog (hedgehog)
2123
22−import Data.TypeRepMap.Internal (TypeRepMap (..), WrapTypeable (..), delete, insert, lookup, member, invariantCheck)
24+import Data.TypeRepMap.Internal (TypeRepMap (..), WrapTypeable (..), delete, insert, invariantCheck,
25+ lookup, member)
2326
2427import qualified Hedgehog.Gen as Gen
2528import qualified Hedgehog.Range as Range
2629
27−----------------------------------------------------------------------------
28−-- Common utils
29−----------------------------------------------------------------------------
30−
31−type PropertyTest = [TestTree]
3230
33−prop :: HasCallStack => TestName -> PropertyT IO () -> PropertyTest
34−prop testName = pure . testProperty testName . property
31+typeRepMapPropertySpec :: Spec
32+typeRepMapPropertySpec = describe "TypeRepMap Property tests" $ do
33+ describe "Map modification properties" $ do
34+ insertLookupSpec
35+ insertInsertSpec
36+ deleteMemberSpec
37+ insertInvariantSpec
38+ deleteInvariantSpec
39+ describe "Instance Laws" $ do
40+ semigroupAssocSpec
41+ monoidIdentitySpec
3542
3643----------------------------------------------------------------------------
3744-- Map modification properties
3845----------------------------------------------------------------------------
3946
40−test_InsertLookup :: PropertyTest
41−test_InsertLookup = prop "lookup k (insert k v m) == Just v" $ do
47+type Property = SpecWith (Arg Expectation)
48+
49+insertLookupSpec :: Property
50+insertLookupSpec = it "lookup k (insert k v m) == Just v" $ hedgehog $ do
4251 m <- forAll genMap
4352 WrapTypeable (proxy :: IntProxy n) <- forAll genTF
4453 lookup @n @IntProxy (insert proxy m) === Just proxy
4554
46−test_InsertInsert :: PropertyTest
47−test_InsertInsert = prop "insert k b . insert k a == insert k b" $ do
55+insertInsertSpec :: Property
56+insertInsertSpec = it "insert k b . insert k a == insert k b" $ hedgehog $ do
4857 m <- forAll genMap
4958 WrapTypeable a@(IntProxy (proxy :: Proxy n) i) <- forAll genTF
5059 let b = IntProxy proxy (i + 1)
5160 lookup @n @IntProxy (insert b $ insert a m) === Just b
5261
53−test_DeleteMember :: PropertyTest
54−test_DeleteMember = prop "member k . delete k == False" $ do
62+deleteMemberSpec :: Property
63+deleteMemberSpec = it "member k . delete k == False" $ hedgehog $ do
5564 m <- forAll genMap
5665 WrapTypeable (proxy :: IntProxy n) <- forAll genTF
5766 shouldInsert <- forAll Gen.bool
@@ -61,14 +70,14 @@ test_DeleteMember = prop "member k . delete k == False" $ do
6170 else
6271 member @n (delete @n m) === False
6372
64−test_InsertInvariant :: PropertyTest
65−test_InsertInvariant = prop "invariantCheck (insert k b) == True" $ do
73+insertInvariantSpec :: Property
74+insertInvariantSpec = it "invariantCheck (insert k b) == True" $ hedgehog $ do
6675 m <- forAll genMap
6776 WrapTypeable a <- forAll genTF
6877 assert $ invariantCheck (insert a m)
6978
70−test_DeleteInvariant :: PropertyTest
71−test_DeleteInvariant = prop "invariantCheck (delete k b) == True" $ do
79+deleteInvariantSpec :: Property
80+deleteInvariantSpec = it "invariantCheck (delete k b) == True" $ hedgehog $ do
7281 m <- forAll genMap
7382 WrapTypeable (_ :: IntProxy n) <- forAll genTF
7483 assert $ invariantCheck (delete @n m)
@@ -78,20 +87,21 @@ test_DeleteInvariant = prop "invariantCheck (delete k b) == True" $ do
7887----------------------------------------------------------------------------
7988
8089#if __GLASGOW_HASKELL__ < 806
81−-- This newtype is used to compare 'TypeRepMap's using only 'Fingerprint's. It's
82−-- not a good idea to write such `Eq` instance for `TypeRepMap` itself because
83−-- it doesn't compare values so it's not true equality. But this should be
84−-- enough for tests.
90+{- | This newtype is used to compare 'TypeRepMap's using only 'Fingerprint's.
91+It's not a good idea to write such 'Eq' instance for 'TypeRepMap' itself because
92+it doesn't compare values so it's not true equality. But this should be enough
93+for tests.
94+-}
8595newtype FpMap f = FpMap (TypeRepMap f)
86− deriving newtype (Show, Semigroup, Monoid)
96+ deriving newtype (Show, Semigroup, Monoid)
8797
8898instance Eq (FpMap f) where
8999 FpMap (TypeRepMap as1 bs1 _ _) == FpMap (TypeRepMap as2 bs2 _ _) =
90100 as1 == as2 && bs1 == bs2
91101#endif
92102
93−test_SemigroupAssoc :: PropertyTest
94−test_SemigroupAssoc = prop "x <> (y <> z) == (x <> y) <> z" $ do
103+semigroupAssocSpec :: Property
104+semigroupAssocSpec = it "x <> (y <> z) == (x <> y) <> z" $ hedgehog $ do
95105#if __GLASGOW_HASKELL__ >= 806
96106 x <- forAll genMap
97107 y <- forAll genMap
@@ -101,11 +111,10 @@ test_SemigroupAssoc = prop "x <> (y <> z) == (x <> y) <> z" $ do
101111 y <- FpMap <$> forAll genMap
102112 z <- FpMap <$> forAll genMap
103113#endif
104−
105114 (x <> (y <> z)) === ((x <> y) <> z)
106115
107−test_MonoidIdentity :: PropertyTest
108−test_MonoidIdentity = prop "x <> mempty == mempty <> x == x" $ do
116+monoidIdentitySpec :: Property
117+monoidIdentitySpec = it "x <> mempty == mempty <> x == x" $ hedgehog $ do
109118#if __GLASGOW_HASKELL__ >= 806
110119 x <- forAll genMap
111120#else
test/Test/TypeRep/Vector.hs+8−6
@@ -1,16 +1,18 @@
1−module Test.TypeRep.Vector where
1+module Test.TypeRep.Vector
2+ ( vectorSpec
3+ ) where
24
35import Prelude hiding (lookup)
46
57import Data.Functor.Identity (Identity (..))
8+import Test.Hspec (Spec, describe, it, shouldBe)
69
7−import Test.Tasty.Hspec
10+import Data.TypeRep.Vector (TF (..), fromList, lookup)
811
9−import Data.TypeRep.Vector
1012
11−-- Simple test for 'lookup', 'insert' and 'size' functions.
12−spec_insertLookup :: Spec
13−spec_insertLookup =
13+-- | Simple test for 'lookup', 'insert' and 'size' functions.
14+vectorSpec :: Spec
15+vectorSpec = describe "Vector TypeRep" $
1416 describe "Lookup Test" $ do
1517 it "returns the inserted element" $
1618 lookup (fromList [TF (Identity 'a')]) `shouldBe` Just (Identity 'a')
test/Test/TypeRep/VectorOpt.hs+8−6
@@ -1,16 +1,18 @@
1−module Test.TypeRep.VectorOpt where
1+module Test.TypeRep.VectorOpt
2+ ( optimalVectorSpec
3+ ) where
24
35import Prelude hiding (lookup)
46
57import Data.Functor.Identity (Identity (..))
6−
7−import Test.Tasty.Hspec
8+import Test.Hspec (Spec, describe, it, shouldBe)
89
910import Data.TypeRep.OptimalVector (TF (..), fromList, lookup)
1011
11−-- Simple test for 'lookup', 'insert' and 'size' functions.
12−spec_insertLookup :: Spec
13−spec_insertLookup =
12+
13+-- | Simple test for 'lookup', 'insert' and 'size' functions.
14+optimalVectorSpec :: Spec
15+optimalVectorSpec = describe "Optimal Vector TypeRep" $
1416 describe "Lookup Test" $ do
1517 it "returns the inserted element" $
1618 lookup (fromList [TF $ Identity 'a']) `shouldBe` Just (Identity 'a')
typerep-map.cabal+4−7
@@ -81,20 +81,17 @@ test-suite typerep-map-test
8181
8282 main-is: Test.hs
8383 other-modules: Test.TypeRep.CMap
84− , Test.TypeRep.CacheMap
85− , Test.TypeRep.MapProperty
84+ , Test.TypeRep.TypeRepMap
85+ , Test.TypeRep.TypeRepMapProperty
8686 , Test.TypeRep.Vector
8787 , Test.TypeRep.VectorOpt
8888
89− build-tool-depends: tasty-discover:tasty-discover
9089 build-depends: ghc-typelits-knownnat >= 0.4.2 && < 0.8
9190 , hedgehog ^>= 1.0
91+ , hspec ^>= 2.7.1
92+ , hspec-hedgehog ^>= 0.0.1
9293 , typerep-map
9394 , typerep-extra-impls
94− , tasty >= 1.0.1.1 && < 1.3
95− , tasty-discover >= 4.1.1 && < 4.3
96− , tasty-hedgehog ^>= 1.0.0.0
97− , tasty-hspec ^>= 1.1.5
9895
9996 ghc-options: -threaded -rtsopts -with-rtsopts=-N
10097