Team Ai
Modelpublic

AryaWu/sqlite

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