packages feed

inline-asm-0.2.0.0: test/Spec.hs

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE GHCForeignImportPrim, UnliftedFFITypes, UnboxedTuples #-}

import Test.Hspec
import Test.QuickCheck

import Language.Asm.Inline

defineAsmFun "timesTwo" [t| Int -> Int |] "add %rbx, %rbx"
defineAsmFun "plusWord" [t| Int -> Int -> Int |] "add %r14, %rbx"
defineAsmFun "swap" [t| Int -> Int -> (Int, Int) |] "xchg %rbx, %r14"

main :: IO ()
main = hspec $ do
  describe "defineAsmFun" $ do
    it "timesTwo" $ property $ \num -> timesTwo num `shouldBe` num * 2
    it "plusWord" $ property $ \n1 n2 -> plusWord n1 n2 `shouldBe` n1 + n2
  describe "Returning tuples" $
    it "swap" $ property $ \n1 n2 -> swap n1 n2 `shouldBe` (n2, n1)