AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <string.h>4#include <stdlib.h>5#include <stdio.h>6 7/* Global database handle used for Parse allocations in tests */8static sqlite3 *gdb = NULL;9 10void setUp(void) {11 int rc = sqlite3_open(":memory:", &gdb);12 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);13 TEST_ASSERT_NOT_NULL(gdb);14}15 16void tearDown(void) {17 if (gdb) {18 sqlite3_close(gdb);19 gdb = NULL;20 }21}22 23/* Helper: initialize a Parse object for testing */24static void initParse(Parse *p){25 memset(p, 0, sizeof(*p));26 p->db = gdb;27}28 29/* Helper: free any zErrMsg associated with Parse */30static void cleanupParse(Parse *p){31 if( p && p->zErrMsg ){32 sqlite3DbFree(p->db, p->zErrMsg);33 p->zErrMsg = 0;34 }35}36 37/* Helper: check substring presence */38static void assertContains(const char *haystack, const char *needle){39 TEST_ASSERT_NOT_NULL(haystack);40 TEST_ASSERT_NOT_NULL(needle);41 TEST_ASSERT_NOT_NULL_MESSAGE(strstr(haystack, needle), "Expected substring not found");42}43 44/* Test: NULL list should yield 0 and no error */45void test_sqlite3HasExplicitNulls_null_list(void){46 Parse p;47 initParse(&p);48 49 int rc = sqlite3HasExplicitNulls(&p, NULL);50 TEST_ASSERT_EQUAL_INT(0, rc);51 TEST_ASSERT_EQUAL_INT(0, p.nErr);52 TEST_ASSERT_EQUAL_PTR(NULL, p.zErrMsg);53 54 cleanupParse(&p);55}56 57/* Test: list with no bNulls set yields 0 and no error */58void test_sqlite3HasExplicitNulls_no_flags(void){59 Parse p;60 initParse(&p);61 62 ExprList list;63 memset(&list, 0, sizeof(list));64 struct ExprList_item items[3];65 memset(items, 0, sizeof(items));66 list.a = items;67 list.nExpr = 3;68 69 /* All items have bNulls = 0 by default due to memset */70 int rc = sqlite3HasExplicitNulls(&p, &list);71 TEST_ASSERT_EQUAL_INT(0, rc);72 TEST_ASSERT_EQUAL_INT(0, p.nErr);73 TEST_ASSERT_EQUAL_PTR(NULL, p.zErrMsg);74 75 cleanupParse(&p);76}77 78/* Test: bNulls set with sortFlags==0 -> "FIRST" */79void test_sqlite3HasExplicitNulls_first_when_sortFlags_0(void){80 Parse p;81 initParse(&p);82 83 ExprList list;84 memset(&list, 0, sizeof(list));85 struct ExprList_item items[2];86 memset(items, 0, sizeof(items));87 list.a = items;88 list.nExpr = 2;89 90 items[0].fg.bNulls = 1;91 items[0].fg.sortFlags = (u8)0;92 93 int rc = sqlite3HasExplicitNulls(&p, &list);94 TEST_ASSERT_EQUAL_INT(1, rc);95 TEST_ASSERT_EQUAL_INT(1, p.nErr);96 assertContains(p.zErrMsg, "unsupported use of NULLS FIRST");97 98 cleanupParse(&p);99}100 101/* Test: bNulls set with sortFlags==1 -> "LAST" */102void test_sqlite3HasExplicitNulls_last_when_sortFlags_1(void){103 Parse p;104 initParse(&p);105 106 ExprList list;107 memset(&list, 0, sizeof(list));108 struct ExprList_item items[2];109 memset(items, 0, sizeof(items));110 list.a = items;111 list.nExpr = 2;112 113 items[0].fg.bNulls = 0;114 items[1].fg.bNulls = 1;115 items[1].fg.sortFlags = (u8)1;116 117 int rc = sqlite3HasExplicitNulls(&p, &list);118 TEST_ASSERT_EQUAL_INT(1, rc);119 TEST_ASSERT_EQUAL_INT(1, p.nErr);120 assertContains(p.zErrMsg, "unsupported use of NULLS LAST");121 122 cleanupParse(&p);123}124 125/* Test: bNulls set with sortFlags==3 -> "FIRST" */126void test_sqlite3HasExplicitNulls_first_when_sortFlags_3(void){127 Parse p;128 initParse(&p);129 130 ExprList list;131 memset(&list, 0, sizeof(list));132 struct ExprList_item items[1];133 memset(items, 0, sizeof(items));134 list.a = items;135 list.nExpr = 1;136 137 items[0].fg.bNulls = 1;138 items[0].fg.sortFlags = (u8)3;139 140 int rc = sqlite3HasExplicitNulls(&p, &list);141 TEST_ASSERT_EQUAL_INT(1, rc);142 TEST_ASSERT_EQUAL_INT(1, p.nErr);143 assertContains(p.zErrMsg, "unsupported use of NULLS FIRST");144 145 cleanupParse(&p);146}147 148/* Test: bNulls set with sortFlags==2 -> "LAST" (any non-0-or-3 value) */149void test_sqlite3HasExplicitNulls_last_when_sortFlags_2(void){150 Parse p;151 initParse(&p);152 153 ExprList list;154 memset(&list, 0, sizeof(list));155 struct ExprList_item items[1];156 memset(items, 0, sizeof(items));157 list.a = items;158 list.nExpr = 1;159 160 items[0].fg.bNulls = 1;161 items[0].fg.sortFlags = (u8)2;162 163 int rc = sqlite3HasExplicitNulls(&p, &list);164 TEST_ASSERT_EQUAL_INT(1, rc);165 TEST_ASSERT_EQUAL_INT(1, p.nErr);166 assertContains(p.zErrMsg, "unsupported use of NULLS LAST");167 168 cleanupParse(&p);169}170 171int main(void) {172 UNITY_BEGIN();173 RUN_TEST(test_sqlite3HasExplicitNulls_null_list);174 RUN_TEST(test_sqlite3HasExplicitNulls_no_flags);175 RUN_TEST(test_sqlite3HasExplicitNulls_first_when_sortFlags_0);176 RUN_TEST(test_sqlite3HasExplicitNulls_last_when_sortFlags_1);177 RUN_TEST(test_sqlite3HasExplicitNulls_first_when_sortFlags_3);178 RUN_TEST(test_sqlite3HasExplicitNulls_last_when_sortFlags_2);179 return UNITY_END();180}