Team Ai
Modelpublic

AryaWu/sqlite

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