AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <string.h>4 5/* External wrapper for the static function under test */6extern int test_matchQuality(FuncDef *p, int nArg, u8 enc);7 8/* Dummy SQL function implementation pointer for xSFunc */9static void dummyStep(sqlite3_context *ctx, int argc, sqlite3_value **argv){10 (void)ctx; (void)argc; (void)argv;11}12 13static void initFuncDef(FuncDef *p, int nArg, u8 enc, int hasSFunc){14 memset(p, 0, sizeof(*p));15 p->nArg = nArg;16 p->funcFlags = enc; /* Only encoding bits are needed for matchQuality */17 p->xSFunc = hasSFunc ? dummyStep : 0;18}19 20void setUp(void) {21 /* No global setup needed */22}23 24void tearDown(void) {25 /* No global teardown needed */26}27 28/* 1) Perfect match: exact nArg and exact encoding -> 6 */29void test_matchQuality_perfect_utf8_exact_nArg(void){30 FuncDef f;31 initFuncDef(&f, 2, SQLITE_UTF8, 1);32 int score = test_matchQuality(&f, 2, SQLITE_UTF8);33 TEST_ASSERT_EQUAL_INT(6, score);34}35 36/* 2) Exact nArg, both UTF16 but different byte-order -> 5 */37void test_matchQuality_utf16_byteorder_change_exact_nArg(void){38 FuncDef f;39 initFuncDef(&f, 5, SQLITE_UTF16BE, 1);40 int score = test_matchQuality(&f, 5, SQLITE_UTF16LE);41 TEST_ASSERT_EQUAL_INT(5, score);42}43 44/* 3) Exact nArg, UTF8 vs UTF16 -> 4 */45void test_matchQuality_utf8_vs_utf16_exact_nArg(void){46 FuncDef f;47 initFuncDef(&f, 1, SQLITE_UTF16LE, 1);48 int score = test_matchQuality(&f, 1, SQLITE_UTF8);49 TEST_ASSERT_EQUAL_INT(4, score);50}51 52/* 4) Varargs function (p->nArg=-1) with specific nArg, exact encoding -> 3 */53void test_matchQuality_varargs_specific_nArg_encoding_match(void){54 FuncDef f;55 initFuncDef(&f, -1, SQLITE_UTF8, 1);56 int score = test_matchQuality(&f, 3, SQLITE_UTF8);57 TEST_ASSERT_EQUAL_INT(3, score);58}59 60/* 5) Varargs function (p->nArg=-1), UTF16 different byte order -> 2 */61void test_matchQuality_varargs_utf16_diffbyteorder(void){62 FuncDef f;63 initFuncDef(&f, -1, SQLITE_UTF16BE, 1);64 int score = test_matchQuality(&f, 7, SQLITE_UTF16LE);65 TEST_ASSERT_EQUAL_INT(2, score);66}67 68/* 6) Wrong argcount (non-varargs) -> 0 */69void test_matchQuality_wrong_argcount_nonvarargs_returns0(void){70 FuncDef f;71 initFuncDef(&f, 2, SQLITE_UTF8, 1);72 int score = test_matchQuality(&f, 3, SQLITE_UTF8);73 TEST_ASSERT_EQUAL_INT(0, score);74}75 76/* 7) p->nArg=-3 (>=1) with insufficient args (0) -> 0 */77void test_matchQuality_neg3_requires_min1_insufficient_returns0(void){78 FuncDef f;79 initFuncDef(&f, -3, SQLITE_UTF8, 1);80 int score = test_matchQuality(&f, 0, SQLITE_UTF8);81 TEST_ASSERT_EQUAL_INT(0, score);82}83 84/* 8) p->nArg=-3 (>=1) with sufficient args -> 1 + encoding bonus (3) */85void test_matchQuality_neg3_requires_min1_satisfied_scores(void){86 FuncDef f;87 initFuncDef(&f, -3, SQLITE_UTF8, 1);88 int score = test_matchQuality(&f, 2, SQLITE_UTF8);89 TEST_ASSERT_EQUAL_INT(3, score);90}91 92/* 9) p->nArg=-4 (>=2) insufficient args (1) -> 0 */93void test_matchQuality_neg4_requires_min2_insufficient_returns0(void){94 FuncDef f;95 initFuncDef(&f, -4, SQLITE_UTF16LE, 1);96 int score = test_matchQuality(&f, 1, SQLITE_UTF16LE);97 TEST_ASSERT_EQUAL_INT(0, score);98}99 100/* 10) p->nArg=-4 (>=2) sufficient args -> 1 + exact encoding bonus (3) */101void test_matchQuality_neg4_requires_min2_satisfied_scores(void){102 FuncDef f;103 initFuncDef(&f, -4, SQLITE_UTF16LE, 1);104 int score = test_matchQuality(&f, 2, SQLITE_UTF16LE);105 TEST_ASSERT_EQUAL_INT(3, score);106}107 108/* 11) Request "any" (nArg=-1) against varargs function with exact encoding -> 6 */109void test_matchQuality_request_any_against_varargs_exact_encoding(void){110 FuncDef f;111 initFuncDef(&f, -1, SQLITE_UTF16BE, 1);112 int score = test_matchQuality(&f, -1, SQLITE_UTF16BE);113 TEST_ASSERT_EQUAL_INT(6, score);114}115 116/* 12) Special search mode nArg=-2 with xSFunc==NULL -> 0 */117void test_matchQuality_nArg_neg2_with_xSFunc_null_returns0(void){118 FuncDef f;119 initFuncDef(&f, 3, SQLITE_UTF8, 0); /* xSFunc NULL */120 int score = test_matchQuality(&f, -2, SQLITE_UTF8);121 TEST_ASSERT_EQUAL_INT(0, score);122}123 124/* 13) Special search mode nArg=-2 with xSFunc!=NULL -> 6 */125void test_matchQuality_nArg_neg2_with_xSFunc_nonnull_returns6(void){126 FuncDef f;127 initFuncDef(&f, -1, SQLITE_UTF16LE, 1); /* xSFunc non-NULL */128 int score = test_matchQuality(&f, -2, SQLITE_UTF8 /* any enc; ignored */);129 TEST_ASSERT_EQUAL_INT(6, score);130}131 132int main(void){133 UNITY_BEGIN();134 RUN_TEST(test_matchQuality_perfect_utf8_exact_nArg);135 RUN_TEST(test_matchQuality_utf16_byteorder_change_exact_nArg);136 RUN_TEST(test_matchQuality_utf8_vs_utf16_exact_nArg);137 RUN_TEST(test_matchQuality_varargs_specific_nArg_encoding_match);138 RUN_TEST(test_matchQuality_varargs_utf16_diffbyteorder);139 RUN_TEST(test_matchQuality_wrong_argcount_nonvarargs_returns0);140 RUN_TEST(test_matchQuality_neg3_requires_min1_insufficient_returns0);141 RUN_TEST(test_matchQuality_neg3_requires_min1_satisfied_scores);142 RUN_TEST(test_matchQuality_neg4_requires_min2_insufficient_returns0);143 RUN_TEST(test_matchQuality_neg4_requires_min2_satisfied_scores);144 RUN_TEST(test_matchQuality_request_any_against_varargs_exact_encoding);145 RUN_TEST(test_matchQuality_nArg_neg2_with_xSFunc_null_returns0);146 RUN_TEST(test_matchQuality_nArg_neg2_with_xSFunc_nonnull_returns6);147 return UNITY_END();148}