| | #include "sqliteInt.h" |
| | #include "unity.h" |
| | #include <string.h> |
| | #include <stdlib.h> |
| | #include <stdio.h> |
| |
|
| | |
| | extern int test_getConstraintToken(const u8 *z, int *piToken); |
| |
|
| | void setUp(void) { |
| | |
| | } |
| |
|
| | void tearDown(void) { |
| | |
| | } |
| |
|
| | |
| | static int idx_of_char(const char *s, char c){ |
| | const char *p = strchr(s, c); |
| | if( !p ) return -1; |
| | return (int)(p - s); |
| | } |
| |
|
| | |
| | static int idx_after_sub(const char *s, const char *sub){ |
| | const char *p = strstr(s, sub); |
| | if( !p ) return -1; |
| | return (int)((p - s) + (int)strlen(sub)); |
| | } |
| |
|
| | |
| | void test_getConstraintToken_simple_identifier(void) { |
| | const char *z = "abc def"; |
| | int t = 0; |
| | int n = test_getConstraintToken((const u8*)z, &t); |
| | TEST_ASSERT_EQUAL_INT(TK_ID, t); |
| | TEST_ASSERT_EQUAL_INT(3, n); |
| | } |
| |
|
| | |
| | void test_getConstraintToken_skips_space_and_comments_before_id(void) { |
| | const char *z = " /* comment */\n-- line comment\nabc def"; |
| | int expected = idx_after_sub(z, "abc"); |
| | TEST_ASSERT_TRUE_MESSAGE(expected > 0, "Did not find 'abc' in test string"); |
| |
|
| | int t = 0; |
| | int n = test_getConstraintToken((const u8*)z, &t); |
| |
|
| | TEST_ASSERT_EQUAL_INT(TK_ID, t); |
| | TEST_ASSERT_EQUAL_INT(expected, n); |
| | } |
| |
|
| | |
| | void test_getConstraintToken_minimal_parentheses(void) { |
| | const char *z = "()X"; |
| | int expected = idx_of_char(z, 'X'); |
| | TEST_ASSERT_TRUE_MESSAGE(expected >= 0, "Sentinel 'X' not found"); |
| |
|
| | int t = 0; |
| | int n = test_getConstraintToken((const u8*)z, &t); |
| |
|
| | TEST_ASSERT_EQUAL_INT(TK_LP, t); |
| | TEST_ASSERT_EQUAL_INT(expected, n); |
| | } |
| |
|
| | |
| | void test_getConstraintToken_parentheses_with_inner_tokens(void) { |
| | const char *z = " (two three)X"; |
| | int expected = idx_of_char(z, 'X'); |
| | TEST_ASSERT_TRUE_MESSAGE(expected >= 0, "Sentinel 'X' not found"); |
| |
|
| | int t = 0; |
| | int n = test_getConstraintToken((const u8*)z, &t); |
| |
|
| | TEST_ASSERT_EQUAL_INT(TK_LP, t); |
| | TEST_ASSERT_EQUAL_INT(expected, n); |
| | } |
| |
|
| | |
| | void test_getConstraintToken_nested_parentheses(void) { |
| | const char *z = "(a(b)c)X"; |
| | int expected = idx_of_char(z, 'X'); |
| | TEST_ASSERT_TRUE_MESSAGE(expected >= 0, "Sentinel 'X' not found"); |
| |
|
| | int t = 0; |
| | int n = test_getConstraintToken((const u8*)z, &t); |
| |
|
| | TEST_ASSERT_EQUAL_INT(TK_LP, t); |
| | TEST_ASSERT_EQUAL_INT(expected, n); |
| | } |
| |
|
| | |
| | void test_getConstraintToken_unclosed_parenthesis_hits_illegal(void) { |
| | const char *z = "(abc"; |
| | int t = 0; |
| | int n = test_getConstraintToken((const u8*)z, &t); |
| |
|
| | TEST_ASSERT_EQUAL_INT(TK_ILLEGAL, t); |
| | |
| | TEST_ASSERT_EQUAL_INT(1, n); |
| | } |
| |
|
| | |
| | void test_getConstraintToken_unterminated_string_inside_parentheses(void) { |
| | const char *z = "('unterminated"; |
| | int t = 0; |
| | int n = test_getConstraintToken((const u8*)z, &t); |
| |
|
| | TEST_ASSERT_EQUAL_INT(TK_ILLEGAL, t); |
| | |
| | TEST_ASSERT_TRUE(n > 1); |
| | TEST_ASSERT_TRUE(n <= (int)strlen(z)); |
| | } |
| |
|
| | |
| | void test_getConstraintToken_keyword_token(void) { |
| | const char *z = "SELECT rest"; |
| | int t = 0; |
| | int n = test_getConstraintToken((const u8*)z, &t); |
| |
|
| | TEST_ASSERT_EQUAL_INT(TK_SELECT, t); |
| | TEST_ASSERT_EQUAL_INT(6, n); |
| | } |
| |
|
| | int main(void) { |
| | UNITY_BEGIN(); |
| |
|
| | RUN_TEST(test_getConstraintToken_simple_identifier); |
| | RUN_TEST(test_getConstraintToken_skips_space_and_comments_before_id); |
| | RUN_TEST(test_getConstraintToken_minimal_parentheses); |
| | RUN_TEST(test_getConstraintToken_parentheses_with_inner_tokens); |
| | RUN_TEST(test_getConstraintToken_nested_parentheses); |
| | RUN_TEST(test_getConstraintToken_unclosed_parenthesis_hits_illegal); |
| | RUN_TEST(test_getConstraintToken_unterminated_string_inside_parentheses); |
| | RUN_TEST(test_getConstraintToken_keyword_token); |
| |
|
| | return UNITY_END(); |
| | } |