AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <string.h>4#include <stdlib.h>5#include <stdio.h>6 7/* Unity fixtures */8void setUp(void) {9 /* No-op for these tests */10}11 12void tearDown(void) {13 /* No-op for these tests */14}15 16/* Test: nReg == 1 uses sqlite3GetTempReg and returns from temp stack if available */17void test_sqlite3GetTempRange_nReg1_uses_temp_stack_if_available(void) {18 Parse p;19 memset(&p, 0, sizeof(p));20 p.nMem = 10;21 p.nTempReg = 2;22 /* sqlite3GetTempReg uses pre-decrement, so with nTempReg=2 it returns aTempReg[1] */23 p.aTempReg[0] = 5;24 p.aTempReg[1] = 6;25 26 int r = sqlite3GetTempRange(&p, 1);27 TEST_ASSERT_EQUAL_INT(6, r);28 TEST_ASSERT_EQUAL_INT(1, p.nTempReg);29 TEST_ASSERT_EQUAL_INT(10, p.nMem); /* nMem unchanged when using temp stack */30}31 32/* Test: nReg == 1 when no temp regs available increments nMem and returns nMem */33void test_sqlite3GetTempRange_nReg1_no_temp_regs_increments_nMem(void) {34 Parse p;35 memset(&p, 0, sizeof(p));36 p.nMem = 10;37 p.nTempReg = 0;38 39 int r = sqlite3GetTempRange(&p, 1);40 TEST_ASSERT_EQUAL_INT(11, r);41 TEST_ASSERT_EQUAL_INT(11, p.nMem);42 TEST_ASSERT_EQUAL_INT(0, p.nTempReg);43}44 45/* Test: nReg > 1 allocated entirely from range pool when available */46void test_sqlite3GetTempRange_multi_from_range_pool(void) {47 Parse p;48 memset(&p, 0, sizeof(p));49 p.iRangeReg = 20;50 p.nRangeReg = 10;51 p.nMem = 100;52 53 int r1 = sqlite3GetTempRange(&p, 4);54 TEST_ASSERT_EQUAL_INT(20, r1);55 TEST_ASSERT_EQUAL_INT(24, p.iRangeReg);56 TEST_ASSERT_EQUAL_INT(6, p.nRangeReg);57 TEST_ASSERT_EQUAL_INT(100, p.nMem);58 59 /* Allocate exactly the remainder of the pool */60 int r2 = sqlite3GetTempRange(&p, 6);61 TEST_ASSERT_EQUAL_INT(24, r2);62 TEST_ASSERT_EQUAL_INT(30, p.iRangeReg);63 TEST_ASSERT_EQUAL_INT(0, p.nRangeReg);64 TEST_ASSERT_EQUAL_INT(100, p.nMem);65}66 67/* Test: nReg > nRangeReg allocates from nMem and leaves pool untouched */68void test_sqlite3GetTempRange_multi_exceeds_pool_uses_nMem(void) {69 Parse p;70 memset(&p, 0, sizeof(p));71 p.iRangeReg = 30;72 p.nRangeReg = 3;73 p.nMem = 50;74 75 int r = sqlite3GetTempRange(&p, 5);76 TEST_ASSERT_EQUAL_INT(51, r); /* nMem + 1 */77 TEST_ASSERT_EQUAL_INT(55, p.nMem); /* nMem increased by nReg */78 TEST_ASSERT_EQUAL_INT(30, p.iRangeReg); /* pool untouched */79 TEST_ASSERT_EQUAL_INT(3, p.nRangeReg);80}81 82/* Test: nReg equal to pool size allocates exactly and zeroes pool */83void test_sqlite3GetTempRange_multi_exact_pool_size(void) {84 Parse p;85 memset(&p, 0, sizeof(p));86 p.iRangeReg = 100;87 p.nRangeReg = 4;88 p.nMem = 5;89 90 int r = sqlite3GetTempRange(&p, 4);91 TEST_ASSERT_EQUAL_INT(100, r);92 TEST_ASSERT_EQUAL_INT(104, p.iRangeReg);93 TEST_ASSERT_EQUAL_INT(0, p.nRangeReg);94 TEST_ASSERT_EQUAL_INT(5, p.nMem);95}96 97/* Test: nReg == 0 returns current iRangeReg and does not modify counters */98void test_sqlite3GetTempRange_zero_request_no_changes(void) {99 Parse p;100 memset(&p, 0, sizeof(p));101 p.iRangeReg = 7;102 p.nRangeReg = 9;103 p.nMem = 77;104 105 int r = sqlite3GetTempRange(&p, 0);106 TEST_ASSERT_EQUAL_INT(7, r);107 TEST_ASSERT_EQUAL_INT(7, p.iRangeReg);108 TEST_ASSERT_EQUAL_INT(9, p.nRangeReg);109 TEST_ASSERT_EQUAL_INT(77, p.nMem);110}111 112int main(void) {113 UNITY_BEGIN();114 RUN_TEST(test_sqlite3GetTempRange_nReg1_uses_temp_stack_if_available);115 RUN_TEST(test_sqlite3GetTempRange_nReg1_no_temp_regs_increments_nMem);116 RUN_TEST(test_sqlite3GetTempRange_multi_from_range_pool);117 RUN_TEST(test_sqlite3GetTempRange_multi_exceeds_pool_uses_nMem);118 RUN_TEST(test_sqlite3GetTempRange_multi_exact_pool_size);119 RUN_TEST(test_sqlite3GetTempRange_zero_request_no_changes);120 return UNITY_END();121}