-
Notifications
You must be signed in to change notification settings - Fork 210
/
GenSpec.hs
137 lines (121 loc) · 4.08 KB
/
GenSpec.hs
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
{-# LANGUAGE LambdaCase #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Cardano.Api.GenSpec (spec) where
import Prelude
import Cardano.Api
( CardanoEra (..)
, SlotNo (..)
, TxIn (..)
, TxInsCollateral (..)
, TxIx (..)
, collateralSupportedInEra
)
import Cardano.Api.Gen
import Data.Function
( (&) )
import Data.Word
( Word32 )
import Test.Hspec
import Test.QuickCheck
( Arbitrary
, Property
, arbitrary
, checkCoverage
, counterexample
, cover
, forAll
, label
, property
)
spec :: Spec
spec =
describe "Cardano.Api.Gen" $
describe "Generator coverage" $ do
it "genTxIx" $
property genTxIxCoverage
it "genTxIn" $
property genTxInCoverage
describe "genTxInsCollateral" $ do
it "ByronEra" $
property
$ forAll (genTxInsCollateral ByronEra)
$ genTxInCollateralCoverage ByronEra
it "ShelleyEra" $
property
$ forAll (genTxInsCollateral ShelleyEra)
$ genTxInCollateralCoverage ShelleyEra
it "AllegraEra" $
property
$ forAll (genTxInsCollateral AllegraEra)
$ genTxInCollateralCoverage AllegraEra
it "MaryEra" $
property
$ forAll (genTxInsCollateral MaryEra)
$ genTxInCollateralCoverage MaryEra
it "AlonzoEra" $
property
$ forAll (genTxInsCollateral AlonzoEra)
$ genTxInCollateralCoverage AlonzoEra
it "genSlotNo" $
property genSlotNoCoverage
genTxIxCoverage :: TxIx -> Property
genTxIxCoverage (TxIx ix) = unsignedCoverage "txIx" ix
instance Arbitrary TxIx where
arbitrary = genTxIndex
genTxInCoverage :: TxIn -> Property
genTxInCoverage (TxIn _id ix) =
-- We don't provide any coverage for genShelleyHash, and so we don't provide
-- any coverage for txId either (as txId consists of a shelleyHash).
genTxIxCoverage ix
instance Arbitrary TxIn where
arbitrary = genTxIn
genTxInCollateralCoverage :: CardanoEra era -> TxInsCollateral era -> Property
genTxInCollateralCoverage era collateral =
case collateralSupportedInEra era of
Nothing ->
(collateral == TxInsCollateralNone)
& label ("collateral is never generated in " <> show era)
& counterexample ("collateral was generated in " <> show era)
Just _ ->
checkCoverage
$ cover 10 (hasNoCollateral collateral)
"no collateral"
$ cover 10 (hasSomeCollateral collateral)
"some collateral"
$ cover 2 (collateralLength collateral == Just 0)
"list of zero collateral"
$ cover 10 (collateralLength collateral > Just 0)
"list of more than zero collateral"
$ cover 10 (collateralLength collateral > Just 3)
"list of more than three collateral"
$ True
where
hasNoCollateral = (== TxInsCollateralNone)
hasSomeCollateral = \case
TxInsCollateralNone -> False
TxInsCollateral _ _ -> True
collateralLength = \case
TxInsCollateralNone -> Nothing
TxInsCollateral _ cs -> Just $ length cs
genSlotNoCoverage :: SlotNo -> Property
genSlotNoCoverage = unsignedCoverage "slot number"
instance Arbitrary SlotNo where
arbitrary = genSlotNo
unsignedCoverage
:: ( Num a
, Ord a
)
=> String
-> a
-> Property
unsignedCoverage name x = checkCoverage
$ cover 1 (x == 0)
(name <> " is zero")
$ cover 30 (x > 0 && x < veryLarge)
(name <> " is between zero and very large")
$ cover 5 (x > veryLarge)
(name <> " is greater than very large")
$ label (name <> " is non-negative") (x >= 0)
& counterexample (name <> " was negative")
where
veryLarge = fromIntegral (maxBound :: Word32)