hic-0.0.0.1: test/Language/Cimple/Analysis/Refined/LatticeOpSpec.hs
{-# LANGUAGE OverloadedStrings #-}
module Language.Cimple.Analysis.Refined.LatticeOpSpec (spec) where
import Language.Cimple.Analysis.Refined.Arbitrary ()
import Language.Cimple.Analysis.Refined.LatticeOp
import Test.Hspec
import Test.Hspec.QuickCheck (prop)
spec :: Spec
spec = do
describe "applyVariance" $ do
it "preserves polarity for Covariant" $ do
applyVariance Covariant PJoin `shouldBe` PJoin
applyVariance Covariant PMeet `shouldBe` PMeet
it "flips polarity for Contravariant" $ do
applyVariance Contravariant PJoin `shouldBe` PMeet
applyVariance Contravariant PMeet `shouldBe` PJoin
it "returns PMeet for Invariant in both phases" $ do
applyVariance Invariant PMeet `shouldBe` PMeet
applyVariance Invariant PJoin `shouldBe` PMeet
prop "applying Covariant is identity" $ \p ->
applyVariance Covariant p == p
prop "applying Contravariant is flipPol" $ \p ->
applyVariance Contravariant p == flipPol p
describe "flipPol" $ do
it "flips PJoin to PMeet" $ do
flipPol PJoin `shouldBe` PMeet
it "flips PMeet to PJoin" $ do
flipPol PMeet `shouldBe` PJoin
prop "flipPol is its own inverse" $ \p ->
flipPol (flipPol p) == p