AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <string.h>4#include <stdlib.h>5 6/* The wrapper provided in the module for the static function under test */7extern int test_gatherSelectWindowsCallback(Walker *pWalker, Expr *pExpr);8 9void setUp(void) {10 /* Setup code here, or leave empty */11}12 13void tearDown(void) {14 /* Cleanup code here, or leave empty */15}16 17/* Helper to zero-initialize structures safely */18static void zero_memory(void *p, size_t n){19 memset(p, 0, n);20}21 22/* Test: No-op when expression is not a function */23void test_gatherSelectWindowsCallback_noop_when_not_function(void){24 Select s; Walker w; Expr e;25 zero_memory(&s, sizeof(s));26 zero_memory(&w, sizeof(w));27 zero_memory(&e, sizeof(e));28 29 /* Set walker to reference our Select */30 w.u.pSelect = &s;31 32 /* Expression is not a function */33 e.op = TK_INTEGER; /* any non-function op */34 e.flags = 0;35 e.y.pWin = NULL;36 37 int rc = test_gatherSelectWindowsCallback(&w, &e);38 TEST_ASSERT_EQUAL_INT(WRC_Continue, rc);39 TEST_ASSERT_NULL(s.pWin);40}41 42/* Test: No-op when expression is a function without EP_WinFunc flag */43void test_gatherSelectWindowsCallback_noop_when_function_without_winflag(void){44 Select s; Walker w; Expr e; Window win;45 zero_memory(&s, sizeof(s));46 zero_memory(&w, sizeof(w));47 zero_memory(&e, sizeof(e));48 zero_memory(&win, sizeof(win));49 50 w.u.pSelect = &s;51 52 e.op = TK_FUNCTION;53 e.flags = 0; /* EP_WinFunc not set */54 e.y.pWin = &win; /* Even if a Window is present, flag is missing */55 56 int rc = test_gatherSelectWindowsCallback(&w, &e);57 TEST_ASSERT_EQUAL_INT(WRC_Continue, rc);58 TEST_ASSERT_NULL(s.pWin); /* No link should have occurred */59 TEST_ASSERT_NULL(win.ppThis); /* No link should have occurred */60}61 62/* Test: Links a single window function into the Select window list */63void test_gatherSelectWindowsCallback_links_single_window(void){64 Select s; Walker w; Expr e; Window win;65 zero_memory(&s, sizeof(s));66 zero_memory(&w, sizeof(w));67 zero_memory(&e, sizeof(e));68 zero_memory(&win, sizeof(win));69 70 w.u.pSelect = &s;71 72 e.op = TK_FUNCTION;73 e.flags = EP_WinFunc; /* Mark as window-function */74 e.y.pWin = &win;75 76 int rc = test_gatherSelectWindowsCallback(&w, &e);77 TEST_ASSERT_EQUAL_INT(WRC_Continue, rc);78 79 /* Verify linking effects */80 TEST_ASSERT_EQUAL_PTR(&win, s.pWin);81 TEST_ASSERT_NOT_NULL(win.ppThis);82 TEST_ASSERT_EQUAL_PTR(&s.pWin, win.ppThis); /* For first element, ppThis should be &s.pWin */83 TEST_ASSERT_EQUAL_PTR(&win, *(win.ppThis)); /* That pointer should dereference back to win */84 TEST_ASSERT_NULL(win.pNextWin); /* Single element list */85}86 87/* Test: Links multiple windows and appends in order */88void test_gatherSelectWindowsCallback_links_multiple_windows_appends(void){89 Select s; Walker w; Expr e1, e2; Window w1, w2;90 zero_memory(&s, sizeof(s));91 zero_memory(&w, sizeof(w));92 zero_memory(&e1, sizeof(e1));93 zero_memory(&e2, sizeof(e2));94 zero_memory(&w1, sizeof(w1));95 zero_memory(&w2, sizeof(w2));96 97 w.u.pSelect = &s;98 99 /* First window function expression */100 e1.op = TK_FUNCTION;101 e1.flags = EP_WinFunc;102 e1.y.pWin = &w1;103 104 /* Second window function expression */105 e2.op = TK_FUNCTION;106 e2.flags = EP_WinFunc;107 e2.y.pWin = &w2;108 109 int rc1 = test_gatherSelectWindowsCallback(&w, &e1);110 int rc2 = test_gatherSelectWindowsCallback(&w, &e2);111 112 TEST_ASSERT_EQUAL_INT(WRC_Continue, rc1);113 TEST_ASSERT_EQUAL_INT(WRC_Continue, rc2);114 115 /* Verify list structure and linking invariants */116 TEST_ASSERT_EQUAL_PTR(&w1, s.pWin); /* Head remains first window */117 TEST_ASSERT_NOT_NULL(w1.ppThis);118 TEST_ASSERT_EQUAL_PTR(&s.pWin, w1.ppThis); /* First's ppThis points to head pointer */119 TEST_ASSERT_EQUAL_PTR(&w1, *(w1.ppThis)); /* Deref ppThis yields w1 */120 121 TEST_ASSERT_EQUAL_PTR(&w2, w1.pNextWin); /* Second appended after first */122 TEST_ASSERT_NOT_NULL(w2.ppThis);123 TEST_ASSERT_EQUAL_PTR(&w1.pNextWin, w2.ppThis); /* Second's ppThis points to w1->pNextWin */124 TEST_ASSERT_EQUAL_PTR(&w2, *(w2.ppThis)); /* Deref ppThis yields w2 */125 TEST_ASSERT_NULL(w2.pNextWin); /* Tail terminates */126}127 128/* Test: Function always returns WRC_Continue even across different inputs */129void test_gatherSelectWindowsCallback_always_returns_WRC_Continue(void){130 Select s; Walker w; Expr e; Window win;131 zero_memory(&s, sizeof(s));132 zero_memory(&w, sizeof(w));133 zero_memory(&e, sizeof(e));134 zero_memory(&win, sizeof(win));135 w.u.pSelect = &s;136 137 /* Case 1: Non-function */138 e.op = TK_INTEGER; e.flags = 0; e.y.pWin = NULL;139 int rc = test_gatherSelectWindowsCallback(&w, &e);140 TEST_ASSERT_EQUAL_INT(WRC_Continue, rc);141 142 /* Case 2: Function without EP_WinFunc */143 e.op = TK_FUNCTION; e.flags = 0; e.y.pWin = &win;144 rc = test_gatherSelectWindowsCallback(&w, &e);145 TEST_ASSERT_EQUAL_INT(WRC_Continue, rc);146 147 /* Case 3: Function with EP_WinFunc */148 Select s2; Walker w2; Expr e2; Window win2;149 zero_memory(&s2, sizeof(s2));150 zero_memory(&w2, sizeof(w2));151 zero_memory(&e2, sizeof(e2));152 zero_memory(&win2, sizeof(win2));153 w2.u.pSelect = &s2;154 e2.op = TK_FUNCTION; e2.flags = EP_WinFunc; e2.y.pWin = &win2;155 rc = test_gatherSelectWindowsCallback(&w2, &e2);156 TEST_ASSERT_EQUAL_INT(WRC_Continue, rc);157 TEST_ASSERT_EQUAL_PTR(&win2, s2.pWin);158}159 160int main(void) {161 UNITY_BEGIN();162 RUN_TEST(test_gatherSelectWindowsCallback_noop_when_not_function);163 RUN_TEST(test_gatherSelectWindowsCallback_noop_when_function_without_winflag);164 RUN_TEST(test_gatherSelectWindowsCallback_links_single_window);165 RUN_TEST(test_gatherSelectWindowsCallback_links_multiple_windows_appends);166 RUN_TEST(test_gatherSelectWindowsCallback_always_returns_WRC_Continue);167 return UNITY_END();168}