packages feed

extism-1.0.0.0: test/Test.hs

import Extism
import Extism.HostFunction
import Extism.Manifest
import Test.HUnit

assertUnwrap (Right x) = return x
assertUnwrap (Left (ExtismError msg)) =
  assertFailure msg

defaultManifest = manifest [wasmFile "../wasm/code.wasm"]

hostFunctionManifest = manifest [wasmFile "../wasm/code-functions.wasm"]

initPlugin :: IO Plugin
initPlugin =
  Extism.newPlugin defaultManifest [] False >>= assertUnwrap

pluginFunctionExists = do
  p <- initPlugin
  exists <- functionExists p "count_vowels"
  assertBool "function exists" exists
  exists' <- functionExists p "function_doesnt_exist"
  assertBool "function doesn't exist" (not exists')

checkCallResult p = do
  res <- call p "count_vowels" "this is a test" >>= assertUnwrap
  assertEqual "count vowels output" "{\"count\": 4}" res

pluginCall = do
  p <- initPlugin
  checkCallResult p

hello plugin () = do
  s <- unwrap <$> input plugin 0
  assertEqual "host function input" "{\"count\": 4}" s
  putStrLn "Hello from Haskell!"
  output plugin 0 "{\"count\": 999}"

pluginCallHostFunction = do
  p <- Extism.newPlugin hostFunctionManifest [] False >>= assertUnwrap
  res <- call p "count_vowels" "this is a test" >>= assertUnwrap
  assertEqual "count vowels output" "{\"count\": 999}" res

pluginMultiple = do
  p <- initPlugin
  checkCallResult p
  q <- initPlugin
  r <- initPlugin
  checkCallResult q
  checkCallResult r

pluginConfig = do
  p <- initPlugin
  b <- setConfig p [("a", Just "1"), ("b", Just "2"), ("c", Just "3"), ("d", Nothing)]
  assertBool "set config" b

testSetLogFile = do
  b <- setLogFile "stderr" Extism.LogError
  assertBool "set log file" b

t name f = TestLabel name (TestCase f)

main = do
  runTestTT
    ( TestList
        [ t "Plugin.FunctionExists" pluginFunctionExists,
          t "Plugin.Call" pluginCall,
          t "Plugin.CallHostFunction" pluginCallHostFunction,
          t "Plugin.Multiple" pluginMultiple,
          t "Plugin.Config" pluginConfig,
          t "SetLogFile" testSetLogFile
        ]
    )