Team Ai
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 10mo agoView on Hugging Face
0likes
tests_main_sqlite3_progress_handler.c125 linesDownload Raw Back to tests
1#include "sqliteInt.h"2#include "unity.h"3#include <stdlib.h>4#include <string.h>5#include <limits.h>6 7static sqlite3 *gDb = NULL;8 9/* Simple progress callbacks used for pointer identity tests */10static int progress_cb0(void *pArg){11  (void)pArg;12  return 0;13}14static int progress_cb1(void *pArg){15  (void)pArg;16  return 1;17}18 19void setUp(void) {20  int rc = sqlite3_open(":memory:", &gDb);21  TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);22  TEST_ASSERT_NOT_NULL(gDb);23}24 25void tearDown(void) {26  if( gDb ){27    int rc = sqlite3_close(gDb);28    /* Ensure the db closes cleanly */29    TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);30    gDb = NULL;31  }32}33 34/* nOps > 0: fields should be set */35void test_sqlite3_progress_handler_sets_values_when_nOps_positive(void) {36  int arg = 42;37 38  /* Start from a known cleared state */39  sqlite3_progress_handler(gDb, 0, NULL, NULL);40 41  sqlite3_progress_handler(gDb, 100, progress_cb0, &arg);42 43  TEST_ASSERT_EQUAL_PTR((void*)progress_cb0, (void*)gDb->xProgress);44  TEST_ASSERT_EQUAL_UINT((unsigned)100, gDb->nProgressOps);45  TEST_ASSERT_EQUAL_PTR(&arg, gDb->pProgressArg);46}47 48/* nOps == 0: fields should be cleared, regardless of non-NULL callback and arg */49void test_sqlite3_progress_handler_clears_values_when_nOps_zero(void) {50  int arg = 7;51 52  /* First set to non-zero values */53  sqlite3_progress_handler(gDb, 5, progress_cb0, &arg);54 55  /* Now call with nOps == 0 (even with non-NULL callback/arg) */56  sqlite3_progress_handler(gDb, 0, progress_cb1, &arg);57 58  TEST_ASSERT_EQUAL_PTR(NULL, (void*)gDb->xProgress);59  TEST_ASSERT_EQUAL_UINT((unsigned)0, gDb->nProgressOps);60  TEST_ASSERT_EQUAL_PTR(NULL, gDb->pProgressArg);61}62 63/* nOps < 0: fields should be cleared */64void test_sqlite3_progress_handler_clears_values_when_nOps_negative(void) {65  int arg = 99;66 67  /* First set to non-zero values */68  sqlite3_progress_handler(gDb, 3, progress_cb1, &arg);69 70  /* Now clear using negative nOps */71  sqlite3_progress_handler(gDb, -1, progress_cb0, &arg);72 73  TEST_ASSERT_EQUAL_PTR(NULL, (void*)gDb->xProgress);74  TEST_ASSERT_EQUAL_UINT((unsigned)0, gDb->nProgressOps);75  TEST_ASSERT_EQUAL_PTR(NULL, gDb->pProgressArg);76}77 78/* Repeated positive sets should overwrite previous values */79void test_sqlite3_progress_handler_overwrites_previous_values(void) {80  int arg1 = 1;81  int arg2 = 2;82 83  sqlite3_progress_handler(gDb, 5,  progress_cb0, &arg1);84  TEST_ASSERT_EQUAL_PTR((void*)progress_cb0, (void*)gDb->xProgress);85  TEST_ASSERT_EQUAL_UINT((unsigned)5, gDb->nProgressOps);86  TEST_ASSERT_EQUAL_PTR(&arg1, gDb->pProgressArg);87 88  sqlite3_progress_handler(gDb, 123, progress_cb1, &arg2);89  TEST_ASSERT_EQUAL_PTR((void*)progress_cb1, (void*)gDb->xProgress);90  TEST_ASSERT_EQUAL_UINT((unsigned)123, gDb->nProgressOps);91  TEST_ASSERT_EQUAL_PTR(&arg2, gDb->pProgressArg);92}93 94/* Large positive nOps should be stored as (unsigned)nOps */95void test_sqlite3_progress_handler_handles_large_nOps(void) {96  int arg = 0;97  sqlite3_progress_handler(gDb, INT_MAX, progress_cb1, &arg);98 99  TEST_ASSERT_EQUAL_PTR((void*)progress_cb1, (void*)gDb->xProgress);100  TEST_ASSERT_EQUAL_UINT((unsigned)INT_MAX, gDb->nProgressOps);101  TEST_ASSERT_EQUAL_PTR(&arg, gDb->pProgressArg);102}103 104/* Ensure that calling clear after set truly zeroes everything */105void test_sqlite3_progress_handler_set_then_clear_results_in_zero_state(void) {106  int arg = 11;107  sqlite3_progress_handler(gDb, 10, progress_cb0, &arg);108 109  sqlite3_progress_handler(gDb, 0, NULL, NULL);110 111  TEST_ASSERT_NULL(gDb->xProgress);112  TEST_ASSERT_EQUAL_UINT(0u, gDb->nProgressOps);113  TEST_ASSERT_NULL(gDb->pProgressArg);114}115 116int main(void) {117  UNITY_BEGIN();118  RUN_TEST(test_sqlite3_progress_handler_sets_values_when_nOps_positive);119  RUN_TEST(test_sqlite3_progress_handler_clears_values_when_nOps_zero);120  RUN_TEST(test_sqlite3_progress_handler_clears_values_when_nOps_negative);121  RUN_TEST(test_sqlite3_progress_handler_overwrites_previous_values);122  RUN_TEST(test_sqlite3_progress_handler_handles_large_nOps);123  RUN_TEST(test_sqlite3_progress_handler_set_then_clear_results_in_zero_state);124  return UNITY_END();125}