aboutsummaryrefslogtreecommitdiffstats
path: root/test/Property.hs
blob: ba961cfec7fc3da8c117444135e3d387b3ee1fca (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
58
59
module Property
    ( propertyTests
    )
where

import           Data.Either             (fromRight, 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 =
        vshow
            . fromRight (error "Failed idempotent test")
            . parse parseModDecl "idempotent_test.v"
            . alexScanTokens

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

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

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