#ifndef PG_QUERY_TEST_FRAMEWORK_H
#define PG_QUERY_TEST_FRAMEWORK_H
#include <stdio.h>
#include <stdlib.h>
#include "postgres.h"
#include "nodes/pg_list.h"
typedef struct
{
char *wanted_test;
size_t passed;
size_t failed;
size_t skipped;
} TestState;
typedef void (TestFn) (TestState * test_state);
typedef void (TestCleanupFn) (void);
int TEST_INIT_impl(TestState * test_state, const char *func, size_t line);
int TEST_BOUNDED_STRCMP(char *s1, char *s2);
void TEST_ASSERT_NULL_impl(TestState * test_state, char *actual_str, void *actual);
void TEST_ASSERT_LIST_EQUAL_impl(TestState * test_state, char *actual_str, List *actual, List *expected);
void TEST_ASSERT_LIST_LENGTH_impl(TestState * test_state, char *lst_str, List *lst, size_t expected_len);
void TEST_ASSERT_STR_EQUAL_impl(TestState * test_state, char *actual_str, char *actual, char *expected);
#define TEST_PASS() (test_state->passed++)
#define TEST_FAIL(...) (printf(__VA_ARGS__), test_state->failed++)
#define TEST_SKIP(...) (printf(" SKIP: " __VA_ARGS__), test_state->skipped++)
#define TEST_INIT() do { if (TEST_INIT_impl(test_state, __func__, __LINE__) != 0) return; } while(0)
#define TEST_ASSERT_NULL(actual) TEST_ASSERT_NULL_impl(test_state, #actual, actual)
#define TEST_ASSERT_LIST_EQUAL(actual, expected) TEST_ASSERT_LIST_EQUAL_impl(test_state, #actual, actual, expected)
#define TEST_ASSERT_LIST_LENGTH(lst, len) TEST_ASSERT_LIST_LENGTH_impl(test_state, #lst, lst, len)
#define TEST_ASSERT_STR_EQUAL(actual, expected) TEST_ASSERT_STR_EQUAL_impl(test_state, #actual, actual, expected)
int test_run(int argc, char *argv[], TestFn * tests[], TestCleanupFn * test_cleanup);
int test_run_with_mcxt(int argc, char *argv[], TestFn * tests[], TestCleanupFn * test_cleanup);
#define TEST_LIST_MAKE6(a,b,c,d,e,f) lappend(list_make5(a,b,c,d,e), f)
#define TEST_LIST_MAKE7(a,b,c,d,e,f,g) lappend(TEST_LIST_MAKE6(a,b,c,d,e,f), g)
#define TEST_LIST_MAKE8(a,b,c,d,e,f,g,h) lappend(TEST_LIST_MAKE7(a,b,c,d,e,f,g), h)
#define TEST_LIST_MAKE9(a,b,c,d,e,f,g,h,i) lappend(TEST_LIST_MAKE8(a,b,c,d,e,f,g,h), i)
#endif