AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <stdlib.h>4#include <string.h>5 6/* Unity setup/teardown */7void setUp(void) {8 /* No global setup needed */9}10void tearDown(void) {11 /* No global teardown needed */12}13 14/* Helper to zero a Table structure fields we care about */15static void initTable(Table *pTab, Column *aCol, int nCol, int hasVirtual){16 memset(pTab, 0, sizeof(*pTab));17 pTab->nCol = (i16)nCol;18 pTab->aCol = aCol;19#ifndef SQLITE_OMIT_GENERATED_COLUMNS20 if( hasVirtual ){21 pTab->tabFlags |= TF_HasVirtual;22 }23#else24 (void)hasVirtual;25#endif26 /* Compute nNVCol based on COLFLAG_VIRTUAL */27 int i, nNV = 0;28 for(i=0; i<nCol; i++){29 if( (aCol[i].colFlags & COLFLAG_VIRTUAL)==0 ) nNV++;30 }31#ifndef SQLITE_OMIT_GENERATED_COLUMNS32 pTab->nNVCol = (i16)nNV;33#endif34}35 36/* Test: No virtual columns and no TF_HasVirtual flag -> identity mapping. */37void test_sqlite3TableColumnToStorage_noVirtualFlag_identity(void){38 Column cols[5];39 memset(cols, 0, sizeof(cols));40 Table tab;41 initTable(&tab, cols, 5, 0);42 43 TEST_ASSERT_EQUAL_INT(-1, sqlite3TableColumnToStorage(&tab, (i16)-1));44 for(int i=0; i<5; i++){45 TEST_ASSERT_EQUAL_INT(i, sqlite3TableColumnToStorage(&tab, (i16)i));46 }47}48 49/* Test: TF_HasVirtual set but all columns non-virtual -> identity mapping. */50void test_sqlite3TableColumnToStorage_hasVirtualFlag_but_no_virtual_columns_identity(void){51 Column cols[5];52 memset(cols, 0, sizeof(cols)); /* all non-virtual */53 Table tab;54 initTable(&tab, cols, 5, 1);55 56 TEST_ASSERT_EQUAL_INT(-1, sqlite3TableColumnToStorage(&tab, (i16)-1));57 for(int i=0; i<5; i++){58 TEST_ASSERT_EQUAL_INT(i, sqlite3TableColumnToStorage(&tab, (i16)i));59 }60}61 62/* Test: Documented mapping example:63 CREATE TABLE ex(N,S,V,N,S,V,N,S,V);64 inputs: 0 1 2 3 4 5 6 7 865 outputs: 0 1 6 2 3 7 4 5 866*/67void test_sqlite3TableColumnToStorage_document_example(void){68 Column cols[9];69 memset(cols, 0, sizeof(cols));70 /* Mark virtual columns: positions 2,5,8 */71 cols[2].colFlags |= COLFLAG_VIRTUAL;72 cols[5].colFlags |= COLFLAG_VIRTUAL;73 cols[8].colFlags |= COLFLAG_VIRTUAL;74 75 Table tab;76 initTable(&tab, cols, 9, 1);77 78 int expected[9] = {0,1,6,2,3,7,4,5,8};79 for(int i=0; i<9; i++){80 TEST_ASSERT_EQUAL_INT(expected[i],81 sqlite3TableColumnToStorage(&tab, (i16)i));82 }83}84 85/* Test: Leading virtuals: V, V, N -> expect [1,2,0] */86void test_sqlite3TableColumnToStorage_leading_virtuals(void){87 Column cols[3];88 memset(cols, 0, sizeof(cols));89 cols[0].colFlags |= COLFLAG_VIRTUAL;90 cols[1].colFlags |= COLFLAG_VIRTUAL;91 /* cols[2] non-virtual */92 93 Table tab;94 initTable(&tab, cols, 3, 1);95 96 TEST_ASSERT_EQUAL_INT(1, sqlite3TableColumnToStorage(&tab, (i16)0));97 TEST_ASSERT_EQUAL_INT(2, sqlite3TableColumnToStorage(&tab, (i16)1));98 TEST_ASSERT_EQUAL_INT(0, sqlite3TableColumnToStorage(&tab, (i16)2));99}100 101/* Test: All virtual columns: V, V, V -> expect identity [0,1,2] */102void test_sqlite3TableColumnToStorage_all_virtual_identity(void){103 Column cols[3];104 memset(cols, 0, sizeof(cols));105 cols[0].colFlags |= COLFLAG_VIRTUAL;106 cols[1].colFlags |= COLFLAG_VIRTUAL;107 cols[2].colFlags |= COLFLAG_VIRTUAL;108 109 Table tab;110 initTable(&tab, cols, 3, 1);111 112 for(int i=0; i<3; i++){113 TEST_ASSERT_EQUAL_INT(i, sqlite3TableColumnToStorage(&tab, (i16)i));114 }115}116 117/* Test: Mixed pattern N, V, V, N -> expect [0,2,3,1] */118void test_sqlite3TableColumnToStorage_mixed_NVVN(void){119 Column cols[4];120 memset(cols, 0, sizeof(cols));121 /* N at 0 */122 cols[1].colFlags |= COLFLAG_VIRTUAL; /* V */123 cols[2].colFlags |= COLFLAG_VIRTUAL; /* V */124 /* N at 3 */125 126 Table tab;127 initTable(&tab, cols, 4, 1);128 129 int expected[4] = {0,2,3,1};130 for(int i=0; i<4; i++){131 TEST_ASSERT_EQUAL_INT(expected[i],132 sqlite3TableColumnToStorage(&tab, (i16)i));133 }134}135 136/* Test: Negative iCol with TF_HasVirtual set -> returns unchanged (-1) */137void test_sqlite3TableColumnToStorage_negative_iCol_with_virtual_flag(void){138 Column cols[2];139 memset(cols, 0, sizeof(cols));140 cols[1].colFlags |= COLFLAG_VIRTUAL;141 142 Table tab;143 initTable(&tab, cols, 2, 1);144 145 TEST_ASSERT_EQUAL_INT(-1, sqlite3TableColumnToStorage(&tab, (i16)-1));146}147 148/* Main to run Unity tests */149int main(void){150 UNITY_BEGIN();151 RUN_TEST(test_sqlite3TableColumnToStorage_noVirtualFlag_identity);152 RUN_TEST(test_sqlite3TableColumnToStorage_hasVirtualFlag_but_no_virtual_columns_identity);153 RUN_TEST(test_sqlite3TableColumnToStorage_document_example);154 RUN_TEST(test_sqlite3TableColumnToStorage_leading_virtuals);155 RUN_TEST(test_sqlite3TableColumnToStorage_all_virtual_identity);156 RUN_TEST(test_sqlite3TableColumnToStorage_mixed_NVVN);157 RUN_TEST(test_sqlite3TableColumnToStorage_negative_iCol_with_virtual_flag);158 return UNITY_END();159}