aboutsummaryrefslogtreecommitdiffstats
path: root/test/Property.hs
blob: 431a15528b63e859661f053e9fa8f681f5609bfb (plain)
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
module Property
    ( propertyTests
    )
where

import           Data.Either             (either, isRight)
import qualified Data.Graph.Inductive    as G
import           Hedgehog                (Gen, (===))
import qualified Hedgehog                as Hog
import qualified Hedgehog.Gen            as Hog
import           Test.Tasty
import           Test.Tasty.Hedgehog
import           Text.Parsec
import           VeriFuzz
import           VeriFuzz.Verilog.Lex
import           VeriFuzz.Verilog.Parser

randomMod' :: Gen ModDecl
randomMod' = Hog.resize 20 (randomMod 3 10)

randomDAG' :: Gen Circuit
randomDAG' = Hog.resize 30 randomDAG

simpleGraph :: TestTree
simpleGraph = testProperty "simple graph generation check" . Hog.property $ do
    xs <- Hog.forAllWith (const "") randomDAG'
    Hog.assert $ simp xs
    where simp = G.isSimple . getCircuit

parserInput' :: Hog.Property
parserInput' = Hog.property $ do
    v <- Hog.forAll randomMod'
    Hog.assert . isRight $ parse parseModDecl
                                 "input_test.v"
                                 (alexScanTokens $ str v)
    where str = show . GenVerilog

parserIdempotent' :: Hog.Property
parserIdempotent' = Hog.property $ do
    v <- Hog.forAll randomMod'
    let sv = vshow v
    p sv === (p . p) sv
  where
    vshow = show . GenVerilog
    p sv = either (\x -> show x <> "\n" <> sv) vshow
        . parse parseModDecl "idempotent_test.v"
        $ alexScanTokens sv

parserInput :: TestTree
parserInput = testProperty "parser input" parserInput'

parserIdempotent :: TestTree
parserIdempotent = testProperty "parser idempotence" parserIdempotent'

propertyTests :: TestTree
propertyTests =
    testGroup "Property Tests" [simpleGraph, parserInput, parserIdempotent]