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