Team Ai
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 10mo agoView on Hugging Face
0likes
tests_main_sqlite3_collation_needed.c98 linesDownload Raw Back to tests
1#include "sqliteInt.h"2#include "unity.h"3#include <stdlib.h>4#include <string.h>5 6/* Global database handle for tests */7static sqlite3 *gDb = NULL;8 9/* Sample callbacks to use in tests */10static void collNeededA(void *pArg, sqlite3 *db, int eTextRep, const char *zName){11  /* No-op; presence of this function serves as unique function pointer */12  (void)pArg; (void)db; (void)eTextRep; (void)zName;13}14static void collNeededB(void *pArg, sqlite3 *db, int eTextRep, const char *zName){15  /* No-op; presence of this function serves as unique function pointer */16  (void)pArg; (void)db; (void)eTextRep; (void)zName;17}18 19void setUp(void) {20  int rc = sqlite3_open(":memory:", &gDb);21  TEST_ASSERT_EQUAL_INT_MESSAGE(SQLITE_OK, rc, "Failed to open in-memory SQLite DB");22  TEST_ASSERT_NOT_NULL_MESSAGE(gDb, "sqlite3_open returned NULL db");23}24 25void tearDown(void) {26  if( gDb ){27    int rc = sqlite3_close(gDb);28    TEST_ASSERT_EQUAL_INT_MESSAGE(SQLITE_OK, rc, "Failed to close SQLite DB");29    gDb = NULL;30  }31}32 33/* Test: setting callback and argument, and clearing any prior xCollNeeded16 */34void test_sqlite3_collation_needed_sets_callback_and_arg_clears_16(void) {35  /* Pre-set xCollNeeded16 to a non-NULL value to verify it is cleared */36  gDb->xCollNeeded = NULL;37  gDb->xCollNeeded16 = (void*)0x1;38  gDb->pCollNeededArg = NULL;39 40  void *arg = (void*)0x1234;41  int rc = sqlite3_collation_needed(gDb, arg, collNeededA);42  TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);43  TEST_ASSERT_EQUAL_PTR(collNeededA, gDb->xCollNeeded);44  TEST_ASSERT_NULL(gDb->xCollNeeded16);45  TEST_ASSERT_EQUAL_PTR(arg, gDb->pCollNeededArg);46}47 48/* Test: replacing an existing callback and argument */49void test_sqlite3_collation_needed_replaces_existing_values(void) {50  void *arg1 = (void*)0x1111;51  void *arg2 = (void*)0x2222;52 53  int rc1 = sqlite3_collation_needed(gDb, arg1, collNeededA);54  TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc1);55  TEST_ASSERT_EQUAL_PTR(collNeededA, gDb->xCollNeeded);56  TEST_ASSERT_NULL(gDb->xCollNeeded16);57  TEST_ASSERT_EQUAL_PTR(arg1, gDb->pCollNeededArg);58 59  int rc2 = sqlite3_collation_needed(gDb, arg2, collNeededB);60  TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc2);61  TEST_ASSERT_EQUAL_PTR(collNeededB, gDb->xCollNeeded);62  TEST_ASSERT_NULL(gDb->xCollNeeded16);63  TEST_ASSERT_EQUAL_PTR(arg2, gDb->pCollNeededArg);64}65 66/* Test: setting a NULL callback still clears 16-bit callback and sets arg */67void test_sqlite3_collation_needed_allows_null_callback(void) {68  /* Pre-set different values to ensure they are overwritten/cleared */69  gDb->xCollNeeded = collNeededA;70  gDb->xCollNeeded16 = (void*)0x1;71  gDb->pCollNeededArg = (void*)0xDEAD;72 73  void *arg = (void*)0xBEEF;74  int rc = sqlite3_collation_needed(gDb, arg, NULL);75  TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);76  TEST_ASSERT_NULL(gDb->xCollNeeded);77  TEST_ASSERT_NULL(gDb->xCollNeeded16);78  TEST_ASSERT_EQUAL_PTR(arg, gDb->pCollNeededArg);79}80 81#ifdef SQLITE_ENABLE_API_ARMOR82/* Test: With API armor, passing a NULL db should return SQLITE_MISUSE_BKPT */83void test_sqlite3_collation_needed_null_db_returns_misuse_with_armor(void) {84  int rc = sqlite3_collation_needed(NULL, (void*)0x1, collNeededA);85  TEST_ASSERT_EQUAL_INT(SQLITE_MISUSE_BKPT, rc);86}87#endif88 89int main(void) {90  UNITY_BEGIN();91  RUN_TEST(test_sqlite3_collation_needed_sets_callback_and_arg_clears_16);92  RUN_TEST(test_sqlite3_collation_needed_replaces_existing_values);93  RUN_TEST(test_sqlite3_collation_needed_allows_null_callback);94  #ifdef SQLITE_ENABLE_API_ARMOR95  RUN_TEST(test_sqlite3_collation_needed_null_db_returns_misuse_with_armor);96  #endif97  return UNITY_END();98}