AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <stdlib.h>4#include <string.h>5#include <stdio.h>6 7/* Helper: allocate temp buffer for sqlite3BitvecClear.8 The implementation requires at least BITVEC_SZ bytes (512 in this module),9 allocate a comfortably larger buffer to be safe across builds. */10static void *alloc_tmpbuf(void){11 /* Use sqlite3 allocator to stay within SQLite's memory system. */12 void *p = sqlite3_malloc64(2048);13 TEST_ASSERT_NOT_NULL_MESSAGE(p, "Failed to allocate temporary buffer");14 memset(p, 0, 2048);15 return p;16}17 18void setUp(void) {19 /* Initialize SQLite memory subsystem (safe to call repeatedly). */20 int rc = sqlite3_initialize();21 TEST_ASSERT_TRUE_MESSAGE(rc == SQLITE_OK || rc == SQLITE_MISUSE, "sqlite3_initialize failed");22}23 24void tearDown(void) {25 /* No per-test teardown required. */26}27 28/* Small bitmap: basic set/test/clear and boundary conditions. */29static void test_small_basic(Bitvec *p){30 TEST_ASSERT_NOT_NULL(p);31 /* Initially all bits should be clear. */32 TEST_ASSERT_EQUAL_INT(0, sqlite3BitvecTestNotNull(p, 1));33 34 /* Set and test a few positions, including boundaries. */35 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3BitvecSet(p, 1));36 TEST_ASSERT_EQUAL_INT(1, sqlite3BitvecTestNotNull(p, 1));37 38 u32 sz = sqlite3BitvecSize(p);39 TEST_ASSERT_TRUE(sz >= 3); /* ensure our next tests make sense */40 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3BitvecSet(p, 3));41 TEST_ASSERT_EQUAL_INT(1, sqlite3BitvecTestNotNull(p, 3));42 43 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3BitvecSet(p, sz));44 TEST_ASSERT_EQUAL_INT(1, sqlite3BitvecTestNotNull(p, sz));45 46 /* Unset positions should be 0. */47 TEST_ASSERT_EQUAL_INT(0, sqlite3BitvecTestNotNull(p, 2));48 49 /* Out-of-range indices should be 0. */50 TEST_ASSERT_EQUAL_INT(0, sqlite3BitvecTestNotNull(p, 0));51 TEST_ASSERT_EQUAL_INT(0, sqlite3BitvecTestNotNull(p, sz+1));52 53 /* Clear a set bit and re-test. */54 void *tmp = alloc_tmpbuf();55 sqlite3BitvecClear(p, 3, tmp);56 TEST_ASSERT_EQUAL_INT(0, sqlite3BitvecTestNotNull(p, 3));57 sqlite3_free(tmp);58}59 60void test_sqlite3BitvecTestNotNull_small_basic(void) {61 Bitvec *p = sqlite3BitvecCreate(100);62 TEST_ASSERT_NOT_NULL(p);63 test_small_basic(p);64 sqlite3BitvecDestroy(p);65}66 67void test_sqlite3BitvecTestNotNull_small_pattern_even_bits(void) {68 const u32 sz = 200;69 Bitvec *p = sqlite3BitvecCreate(sz);70 TEST_ASSERT_NOT_NULL(p);71 72 /* Set even bits */73 for(u32 i=2; i<=sz; i+=2){74 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3BitvecSet(p, i));75 }76 77 /* Verify even bits are set and odd bits are clear */78 for(u32 i=1; i<=sz; i++){79 int v = sqlite3BitvecTestNotNull(p, i);80 if( (i & 1)==0 ){81 TEST_ASSERT_EQUAL_INT_MESSAGE(1, v, "Expected even bit to be set");82 }else{83 TEST_ASSERT_EQUAL_INT_MESSAGE(0, v, "Expected odd bit to be clear");84 }85 }86 87 /* Clear a few evens and verify */88 void *tmp = alloc_tmpbuf();89 sqlite3BitvecClear(p, 10, tmp);90 sqlite3BitvecClear(p, 200, tmp);91 TEST_ASSERT_EQUAL_INT(0, sqlite3BitvecTestNotNull(p, 10));92 TEST_ASSERT_EQUAL_INT(0, sqlite3BitvecTestNotNull(p, 200));93 sqlite3_free(tmp);94 95 sqlite3BitvecDestroy(p);96}97 98/* Large bitmap with iSize >> threshold: test in initial hash-table mode. */99void test_sqlite3BitvecTestNotNull_large_hash_basic(void) {100 const u32 sz = 100000;101 Bitvec *p = sqlite3BitvecCreate(sz);102 TEST_ASSERT_NOT_NULL(p);103 104 /* Set a selection of dispersed bits */105 const u32 values[] = {1, 2, 3, 1000, 5000, 12345, 54321, 65536, 77777, 99999};106 const size_t n = sizeof(values)/sizeof(values[0]);107 for(size_t k=0; k<n; ++k){108 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3BitvecSet(p, values[k]));109 }110 111 /* Verify set bits are reported as set */112 for(size_t k=0; k<n; ++k){113 TEST_ASSERT_EQUAL_INT(1, sqlite3BitvecTestNotNull(p, values[k]));114 }115 116 /* Verify a few unset bits are reported as clear */117 TEST_ASSERT_EQUAL_INT(0, sqlite3BitvecTestNotNull(p, 4));118 TEST_ASSERT_EQUAL_INT(0, sqlite3BitvecTestNotNull(p, 40000));119 120 /* Out-of-range checks */121 TEST_ASSERT_EQUAL_INT(0, sqlite3BitvecTestNotNull(p, 0));122 TEST_ASSERT_EQUAL_INT(0, sqlite3BitvecTestNotNull(p, sz+1));123 124 sqlite3BitvecDestroy(p);125}126 127/* Large bitmap: insert enough bits to potentially trigger subdivision and128 ensure recursive traversal works; also test clearing in this mode. */129void test_sqlite3BitvecTestNotNull_large_subdivision_and_clear(void) {130 const u32 sz = 200000;131 Bitvec *p = sqlite3BitvecCreate(sz);132 TEST_ASSERT_NOT_NULL(p);133 134 /* Insert many bits. This will either remain in hash mode or trigger subdivision.135 Either way, sqlite3BitvecTestNotNull must continue to return correct results. */136 const u32 count = 150; /* comfortably larger than typical subdivision threshold */137 for(u32 i=1; i<=count; ++i){138 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3BitvecSet(p, i));139 }140 141 /* Verify some set bits */142 TEST_ASSERT_EQUAL_INT(1, sqlite3BitvecTestNotNull(p, 1));143 TEST_ASSERT_EQUAL_INT(1, sqlite3BitvecTestNotNull(p, 50));144 TEST_ASSERT_EQUAL_INT(1, sqlite3BitvecTestNotNull(p, 150));145 146 /* Verify an unset distant bit - likely in a different bin/subtree - is clear */147 TEST_ASSERT_EQUAL_INT(0, sqlite3BitvecTestNotNull(p, 100000));148 149 /* Boundary/out-of-range */150 TEST_ASSERT_EQUAL_INT(0, sqlite3BitvecTestNotNull(p, 0));151 TEST_ASSERT_EQUAL_INT(0, sqlite3BitvecTestNotNull(p, sz+1));152 153 /* Clear a previously set bit and re-test */154 void *tmp = alloc_tmpbuf();155 sqlite3BitvecClear(p, 100, tmp);156 TEST_ASSERT_EQUAL_INT(0, sqlite3BitvecTestNotNull(p, 100));157 sqlite3_free(tmp);158 159 sqlite3BitvecDestroy(p);160}161 162/* Very small sizes: size==1 boundary behavior. */163void test_sqlite3BitvecTestNotNull_size_one(void) {164 Bitvec *p = sqlite3BitvecCreate(1);165 TEST_ASSERT_NOT_NULL(p);166 167 TEST_ASSERT_EQUAL_INT(0, sqlite3BitvecTestNotNull(p, 1));168 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3BitvecSet(p, 1));169 TEST_ASSERT_EQUAL_INT(1, sqlite3BitvecTestNotNull(p, 1));170 171 /* out-of-range and zero */172 TEST_ASSERT_EQUAL_INT(0, sqlite3BitvecTestNotNull(p, 0));173 TEST_ASSERT_EQUAL_INT(0, sqlite3BitvecTestNotNull(p, 2));174 175 sqlite3BitvecDestroy(p);176}177 178int main(void) {179 UNITY_BEGIN();180 181 RUN_TEST(test_sqlite3BitvecTestNotNull_small_basic);182 RUN_TEST(test_sqlite3BitvecTestNotNull_small_pattern_even_bits);183 RUN_TEST(test_sqlite3BitvecTestNotNull_large_hash_basic);184 RUN_TEST(test_sqlite3BitvecTestNotNull_large_subdivision_and_clear);185 RUN_TEST(test_sqlite3BitvecTestNotNull_size_one);186 187 return UNITY_END();188}