packages feed

duckdb-ffi-0.1.4.1: test/ConfigurationTest.hs

{-# LANGUAGE BlockArguments #-}

module ConfigurationTest (tests) where

import Database.DuckDB.FFI
import Foreign.C.String (peekCString, withCString)
import Foreign.Marshal.Alloc (alloca)
import Foreign.Ptr (nullPtr)
import Foreign.Storable (peek)
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.HUnit (assertBool, testCase, (@?=))

tests :: TestTree
tests =
    testGroup
        "Configuration"
        [configurationLifecycle]

configurationLifecycle :: TestTree
configurationLifecycle =
    testCase "create, inspect, mutate, and destroy configuration" $
        alloca \configPtr -> do
            state <- c_duckdb_create_config configPtr
            state @?= DuckDBSuccess

            config <- peek configPtr
            assertBool "config pointer should not be null" (config /= nullPtr)

            count <- c_duckdb_config_count
            assertBool "config flag count should be > 0" (count > 0)

            alloca \namePtr -> alloca \descPtr -> do
                flagState <- c_duckdb_get_config_flag 0 namePtr descPtr
                flagState @?= DuckDBSuccess
                flagName <- peek namePtr >>= peekCString
                flagDesc <- peek descPtr >>= peekCString
                assertBool "flag name should not be empty" (not (null flagName))
                assertBool "flag description should not be empty" (not (null flagDesc))

            setState <-
                withCString "access_mode" \flag ->
                    withCString "READ_WRITE" $ \value ->
                        c_duckdb_set_config config flag value
            setState @?= DuckDBSuccess

            c_duckdb_destroy_config configPtr