AryaWu/sqlite
0
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}