hic-0.0.0.1: test/Language/Cimple/Analysis/Refined/SemanticEqualitySpec.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Language.Cimple.Analysis.Refined.SemanticEqualitySpec (spec) where
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as Map
import qualified Language.Cimple as C
import Language.Cimple.Analysis.Refined.Arbitrary ()
import Language.Cimple.Analysis.Refined.Context (emptyContext,
emptyRefinements)
import Language.Cimple.Analysis.Refined.LatticeOp (Polarity (..))
import Language.Cimple.Analysis.Refined.SemanticEquality
import Language.Cimple.Analysis.Refined.State
import Language.Cimple.Analysis.Refined.Types
import Test.Hspec
import Test.Hspec.QuickCheck (prop)
spec :: Spec
spec = do
describe "semEqStep" $ do
it "matches a builtin type" $ do
let ps = AnyRigidNodeF (RObject (VBuiltin S32Ty) (Quals False))
orig = AnyRigidNodeF (RObject (VBuiltin S32Ty) (Quals False))
semEqStep @TemplateId ps psNodeL orig `shouldBe` True
it "matches a linear expression with different order" $ do
let ps = AnyRigidNodeF (RObject (VSizeExpr [(ProductState 2 3 PJoin False emptyContext 0 0 Nothing, 1), (ProductState 4 5 PJoin False emptyContext 0 0 Nothing, 2)]) (Quals False))
orig = AnyRigidNodeF (RObject (VSizeExpr [(4, 2), (2, 1)]) (Quals False))
semEqStep @TemplateId ps psNodeL orig `shouldBe` True
describe "VNominal structural similarity" $ do
it "matches VNominal nodes with different parameters if selector maps them to same originals" $ do
let ps = AnyRigidNodeF (RObject (VNominal (dummyL' (TIdName "Point")) [ProductState 10 11 PJoin False emptyContext 0 0 Nothing]) (Quals False))
orig = AnyRigidNodeF (RObject (VNominal (dummyL' (TIdName "Point")) [10]) (Quals False))
semEqStep @TemplateId ps psNodeL orig `shouldBe` True
describe "semEqResult" $ do
prop "is reflexive (canonicalized)" $ \(node :: AnyRigidNodeF TemplateId ProductState) ->
semEqResult node node
dummyL' :: t -> C.Lexeme t
dummyL' = C.L (C.AlexPn 0 0 0) C.IdSueType