AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <stdlib.h>4#include <string.h>5 6/* Helpers to allocate and initialize internal structs needed by tests */7 8static ExprList* helperAllocExprList(int nExpr){9 ExprList *p = (ExprList*)sqlite3_malloc(sizeof(ExprList));10 TEST_ASSERT_NOT_NULL(p);11 memset(p, 0, sizeof(*p));12 p->nExpr = nExpr;13 return p;14}15 16static Select* helperAllocSelectWithNExpr(int nExpr){17 Select *pS = (Select*)sqlite3_malloc(sizeof(Select));18 TEST_ASSERT_NOT_NULL(pS);19 memset(pS, 0, sizeof(*pS));20 21 ExprList *pEList = helperAllocExprList(nExpr);22 pS->pEList = pEList;23 return pS;24}25 26static Expr* helperAllocExpr(void){27 Expr *p = (Expr*)sqlite3_malloc(sizeof(Expr));28 TEST_ASSERT_NOT_NULL(p);29 memset(p, 0, sizeof(*p));30 return p;31}32 33/* Constructors for the expressions we need */34 35static Expr* makeScalarExpr(int op){36 Expr *p = helperAllocExpr();37 p->op = (u8)op;38 return p;39}40 41static Expr* makeVectorExpr(int nExpr){42 Expr *p = helperAllocExpr();43 p->op = TK_VECTOR;44 p->x.pList = helperAllocExprList(nExpr);45 return p;46}47 48static Expr* makeSelectExpr(int nExpr){49 Expr *p = helperAllocExpr();50 p->op = TK_SELECT;51 p->x.pSelect = helperAllocSelectWithNExpr(nExpr);52 return p;53}54 55static Expr* makeRegisterOfVectorExpr(int nExpr){56 Expr *p = helperAllocExpr();57 p->op = TK_REGISTER;58 p->op2 = TK_VECTOR;59 p->x.pList = helperAllocExprList(nExpr);60 return p;61}62 63static Expr* makeRegisterOfSelectExpr(int nExpr){64 Expr *p = helperAllocExpr();65 p->op = TK_REGISTER;66 p->op2 = TK_SELECT;67 p->x.pSelect = helperAllocSelectWithNExpr(nExpr);68 return p;69}70 71static Expr* makeRegisterOfScalarExpr(int scalarOp){72 Expr *p = helperAllocExpr();73 p->op = TK_REGISTER;74 p->op2 = (u8)scalarOp;75 /* No x.* needed for scalar ops */76 return p;77}78 79/* Deep-free for the minimal allocations performed above */80 81static void helperFreeExpr(Expr *p){82 if( p==NULL ) return;83 u8 op = p->op;84 if( op==TK_REGISTER ) op = p->op2;85 86 if( op==TK_VECTOR ){87 if( p->x.pList ){88 sqlite3_free(p->x.pList);89 p->x.pList = NULL;90 }91 }else if( op==TK_SELECT ){92 if( p->x.pSelect ){93 if( p->x.pSelect->pEList ){94 sqlite3_free(p->x.pSelect->pEList);95 p->x.pSelect->pEList = NULL;96 }97 sqlite3_free(p->x.pSelect);98 p->x.pSelect = NULL;99 }100 }101 sqlite3_free(p);102}103 104/* Unity setup/teardown */105void setUp(void) {106 /* No global setup required */107}108void tearDown(void) {109 /* No global teardown required */110}111 112/* Tests */113 114void test_sqlite3ExprVectorSize_scalar_returns_one(void){115 Expr *p = makeScalarExpr(TK_INTEGER);116 int n = sqlite3ExprVectorSize(p);117 TEST_ASSERT_EQUAL_INT(1, n);118 helperFreeExpr(p);119}120 121void test_sqlite3ExprVectorSize_vector_counts_nexpr_small(void){122 Expr *p = makeVectorExpr(1);123 int n = sqlite3ExprVectorSize(p);124 TEST_ASSERT_EQUAL_INT(1, n);125 helperFreeExpr(p);126}127 128void test_sqlite3ExprVectorSize_vector_counts_nexpr_multi(void){129 Expr *p = makeVectorExpr(3);130 int n = sqlite3ExprVectorSize(p);131 TEST_ASSERT_EQUAL_INT(3, n);132 helperFreeExpr(p);133}134 135void test_sqlite3ExprVectorSize_select_counts_result_columns_single(void){136 Expr *p = makeSelectExpr(1);137 int n = sqlite3ExprVectorSize(p);138 TEST_ASSERT_EQUAL_INT(1, n);139 helperFreeExpr(p);140}141 142void test_sqlite3ExprVectorSize_select_counts_result_columns_multi(void){143 Expr *p = makeSelectExpr(5);144 int n = sqlite3ExprVectorSize(p);145 TEST_ASSERT_EQUAL_INT(5, n);146 helperFreeExpr(p);147}148 149void test_sqlite3ExprVectorSize_register_wrapped_vector(void){150 Expr *p = makeRegisterOfVectorExpr(4);151 int n = sqlite3ExprVectorSize(p);152 TEST_ASSERT_EQUAL_INT(4, n);153 helperFreeExpr(p);154}155 156void test_sqlite3ExprVectorSize_register_wrapped_select(void){157 Expr *p = makeRegisterOfSelectExpr(6);158 int n = sqlite3ExprVectorSize(p);159 TEST_ASSERT_EQUAL_INT(6, n);160 helperFreeExpr(p);161}162 163void test_sqlite3ExprVectorSize_register_wrapped_scalar_returns_one(void){164 Expr *p = makeRegisterOfScalarExpr(TK_INTEGER);165 int n = sqlite3ExprVectorSize(p);166 TEST_ASSERT_EQUAL_INT(1, n);167 helperFreeExpr(p);168}169 170void test_sqlite3ExprVectorSize_large_vector_count(void){171 int N = 100;172 Expr *p = makeVectorExpr(N);173 int n = sqlite3ExprVectorSize(p);174 TEST_ASSERT_EQUAL_INT(N, n);175 helperFreeExpr(p);176}177 178void test_sqlite3ExprVectorSize_large_select_count(void){179 int N = 128;180 Expr *p = makeSelectExpr(N);181 int n = sqlite3ExprVectorSize(p);182 TEST_ASSERT_EQUAL_INT(N, n);183 helperFreeExpr(p);184}185 186/* main */187int main(void){188 UNITY_BEGIN();189 RUN_TEST(test_sqlite3ExprVectorSize_scalar_returns_one);190 RUN_TEST(test_sqlite3ExprVectorSize_vector_counts_nexpr_small);191 RUN_TEST(test_sqlite3ExprVectorSize_vector_counts_nexpr_multi);192 RUN_TEST(test_sqlite3ExprVectorSize_select_counts_result_columns_single);193 RUN_TEST(test_sqlite3ExprVectorSize_select_counts_result_columns_multi);194 RUN_TEST(test_sqlite3ExprVectorSize_register_wrapped_vector);195 RUN_TEST(test_sqlite3ExprVectorSize_register_wrapped_select);196 RUN_TEST(test_sqlite3ExprVectorSize_register_wrapped_scalar_returns_one);197 RUN_TEST(test_sqlite3ExprVectorSize_large_vector_count);198 RUN_TEST(test_sqlite3ExprVectorSize_large_select_count);199 return UNITY_END();200}