packages feed

llvm-pretty-0.12.0.0: test/Triple.hs

module Triple (tests) where

import           Control.Monad (forM_)

import qualified Text.LLVM.Triple.AST as AST
import qualified Text.LLVM.Triple.Parse as Parse
import qualified Text.LLVM.Triple.Print as Print

import qualified Test.Tasty as Tasty
import qualified Test.Tasty.HUnit as TastyH

each :: Bounded a => Enum a => (a -> String) -> (a -> Bool) -> IO ()
each name test =
  forM_ (enumFrom minBound) $ \e ->
    TastyH.assertBool (name e) (test e)

tests :: Tasty.TestTree
tests =
  Tasty.testGroup
    "Triple parse/print"
    [ TastyH.testCase
        "parse . print == id :: Arch -> Arch"
        (roundtrip Parse.parseArch Print.archName)
    , TastyH.testCase
        "parse . print == id :: Vendor -> Vendor"
        (roundtrip Parse.parseVendor Print.vendorName)
    , TastyH.testCase
        "parse . print == id :: OS -> OS"
        (roundtrip Parse.parseOS Print.osName)
    , TastyH.testCase
        "parse . print == id :: Environment -> Environment"
        (roundtrip Parse.parseEnv Print.envName)
    , TastyH.testCase
        "parse . print == id :: ObjectFormat -> ObjectFormat"
        (roundtrip Parse.parseObjFmt Print.objFmtName)
    , triple "aarch64-unknown-linux-gnu" $
        AST.TargetTriple
        { AST.ttArch = AST.AArch64
        , AST.ttSubArch = AST.NoSubArch
        , AST.ttVendor = AST.UnknownVendor
        , AST.ttOS = AST.Linux
        , AST.ttEnv = AST.GNU
        , AST.ttObjFmt = AST.UnknownObjectFormat
        }
    , triple "x86_64-unknown-linux-gnu" $
        AST.TargetTriple
        { AST.ttArch = AST.X86_64
        , AST.ttSubArch = AST.NoSubArch
        , AST.ttVendor = AST.UnknownVendor
        , AST.ttOS = AST.Linux
        , AST.ttEnv = AST.GNU
        , AST.ttObjFmt = AST.UnknownObjectFormat
        }
    , triple "i386-unknown-linux-elf" $
        AST.TargetTriple
        { AST.ttArch = AST.X86
        , AST.ttSubArch = AST.NoSubArch
        , AST.ttVendor = AST.UnknownVendor
        , AST.ttOS = AST.Linux
        , AST.ttEnv = AST.UnknownEnvironment
        , AST.ttObjFmt = AST.ELF
        }
    ]
  where
    triple s t =
      TastyH.testCase
        ("parse '" ++ s ++ "'")
        (t TastyH.@=? Parse.parseTriple s)
    roundtrip pars prnt =
      each
        (\a -> "parse (print " ++ prnt a ++ ") == " ++ prnt a)
        (\a -> a == pars (prnt a))