AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <string.h>4#include <stdio.h>5 6static sqlite3 *gDb = NULL;7 8void setUp(void) {9 int rc = sqlite3_open(":memory:", &gDb);10 TEST_ASSERT_EQUAL_INT_MESSAGE(SQLITE_OK, rc, "sqlite3_open failed");11 TEST_ASSERT_NOT_NULL(gDb);12}13 14void tearDown(void) {15 if (gDb) {16 int rc = sqlite3_close(gDb);17 TEST_ASSERT_EQUAL_INT_MESSAGE(SQLITE_OK, rc, "sqlite3_close failed");18 gDb = NULL;19 }20}21 22/* Helper to run an ATTACH and assert success */23static void exec_sql_ok(sqlite3 *db, const char *zSql){24 char *zErr = NULL;25 int rc = sqlite3_exec(db, zSql, 0, 0, &zErr);26 if( zErr ){27 /* Provide error context if it fails */28 fprintf(stderr, "SQL error: %s\n", zErr);29 sqlite3_free(zErr);30 }31 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);32}33 34/* Basic: NULL input should return -1 */35void test_sqlite3FindDbName_NULL_returns_minus1(void) {36 int iDb = sqlite3FindDbName(gDb, NULL);37 TEST_ASSERT_EQUAL_INT(-1, iDb);38}39 40/* Empty string should return -1 (no match) */41void test_sqlite3FindDbName_empty_string_returns_minus1(void) {42 int iDb = sqlite3FindDbName(gDb, "");43 TEST_ASSERT_EQUAL_INT(-1, iDb);44}45 46/* Default main db: index 0; case-insensitive */47void test_sqlite3FindDbName_main_default_and_case_insensitive(void) {48 int iDb1 = sqlite3FindDbName(gDb, "main");49 TEST_ASSERT_EQUAL_INT(0, iDb1);50 51 int iDb2 = sqlite3FindDbName(gDb, "MaIn");52 TEST_ASSERT_EQUAL_INT(0, iDb2);53}54 55/* Default temp db: index 1; case-insensitive */56void test_sqlite3FindDbName_temp_default_and_case_insensitive(void) {57 int iDb1 = sqlite3FindDbName(gDb, "temp");58 TEST_ASSERT_EQUAL_INT(1, iDb1);59 60 int iDb2 = sqlite3FindDbName(gDb, "TEMP");61 TEST_ASSERT_EQUAL_INT(1, iDb2);62}63 64/* Unknown name should return -1 */65void test_sqlite3FindDbName_unknown_name_returns_minus1(void) {66 int iDb = sqlite3FindDbName(gDb, "nonexistent_db_name_123");67 TEST_ASSERT_EQUAL_INT(-1, iDb);68}69 70/* After ATTACH, the new db should be found at index nDb-1; case-insensitive name lookup */71void test_sqlite3FindDbName_after_attach_aux(void) {72 int nBefore = gDb->nDb;73 exec_sql_ok(gDb, "ATTACH ':memory:' AS aux;");74 int nAfter = gDb->nDb;75 TEST_ASSERT_EQUAL_INT(nBefore + 1, nAfter);76 77 int idxExpected = nAfter - 1;78 TEST_ASSERT_TRUE(idxExpected >= 2); /* 0=main, 1=temp, so attached starts at >=2 */79 80 /* Verify the attached db short name matches "aux" (case-insensitive) */81 TEST_ASSERT_NOT_NULL(gDb->aDb[idxExpected].zDbSName);82 TEST_ASSERT_EQUAL_INT(0, sqlite3_stricmp(gDb->aDb[idxExpected].zDbSName, "aux"));83 84 /* Function under test should find the same index for both cases */85 int iDbLower = sqlite3FindDbName(gDb, "aux");86 TEST_ASSERT_EQUAL_INT(idxExpected, iDbLower);87 88 int iDbMixed = sqlite3FindDbName(gDb, "AuX");89 TEST_ASSERT_EQUAL_INT(idxExpected, iDbMixed);90 91 /* A similar but different name should not be found */92 int iDbNo = sqlite3FindDbName(gDb, "auxx");93 TEST_ASSERT_EQUAL_INT(-1, iDbNo);94}95 96/* Renaming main via SQLITE_DBCONFIG_MAINDBNAME:97 - The new name should resolve to index 0 (case-insensitive).98 - "main" should still resolve to index 0 (special alias). */99void test_sqlite3FindDbName_main_alias_preserves_main_and_new_name(void) {100 const char *zAlias = "PrimaryDB";101 int rc = sqlite3_db_config(gDb, SQLITE_DBCONFIG_MAINDBNAME, zAlias);102 TEST_ASSERT_EQUAL_INT_MESSAGE(SQLITE_OK, rc, "sqlite3_db_config MAINDBNAME failed");103 104 /* Confirm internal zDbSName updated */105 TEST_ASSERT_NOT_NULL(gDb->aDb[0].zDbSName);106 TEST_ASSERT_EQUAL_INT(0, sqlite3_stricmp(gDb->aDb[0].zDbSName, zAlias));107 108 /* New name resolves to 0 */109 int iDbNew = sqlite3FindDbName(gDb, "PrimaryDB");110 TEST_ASSERT_EQUAL_INT(0, iDbNew);111 int iDbNewCase = sqlite3FindDbName(gDb, "pRiMaRyDb");112 TEST_ASSERT_EQUAL_INT(0, iDbNewCase);113 114 /* "main" remains an acceptable alias (any case) */115 int iDbMain = sqlite3FindDbName(gDb, "main");116 TEST_ASSERT_EQUAL_INT(0, iDbMain);117 int iDbMainCase = sqlite3FindDbName(gDb, "MaIn");118 TEST_ASSERT_EQUAL_INT(0, iDbMainCase);119}120 121int main(void) {122 UNITY_BEGIN();123 124 RUN_TEST(test_sqlite3FindDbName_NULL_returns_minus1);125 RUN_TEST(test_sqlite3FindDbName_empty_string_returns_minus1);126 RUN_TEST(test_sqlite3FindDbName_main_default_and_case_insensitive);127 RUN_TEST(test_sqlite3FindDbName_temp_default_and_case_insensitive);128 RUN_TEST(test_sqlite3FindDbName_unknown_name_returns_minus1);129 RUN_TEST(test_sqlite3FindDbName_after_attach_aux);130 RUN_TEST(test_sqlite3FindDbName_main_alias_preserves_main_and_new_name);131 132 return UNITY_END();133}