{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TypeApplications #-} {-| Module : HsLua.Packaging.RenderingTests Copyright : © 2020-2021 Albert Krewinkel License : MIT Maintainer : Albert Krewinkel Tests for calling exposed Haskell functions. -} module HsLua.Packaging.RenderingTests (tests) where import Data.Maybe (fromMaybe) import Data.Version (makeVersion) import HsLua.Packaging.Function import HsLua.Packaging.Module import HsLua.Packaging.Rendering import HsLua.Marshalling (peekIntegral, peekRealFloat, pushIntegral, pushRealFloat) import Test.Tasty (TestTree, testGroup) import Test.Tasty.HUnit ((@=?), testCase) import qualified Data.Text as T import qualified HsLua.Core as Lua -- | Calling Haskell functions from Lua. tests :: TestTree tests = testGroup "Rendering" $ let factorialDocs = T.intercalate "\n" [ "factorial (n)" , "" , "Calculates the factorial of a positive integer." , "" , "*Since: 1.0.0*" , "" , "Parameters:" , "" , "n" , ": number for which the factorial is computed (integer)" , "" , "Returns:" , "" , " - factorial (integer)" ] nrootDocs = T.intercalate "\n" [ "nroot (x, n)" , "" , "Parameters:" , "" , "x" , ": (number)" , "" , "n" , ": (integer)" , "" , "Returns:" , "" , " - nth root (number)" ] eulerDocs = T.intercalate "\n" [ "euler_mascheroni" , "" , "Euler-Mascheroni constant" ] in [ testGroup "Function" [ testCase "rendered docs" $ factorialDocs @=? renderFunction factorial ] , testGroup "Module" [ testCase "module docs" (T.unlines [ "# mymath" , "" , "A math module." , "" , "### " `T.append` eulerDocs , "" , "## Functions" , "" , "### " `T.append` factorialDocs , "" , "### " `T.append` nrootDocs ] @=? render mymath) ] ] -- | Calculate the nth root of a number. Defaults to square root. nroot :: DocumentedFunction Lua.Exception nroot = defun "nroot" (liftPure2 nroot') <#> parameter (peekRealFloat @Double) "number" "x" "" <#> optionalParameter (peekIntegral @Int) "integer" "n" "" =#> functionResult pushRealFloat "number" "nth root" where nroot' :: Double -> Maybe Int -> Double nroot' x nOpt = let n = fromMaybe 2 nOpt in x ** (1 / fromIntegral n) mymath :: Module Lua.Exception mymath = Module { moduleName = "mymath" , moduleDescription = "A math module." , moduleFields = [euler_mascheroni] , moduleFunctions = [ factorial, nroot ] , moduleOperations = [] } -- | Euler-Mascheroni constant euler_mascheroni :: Field Lua.Exception euler_mascheroni = Field { fieldName = "euler_mascheroni" , fieldDescription = "Euler-Mascheroni constant" , fieldPushValue = pushRealFloat @Double 0.57721566490153286060651209008240243 } -- | Calculate the factorial of a number. factorial :: DocumentedFunction Lua.Exception factorial = defun "factorial" ### liftPure (\n -> product [1..n]) <#> factorialParam =#> factorialResult #? "Calculates the factorial of a positive integer." `since` makeVersion [1,0,0] factorialParam :: Parameter Lua.Exception Integer factorialParam = parameter peekIntegral "integer" "n" "number for which the factorial is computed" factorialResult :: FunctionResults Lua.Exception Integer factorialResult = functionResult pushIntegral "integer" "factorial"