content: {-# LANGUAGE OverloadedStrings #-}
  module LLVM.Test.Global where
  
  import Test.Tasty
  import Test.Tasty.HUnit
  
  import Data.Monoid
  import qualified Data.ByteString.Char8 as ByteString
  import Data.ByteString.Short (fromShort)
  
  import LLVM.Test.Support
  
  import LLVM.Context
  import LLVM.Module
  import LLVM.AST
  import LLVM.AST.Type as A.T
  import qualified LLVM.AST.Global as G
  
  tests = testGroup "Global" [
    testGroup "Alignment" [
      testCase name $ withContext $ \context -> do
        let ast = Module "<string>" "<string>" Nothing Nothing [ GlobalDefinition g ]
        ast' <- withModuleFromAST context ast moduleAST
        ast' @?= ast
      | a <- [0,1],
        s <- [Nothing, Just "foo"],
        g <- [
         globalVariableDefaults {
          G.name = UnName 0,
          G.type' = i32,
          G.alignment = a,
          G.section = s
          },
         functionDefaults {
           G.returnType = A.T.void,
           G.name = UnName 0,
           G.parameters = ([], False),
           G.alignment = a,
           G.section = s
         }
         ],
        let
            gn (G.Function {}) = "function"
            gn (G.GlobalVariable {}) = "variable"
            name = gn g <> ", align " <> show a <> (maybe "" (("  section " <>) . ByteString.unpack . fromShort) s)
     ]
   ]
  