Team Ai
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 10mo agoView on Hugging Face
0likes
tests_main_sqlite3_limit.c143 linesDownload Raw Back to tests
1#include "sqliteInt.h"2#include "unity.h"3#include <string.h>4 5static sqlite3 *gDb = NULL;6 7void setUp(void) {8  int rc = sqlite3_open(":memory:", &gDb);9  TEST_ASSERT_EQUAL_INT_MESSAGE(SQLITE_OK, rc, "sqlite3_open failed");10  TEST_ASSERT_NOT_NULL(gDb);11}12 13void tearDown(void) {14  if (gDb) {15    int rc = sqlite3_close(gDb);16    TEST_ASSERT_EQUAL_INT_MESSAGE(SQLITE_OK, rc, "sqlite3_close failed");17    gDb = NULL;18  }19}20 21static void copyLimits(int *dst){22  for(int i=0; i<SQLITE_N_LIMIT; i++){23    dst[i] = gDb->aLimit[i];24  }25}26 27void test_sqlite3_limit_invalid_index_negative_returns_minus1_and_no_change(void) {28  int before[SQLITE_N_LIMIT];29  copyLimits(before);30 31  int rc = sqlite3_limit(gDb, -1, 12345);32  TEST_ASSERT_EQUAL_INT(-1, rc);33 34  for(int i=0; i<SQLITE_N_LIMIT; i++){35    TEST_ASSERT_EQUAL_INT_MESSAGE(before[i], gDb->aLimit[i], "aLimit changed on invalid negative index");36  }37}38 39void test_sqlite3_limit_invalid_index_too_large_returns_minus1_and_no_change(void) {40  int before[SQLITE_N_LIMIT];41  copyLimits(before);42 43  int rc = sqlite3_limit(gDb, SQLITE_N_LIMIT, 12345);44  TEST_ASSERT_EQUAL_INT(-1, rc);45 46  for(int i=0; i<SQLITE_N_LIMIT; i++){47    TEST_ASSERT_EQUAL_INT_MESSAGE(before[i], gDb->aLimit[i], "aLimit changed on invalid high index");48  }49}50 51void test_sqlite3_limit_negative_newLimit_returns_old_and_no_change_for_COLUMN(void) {52  int id = SQLITE_LIMIT_COLUMN;53  int old = gDb->aLimit[id];54 55  int ret = sqlite3_limit(gDb, id, -5);56  TEST_ASSERT_EQUAL_INT(old, ret);57  TEST_ASSERT_EQUAL_INT(old, gDb->aLimit[id]);58}59 60void test_sqlite3_limit_LENGTH_negative_newLimit_does_not_apply_minimum(void) {61  int id = SQLITE_LIMIT_LENGTH;62  int old = gDb->aLimit[id];63 64  int ret = sqlite3_limit(gDb, id, -1234);65  TEST_ASSERT_EQUAL_INT(old, ret);66  TEST_ASSERT_EQUAL_INT(old, gDb->aLimit[id]);67}68 69void test_sqlite3_limit_LENGTH_positive_below_minimum_clamps_to_SQLITE_MIN_LENGTH(void) {70  int id = SQLITE_LIMIT_LENGTH;71  int old = gDb->aLimit[id];72 73  int ret = sqlite3_limit(gDb, id, 0); /* Non-negative below minimum */74  TEST_ASSERT_EQUAL_INT(old, ret);75  TEST_ASSERT_EQUAL_INT(SQLITE_MIN_LENGTH, gDb->aLimit[id]);76 77  /* Also verify that asking for an excessively large value clamps to SQLITE_MAX_LENGTH */78  ret = sqlite3_limit(gDb, id, SQLITE_MAX_LENGTH + 1000000);79  TEST_ASSERT_EQUAL_INT(SQLITE_MIN_LENGTH, ret);80  TEST_ASSERT_EQUAL_INT(SQLITE_MAX_LENGTH, gDb->aLimit[id]);81}82 83void test_sqlite3_limit_COLUMN_clamps_to_SQLITE_MAX_COLUMN_and_returns_previous(void) {84  int id = SQLITE_LIMIT_COLUMN;85 86  /* First set to a known value below the hard limit */87  int prev = sqlite3_limit(gDb, id, -1); /* read current without changing */88  int below = (prev > 1) ? (prev - 1) : prev; /* ensure non-negative and <= prev */89  int ret1 = sqlite3_limit(gDb, id, below);90  TEST_ASSERT_EQUAL_INT(prev, ret1);91  TEST_ASSERT_EQUAL_INT(below, gDb->aLimit[id]);92 93  /* Now request above the hard limit; expect clamp to SQLITE_MAX_COLUMN */94  int ret2 = sqlite3_limit(gDb, id, SQLITE_MAX_COLUMN + 999999);95  TEST_ASSERT_EQUAL_INT(below, ret2);96  TEST_ASSERT_EQUAL_INT(SQLITE_MAX_COLUMN, gDb->aLimit[id]);97}98 99void test_sqlite3_limit_only_target_index_changes_VARIABLE_NUMBER(void) {100  int before[SQLITE_N_LIMIT];101  copyLimits(before);102 103  int id = SQLITE_LIMIT_VARIABLE_NUMBER;104  int newVal = 30; /* Well below default hard limit */105  int ret = sqlite3_limit(gDb, id, newVal);106  TEST_ASSERT_EQUAL_INT(before[id], ret);107  TEST_ASSERT_EQUAL_INT(newVal, gDb->aLimit[id]);108 109  for(int i=0; i<SQLITE_N_LIMIT; i++){110    if (i == id) continue;111    TEST_ASSERT_EQUAL_INT_MESSAGE(before[i], gDb->aLimit[i], "Unexpected change to a different limit index");112  }113}114 115void test_sqlite3_limit_returns_previous_value_across_sequence(void) {116  int id = SQLITE_LIMIT_SQL_LENGTH;117 118  int old0 = sqlite3_limit(gDb, id, -1); /* read */119  int target1 = old0 - 10;120  if (target1 < 0) target1 = 0;121 122  int ret1 = sqlite3_limit(gDb, id, target1);123  TEST_ASSERT_EQUAL_INT(old0, ret1);124  TEST_ASSERT_EQUAL_INT(target1, gDb->aLimit[id]);125 126  int target2 = (target1 > 20) ? (target1 - 20) : 0;127  int ret2 = sqlite3_limit(gDb, id, target2);128  TEST_ASSERT_EQUAL_INT(target1, ret2);129  TEST_ASSERT_EQUAL_INT(target2, gDb->aLimit[id]);130}131 132int main(void) {133  UNITY_BEGIN();134  RUN_TEST(test_sqlite3_limit_invalid_index_negative_returns_minus1_and_no_change);135  RUN_TEST(test_sqlite3_limit_invalid_index_too_large_returns_minus1_and_no_change);136  RUN_TEST(test_sqlite3_limit_negative_newLimit_returns_old_and_no_change_for_COLUMN);137  RUN_TEST(test_sqlite3_limit_LENGTH_negative_newLimit_does_not_apply_minimum);138  RUN_TEST(test_sqlite3_limit_LENGTH_positive_below_minimum_clamps_to_SQLITE_MIN_LENGTH);139  RUN_TEST(test_sqlite3_limit_COLUMN_clamps_to_SQLITE_MAX_COLUMN_and_returns_previous);140  RUN_TEST(test_sqlite3_limit_only_target_index_changes_VARIABLE_NUMBER);141  RUN_TEST(test_sqlite3_limit_returns_previous_value_across_sequence);142  return UNITY_END();143}