|
|
#include "sqliteInt.h" |
|
|
#include "unity.h" |
|
|
#include <string.h> |
|
|
#include <stdlib.h> |
|
|
|
|
|
|
|
|
extern int test_renameTableExprCb(Walker *pWalker, Expr *pExpr); |
|
|
|
|
|
static sqlite3 *gDb = NULL; |
|
|
|
|
|
void setUp(void) { |
|
|
int rc = sqlite3_open(":memory:", &gDb); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
TEST_ASSERT_NOT_NULL(gDb); |
|
|
} |
|
|
|
|
|
void tearDown(void) { |
|
|
if (gDb) { |
|
|
sqlite3_close(gDb); |
|
|
gDb = NULL; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static void initParse(Parse *pParse){ |
|
|
memset(pParse, 0, sizeof(*pParse)); |
|
|
pParse->db = gDb; |
|
|
} |
|
|
|
|
|
|
|
|
static void initWalkerWithRenameCtx(Walker *pWalker, RenameCtx *pCtx, Parse *pParse){ |
|
|
memset(pWalker, 0, sizeof(*pWalker)); |
|
|
memset(pCtx, 0, sizeof(*pCtx)); |
|
|
pWalker->pParse = pParse; |
|
|
pWalker->u.pRename = pCtx; |
|
|
} |
|
|
|
|
|
|
|
|
static void initColumnExprWithTab(Expr *pExpr, Table *pTab){ |
|
|
memset(pExpr, 0, sizeof(*pExpr)); |
|
|
pExpr->op = TK_COLUMN; |
|
|
|
|
|
pExpr->y.pTab = pTab; |
|
|
} |
|
|
|
|
|
|
|
|
void test_renameTableExprCb_returns_continue_for_non_column(void){ |
|
|
Parse sParse; initParse(&sParse); |
|
|
Walker sWalker; RenameCtx sCtx; |
|
|
initWalkerWithRenameCtx(&sWalker, &sCtx, &sParse); |
|
|
|
|
|
Expr sExpr; |
|
|
memset(&sExpr, 0, sizeof(sExpr)); |
|
|
sExpr.op = TK_INTEGER; |
|
|
|
|
|
int rc = test_renameTableExprCb(&sWalker, &sExpr); |
|
|
TEST_ASSERT_EQUAL_INT(WRC_Continue, rc); |
|
|
} |
|
|
|
|
|
|
|
|
void test_renameTableExprCb_no_action_when_table_mismatch(void){ |
|
|
Parse sParse; initParse(&sParse); |
|
|
Walker sWalker; RenameCtx sCtx; |
|
|
initWalkerWithRenameCtx(&sWalker, &sCtx, &sParse); |
|
|
|
|
|
Table tabA, tabB; |
|
|
memset(&tabA, 0, sizeof(tabA)); |
|
|
memset(&tabB, 0, sizeof(tabB)); |
|
|
sCtx.pTab = &tabA; |
|
|
|
|
|
Expr sExpr; |
|
|
initColumnExprWithTab(&sExpr, &tabB); |
|
|
|
|
|
int rc = test_renameTableExprCb(&sWalker, &sExpr); |
|
|
TEST_ASSERT_EQUAL_INT(WRC_Continue, rc); |
|
|
} |
|
|
|
|
|
|
|
|
void test_renameTableExprCb_triggers_on_match(void){ |
|
|
Parse sParse; initParse(&sParse); |
|
|
Walker sWalker; RenameCtx sCtx; |
|
|
initWalkerWithRenameCtx(&sWalker, &sCtx, &sParse); |
|
|
|
|
|
Table tabT; |
|
|
memset(&tabT, 0, sizeof(tabT)); |
|
|
sCtx.pTab = &tabT; |
|
|
|
|
|
Expr sExpr; |
|
|
initColumnExprWithTab(&sExpr, &tabT); |
|
|
|
|
|
int rc = test_renameTableExprCb(&sWalker, &sExpr); |
|
|
TEST_ASSERT_EQUAL_INT(WRC_Continue, rc); |
|
|
} |
|
|
|
|
|
|
|
|
void test_renameTableExprCb_multiple_sequential_calls(void){ |
|
|
Parse sParse; initParse(&sParse); |
|
|
Walker sWalker; RenameCtx sCtx; |
|
|
initWalkerWithRenameCtx(&sWalker, &sCtx, &sParse); |
|
|
|
|
|
Table tab1, tab2; |
|
|
memset(&tab1, 0, sizeof(tab1)); |
|
|
memset(&tab2, 0, sizeof(tab2)); |
|
|
sCtx.pTab = &tab1; |
|
|
|
|
|
Expr e1, e2, e3; |
|
|
|
|
|
memset(&e1, 0, sizeof(e1)); |
|
|
e1.op = TK_NULL; |
|
|
|
|
|
|
|
|
initColumnExprWithTab(&e2, &tab2); |
|
|
|
|
|
|
|
|
initColumnExprWithTab(&e3, &tab1); |
|
|
|
|
|
TEST_ASSERT_EQUAL_INT(WRC_Continue, test_renameTableExprCb(&sWalker, &e1)); |
|
|
TEST_ASSERT_EQUAL_INT(WRC_Continue, test_renameTableExprCb(&sWalker, &e2)); |
|
|
TEST_ASSERT_EQUAL_INT(WRC_Continue, test_renameTableExprCb(&sWalker, &e3)); |
|
|
} |
|
|
|
|
|
int main(void) { |
|
|
UNITY_BEGIN(); |
|
|
RUN_TEST(test_renameTableExprCb_returns_continue_for_non_column); |
|
|
RUN_TEST(test_renameTableExprCb_no_action_when_table_mismatch); |
|
|
RUN_TEST(test_renameTableExprCb_triggers_on_match); |
|
|
RUN_TEST(test_renameTableExprCb_multiple_sequential_calls); |
|
|
return UNITY_END(); |
|
|
} |