libnvvm-1.0.0: Test/simple/Simple.hs
-- Copyright (c) 2012-2014 NVIDIA Corporation. All rights reserved.
--
-- Permission is hereby granted, free of charge, to any person obtaining a copy
-- of this software and associated documentation files (the "Software"), to deal
-- in the Software without restriction, including without limitation the rights
-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-- copies of the Software, and to permit persons to whom the Software is
-- furnished to do so, subject to the following conditions:
--
-- The above copyright notice and this permission notice shall be included in
-- all copies or substantial portions of the Software.
--
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-- SOFTWARE.
module Main (main) where
import Foreign.LibNVVM
import Control.Monad
import Control.Exception
import Text.Printf
import Test.HUnit hiding (Test)
import Test.Framework.Providers.HUnit (testCase)
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as B8
import qualified Test.Framework as TF (Test, defaultMain, testGroup)
main :: IO ()
main = TF.defaultMain tests
tests :: [TF.Test]
tests =
[ TF.testGroup "Positive tests"
[ testCase "compile HelloWorld.ll"
pCompileHelloWorldLL
, testCase "compile HelloWorld.bc"
pCompileHelloWorldBC
, testCase "compile multiple .ll files"
pCompileMultipleLL
, testCase "compile multiple .bc files"
pCompileMultipleBC
, testCase "compile multiple .ll and .bc files"
pCompileMultipleLLBC
]
, TF.testGroup "Negative tests"
[ testCase "compile HelloWorldWithError.ll"
nCompileHelloWorldWithErrorLL
, testCase "compile multiple .ll files with redefinitions"
nCompileMultipleLL
, testCase "compile multiple .bc files with redefinitions"
nCompileMultipleBC
, testCase "compile multiple .ll and .bc files with redefinitions"
nCompileMultipleLLBC
]
]
assertRaises
:: (Exception e, Show e, Eq e)
=> String
-> e
-> IO a
-> Assertion
assertRaises msg selector action =
let testErr e
| e == selector = return ()
| otherwise = assertFailure $ printf "%s\nReceived unexpected exception: %s\nInstead of exception: %s"
msg (show e) (show selector)
in do
r <- try action
case r of
Left e -> testErr e
Right _ -> assertFailure $ printf "%s\nReceived no exception, but was expecting: %s" msg (show selector)
-- Compilation actually returns a UserError so that the compilation error
-- message is returned as part of the string. The first line of the error
-- message does contain the Status error string, however, so just compare that.
--
instance Eq NVVMException where
s == t = head (lines (show s)) == head (lines (show t))
-- Positive tests
-- --------------
pCompileHelloWorldLL :: Assertion
pCompileHelloWorldLL = do
ll <- B8.readFile "Test/data/HelloWorld.ll"
void $! compileModule "compileLL" ll [] True
pCompileHelloWorldBC :: Assertion
pCompileHelloWorldBC = do
bc <- B.readFile "Test/data/HelloWorld.bc"
void $! compileModule "compileBC" bc [] True
pCompileMultipleLL :: Assertion
pCompileMultipleLL = do
lls <- mapM B8.readFile [ "Test/data/HelloWorld0.ll"
, "Test/data/HelloWorld1.ll"
, "Test/data/HelloWorld2.ll"
, "Test/data/HelloWorld3.ll"
]
void $! compileModules (zip (repeat "compileMultipleLL") lls) [] True
pCompileMultipleBC :: Assertion
pCompileMultipleBC = do
bcs <- mapM B.readFile [ "Test/data/HelloWorld0.bc"
, "Test/data/HelloWorld1.bc"
, "Test/data/HelloWorld2.bc"
, "Test/data/HelloWorld3.bc"
]
void $! compileModules (zip (repeat "compileMultipleBC") bcs) [] True
pCompileMultipleLLBC :: Assertion
pCompileMultipleLLBC = do
llbcs <- sequence [ B8.readFile "Test/data/HelloWorld0.ll"
, B.readFile "Test/data/HelloWorld1.bc"
, B8.readFile "Test/data/HelloWorld2.ll"
, B.readFile "Test/data/HelloWorld3.bc"
]
void $! compileModules (zip (repeat "compileMultipleLLBC") llbcs) [] True
-- Negative tests
-- --------------
compilationError :: IO Result -> Assertion
compilationError action =
assertRaises "Compilation Error" (ExitCode Compilation) action
nCompileHelloWorldWithErrorLL :: Assertion
nCompileHelloWorldWithErrorLL = do
ll <- B8.readFile "Test/data/HelloWorldWithError.ll"
compilationError $ compileModule "errorLL" ll [] True
nCompileMultipleLL :: Assertion
nCompileMultipleLL = do
lls <- mapM B8.readFile [ "Test/data/HelloWorld.ll"
, "Test/data/HelloWorld.ll"
]
compilationError $ compileModules (zip (repeat "errorMultipleLL") lls) [] True
nCompileMultipleBC :: Assertion
nCompileMultipleBC = do
bcs <- mapM B.readFile [ "Test/data/HelloWorld.bc"
, "Test/data/HelloWorld.bc"
]
compilationError $ compileModules (zip (repeat "errorMultipleBC") bcs) [] True
nCompileMultipleLLBC :: Assertion
nCompileMultipleLLBC = do
llbcs <- sequence [ B8.readFile "Test/data/HelloWorld.ll"
, B.readFile "Test/data/HelloWorld.bc"
]
compilationError $ compileModules (zip (repeat "errorMultipleLLBC") llbcs) [] True