|
|
#include "sqliteInt.h" |
|
|
#include "unity.h" |
|
|
#include <string.h> |
|
|
|
|
|
|
|
|
extern void test_renameParseCleanup(Parse *pParse); |
|
|
|
|
|
static void init_parse_with_allocs(sqlite3 *db, Parse *pParse){ |
|
|
memset(pParse, 0, sizeof(*pParse)); |
|
|
pParse->db = db; |
|
|
|
|
|
|
|
|
pParse->pVdbe = sqlite3VdbeCreate(db); |
|
|
|
|
|
|
|
|
pParse->pNewTable = (Table*)sqlite3DbMallocZero(db, sizeof(Table)); |
|
|
|
|
|
|
|
|
Index *pIdx1 = (Index*)sqlite3DbMallocZero(db, sizeof(Index)); |
|
|
Index *pIdx2 = (Index*)sqlite3DbMallocZero(db, sizeof(Index)); |
|
|
if( pIdx1 ) pIdx1->pNext = pIdx2; |
|
|
pParse->pNewIndex = pIdx1; |
|
|
|
|
|
|
|
|
pParse->pNewTrigger = (Trigger*)sqlite3DbMallocZero(db, sizeof(Trigger)); |
|
|
|
|
|
|
|
|
pParse->zErrMsg = sqlite3DbStrDup(db, "unit-test-error"); |
|
|
|
|
|
|
|
|
RenameToken *t1 = (RenameToken*)sqlite3DbMallocZero(db, sizeof(RenameToken)); |
|
|
RenameToken *t2 = (RenameToken*)sqlite3DbMallocZero(db, sizeof(RenameToken)); |
|
|
if( t1 ) t1->pNext = t2; |
|
|
pParse->pRename = t1; |
|
|
} |
|
|
|
|
|
void setUp(void) { |
|
|
|
|
|
} |
|
|
|
|
|
void tearDown(void) { |
|
|
|
|
|
} |
|
|
|
|
|
static void assert_parse_pointers_cleared(Parse *p){ |
|
|
TEST_ASSERT_NULL(p->pVdbe); |
|
|
TEST_ASSERT_NULL(p->pNewTable); |
|
|
TEST_ASSERT_NULL(p->pNewIndex); |
|
|
TEST_ASSERT_NULL(p->pNewTrigger); |
|
|
TEST_ASSERT_NULL(p->zErrMsg); |
|
|
TEST_ASSERT_NULL(p->pRename); |
|
|
} |
|
|
|
|
|
|
|
|
void test_renameParseCleanup_clears_all_fields(void){ |
|
|
sqlite3 *db = 0; |
|
|
int rc = sqlite3_open(":memory:", &db); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
TEST_ASSERT_NOT_NULL(db); |
|
|
|
|
|
Parse p; |
|
|
init_parse_with_allocs(db, &p); |
|
|
|
|
|
test_renameParseCleanup(&p); |
|
|
|
|
|
|
|
|
assert_parse_pointers_cleared(&p); |
|
|
|
|
|
|
|
|
rc = sqlite3_close(db); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
} |
|
|
|
|
|
|
|
|
void test_renameParseCleanup_handles_null_fields(void){ |
|
|
sqlite3 *db = 0; |
|
|
int rc = sqlite3_open(":memory:", &db); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
TEST_ASSERT_NOT_NULL(db); |
|
|
|
|
|
Parse p; |
|
|
memset(&p, 0, sizeof(p)); |
|
|
p.db = db; |
|
|
|
|
|
|
|
|
test_renameParseCleanup(&p); |
|
|
|
|
|
|
|
|
assert_parse_pointers_cleared(&p); |
|
|
|
|
|
rc = sqlite3_close(db); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
} |
|
|
|
|
|
|
|
|
void test_renameParseCleanup_multiple_indexes_and_tokens(void){ |
|
|
sqlite3 *db = 0; |
|
|
int rc = sqlite3_open(":memory:", &db); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
TEST_ASSERT_NOT_NULL(db); |
|
|
|
|
|
Parse p; |
|
|
memset(&p, 0, sizeof(p)); |
|
|
p.db = db; |
|
|
|
|
|
|
|
|
p.pVdbe = sqlite3VdbeCreate(db); |
|
|
|
|
|
|
|
|
Index *i1 = (Index*)sqlite3DbMallocZero(db, sizeof(Index)); |
|
|
Index *i2 = (Index*)sqlite3DbMallocZero(db, sizeof(Index)); |
|
|
Index *i3 = (Index*)sqlite3DbMallocZero(db, sizeof(Index)); |
|
|
if( i1 ) i1->pNext = i2; |
|
|
if( i2 ) i2->pNext = i3; |
|
|
p.pNewIndex = i1; |
|
|
|
|
|
|
|
|
RenameToken *t1 = (RenameToken*)sqlite3DbMallocZero(db, sizeof(RenameToken)); |
|
|
RenameToken *t2 = (RenameToken*)sqlite3DbMallocZero(db, sizeof(RenameToken)); |
|
|
RenameToken *t3 = (RenameToken*)sqlite3DbMallocZero(db, sizeof(RenameToken)); |
|
|
if( t1 ) t1->pNext = t2; |
|
|
if( t2 ) t2->pNext = t3; |
|
|
p.pRename = t1; |
|
|
|
|
|
|
|
|
p.pNewTable = (Table*)sqlite3DbMallocZero(db, sizeof(Table)); |
|
|
p.pNewTrigger = (Trigger*)sqlite3DbMallocZero(db, sizeof(Trigger)); |
|
|
p.zErrMsg = sqlite3DbStrDup(db, "err"); |
|
|
|
|
|
test_renameParseCleanup(&p); |
|
|
|
|
|
|
|
|
assert_parse_pointers_cleared(&p); |
|
|
|
|
|
rc = sqlite3_close(db); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
} |
|
|
|
|
|
|
|
|
void test_renameParseCleanup_idempotent_double_call(void){ |
|
|
sqlite3 *db = 0; |
|
|
int rc = sqlite3_open(":memory:", &db); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
TEST_ASSERT_NOT_NULL(db); |
|
|
|
|
|
Parse p; |
|
|
init_parse_with_allocs(db, &p); |
|
|
|
|
|
|
|
|
test_renameParseCleanup(&p); |
|
|
assert_parse_pointers_cleared(&p); |
|
|
|
|
|
|
|
|
test_renameParseCleanup(&p); |
|
|
assert_parse_pointers_cleared(&p); |
|
|
|
|
|
rc = sqlite3_close(db); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
} |
|
|
|
|
|
int main(void){ |
|
|
UNITY_BEGIN(); |
|
|
RUN_TEST(test_renameParseCleanup_clears_all_fields); |
|
|
RUN_TEST(test_renameParseCleanup_handles_null_fields); |
|
|
RUN_TEST(test_renameParseCleanup_multiple_indexes_and_tokens); |
|
|
RUN_TEST(test_renameParseCleanup_idempotent_double_call); |
|
|
return UNITY_END(); |
|
|
} |