Team Ai
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 10mo agoView on Hugging Face
0likes
tests_expr_sqlite3ExprListFlags.c142 linesDownload Raw Back to tests
1#include "sqliteInt.h"2#include "unity.h"3#include <stdlib.h>4#include <string.h>5 6/* Ensure the prototype is visible to the compiler */7extern u32 sqlite3ExprListFlags(const ExprList *pList);8 9void setUp(void) {10  /* Setup code here, or leave empty */11}12void tearDown(void) {13  /* Cleanup code here, or leave empty */14}15 16/* Helper to build an ExprList from arrays of flags */17static void buildExprList(ExprList *pList,18                          struct ExprList_item *items,19                          Expr *exprs,20                          int n,21                          const u32 *flags){22  memset(pList, 0, sizeof(*pList));23  pList->nExpr = n;24  pList->a = items;25  for(int i=0; i<n; i++){26    memset(&items[i], 0, sizeof(items[i]));27    memset(&exprs[i], 0, sizeof(exprs[i]));28    exprs[i].flags = flags[i];29    items[i].pExpr = &exprs[i];30  }31}32 33/* Test: empty list should yield 0 and not dereference a[] */34void test_sqlite3ExprListFlags_empty_list_returns_zero(void){35  ExprList list;36  memset(&list, 0, sizeof(list));37  list.nExpr = 0;38  list.a = NULL; /* Should not be accessed */39  u32 res = sqlite3ExprListFlags(&list);40  TEST_ASSERT_EQUAL_HEX32(0u, res);41}42 43/* Test: single expression returns its flags */44void test_sqlite3ExprListFlags_single_expr_returns_same_flags(void){45  ExprList list;46  struct ExprList_item items[1];47  Expr exprs[1];48  const u32 flags[1] = { 0xA5A5A5A5u };49 50  buildExprList(&list, items, exprs, 1, flags);51 52  u32 res = sqlite3ExprListFlags(&list);53  TEST_ASSERT_EQUAL_HEX32(flags[0], res);54}55 56/* Test: multiple expressions with non-overlapping bits */57void test_sqlite3ExprListFlags_multiple_nonoverlapping_bits(void){58  ExprList list;59  struct ExprList_item items[3];60  Expr exprs[3];61  const u32 flags[3] = { 0x00000001u, 0x00000020u, 0x00400000u };62  const u32 expected = 0x00400021u;63 64  buildExprList(&list, items, exprs, 3, flags);65 66  u32 res = sqlite3ExprListFlags(&list);67  TEST_ASSERT_EQUAL_HEX32(expected, res);68}69 70/* Test: multiple expressions with overlapping bits should OR to union */71void test_sqlite3ExprListFlags_multiple_overlapping_bits(void){72  ExprList list;73  struct ExprList_item items[4];74  Expr exprs[4];75  const u32 flags[4] = {76    0x00000007u, /* 0b000...0111 */77    0x00000006u, /* 0b000...0110 */78    0x00000010u, /* 0b000...10000 */79    0x00000002u  /* 0b000...00010 */80  };81  const u32 expected = 0x00000017u; /* 0b000...10111 */82 83  buildExprList(&list, items, exprs, 4, flags);84 85  u32 res = sqlite3ExprListFlags(&list);86  TEST_ASSERT_EQUAL_HEX32(expected, res);87}88 89/* Test: expressions with some zero flags should not affect OR */90void test_sqlite3ExprListFlags_zeros_mixed_in_list(void){91  ExprList list;92  struct ExprList_item items[5];93  Expr exprs[5];94  const u32 flags[5] = { 0x0u, 0x8u, 0x0u, 0x80u, 0x8000u };95  const u32 expected = 0x8088u;96 97  buildExprList(&list, items, exprs, 5, flags);98 99  u32 res = sqlite3ExprListFlags(&list);100  TEST_ASSERT_EQUAL_HEX32(expected, res);101}102 103/* Test: stress with many items and patterned flags */104void test_sqlite3ExprListFlags_many_items_stress(void){105  const int N = 64;106  struct ExprList_item *items = (struct ExprList_item*)malloc(sizeof(*items)*N);107  Expr *exprs = (Expr*)malloc(sizeof(*exprs)*N);108  ExprList list;109  u32 flags[N];110  u32 expected = 0u;111 112  TEST_ASSERT_NOT_NULL(items);113  TEST_ASSERT_NOT_NULL(exprs);114 115  /* Pattern: set bit i%24 for variety, and also include some overlapping bits */116  for(int i=0; i<N; i++){117    u32 f = (1u << (i % 24));118    if( (i % 5) == 0 ) f |= 0x00000002u;  /* add overlapping bit */119    if( (i % 7) == 0 ) f |= 0x00010000u;  /* add another overlapping bit */120    flags[i] = f;121    expected |= f;122  }123 124  buildExprList(&list, items, exprs, N, flags);125 126  u32 res = sqlite3ExprListFlags(&list);127  TEST_ASSERT_EQUAL_HEX32(expected, res);128 129  free(items);130  free(exprs);131}132 133int main(void){134  UNITY_BEGIN();135  RUN_TEST(test_sqlite3ExprListFlags_empty_list_returns_zero);136  RUN_TEST(test_sqlite3ExprListFlags_single_expr_returns_same_flags);137  RUN_TEST(test_sqlite3ExprListFlags_multiple_nonoverlapping_bits);138  RUN_TEST(test_sqlite3ExprListFlags_multiple_overlapping_bits);139  RUN_TEST(test_sqlite3ExprListFlags_zeros_mixed_in_list);140  RUN_TEST(test_sqlite3ExprListFlags_many_items_stress);141  return UNITY_END();142}