Team Ai
Modelpublic

AryaWu/sqlite

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