|
|
#include "../../unity/unity.h" |
|
|
#include <stdio.h> |
|
|
#include <string.h> |
|
|
#include <stdint.h> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int keycmp (struct line const *line1, struct line const *line2, |
|
|
idx_t jf_1, idx_t jf_2); |
|
|
|
|
|
|
|
|
extern bool ignore_case; |
|
|
extern bool hard_LC_COLLATE; |
|
|
|
|
|
static void setup_line_fields(struct line *ln, struct field *fields, idx_t n) |
|
|
{ |
|
|
|
|
|
memset(ln, 0, sizeof(*ln)); |
|
|
ln->fields = fields; |
|
|
ln->nfields = n; |
|
|
ln->nfields_allocated = n; |
|
|
|
|
|
} |
|
|
|
|
|
void setUp(void) { |
|
|
|
|
|
ignore_case = false; |
|
|
hard_LC_COLLATE = false; |
|
|
} |
|
|
|
|
|
void tearDown(void) { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
static void make_field(struct field *f, const char *s, idx_t len) |
|
|
{ |
|
|
f->beg = (char *)s; |
|
|
f->len = len; |
|
|
} |
|
|
|
|
|
void test_keycmp_both_missing(void) |
|
|
{ |
|
|
struct line l1, l2; |
|
|
setup_line_fields(&l1, NULL, 0); |
|
|
setup_line_fields(&l2, NULL, 0); |
|
|
|
|
|
int r = keycmp(&l1, &l2, 0, 0); |
|
|
TEST_ASSERT_EQUAL_INT(0, r); |
|
|
} |
|
|
|
|
|
void test_keycmp_left_missing_right_present(void) |
|
|
{ |
|
|
struct line l1, l2; |
|
|
struct field f2[1]; |
|
|
make_field(&f2[0], "x", (idx_t)1); |
|
|
|
|
|
setup_line_fields(&l1, NULL, 0); |
|
|
setup_line_fields(&l2, f2, 1); |
|
|
|
|
|
int r = keycmp(&l1, &l2, 0, 0); |
|
|
TEST_ASSERT_TRUE(r < 0); |
|
|
} |
|
|
|
|
|
void test_keycmp_left_present_right_missing(void) |
|
|
{ |
|
|
struct line l1, l2; |
|
|
struct field f1[1]; |
|
|
make_field(&f1[0], "x", (idx_t)1); |
|
|
|
|
|
setup_line_fields(&l1, f1, 1); |
|
|
setup_line_fields(&l2, NULL, 0); |
|
|
|
|
|
int r = keycmp(&l1, &l2, 0, 0); |
|
|
TEST_ASSERT_TRUE(r > 0); |
|
|
} |
|
|
|
|
|
void test_keycmp_both_empty_fields(void) |
|
|
{ |
|
|
struct line l1, l2; |
|
|
struct field f1[1], f2[1]; |
|
|
make_field(&f1[0], "", (idx_t)0); |
|
|
make_field(&f2[0], "", (idx_t)0); |
|
|
|
|
|
setup_line_fields(&l1, f1, 1); |
|
|
setup_line_fields(&l2, f2, 1); |
|
|
|
|
|
int r = keycmp(&l1, &l2, 0, 0); |
|
|
TEST_ASSERT_EQUAL_INT(0, r); |
|
|
} |
|
|
|
|
|
void test_keycmp_empty_vs_nonempty(void) |
|
|
{ |
|
|
struct line l1, l2; |
|
|
struct field f1[1], f2[1]; |
|
|
make_field(&f1[0], "", (idx_t)0); |
|
|
make_field(&f2[0], "a", (idx_t)1); |
|
|
|
|
|
setup_line_fields(&l1, f1, 1); |
|
|
setup_line_fields(&l2, f2, 1); |
|
|
|
|
|
int r = keycmp(&l1, &l2, 0, 0); |
|
|
TEST_ASSERT_TRUE(r < 0); |
|
|
} |
|
|
|
|
|
void test_keycmp_memcmp_less(void) |
|
|
{ |
|
|
struct line l1, l2; |
|
|
struct field f1[1], f2[1]; |
|
|
make_field(&f1[0], "abc", (idx_t)3); |
|
|
make_field(&f2[0], "abd", (idx_t)3); |
|
|
|
|
|
setup_line_fields(&l1, f1, 1); |
|
|
setup_line_fields(&l2, f2, 1); |
|
|
|
|
|
ignore_case = false; |
|
|
hard_LC_COLLATE = false; |
|
|
|
|
|
int r = keycmp(&l1, &l2, 0, 0); |
|
|
TEST_ASSERT_TRUE(r < 0); |
|
|
} |
|
|
|
|
|
void test_keycmp_memcmp_greater(void) |
|
|
{ |
|
|
struct line l1, l2; |
|
|
struct field f1[1], f2[1]; |
|
|
make_field(&f1[0], "abd", (idx_t)3); |
|
|
make_field(&f2[0], "abc", (idx_t)3); |
|
|
|
|
|
setup_line_fields(&l1, f1, 1); |
|
|
setup_line_fields(&l2, f2, 1); |
|
|
|
|
|
ignore_case = false; |
|
|
hard_LC_COLLATE = false; |
|
|
|
|
|
int r = keycmp(&l1, &l2, 0, 0); |
|
|
TEST_ASSERT_TRUE(r > 0); |
|
|
} |
|
|
|
|
|
void test_keycmp_len_tiebreak_shorter_less(void) |
|
|
{ |
|
|
struct line l1, l2; |
|
|
struct field f1[1], f2[1]; |
|
|
make_field(&f1[0], "ab", (idx_t)2); |
|
|
make_field(&f2[0], "abc", (idx_t)3); |
|
|
|
|
|
setup_line_fields(&l1, f1, 1); |
|
|
setup_line_fields(&l2, f2, 1); |
|
|
|
|
|
ignore_case = false; |
|
|
hard_LC_COLLATE = false; |
|
|
|
|
|
int r = keycmp(&l1, &l2, 0, 0); |
|
|
TEST_ASSERT_TRUE(r < 0); |
|
|
} |
|
|
|
|
|
void test_keycmp_ignore_case_equal(void) |
|
|
{ |
|
|
struct line l1, l2; |
|
|
struct field f1[1], f2[1]; |
|
|
make_field(&f1[0], "AbC", (idx_t)3); |
|
|
make_field(&f2[0], "aBc", (idx_t)3); |
|
|
|
|
|
setup_line_fields(&l1, f1, 1); |
|
|
setup_line_fields(&l2, f2, 1); |
|
|
|
|
|
ignore_case = true; |
|
|
hard_LC_COLLATE = false; |
|
|
|
|
|
int r = keycmp(&l1, &l2, 0, 0); |
|
|
TEST_ASSERT_EQUAL_INT(0, r); |
|
|
} |
|
|
|
|
|
void test_keycmp_ignore_case_len_tiebreak(void) |
|
|
{ |
|
|
struct line l1, l2; |
|
|
struct field f1[1], f2[1]; |
|
|
make_field(&f1[0], "Ab", (idx_t)2); |
|
|
make_field(&f2[0], "aBc", (idx_t)3); |
|
|
|
|
|
setup_line_fields(&l1, f1, 1); |
|
|
setup_line_fields(&l2, f2, 1); |
|
|
|
|
|
ignore_case = true; |
|
|
hard_LC_COLLATE = false; |
|
|
|
|
|
int r = keycmp(&l1, &l2, 0, 0); |
|
|
TEST_ASSERT_TRUE(r < 0); |
|
|
} |
|
|
|
|
|
void test_keycmp_hard_collate_equal(void) |
|
|
{ |
|
|
struct line l1, l2; |
|
|
struct field f1[1], f2[1]; |
|
|
make_field(&f1[0], "abc", (idx_t)3); |
|
|
make_field(&f2[0], "abc", (idx_t)3); |
|
|
|
|
|
setup_line_fields(&l1, f1, 1); |
|
|
setup_line_fields(&l2, f2, 1); |
|
|
|
|
|
ignore_case = false; |
|
|
hard_LC_COLLATE = true; |
|
|
|
|
|
int r = keycmp(&l1, &l2, 0, 0); |
|
|
TEST_ASSERT_EQUAL_INT(0, r); |
|
|
} |
|
|
|
|
|
void test_keycmp_nonzero_join_field(void) |
|
|
{ |
|
|
struct line l1, l2; |
|
|
struct field f1[2], f2[2]; |
|
|
make_field(&f1[0], "k1", (idx_t)2); |
|
|
make_field(&f1[1], "x", (idx_t)1); |
|
|
make_field(&f2[0], "k2", (idx_t)2); |
|
|
make_field(&f2[1], "x", (idx_t)1); |
|
|
|
|
|
setup_line_fields(&l1, f1, 2); |
|
|
setup_line_fields(&l2, f2, 2); |
|
|
|
|
|
ignore_case = false; |
|
|
hard_LC_COLLATE = false; |
|
|
|
|
|
|
|
|
int r = keycmp(&l1, &l2, 1, 1); |
|
|
TEST_ASSERT_EQUAL_INT(0, r); |
|
|
} |
|
|
|
|
|
int main(void) |
|
|
{ |
|
|
UNITY_BEGIN(); |
|
|
|
|
|
RUN_TEST(test_keycmp_both_missing); |
|
|
RUN_TEST(test_keycmp_left_missing_right_present); |
|
|
RUN_TEST(test_keycmp_left_present_right_missing); |
|
|
RUN_TEST(test_keycmp_both_empty_fields); |
|
|
RUN_TEST(test_keycmp_empty_vs_nonempty); |
|
|
RUN_TEST(test_keycmp_memcmp_less); |
|
|
RUN_TEST(test_keycmp_memcmp_greater); |
|
|
RUN_TEST(test_keycmp_len_tiebreak_shorter_less); |
|
|
RUN_TEST(test_keycmp_ignore_case_equal); |
|
|
RUN_TEST(test_keycmp_ignore_case_len_tiebreak); |
|
|
RUN_TEST(test_keycmp_hard_collate_equal); |
|
|
RUN_TEST(test_keycmp_nonzero_join_field); |
|
|
|
|
|
return UNITY_END(); |
|
|
} |