AryaWu/sqlite
0
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}