packages feed

hic-0.0.0.1: test/Language/Cimple/Analysis/Refined/PathContextSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Language.Cimple.Analysis.Refined.PathContextSpec (spec) where

import qualified Data.Map.Strict                              as Map
import           Language.Cimple.Analysis.Refined.Arbitrary   ()
import           Language.Cimple.Analysis.Refined.PathContext
import           Test.Hspec
import           Test.Hspec.QuickCheck                        (prop)

spec :: Spec
spec = do
    describe "SymbolicPath" $ do
        it "can represent a local variable" $ do
            let path = SymbolicPath (VarRoot "p") []
            spRoot path `shouldBe` VarRoot "p"
            spSteps path `shouldBe` []

        it "can represent field access" $ do
            let path = SymbolicPath (VarRoot "p") [FieldStep "tag"]
            spSteps path `shouldBe` [FieldStep "tag"]

        it "can represent nested access" $ do
            let path = SymbolicPath (VarRoot "p") [FieldStep "data", FieldStep "i"]
            spSteps path `shouldBe` [FieldStep "data", FieldStep "i"]

    describe "extendPath" $ do
        prop "increases length of steps by 1" $ \step path ->
            length (spSteps (extendPath step path)) == length (spSteps path) + 1

        prop "last step matches the added step" $ \step path ->
            last (spSteps (extendPath step path)) == step

    describe "simplifyPath" $ do
        it "follows a simple alias" $ do
            let aliases = Map.singleton "m2" (SymbolicPath (VarRoot "m1") [])
                path = SymbolicPath (VarRoot "m2") [FieldStep "f"]
            simplifyPath aliases path `shouldBe` SymbolicPath (VarRoot "m1") [FieldStep "f"]

        it "prepends steps from alias" $ do
            let aliases = Map.singleton "p" (SymbolicPath (VarRoot "obj") [FieldStep "ptr"])
                path = SymbolicPath (VarRoot "p") [FieldStep "val"]
            simplifyPath aliases path `shouldBe` SymbolicPath (VarRoot "obj") [FieldStep "ptr", FieldStep "val"]