| #include "sqliteInt.h" |
| #include "unity.h" |
| #include <stdlib.h> |
| #include <string.h> |
|
|
| |
| extern int test_renameResolveTrigger(Parse *pParse); |
|
|
| |
| static void execSQL(sqlite3 *db, const char *sql){ |
| int rc = sqlite3_exec(db, sql, 0, 0, 0); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
| } |
|
|
| static void initParseAndTriggerWithTable(sqlite3 **pDb, Parse *pParse, Trigger **ppTrig, const char *zTable){ |
| sqlite3 *db = 0; |
| int rc = sqlite3_open(":memory:", &db); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
| |
| char sql[256]; |
| sqlite3_snprintf(sizeof(sql), sql, "CREATE TABLE %s(a, b);", zTable); |
| execSQL(db, sql); |
|
|
| memset(pParse, 0, sizeof(*pParse)); |
| pParse->db = db; |
|
|
| Trigger *pTrig = (Trigger*)sqlite3DbMallocZero(db, sizeof(Trigger)); |
| TEST_ASSERT_NOT_NULL(pTrig); |
|
|
| Table *pTab = sqlite3FindTable(db, zTable, "main"); |
| TEST_ASSERT_NOT_NULL(pTab); |
| pTrig->pTabSchema = pTab->pSchema; |
| pTrig->table = sqlite3DbStrDup(db, zTable); |
| TEST_ASSERT_NOT_NULL(pTrig->table); |
| pTrig->op = TK_DELETE; |
| pTrig->pWhen = 0; |
| pTrig->step_list = 0; |
|
|
| pParse->pNewTrigger = pTrig; |
|
|
| *pDb = db; |
| *ppTrig = pTrig; |
| } |
|
|
| static Token makeToken(const char *z){ |
| Token t; |
| t.z = z; |
| t.n = (int)strlen(z); |
| return t; |
| } |
|
|
| void setUp(void) { |
| |
| } |
| void tearDown(void) { |
| |
| } |
|
|
| |
| void test_renameResolveTrigger_basic_ok(void){ |
| sqlite3 *db = 0; |
| Parse sParse; |
| Trigger *pTrig = 0; |
|
|
| initParseAndTriggerWithTable(&db, &sParse, &pTrig, "t1"); |
| |
| pTrig->op = TK_INSERT; |
|
|
| int rc = test_renameResolveTrigger(&sParse); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
| TEST_ASSERT_NOT_NULL(sParse.pTriggerTab); |
| TEST_ASSERT_EQUAL_INT(TK_INSERT, sParse.eTriggerOp); |
|
|
| |
| sqlite3DbFree(db, pTrig->table); |
| sqlite3DbFree(db, pTrig); |
| sqlite3_close(db); |
| } |
|
|
| |
| void test_renameResolveTrigger_when_constant_ok(void){ |
| sqlite3 *db = 0; |
| Parse sParse; |
| Trigger *pTrig = 0; |
|
|
| initParseAndTriggerWithTable(&db, &sParse, &pTrig, "t1"); |
|
|
| |
| Token t1 = makeToken("1"); |
| pTrig->pWhen = sqlite3ExprAlloc(db, TK_INTEGER, &t1, 0); |
| TEST_ASSERT_NOT_NULL(pTrig->pWhen); |
|
|
| int rc = test_renameResolveTrigger(&sParse); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
| |
| sqlite3ExprDelete(db, pTrig->pWhen); |
| sqlite3DbFree(db, pTrig->table); |
| sqlite3DbFree(db, pTrig); |
| sqlite3_close(db); |
| } |
|
|
| |
| void test_renameResolveTrigger_when_bad_column_error(void){ |
| sqlite3 *db = 0; |
| Parse sParse; |
| Trigger *pTrig = 0; |
|
|
| initParseAndTriggerWithTable(&db, &sParse, &pTrig, "t1"); |
|
|
| |
| Token tBad = makeToken("nosuchcol"); |
| pTrig->pWhen = sqlite3ExprAlloc(db, TK_ID, &tBad, 0); |
| TEST_ASSERT_NOT_NULL(pTrig->pWhen); |
|
|
| int rc = test_renameResolveTrigger(&sParse); |
| TEST_ASSERT_NOT_EQUAL_INT(SQLITE_OK, rc); |
|
|
| |
| sqlite3ExprDelete(db, pTrig->pWhen); |
| sqlite3DbFree(db, pTrig->table); |
| sqlite3DbFree(db, pTrig); |
| sqlite3_close(db); |
| } |
|
|
| |
| void test_renameResolveTrigger_step_with_select_ok(void){ |
| sqlite3 *db = 0; |
| Parse sParse; |
| Trigger *pTrig = 0; |
|
|
| initParseAndTriggerWithTable(&db, &sParse, &pTrig, "t1"); |
|
|
| TriggerStep *pStep = (TriggerStep*)sqlite3DbMallocZero(db, sizeof(TriggerStep)); |
| TEST_ASSERT_NOT_NULL(pStep); |
| |
| pStep->pSelect = sqlite3SelectNew(&sParse, 0, 0, 0, 0, 0, 0, 0, 0); |
| TEST_ASSERT_NOT_NULL(pStep->pSelect); |
|
|
| pTrig->step_list = pStep; |
|
|
| int rc = test_renameResolveTrigger(&sParse); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
| |
| sqlite3SelectDelete(db, pStep->pSelect); |
| sqlite3DbFree(db, pStep); |
| sqlite3DbFree(db, pTrig->table); |
| sqlite3DbFree(db, pTrig); |
| sqlite3_close(db); |
| } |
|
|
| |
| void test_renameResolveTrigger_step_with_src_and_where_ok(void){ |
| sqlite3 *db = 0; |
| Parse sParse; |
| Trigger *pTrig = 0; |
|
|
| initParseAndTriggerWithTable(&db, &sParse, &pTrig, "t1"); |
|
|
| TriggerStep *pStep = (TriggerStep*)sqlite3DbMallocZero(db, sizeof(TriggerStep)); |
| TEST_ASSERT_NOT_NULL(pStep); |
|
|
| |
| SrcList *pSrc = (SrcList*)sqlite3DbMallocZero(db, sizeof(SrcList)); |
| TEST_ASSERT_NOT_NULL(pSrc); |
| pSrc->nSrc = 1; |
| pSrc->a[0].zName = sqlite3DbStrDup(db, "t1"); |
| TEST_ASSERT_NOT_NULL(pSrc->a[0].zName); |
| pSrc->a[0].zDatabase = sqlite3DbStrDup(db, "main"); |
| TEST_ASSERT_NOT_NULL(pSrc->a[0].zDatabase); |
|
|
| pStep->pSrc = pSrc; |
|
|
| |
| Token tA = makeToken("a"); |
| pStep->pWhere = sqlite3ExprAlloc(db, TK_ID, &tA, 0); |
| TEST_ASSERT_NOT_NULL(pStep->pWhere); |
|
|
| pTrig->step_list = pStep; |
|
|
| int rc = test_renameResolveTrigger(&sParse); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
| |
| sqlite3ExprDelete(db, pStep->pWhere); |
| sqlite3SrcListDelete(db, pStep->pSrc); |
| sqlite3DbFree(db, pStep); |
| sqlite3DbFree(db, pTrig->table); |
| sqlite3DbFree(db, pTrig); |
| sqlite3_close(db); |
| } |
|
|
| int main(void){ |
| UNITY_BEGIN(); |
| RUN_TEST(test_renameResolveTrigger_basic_ok); |
| RUN_TEST(test_renameResolveTrigger_when_constant_ok); |
| RUN_TEST(test_renameResolveTrigger_when_bad_column_error); |
| RUN_TEST(test_renameResolveTrigger_step_with_select_ok); |
| RUN_TEST(test_renameResolveTrigger_step_with_src_and_where_ok); |
| return UNITY_END(); |
| } |