AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <string.h>4#include <stdio.h>5 6/* Wrapper declaration provided in the module */7extern void test_resolveOutOfRangeError(Parse *pParse, const char *zType, int i, int mx, Expr *pError);8 9static void initParse(Parse *p, sqlite3 *db){10 memset(p, 0, sizeof(*p));11 p->db = db;12}13 14void setUp(void) {15 /* Setup code here, or leave empty */16}17 18void tearDown(void) {19 /* Cleanup code here, or leave empty */20}21 22/* Helper to create and open an in-memory database, assert success */23static sqlite3* openTestDb(void){24 sqlite3 *db = NULL;25 int rc = sqlite3_open(":memory:", &db);26 TEST_ASSERT_EQUAL_INT_MESSAGE(SQLITE_OK, rc, "sqlite3_open failed");27 TEST_ASSERT_NOT_NULL(db);28 return db;29}30 31static void freeParseError(Parse *p){32 if( p && p->zErrMsg ){33 sqlite3DbFree(p->db, p->zErrMsg);34 p->zErrMsg = 0;35 }36}37 38/* Test: Basic ORDER BY out-of-range error with i=1, mx=3, NULL Expr */39void test_resolveOutOfRangeError_order_basic(void){40 sqlite3 *db = openTestDb();41 Parse p; initParse(&p, db);42 43 test_resolveOutOfRangeError(&p, "ORDER", 1, 3, NULL);44 45 TEST_ASSERT_EQUAL_INT(1, p.nErr);46 TEST_ASSERT_NOT_NULL(p.zErrMsg);47 48 /* Check stable substrings */49 TEST_ASSERT_NOT_NULL_MESSAGE(strstr(p.zErrMsg, "ORDER BY term out of range"), p.zErrMsg);50 51 char expectedRange[64];52 sprintf(expectedRange, "between 1 and %d", 3);53 TEST_ASSERT_NOT_NULL_MESSAGE(strstr(p.zErrMsg, expectedRange), p.zErrMsg);54 55 freeParseError(&p);56 sqlite3_close(db);57}58 59/* Test: Basic GROUP BY out-of-range error with i=2, mx=5, non-NULL Expr */60void test_resolveOutOfRangeError_group_basic(void){61 sqlite3 *db = openTestDb();62 Parse p; initParse(&p, db);63 64 Expr e; memset(&e, 0, sizeof(e));65 test_resolveOutOfRangeError(&p, "GROUP", 2, 5, &e);66 67 TEST_ASSERT_EQUAL_INT(1, p.nErr);68 TEST_ASSERT_NOT_NULL(p.zErrMsg);69 70 TEST_ASSERT_NOT_NULL_MESSAGE(strstr(p.zErrMsg, "GROUP BY term out of range"), p.zErrMsg);71 72 char expectedRange[64];73 sprintf(expectedRange, "between 1 and %d", 5);74 TEST_ASSERT_NOT_NULL_MESSAGE(strstr(p.zErrMsg, expectedRange), p.zErrMsg);75 76 freeParseError(&p);77 sqlite3_close(db);78}79 80/* Test: Zero index (i=0) still yields expected "between 1 and mx" */81void test_resolveOutOfRangeError_zero_index(void){82 sqlite3 *db = openTestDb();83 Parse p; initParse(&p, db);84 85 test_resolveOutOfRangeError(&p, "ORDER", 0, 1, NULL);86 87 TEST_ASSERT_EQUAL_INT(1, p.nErr);88 TEST_ASSERT_NOT_NULL(p.zErrMsg);89 90 TEST_ASSERT_NOT_NULL_MESSAGE(strstr(p.zErrMsg, "ORDER BY term out of range"), p.zErrMsg);91 92 char expectedRange[64];93 sprintf(expectedRange, "between 1 and %d", 1);94 TEST_ASSERT_NOT_NULL_MESSAGE(strstr(p.zErrMsg, expectedRange), p.zErrMsg);95 96 freeParseError(&p);97 sqlite3_close(db);98}99 100/* Test: Large i relative to mx; ensure message encodes mx correctly */101void test_resolveOutOfRangeError_large_index_small_mx(void){102 sqlite3 *db = openTestDb();103 Parse p; initParse(&p, db);104 105 test_resolveOutOfRangeError(&p, "ORDER", 10, 2, NULL);106 107 TEST_ASSERT_EQUAL_INT(1, p.nErr);108 TEST_ASSERT_NOT_NULL(p.zErrMsg);109 110 TEST_ASSERT_NOT_NULL_MESSAGE(strstr(p.zErrMsg, "ORDER BY term out of range"), p.zErrMsg);111 112 char expectedRange[64];113 sprintf(expectedRange, "between 1 and %d", 2);114 TEST_ASSERT_NOT_NULL_MESSAGE(strstr(p.zErrMsg, expectedRange), p.zErrMsg);115 116 freeParseError(&p);117 sqlite3_close(db);118}119 120/* Test: Multiple calls on same Parse accumulate errors and replace message */121void test_resolveOutOfRangeError_multiple_calls_accumulate_and_replace(void){122 sqlite3 *db = openTestDb();123 Parse p; initParse(&p, db);124 125 /* First call: ORDER */126 test_resolveOutOfRangeError(&p, "ORDER", 3, 4, NULL);127 TEST_ASSERT_EQUAL_INT(1, p.nErr);128 TEST_ASSERT_NOT_NULL(p.zErrMsg);129 TEST_ASSERT_NOT_NULL_MESSAGE(strstr(p.zErrMsg, "ORDER BY term out of range"), p.zErrMsg);130 freeParseError(&p); /* Free before next call to keep memory tidy */131 132 /* Second call: GROUP, should increment nErr and replace message */133 test_resolveOutOfRangeError(&p, "GROUP", 1, 2, NULL);134 TEST_ASSERT_EQUAL_INT(2, p.nErr);135 TEST_ASSERT_NOT_NULL(p.zErrMsg);136 TEST_ASSERT_NOT_NULL_MESSAGE(strstr(p.zErrMsg, "GROUP BY term out of range"), p.zErrMsg);137 138 char expectedRange[64];139 sprintf(expectedRange, "between 1 and %d", 2);140 TEST_ASSERT_NOT_NULL_MESSAGE(strstr(p.zErrMsg, expectedRange), p.zErrMsg);141 142 freeParseError(&p);143 sqlite3_close(db);144}145 146int main(void){147 UNITY_BEGIN();148 RUN_TEST(test_resolveOutOfRangeError_order_basic);149 RUN_TEST(test_resolveOutOfRangeError_group_basic);150 RUN_TEST(test_resolveOutOfRangeError_zero_index);151 RUN_TEST(test_resolveOutOfRangeError_large_index_small_mx);152 RUN_TEST(test_resolveOutOfRangeError_multiple_calls_accumulate_and_replace);153 return UNITY_END();154}