AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3 4#include <stdlib.h>5#include <string.h>6#include <limits.h>7 8/* Helper: open an in-memory database and assert success */9static sqlite3* open_memdb(void){10 sqlite3 *db = NULL;11 int rc = sqlite3_open(":memory:", &db);12 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);13 TEST_ASSERT_NOT_NULL(db);14 return db;15}16 17/* Helper: close database and assert success */18static void close_db(sqlite3 *db){19 int rc = sqlite3_close(db);20 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);21}22 23/* Helper: set last insert rowid and verify via API and internal field */24static void assert_set_and_get(sqlite3 *db, sqlite3_int64 val){25 sqlite3_set_last_insert_rowid(db, val);26 sqlite3_int64 got = sqlite3_last_insert_rowid(db);27 TEST_ASSERT_EQUAL_INT64(val, got);28 29 /* Also check internal field for consistency */30 TEST_ASSERT_EQUAL_INT64(val, db->lastRowid);31}32 33void setUp(void) {34 /* No global setup needed */35}36 37void tearDown(void) {38 /* No global teardown needed */39}40 41/* Basic positive value set/get */42void test_sqlite3_set_last_insert_rowid_basic_positive(void){43 sqlite3 *db = open_memdb();44 assert_set_and_get(db, (sqlite3_int64)12345);45 close_db(db);46}47 48/* Zero and negative values */49void test_sqlite3_set_last_insert_rowid_zero_and_negative(void){50 sqlite3 *db = open_memdb();51 assert_set_and_get(db, (sqlite3_int64)0);52 assert_set_and_get(db, (sqlite3_int64)-1);53 assert_set_and_get(db, (sqlite3_int64)-987654321);54 close_db(db);55}56 57/* Extremes of 64-bit range */58void test_sqlite3_set_last_insert_rowid_extremes(void){59 sqlite3 *db = open_memdb();60 assert_set_and_get(db, (sqlite3_int64)LLONG_MAX);61 assert_set_and_get(db, (sqlite3_int64)LLONG_MIN);62 close_db(db);63}64 65/* Sequential updates overwrite previous value */66void test_sqlite3_set_last_insert_rowid_sequential_updates(void){67 sqlite3 *db = open_memdb();68 69 sqlite3_set_last_insert_rowid(db, (sqlite3_int64)42);70 TEST_ASSERT_EQUAL_INT64((sqlite3_int64)42, sqlite3_last_insert_rowid(db));71 TEST_ASSERT_EQUAL_INT64((sqlite3_int64)42, db->lastRowid);72 73 sqlite3_set_last_insert_rowid(db, (sqlite3_int64)1000000000000LL);74 TEST_ASSERT_EQUAL_INT64((sqlite3_int64)1000000000000LL, sqlite3_last_insert_rowid(db));75 TEST_ASSERT_EQUAL_INT64((sqlite3_int64)1000000000000LL, db->lastRowid);76 77 sqlite3_set_last_insert_rowid(db, (sqlite3_int64)-123456789012345LL);78 TEST_ASSERT_EQUAL_INT64((sqlite3_int64)-123456789012345LL, sqlite3_last_insert_rowid(db));79 TEST_ASSERT_EQUAL_INT64((sqlite3_int64)-123456789012345LL, db->lastRowid);80 81 close_db(db);82}83 84/* Per-connection isolation: setting on one db must not affect another */85void test_sqlite3_set_last_insert_rowid_multiple_connections_isolated(void){86 sqlite3 *db1 = open_memdb();87 sqlite3 *db2 = open_memdb();88 89 sqlite3_set_last_insert_rowid(db1, (sqlite3_int64)777);90 sqlite3_set_last_insert_rowid(db2, (sqlite3_int64)888);91 92 TEST_ASSERT_EQUAL_INT64((sqlite3_int64)777, sqlite3_last_insert_rowid(db1));93 TEST_ASSERT_EQUAL_INT64((sqlite3_int64)888, sqlite3_last_insert_rowid(db2));94 95 TEST_ASSERT_EQUAL_INT64((sqlite3_int64)777, db1->lastRowid);96 TEST_ASSERT_EQUAL_INT64((sqlite3_int64)888, db2->lastRowid);97 98 close_db(db2);99 close_db(db1);100}101 102/* If API armor is enabled, NULL db should be safely ignored (no crash) */103#ifdef SQLITE_ENABLE_API_ARMOR104void test_sqlite3_set_last_insert_rowid_api_armor_null_db(void){105 /* Should not crash or have side effects */106 sqlite3_set_last_insert_rowid(NULL, (sqlite3_int64)123);107 /* If we got here, the call returned safely. */108 TEST_ASSERT_TRUE(1);109}110#endif111 112int main(void) {113 UNITY_BEGIN();114 115 RUN_TEST(test_sqlite3_set_last_insert_rowid_basic_positive);116 RUN_TEST(test_sqlite3_set_last_insert_rowid_zero_and_negative);117 RUN_TEST(test_sqlite3_set_last_insert_rowid_extremes);118 RUN_TEST(test_sqlite3_set_last_insert_rowid_sequential_updates);119 RUN_TEST(test_sqlite3_set_last_insert_rowid_multiple_connections_isolated);120 #ifdef SQLITE_ENABLE_API_ARMOR121 RUN_TEST(test_sqlite3_set_last_insert_rowid_api_armor_null_db);122 #endif123 124 return UNITY_END();125}