packages feed

llvm-pretty-bc-parser-0.4.1.0: unit-test/Tests/Metadata.hs

module Tests.Metadata (tests) where

import qualified Data.Sequence as Seq
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.HUnit (testCase, (@?=))

import Data.LLVM.Internal
import Text.LLVM.AST

import Tests.Instances ()


tests :: TestTree
tests = testGroup "Metadata"
    [ testCase "test dedup metadata" $
        mempty @?= dedupMetadata mempty

    -- The first two should remain unchanged, but the third duplicates information in
    -- the second, so should be updated to hold a reference to it.
    , testGroup "test dedup metadata" $
        let mkPum i v = PartialUnnamedMd i v True
            val1 = mkPum 1 (ValMdString "str")
            val2 = mkPum 2 (ValMdDebugInfo (DebugInfoExpression (DIExpression [])))
            val3 = mkPum 3 (ValMdNode [Just (pumValues val2)])
            deduped = dedupMetadata (Seq.fromList [val1, val2, val3])
        in [ testCase "1" $
               Just val1 @?= deduped Seq.!? 0
           , testCase "2" $
               Just val2 @?= deduped Seq.!? 1
           , testCase "3" $
               Just (mkPum 3 (ValMdNode [Just (ValMdRef 2)])) @?=
                  deduped Seq.!? 2
           ]

    -- Deduplication should not changes: references or strings
    -- This test takes too long.
    -- , testProperty "dedup metadata" $
    --     \lst i -> i >= 0 && length lst > i ==>
    --       let result = dedupMetadata lst
    --       in if lst !! i /= result !! i
    --          then case pumValues (result !! i) of
    --                 ValMdRef _    -> False
    --                 ValMdString _ -> False
    --                 _             -> True
    --          else True
    ]