Team Ai
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 10mo agoView on Hugging Face
0likes
tests_bitvec_sqlite3BitvecTestNotNull.c188 linesDownload Raw Back to tests
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}