Revision e8a25d62 htools/Ganeti/HTools/QC.hs
b/htools/Ganeti/HTools/QC.hs | ||
---|---|---|
49 | 49 |
, testLUXI |
50 | 50 |
, testSsconf |
51 | 51 |
, testRpc |
52 |
, testQuery2 |
|
52 | 53 |
) where |
53 | 54 |
|
54 | 55 |
import Test.QuickCheck |
... | ... | |
557 | 558 |
instance Arbitrary Rpc.RpcCallNodeInfo where |
558 | 559 |
arbitrary = Rpc.RpcCallNodeInfo <$> arbitrary <*> arbitrary |
559 | 560 |
|
561 |
-- | Custom 'Query2.Filter' generator (top-level), which enforces a |
|
562 |
-- (sane) limit on the depth of the generated filters. |
|
563 |
genFilter :: Gen Query2.Filter |
|
564 |
genFilter = choose (0, 10) >>= genFilter' |
|
565 |
|
|
566 |
-- | Custom generator for filters that correctly halves the state of |
|
567 |
-- the generators at each recursive step, per the QuickCheck |
|
568 |
-- documentation, in order not to run out of memory. |
|
569 |
genFilter' :: Int -> Gen Query2.Filter |
|
570 |
genFilter' 0 = |
|
571 |
oneof [ return Query2.EmptyFilter |
|
572 |
, Query2.TrueFilter <$> getName |
|
573 |
, Query2.EQFilter <$> getName <*> value |
|
574 |
, Query2.LTFilter <$> getName <*> value |
|
575 |
, Query2.GTFilter <$> getName <*> value |
|
576 |
, Query2.LEFilter <$> getName <*> value |
|
577 |
, Query2.GEFilter <$> getName <*> value |
|
578 |
, Query2.RegexpFilter <$> getName <*> getName |
|
579 |
, Query2.ContainsFilter <$> getName <*> value |
|
580 |
] |
|
581 |
where value = oneof [ Query2.QuotedString <$> getName |
|
582 |
, Query2.NumericValue <$> arbitrary |
|
583 |
] |
|
584 |
genFilter' n = do |
|
585 |
oneof [ Query2.AndFilter <$> vectorOf n'' (genFilter' n') |
|
586 |
, Query2.OrFilter <$> vectorOf n'' (genFilter' n') |
|
587 |
, Query2.NotFilter <$> genFilter' n' |
|
588 |
] |
|
589 |
where n' = n `div` 2 -- sub-filter generator size |
|
590 |
n'' = max n' 2 -- but we don't want empty or 1-element lists, |
|
591 |
-- so use this for and/or filter list length |
|
592 |
|
|
560 | 593 |
-- * Actual tests |
561 | 594 |
|
562 | 595 |
-- ** Utils tests |
... | ... | |
1954 | 1987 |
, 'prop_Rpc_noffl_request_instlist |
1955 | 1988 |
, 'prop_Rpc_noffl_request_nodeinfo |
1956 | 1989 |
] |
1990 |
|
|
1991 |
-- * Query2 tests |
|
1992 |
|
|
1993 |
-- | Tests that serialisation/deserialisation of filters is |
|
1994 |
-- idempotent. |
|
1995 |
prop_Query2_Serialisation :: Property |
|
1996 |
prop_Query2_Serialisation = |
|
1997 |
forAll genFilter $ \flt -> |
|
1998 |
J.readJSON (J.showJSON flt) ==? J.Ok flt |
|
1999 |
|
|
2000 |
testSuite "Query2" |
|
2001 |
[ 'prop_Query2_Serialisation |
|
2002 |
] |
Also available in: Unified diff