From a1986751af87422e45fa4d0415664b62c868cd04 Mon Sep 17 00:00:00 2001 From: Kevin Day Date: Mon, 27 Mar 2023 23:42:13 -0500 Subject: [PATCH] Update: Add more f_compare unit tests and minor tweaks to f_compare. --- level_0/f_compare/c/compare.c | 152 ++++++++- level_0/f_compare/c/compare.h | 32 ++ level_0/f_compare/c/private-compare.c | 12 +- level_0/f_compare/data/build/settings-tests | 4 + level_0/f_compare/tests/unit/c/test-compare-.h | 2 +- .../f_compare/tests/unit/c/test-compare-dynamic.h | 6 +- .../tests/unit/c/test-compare-dynamic_partial.c | 300 +++++++++++++++++ .../tests/unit/c/test-compare-dynamic_partial.h | 22 ++ .../unit/c/test-compare-dynamic_partial_dynamic.c | 297 ++++++++++++++++ .../unit/c/test-compare-dynamic_partial_dynamic.h | 22 ++ .../unit/c/test-compare-dynamic_partial_string.c | 300 +++++++++++++++++ .../unit/c/test-compare-dynamic_partial_string.h | 22 ++ .../unit/c/test-compare-dynamic_partial_trim.c | 305 +++++++++++++++++ .../unit/c/test-compare-dynamic_partial_trim.h | 22 ++ .../c/test-compare-dynamic_partial_trim_dynamic.c | 302 +++++++++++++++++ .../c/test-compare-dynamic_partial_trim_dynamic.h | 22 ++ .../c/test-compare-dynamic_partial_trim_string.c | 305 +++++++++++++++++ .../c/test-compare-dynamic_partial_trim_string.h | 22 ++ .../tests/unit/c/test-compare-dynamic_string.h | 6 +- .../tests/unit/c/test-compare-dynamic_trim.c | 373 +++++++++++++++++++++ .../tests/unit/c/test-compare-dynamic_trim.h | 36 ++ .../unit/c/test-compare-dynamic_trim_string.c | 373 +++++++++++++++++++++ .../unit/c/test-compare-dynamic_trim_string.h | 36 ++ .../f_compare/tests/unit/c/test-compare-except.c | 282 ++++++++++++++++ .../f_compare/tests/unit/c/test-compare-except.h | 22 ++ level_0/f_compare/tests/unit/c/test-compare-trim.c | 373 +++++++++++++++++++++ level_0/f_compare/tests/unit/c/test-compare-trim.h | 36 ++ level_0/f_compare/tests/unit/c/test-compare.c | 60 ++-- level_0/f_compare/tests/unit/c/test-compare.h | 19 +- 29 files changed, 3701 insertions(+), 64 deletions(-) create mode 100644 level_0/f_compare/tests/unit/c/test-compare-dynamic_partial.c create mode 100644 level_0/f_compare/tests/unit/c/test-compare-dynamic_partial.h create mode 100644 level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_dynamic.c create mode 100644 level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_dynamic.h create mode 100644 level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_string.c create mode 100644 level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_string.h create mode 100644 level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim.c create mode 100644 level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim.h create mode 100644 level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim_dynamic.c create mode 100644 level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim_dynamic.h create mode 100644 level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim_string.c create mode 100644 level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim_string.h create mode 100644 level_0/f_compare/tests/unit/c/test-compare-dynamic_trim.c create mode 100644 level_0/f_compare/tests/unit/c/test-compare-dynamic_trim.h create mode 100644 level_0/f_compare/tests/unit/c/test-compare-dynamic_trim_string.c create mode 100644 level_0/f_compare/tests/unit/c/test-compare-dynamic_trim_string.h create mode 100644 level_0/f_compare/tests/unit/c/test-compare-except.c create mode 100644 level_0/f_compare/tests/unit/c/test-compare-except.h create mode 100644 level_0/f_compare/tests/unit/c/test-compare-trim.c create mode 100644 level_0/f_compare/tests/unit/c/test-compare-trim.h diff --git a/level_0/f_compare/c/compare.c b/level_0/f_compare/c/compare.c index 5791605..f2918de 100644 --- a/level_0/f_compare/c/compare.c +++ b/level_0/f_compare/c/compare.c @@ -92,84 +92,212 @@ extern "C" { #ifndef _di_f_compare_dynamic_partial_ f_status_t f_compare_dynamic_partial(const f_string_static_t string1, const f_string_static_t string2, const f_string_range_t range1, const f_string_range_t range2) { - return private_f_compare(string1.string, string2.string, range1.start, range2.start, string1.used <= range1.stop ? string1.used : range1.stop + 1, string2.used <= range2.stop ? string2.used : range2.stop + 1); + return private_f_compare( + string1.string, + string2.string, + range1.start, + range2.start, + string1.used <= range1.stop + ? string1.used + : range1.stop + 1, + string2.used <= range2.stop + ? string2.used + : range2.stop + 1 + ); } #endif // _di_f_compare_dynamic_partial_ #ifndef _di_f_compare_dynamic_partial_dynamic_ f_status_t f_compare_dynamic_partial_dynamic(const f_string_static_t string1, const f_string_static_t string2, const f_string_range_t range2) { - return private_f_compare(string1.string, string2.string, 0, range2.start, string1.used, string2.used <= range2.stop ? string2.used : range2.stop + 1); + return private_f_compare( + string1.string, + string2.string, + 0, + range2.start, + string1.used, + string2.used <= range2.stop + ? string2.used + : range2.stop + 1 + ); } #endif // _di_f_compare_dynamic_partial_dynamic_ #ifndef _di_f_compare_dynamic_partial_string_ f_status_t f_compare_dynamic_partial_string(const f_string_t string1, const f_string_static_t string2, const f_array_length_t length1, const f_string_range_t range2) { - return private_f_compare(string1, string2.string, 0, range2.start, length1, string2.used < range2.stop ? string2.used : range2.stop + 1); + return private_f_compare( + string1, + string2.string, + 0, + range2.start, + length1, + string2.used < range2.stop + ? string2.used + : range2.stop + 1 + ); } #endif // _di_f_compare_dynamic_partial_string_ #ifndef _di_f_compare_dynamic_partial_except_ f_status_t f_compare_dynamic_partial_except(const f_string_static_t string1, const f_string_static_t string2, const f_string_range_t range1, const f_string_range_t range2, const f_array_lengths_t except1, const f_array_lengths_t except2) { - return private_f_compare_except(string1.string, string2.string, range1.start, range2.start, string1.used < range1.stop ? string1.used : range1.stop + 1, string2.used <= range2.stop ? string2.used : range2.stop + 1, except1, except2); + return private_f_compare_except( + string1.string, + string2.string, + range1.start, + range2.start, + string1.used < range1.stop + ? string1.used + : range1.stop + 1, + string2.used <= range2.stop + ? string2.used + : range2.stop + 1, + except1, + except2 + ); } #endif // _di_f_compare_dynamic_partial_except_ #ifndef _di_f_compare_dynamic_partial_except_dynamic_ f_status_t f_compare_dynamic_partial_except_dynamic(const f_string_static_t string1, const f_string_static_t string2, const f_string_range_t range2, const f_array_lengths_t except1, const f_array_lengths_t except2) { - return private_f_compare_except(string1.string, string2.string, 0, range2.start, string1.used, string2.used <= range2.stop ? string2.used : range2.stop + 1, except1, except2); + return private_f_compare_except( + string1.string, + string2.string, + 0, + range2.start, + string1.used, + string2.used <= range2.stop + ? string2.used + : range2.stop + 1, + except1, + except2 + ); } #endif // _di_f_compare_dynamic_partial_except_dynamic_ #ifndef _di_f_compare_dynamic_partial_except_string_ f_status_t f_compare_dynamic_partial_except_string(const f_string_t string1, const f_string_static_t string2, const f_array_length_t length1, const f_string_range_t range2, const f_array_lengths_t except1, const f_array_lengths_t except2) { - return private_f_compare_except(string1, string2.string, 0, range2.start, length1, string2.used <= range2.stop ? string2.used : range2.stop + 1, except1, except2); + return private_f_compare_except( + string1, + string2.string, + 0, + range2.start, + length1, + string2.used <= range2.stop + ? string2.used + : range2.stop + 1, + except1, + except2 + ); } #endif // _di_f_compare_dynamic_partial_except_string_ #ifndef _di_f_compare_dynamic_partial_except_trim_ f_status_t f_compare_dynamic_partial_except_trim(const f_string_static_t string1, const f_string_static_t string2, const f_string_range_t range1, const f_string_range_t range2, const f_array_lengths_t except1, const f_array_lengths_t except2) { - return private_f_compare_except_trim(string1.string, string2.string, range1.start, range2.start, string1.used <= range1.stop ? string1.used : range1.stop + 1, string2.used <= range2.stop ? string2.used : range2.stop + 1, except1, except2); + return private_f_compare_except_trim( + string1.string, + string2.string, + range1.start, + range2.start, + string1.used <= range1.stop + ? string1.used + : range1.stop + 1, + string2.used <= range2.stop + ? string2.used + : range2.stop + 1, + except1, + except2 + ); } #endif // _di_f_compare_dynamic_partial_except_trim_ #ifndef _di_f_compare_dynamic_partial_except_trim_dynamic_ f_status_t f_compare_dynamic_partial_except_trim_dynamic(const f_string_static_t string1, const f_string_static_t string2, const f_string_range_t range2, const f_array_lengths_t except1, const f_array_lengths_t except2) { - return private_f_compare_except_trim(string1.string, string2.string, 0, range2.start, string1.used, string2.used <= range2.stop ? string2.used : range2.stop + 1, except1, except2); + return private_f_compare_except_trim( + string1.string, + string2.string, + 0, + range2.start, + string1.used, + string2.used <= range2.stop + ? string2.used + : range2.stop + 1, + except1, + except2 + ); } #endif // _di_f_compare_dynamic_partial_except_trim_dynamic_ #ifndef _di_f_compare_dynamic_partial_except_trim_string_ f_status_t f_compare_dynamic_partial_except_trim_string(const f_string_t string1, const f_string_static_t string2, const f_array_length_t length1, const f_string_range_t range2, const f_array_lengths_t except1, const f_array_lengths_t except2) { - return private_f_compare_except_trim(string1, string2.string, 0, range2.start, length1, string2.used <= range2.stop ? string2.used : range2.stop + 1, except1, except2); + return private_f_compare_except_trim( + string1, + string2.string, + 0, + range2.start, + length1, + string2.used <= range2.stop + ? string2.used + : range2.stop + 1, + except1, + except2 + ); } #endif // _di_f_compare_dynamic_partial_except_trim_string_ #ifndef _di_f_compare_dynamic_partial_trim_ f_status_t f_compare_dynamic_partial_trim(const f_string_static_t string1, const f_string_static_t string2, const f_string_range_t range1, const f_string_range_t range2) { - return private_f_compare_trim(string1.string, string2.string, range1.start, range2.start, string1.used <= range1.stop ? string1.used : range1.stop + 1, string2.used <= range2.stop ? string2.used : range2.stop + 1); + return private_f_compare_trim( + string1.string, + string2.string, + range1.start, + range2.start, + string1.used <= range1.stop + ? string1.used + : range1.stop + 1, + string2.used <= range2.stop + ? string2.used + : range2.stop + 1 + ); } #endif // _di_f_compare_dynamic_partial_trim_ #ifndef _di_f_compare_dynamic_partial_trim_dynamic_ f_status_t f_compare_dynamic_partial_trim_dynamic(const f_string_static_t string1, const f_string_static_t string2, const f_string_range_t range2) { - return private_f_compare_trim(string1.string, string2.string, 0, range2.start, string1.used, string2.used <= range2.stop ? string2.used : range2.stop + 1); + return private_f_compare_trim( + string1.string, + string2.string, + 0, + range2.start, + string1.used, + string2.used <= range2.stop + ? string2.used + : range2.stop + 1 + ); } #endif // _di_f_compare_dynamic_partial_trim_dynamic_ #ifndef _di_f_compare_dynamic_partial_trim_string_ f_status_t f_compare_dynamic_partial_trim_string(const f_string_t string1, const f_string_static_t string2, const f_array_length_t length1, const f_string_range_t range2) { - return private_f_compare_trim(string1, string2.string, 0, range2.start, length1, string2.used <= range2.stop ? string2.used : range2.stop + 1); + return private_f_compare_trim( + string1, + string2.string, + 0, + range2.start, + length1, + string2.used <= range2.stop + ? string2.used + : range2.stop + 1 + ); } #endif // _di_f_compare_dynamic_partial_trim_string_ diff --git a/level_0/f_compare/c/compare.h b/level_0/f_compare/c/compare.h index fc1ed83..6ddf9c0 100644 --- a/level_0/f_compare/c/compare.h +++ b/level_0/f_compare/c/compare.h @@ -697,6 +697,38 @@ extern "C" { #endif // _di_f_compare_dynamic_partial_string_ /** + * Compare two strings, similar to strncmp(), but restricted to the given ranges. + * + * This does not stop on NULL. + * NULL characters are ignored. + * Ignores leading and trailing whitespace. + * + * @param string1 + * String to compare. + * @param string2 + * String to compare. + * @param range1 + * A range within the string1 to restrict the comparison to. + * @param range2 + * A range within the string2 to restrict the comparison to. + * + * @return + * F_equal_to when both strings equal. + * F_equal_to_not when both strings do not equal. + * + * F_parameter (with error bit) if a parameter is invalid. + * + * F_parameter (with error bit) from: f_utf_is_combining(). + * F_parameter (with error bit) from: f_utf_is_whitespace(). + * + * @see f_utf_is_combining() + * @see f_utf_is_whitespace() + */ +#ifndef _di_f_compare_dynamic_partial_trim_ + extern f_status_t f_compare_dynamic_partial_trim(const f_string_static_t string1, const f_string_static_t string2, const f_string_range_t range1, const f_string_range_t range2); +#endif // _di_f_compare_dynamic_partial_trim_ + +/** * Compare two strings, similar to strncmp(), but restricted to the given range for the second string. * * This does not stop on NULL. diff --git a/level_0/f_compare/c/private-compare.c b/level_0/f_compare/c/private-compare.c index a3e9626..32e0bb7 100644 --- a/level_0/f_compare/c/private-compare.c +++ b/level_0/f_compare/c/private-compare.c @@ -72,9 +72,7 @@ extern "C" { continue; } - if (string1[i1] != string2[i2]) { - return F_equal_to_not; - } + if (string1[i1] != string2[i2]) return F_equal_to_not; ++i1; ++i2; @@ -87,9 +85,7 @@ extern "C" { while (e1 < except1.used && except1.array[e1] < i1) ++e1; if (e1 < except1.used && except1.array[e1] == i1) continue; - if (string1[i1] != 0) { - return F_equal_to_not; - } + if (string1[i1]) return F_equal_to_not; } // for for (; i2 < stop2; ++i2) { @@ -98,9 +94,7 @@ extern "C" { while (e2 < except2.used && except2.array[e2] < i2) ++e2; if (e2 < except2.used && except2.array[e2] == i2) continue; - if (string2[i2] != 0) { - return F_equal_to_not; - } + if (string2[i2]) return F_equal_to_not; } // for return F_equal_to; diff --git a/level_0/f_compare/data/build/settings-tests b/level_0/f_compare/data/build/settings-tests index acf4512..bb31db4 100644 --- a/level_0/f_compare/data/build/settings-tests +++ b/level_0/f_compare/data/build/settings-tests @@ -26,7 +26,11 @@ build_libraries -lc -lcmocka build_libraries-individual -lf_memory -lf_string -lf_utf -lf_compare build_sources_program test-compare-.c test-compare-dynamic.c test-compare-dynamic_string.c +build_sources_program test-compare-dynamic_partial.c test-compare-dynamic_partial_dynamic.c test-compare-dynamic_partial_string.c +build_sources_program test-compare-dynamic_partial_trim.c test-compare-dynamic_partial_trim_dynamic.c test-compare-dynamic_partial_trim_string.c +build_sources_program test-compare-trim.c test-compare-dynamic_trim.c test-compare-dynamic_trim_string.c build_sources_program test-compare.c +build_sources_program test-compare-except.c build_script no build_shared yes diff --git a/level_0/f_compare/tests/unit/c/test-compare-.h b/level_0/f_compare/tests/unit/c/test-compare-.h index e4169df..69520b2 100644 --- a/level_0/f_compare/tests/unit/c/test-compare-.h +++ b/level_0/f_compare/tests/unit/c/test-compare-.h @@ -1,7 +1,7 @@ /** * FLL - Level 0 * - * Project: Control Group + * Project: Compare * API Version: 0.7 * Licenses: lgpl-2.1-or-later * diff --git a/level_0/f_compare/tests/unit/c/test-compare-dynamic.h b/level_0/f_compare/tests/unit/c/test-compare-dynamic.h index 58bd223..baeb8d2 100644 --- a/level_0/f_compare/tests/unit/c/test-compare-dynamic.h +++ b/level_0/f_compare/tests/unit/c/test-compare-dynamic.h @@ -1,7 +1,7 @@ /** * FLL - Level 0 * - * Project: Control Group + * Project: Compare * API Version: 0.7 * Licenses: lgpl-2.1-or-later * @@ -10,12 +10,12 @@ #ifndef _TEST__F_compare_dynamic_h #define _TEST__F_compare_dynamic_h -// f_compare_() only returns memory failures. +// f_compare_dynamic() only returns memory failures. /** * Test that function works. * - * @see f_compare() + * @see f_compare_dynamic() */ extern void test__f_compare_dynamic__works(void **state); diff --git a/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial.c b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial.c new file mode 100644 index 0000000..3adbb6a --- /dev/null +++ b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial.c @@ -0,0 +1,300 @@ +#include "test-compare.h" +#include "test-compare-dynamic_partial.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__f_compare_dynamic_partial__works(void **state) { + + const f_string_static_t string_1s[] = { + + // 1. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + + // 2. + macro_f_string_static_t_initialize("xxxyyy", 0, 6), + macro_f_string_static_t_initialize("xxxyyy", 0, 6), + macro_f_string_static_t_initialize("xxxyyy", 0, 6), + macro_f_string_static_t_initialize("xxxyyy", 0, 6), + macro_f_string_static_t_initialize("xxxyyy", 0, 6), + macro_f_string_static_t_initialize("xxxyyy", 0, 6), + macro_f_string_static_t_initialize("xxxyyy", 0, 6), + macro_f_string_static_t_initialize("xxxyyy", 0, 6), + + // 3. + macro_f_string_static_t_initialize("xxx1yyy", 0, 7), + macro_f_string_static_t_initialize("xxx1yyy", 0, 7), + macro_f_string_static_t_initialize("xxx1yyy", 0, 7), + macro_f_string_static_t_initialize("xxx1yyy", 0, 7), + macro_f_string_static_t_initialize("xxx1yyy", 0, 7), + macro_f_string_static_t_initialize("xxx1yyy", 0, 7), + macro_f_string_static_t_initialize("xxx1yyy", 0, 7), + macro_f_string_static_t_initialize("xxx1yyy", 0, 7), + + // 4. + macro_f_string_static_t_initialize("xxxoneyyy", 0, 9), + macro_f_string_static_t_initialize("xxxoneyyy", 0, 9), + macro_f_string_static_t_initialize("xxxoneyyy", 0, 9), + macro_f_string_static_t_initialize("xxxoneyyy", 0, 9), + macro_f_string_static_t_initialize("xxxoneyyy", 0, 9), + macro_f_string_static_t_initialize("xxxoneyyy", 0, 9), + macro_f_string_static_t_initialize("xxxoneyyy", 0, 9), + macro_f_string_static_t_initialize("xxxoneyyy", 0, 9), + + // 5. + macro_f_string_static_t_initialize("xxxOneyyy", 0, 9), + macro_f_string_static_t_initialize("xxxOneyyy", 0, 9), + macro_f_string_static_t_initialize("xxxOneyyy", 0, 9), + macro_f_string_static_t_initialize("xxxOneyyy", 0, 9), + macro_f_string_static_t_initialize("xxxOneyyy", 0, 9), + macro_f_string_static_t_initialize("xxxOneyyy", 0, 9), + macro_f_string_static_t_initialize("xxxOneyyy", 0, 9), + macro_f_string_static_t_initialize("xxxOneyyy", 0, 9), + + // 6. + macro_f_string_static_t_initialize("xxx\0neyyy", 0, 9), + macro_f_string_static_t_initialize("xxx\0neyyy", 0, 9), + macro_f_string_static_t_initialize("xxx\0neyyy", 0, 9), + macro_f_string_static_t_initialize("xxx\0neyyy", 0, 9), + macro_f_string_static_t_initialize("xxx\0neyyy", 0, 9), + macro_f_string_static_t_initialize("xxx\0neyyy", 0, 9), + macro_f_string_static_t_initialize("xxx\0neyyy", 0, 9), + macro_f_string_static_t_initialize("xxx\0neyyy", 0, 9), + + // 7. + macro_f_string_static_t_initialize("xxxo\0neyyy", 0, 10), + macro_f_string_static_t_initialize("xxxo\0neyyy", 0, 10), + macro_f_string_static_t_initialize("xxxo\0neyyy", 0, 10), + macro_f_string_static_t_initialize("xxxo\0neyyy", 0, 10), + macro_f_string_static_t_initialize("xxxo\0neyyy", 0, 10), + macro_f_string_static_t_initialize("xxxo\0neyyy", 0, 10), + macro_f_string_static_t_initialize("xxxo\0neyyy", 0, 10), + macro_f_string_static_t_initialize("xxxo\0neyyy", 0, 10), + + // 8. + macro_f_string_static_t_initialize("xxxone\0yyy", 0, 10), + macro_f_string_static_t_initialize("xxxone\0yyy", 0, 10), + macro_f_string_static_t_initialize("xxxone\0yyy", 0, 10), + macro_f_string_static_t_initialize("xxxone\0yyy", 0, 10), + macro_f_string_static_t_initialize("xxxone\0yyy", 0, 10), + macro_f_string_static_t_initialize("xxxone\0yyy", 0, 10), + macro_f_string_static_t_initialize("xxxone\0yyy", 0, 10), + macro_f_string_static_t_initialize("xxxone\0yyy", 0, 10), + }; + + const f_string_static_t string_2s[] = { + + // 1. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 2. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 3. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 4. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 5. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 6. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 7. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 8. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + }; + + const f_string_range_t range_0 = macro_f_string_range_t_initialize(1, 0); + f_string_range_t range_1 = macro_f_string_range_t_initialize(3, 9); + f_string_range_t range_2 = macro_f_string_range_t_initialize(2, 0); + + const f_status_t expects[] = { + + // 1. + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 2. + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 3. + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 4. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + + // 5. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 6. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + + // 7. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + + // 8. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + }; + + uint8_t i = 0; + f_status_t status = F_none; + + // First eight are against empty strings for first argument. + for (; i < 8; ++i) { + + if (i % 8 == 0) { + status = f_compare_dynamic_partial(string_1s[i], string_2s[i], range_0, range_0); + } + else { + range_2.stop = string_2s[i].used - 1; + + status = f_compare_dynamic_partial(string_1s[i], string_2s[i], range_0, range_2); + } + + assert_int_equal(status, expects[i]); + } // for + + for (; i < 64; ++i) { + + range_1.stop = string_1s[i].used - 4; + + if (i % 8 == 0) { + status = f_compare_dynamic_partial(string_1s[i], string_2s[i], range_1, range_0); + } + else { + range_2.stop = string_2s[i].used - 1; + + status = f_compare_dynamic_partial(string_1s[i], string_2s[i], range_1, range_2); + } + + assert_int_equal(status, expects[i]); + } // for +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial.h b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial.h new file mode 100644 index 0000000..c10b50a --- /dev/null +++ b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial.h @@ -0,0 +1,22 @@ +/** + * FLL - Level 0 + * + * Project: Compare + * API Version: 0.7 + * Licenses: lgpl-2.1-or-later + * + * Test the compare project. + */ +#ifndef _TEST__F_compare_dynamic_partial_h +#define _TEST__F_compare_dynamic_partial_h + +// f_compare_dynamic_partial() only returns memory failures. + +/** + * Test that function works. + * + * @see f_compare_dynamic_partial() + */ +extern void test__f_compare_dynamic_partial__works(void **state); + +#endif // _TEST__F_compare_dynamic_partial_h diff --git a/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_dynamic.c b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_dynamic.c new file mode 100644 index 0000000..4408085 --- /dev/null +++ b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_dynamic.c @@ -0,0 +1,297 @@ +#include "test-compare.h" +#include "test-compare-dynamic_partial_dynamic.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__f_compare_dynamic_partial_dynamic__works(void **state) { + + const f_string_static_t string_1s[] = { + + // 1. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + + // 2. + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + + // 3. + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + + // 4. + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + + // 5. + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + + // 6. + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + + // 7. + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + + // 8. + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + }; + + const f_string_static_t string_2s[] = { + + // 1. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 2. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 3. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 4. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 5. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 6. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 7. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 8. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + }; + + const f_string_range_t range_0 = macro_f_string_range_t_initialize(1, 0); + f_string_range_t range_2 = macro_f_string_range_t_initialize(2, 0); + + const f_status_t expects[] = { + + // 1. + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 2. + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 3. + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 4. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + + // 5. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 6. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + + // 7. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + + // 8. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + }; + + uint8_t i = 0; + f_status_t status = F_none; + + // First eight are against empty strings for first argument. + for (; i < 8; ++i) { + + if (i % 8 == 0) { + status = f_compare_dynamic_partial_dynamic(string_1s[i], string_2s[i], range_0); + } + else { + range_2.stop = string_2s[i].used - 1; + + status = f_compare_dynamic_partial_dynamic(string_1s[i], string_2s[i], range_2); + } + + assert_int_equal(status, expects[i]); + } // for + + for (; i < 64; ++i) { + + if (i % 8 == 0) { + status = f_compare_dynamic_partial_dynamic(string_1s[i], string_2s[i], range_0); + } + else { + range_2.stop = string_2s[i].used - 1; + + status = f_compare_dynamic_partial_dynamic(string_1s[i], string_2s[i], range_2); + } + + assert_int_equal(status, expects[i]); + } // for +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_dynamic.h b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_dynamic.h new file mode 100644 index 0000000..fc9109a --- /dev/null +++ b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_dynamic.h @@ -0,0 +1,22 @@ +/** + * FLL - Level 0 + * + * Project: Compare + * API Version: 0.7 + * Licenses: lgpl-2.1-or-later + * + * Test the compare project. + */ +#ifndef _TEST__F_compare_dynamic_partial_dynamic_h +#define _TEST__F_compare_dynamic_partial_dynamic_h + +// f_compare_dynamic_partial_dynamic() only returns memory failures. + +/** + * Test that function works. + * + * @see f_compare_dynamic_partial_dynamic() + */ +extern void test__f_compare_dynamic_partial_dynamic__works(void **state); + +#endif // _TEST__F_compare_dynamic_partial_dynamic_h diff --git a/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_string.c b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_string.c new file mode 100644 index 0000000..13e6fbf --- /dev/null +++ b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_string.c @@ -0,0 +1,300 @@ +#include "test-compare.h" +#include "test-compare-dynamic_partial_string.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__f_compare_dynamic_partial_string__works(void **state) { + + const f_string_static_t string_1s[] = { + + // 1. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + + // 2. + macro_f_string_static_t_initialize("xxx", 0, 3), + macro_f_string_static_t_initialize("xxx", 0, 3), + macro_f_string_static_t_initialize("xxx", 0, 3), + macro_f_string_static_t_initialize("xxx", 0, 3), + macro_f_string_static_t_initialize("xxx", 0, 3), + macro_f_string_static_t_initialize("xxx", 0, 3), + macro_f_string_static_t_initialize("xxx", 0, 3), + macro_f_string_static_t_initialize("xxx", 0, 3), + + // 3. + macro_f_string_static_t_initialize("xxx1", 0, 4), + macro_f_string_static_t_initialize("xxx1", 0, 4), + macro_f_string_static_t_initialize("xxx1", 0, 4), + macro_f_string_static_t_initialize("xxx1", 0, 4), + macro_f_string_static_t_initialize("xxx1", 0, 4), + macro_f_string_static_t_initialize("xxx1", 0, 4), + macro_f_string_static_t_initialize("xxx1", 0, 4), + macro_f_string_static_t_initialize("xxx1", 0, 4), + + // 4. + macro_f_string_static_t_initialize("xxxone", 0, 6), + macro_f_string_static_t_initialize("xxxone", 0, 6), + macro_f_string_static_t_initialize("xxxone", 0, 6), + macro_f_string_static_t_initialize("xxxone", 0, 6), + macro_f_string_static_t_initialize("xxxone", 0, 6), + macro_f_string_static_t_initialize("xxxone", 0, 6), + macro_f_string_static_t_initialize("xxxone", 0, 6), + macro_f_string_static_t_initialize("xxxone", 0, 6), + + // 5. + macro_f_string_static_t_initialize("xxxOne", 0, 6), + macro_f_string_static_t_initialize("xxxOne", 0, 6), + macro_f_string_static_t_initialize("xxxOne", 0, 6), + macro_f_string_static_t_initialize("xxxOne", 0, 6), + macro_f_string_static_t_initialize("xxxOne", 0, 6), + macro_f_string_static_t_initialize("xxxOne", 0, 6), + macro_f_string_static_t_initialize("xxxOne", 0, 6), + macro_f_string_static_t_initialize("xxxOne", 0, 6), + + // 6. + macro_f_string_static_t_initialize("xxx\0ne", 0, 6), + macro_f_string_static_t_initialize("xxx\0ne", 0, 6), + macro_f_string_static_t_initialize("xxx\0ne", 0, 6), + macro_f_string_static_t_initialize("xxx\0ne", 0, 6), + macro_f_string_static_t_initialize("xxx\0ne", 0, 6), + macro_f_string_static_t_initialize("xxx\0ne", 0, 6), + macro_f_string_static_t_initialize("xxx\0ne", 0, 6), + macro_f_string_static_t_initialize("xxx\0ne", 0, 6), + + // 7. + macro_f_string_static_t_initialize("xxxo\0ne", 0, 7), + macro_f_string_static_t_initialize("xxxo\0ne", 0, 7), + macro_f_string_static_t_initialize("xxxo\0ne", 0, 7), + macro_f_string_static_t_initialize("xxxo\0ne", 0, 7), + macro_f_string_static_t_initialize("xxxo\0ne", 0, 7), + macro_f_string_static_t_initialize("xxxo\0ne", 0, 7), + macro_f_string_static_t_initialize("xxxo\0ne", 0, 7), + macro_f_string_static_t_initialize("xxxo\0ne", 0, 7), + + // 8. + macro_f_string_static_t_initialize("xxxone\0", 0, 7), + macro_f_string_static_t_initialize("xxxone\0", 0, 7), + macro_f_string_static_t_initialize("xxxone\0", 0, 7), + macro_f_string_static_t_initialize("xxxone\0", 0, 7), + macro_f_string_static_t_initialize("xxxone\0", 0, 7), + macro_f_string_static_t_initialize("xxxone\0", 0, 7), + macro_f_string_static_t_initialize("xxxone\0", 0, 7), + macro_f_string_static_t_initialize("xxxone\0", 0, 7), + }; + + const f_string_static_t string_2s[] = { + + // 1. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 2. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 3. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 4. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 5. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 6. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 7. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 8. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + }; + + const f_string_range_t range_0 = macro_f_string_range_t_initialize(1, 0); + f_string_range_t range_1 = macro_f_string_range_t_initialize(3, 9); + f_string_range_t range_2 = macro_f_string_range_t_initialize(2, 0); + + const f_status_t expects[] = { + + // 1. + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 2. + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 3. + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 4. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + + // 5. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 6. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + + // 7. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + + // 8. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + }; + + uint8_t i = 0; + f_status_t status = F_none; + + // First eight are against empty strings for first argument. + for (; i < 8; ++i) { + + if (i % 8 == 0) { + status = f_compare_dynamic_partial_string(string_1s[i].string, string_2s[i], 0, range_0); + } + else { + range_2.stop = string_2s[i].used - 1; + + status = f_compare_dynamic_partial_string(string_1s[i].string, string_2s[i], 0, range_2); + } + + assert_int_equal(status, expects[i]); + } // for + + for (; i < 64; ++i) { + + range_1.stop = string_1s[i].used - 1; + + if (i % 8 == 0) { + status = f_compare_dynamic_partial_string(string_1s[i].string + range_1.start, string_2s[i], (range_1.stop - range_1.start) + 1, range_0); + } + else { + range_2.stop = string_2s[i].used - 1; + + status = f_compare_dynamic_partial_string(string_1s[i].string + range_1.start, string_2s[i], (range_1.stop - range_1.start) + 1, range_2); + } + + assert_int_equal(status, expects[i]); + } // for +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_string.h b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_string.h new file mode 100644 index 0000000..4d548cf --- /dev/null +++ b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_string.h @@ -0,0 +1,22 @@ +/** + * FLL - Level 0 + * + * Project: Compare + * API Version: 0.7 + * Licenses: lgpl-2.1-or-later + * + * Test the compare project. + */ +#ifndef _TEST__F_compare_dynamic_partial_string_h +#define _TEST__F_compare_dynamic_partial_string_h + +// f_compare_dynamic_partial_string() only returns memory failures. + +/** + * Test that function works. + * + * @see f_compare_dynamic_partial_string() + */ +extern void test__f_compare_dynamic_partial_string__works(void **state); + +#endif // _TEST__F_compare_dynamic_partial_string_h diff --git a/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim.c b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim.c new file mode 100644 index 0000000..3fbb063 --- /dev/null +++ b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim.c @@ -0,0 +1,305 @@ +#include "test-compare.h" +#include "test-compare-dynamic_partial.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__f_compare_dynamic_partial_trim__works(void **state) { + + // A necessary work-around to to have "\01" with the "\0" being separate from the "1". + f_char_t null_before_one[] = { + 'x', 'x', 'x', '\0', '1', 'y', 'y', 'y' + }; + + const f_string_static_t string_1s[] = { + + // 1. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + + // 2. + macro_f_string_static_t_initialize("xxx yyy", 0, 7), + macro_f_string_static_t_initialize("xxx\tyyy", 0, 7), + macro_f_string_static_t_initialize("xxx\0yyy", 0, 7), + macro_f_string_static_t_initialize("xxx yyy", 0, 10), + macro_f_string_static_t_initialize("xxx \t yyy", 0, 10), + macro_f_string_static_t_initialize("xxx\0 \0\tyyy", 0, 10), + macro_f_string_static_t_initialize("xxx\0 \0yyy", 0, 9), + macro_f_string_static_t_initialize("xxx\0\0\tyyy", 0, 9), + + // 3. + macro_f_string_static_t_initialize("xxx 1yyy", 0, 8), + macro_f_string_static_t_initialize("xxx\t1yyy", 0, 8), + macro_f_string_static_t_initialize(null_before_one, 0, 8), + macro_f_string_static_t_initialize("xxx 1 yyy", 0, 11), + macro_f_string_static_t_initialize("xxx 1\t yyy", 0, 11), + macro_f_string_static_t_initialize("xxx\01 \0\tyyy", 0, 11), + macro_f_string_static_t_initialize("xxx\0 \01yyy", 0, 10), + macro_f_string_static_t_initialize("xxx1\0\0\tyyy", 0, 10), + + // 4. + macro_f_string_static_t_initialize("xxx oneyyy", 0, 10), + macro_f_string_static_t_initialize("xxx\toneyyy", 0, 10), + macro_f_string_static_t_initialize("xxx\0oneyyy", 0, 10), + macro_f_string_static_t_initialize("xxx one yyy", 0, 13), + macro_f_string_static_t_initialize("xxx one\t yyy", 0, 13), + macro_f_string_static_t_initialize("xxx\0one \0\tyyy", 0, 13), + macro_f_string_static_t_initialize("xxx\0 \0oneyyy", 0, 12), + macro_f_string_static_t_initialize("xxxone\0\0\tyyy", 0, 12), + + // 5. + macro_f_string_static_t_initialize("xxx Oneyyy", 0, 10), + macro_f_string_static_t_initialize("xxx\tOneyyy", 0, 10), + macro_f_string_static_t_initialize("xxx\0Oneyyy", 0, 10), + macro_f_string_static_t_initialize("xxx One yyy", 0, 13), + macro_f_string_static_t_initialize("xxx One\t yyy", 0, 13), + macro_f_string_static_t_initialize("xxx\0One \0\tyyy", 0, 13), + macro_f_string_static_t_initialize("xxx\0 \0Oneyyy", 0, 12), + macro_f_string_static_t_initialize("xxxOne\0\0\tyyy", 0, 12), + + // 6. + macro_f_string_static_t_initialize("xxx \0neyyy", 0, 10), + macro_f_string_static_t_initialize("xxx\t\0neyyy", 0, 10), + macro_f_string_static_t_initialize("xxx\0\0neyyy", 0, 10), + macro_f_string_static_t_initialize("xxx \0ne yyy", 0, 13), + macro_f_string_static_t_initialize("xxx \0ne\t yyy", 0, 13), + macro_f_string_static_t_initialize("xxx\0\0ne \0\tyyy", 0, 13), + macro_f_string_static_t_initialize("xxx\0 \0\0neyyy", 0, 12), + macro_f_string_static_t_initialize("xxx\0ne\0\0\tyyy", 0, 12), + + // 7. + macro_f_string_static_t_initialize("xxx o\0neyyy", 0, 11), + macro_f_string_static_t_initialize("xxx\to\0neyyy", 0, 11), + macro_f_string_static_t_initialize("xxx\0o\0neyyy", 0, 11), + macro_f_string_static_t_initialize("xxx o\0ne yyy", 0, 14), + macro_f_string_static_t_initialize("xxx o\0ne\t yyy", 0, 14), + macro_f_string_static_t_initialize("xxx\0o\0ne \0\tyyy", 0, 14), + macro_f_string_static_t_initialize("xxx\0 \0o\0neyyy", 0, 13), + macro_f_string_static_t_initialize("xxxo\0ne\0\0\tyyy", 0, 13), + + // 8. + macro_f_string_static_t_initialize("xxx one\0yyy", 0, 11), + macro_f_string_static_t_initialize("xxx\tone\0yyy", 0, 11), + macro_f_string_static_t_initialize("xxx\0one\0yyy", 0, 11), + macro_f_string_static_t_initialize("xxx one\0 yyy", 0, 14), + macro_f_string_static_t_initialize("xxx one\0\t yyy", 0, 14), + macro_f_string_static_t_initialize("xxx\0one\0 \0\tyyy", 0, 14), + macro_f_string_static_t_initialize("xxx\0 \0one\0yyy", 0, 13), + macro_f_string_static_t_initialize("xxxone\0\0\0\tyyy", 0, 13), + }; + + const f_string_static_t string_2s[] = { + + // 1. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 2. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 3. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 4. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 5. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 6. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 7. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 8. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + }; + + const f_string_range_t range_0 = macro_f_string_range_t_initialize(1, 0); + f_string_range_t range_1 = macro_f_string_range_t_initialize(3, 9); + f_string_range_t range_2 = macro_f_string_range_t_initialize(2, 0); + + const f_status_t expects[] = { + + // 1. + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 2. + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 3. + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 4. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + + // 5. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 6. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + + // 7. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + + // 8. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + }; + + uint8_t i = 0; + f_status_t status = F_none; + + // First eight are against empty strings for first argument. + for (; i < 8; ++i) { + + if (i % 8 == 0) { + status = f_compare_dynamic_partial_trim(string_1s[i], string_2s[i], range_0, range_0); + } + else { + range_2.stop = string_2s[i].used - 1; + + status = f_compare_dynamic_partial_trim(string_1s[i], string_2s[i], range_0, range_2); + } + + assert_int_equal(status, expects[i]); + } // for + + for (; i < 64; ++i) { + + range_1.stop = string_1s[i].used - 4; + + if (i % 8 == 0) { + status = f_compare_dynamic_partial_trim(string_1s[i], string_2s[i], range_1, range_0); + } + else { + range_2.stop = string_2s[i].used - 1; + + status = f_compare_dynamic_partial_trim(string_1s[i], string_2s[i], range_1, range_2); + } + + assert_int_equal(status, expects[i]); + } // for +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim.h b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim.h new file mode 100644 index 0000000..2d314dc --- /dev/null +++ b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim.h @@ -0,0 +1,22 @@ +/** + * FLL - Level 0 + * + * Project: Compare + * API Version: 0.7 + * Licenses: lgpl-2.1-or-later + * + * Test the compare project. + */ +#ifndef _TEST__F_compare_dynamic_partial_trim_h +#define _TEST__F_compare_dynamic_partial_trim_h + +// f_compare_dynamic_partial_trim() only returns memory failures. + +/** + * Test that function works. + * + * @see f_compare_dynamic_partial_trim() + */ +extern void test__f_compare_dynamic_partial_trim__works(void **state); + +#endif // _TEST__F_compare_dynamic_partial_trim_h diff --git a/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim_dynamic.c b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim_dynamic.c new file mode 100644 index 0000000..44c753e --- /dev/null +++ b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim_dynamic.c @@ -0,0 +1,302 @@ +#include "test-compare.h" +#include "test-compare-dynamic_partial_dynamic.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__f_compare_dynamic_partial_trim_dynamic__works(void **state) { + + // A necessary work-around to to have "\01" with the "\0" being separate from the "1". + f_char_t null_before_one[] = { + '\0', '1' + }; + + const f_string_static_t string_1s[] = { + + // 1. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + + // 2. + macro_f_string_static_t_initialize(" ", 0, 1), + macro_f_string_static_t_initialize("\t", 0, 1), + macro_f_string_static_t_initialize("\0", 0, 1), + macro_f_string_static_t_initialize(" ", 0, 4), + macro_f_string_static_t_initialize(" \t ", 0, 4), + macro_f_string_static_t_initialize("\0 \0\t", 0, 4), + macro_f_string_static_t_initialize("\0 \0", 0, 3), + macro_f_string_static_t_initialize("\0\0\t", 0, 3), + + // 3. + macro_f_string_static_t_initialize(" 1", 0, 2), + macro_f_string_static_t_initialize("\t1", 0, 2), + macro_f_string_static_t_initialize(null_before_one, 0, 2), + macro_f_string_static_t_initialize(" 1 ", 0, 5), + macro_f_string_static_t_initialize(" 1\t ", 0, 5), + macro_f_string_static_t_initialize("\01 \0\t", 0, 5), + macro_f_string_static_t_initialize("\0 \01", 0, 4), + macro_f_string_static_t_initialize("1\0\0\t", 0, 4), + + // 4. + macro_f_string_static_t_initialize(" one", 0, 4), + macro_f_string_static_t_initialize("\tone", 0, 4), + macro_f_string_static_t_initialize("\0one", 0, 4), + macro_f_string_static_t_initialize(" one ", 0, 7), + macro_f_string_static_t_initialize(" one\t ", 0, 7), + macro_f_string_static_t_initialize("\0one \0\t", 0, 7), + macro_f_string_static_t_initialize("\0 \0one", 0, 6), + macro_f_string_static_t_initialize("one\0\0\t", 0, 6), + + // 5. + macro_f_string_static_t_initialize(" One", 0, 4), + macro_f_string_static_t_initialize("\tOne", 0, 4), + macro_f_string_static_t_initialize("\0One", 0, 4), + macro_f_string_static_t_initialize(" One ", 0, 7), + macro_f_string_static_t_initialize(" One\t ", 0, 7), + macro_f_string_static_t_initialize("\0One \0\t", 0, 7), + macro_f_string_static_t_initialize("\0 \0One", 0, 6), + macro_f_string_static_t_initialize("One\0\0\t", 0, 6), + + // 6. + macro_f_string_static_t_initialize(" \0ne", 0, 4), + macro_f_string_static_t_initialize("\t\0ne", 0, 4), + macro_f_string_static_t_initialize("\0\0ne", 0, 4), + macro_f_string_static_t_initialize(" \0ne ", 0, 7), + macro_f_string_static_t_initialize(" \0ne\t ", 0, 7), + macro_f_string_static_t_initialize("\0\0ne \0\t", 0, 7), + macro_f_string_static_t_initialize("\0 \0\0ne", 0, 6), + macro_f_string_static_t_initialize("\0ne\0\0\t", 0, 6), + + // 7. + macro_f_string_static_t_initialize(" o\0ne", 0, 5), + macro_f_string_static_t_initialize("\to\0ne", 0, 5), + macro_f_string_static_t_initialize("\0o\0ne", 0, 5), + macro_f_string_static_t_initialize(" o\0ne ", 0, 8), + macro_f_string_static_t_initialize(" o\0ne\t ", 0, 8), + macro_f_string_static_t_initialize("\0o\0ne \0\t", 0, 8), + macro_f_string_static_t_initialize("\0 \0o\0ne", 0, 7), + macro_f_string_static_t_initialize("o\0ne\0\0\t", 0, 7), + + // 8. + macro_f_string_static_t_initialize(" one\0", 0, 5), + macro_f_string_static_t_initialize("\tone\0", 0, 5), + macro_f_string_static_t_initialize("\0one\0", 0, 5), + macro_f_string_static_t_initialize(" one\0 ", 0, 8), + macro_f_string_static_t_initialize(" one\0\t ", 0, 8), + macro_f_string_static_t_initialize("\0one\0 \0\t", 0, 8), + macro_f_string_static_t_initialize("\0 \0one\0", 0, 7), + macro_f_string_static_t_initialize("one\0\0\0\t", 0, 7), + }; + + const f_string_static_t string_2s[] = { + + // 1. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 2. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 3. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 4. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 5. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 6. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 7. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 8. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + }; + + const f_string_range_t range_0 = macro_f_string_range_t_initialize(1, 0); + f_string_range_t range_2 = macro_f_string_range_t_initialize(2, 0); + + const f_status_t expects[] = { + + // 1. + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 2. + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 3. + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 4. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + + // 5. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 6. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + + // 7. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + + // 8. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + }; + + uint8_t i = 0; + f_status_t status = F_none; + + // First eight are against empty strings for first argument. + for (; i < 8; ++i) { + + if (i % 8 == 0) { + status = f_compare_dynamic_partial_trim_dynamic(string_1s[i], string_2s[i], range_0); + } + else { + range_2.stop = string_2s[i].used - 1; + + status = f_compare_dynamic_partial_trim_dynamic(string_1s[i], string_2s[i], range_2); + } + + assert_int_equal(status, expects[i]); + } // for + + for (; i < 64; ++i) { + + if (i % 8 == 0) { + status = f_compare_dynamic_partial_trim_dynamic(string_1s[i], string_2s[i], range_0); + } + else { + range_2.stop = string_2s[i].used - 1; + + status = f_compare_dynamic_partial_trim_dynamic(string_1s[i], string_2s[i], range_2); + } + + assert_int_equal(status, expects[i]); + } // for +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim_dynamic.h b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim_dynamic.h new file mode 100644 index 0000000..4c0d080 --- /dev/null +++ b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim_dynamic.h @@ -0,0 +1,22 @@ +/** + * FLL - Level 0 + * + * Project: Compare + * API Version: 0.7 + * Licenses: lgpl-2.1-or-later + * + * Test the compare project. + */ +#ifndef _TEST__F_compare_dynamic_partial_trim_dynamic_h +#define _TEST__F_compare_dynamic_partial_trim_dynamic_h + +// f_compare_dynamic_partial_trim_dynamic() only returns memory failures. + +/** + * Test that function works. + * + * @see f_compare_dynamic_partial_trim_dynamic() + */ +extern void test__f_compare_dynamic_partial_trim_dynamic__works(void **state); + +#endif // _TEST__F_compare_dynamic_partial_trim_dynamic_h diff --git a/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim_string.c b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim_string.c new file mode 100644 index 0000000..a162c82 --- /dev/null +++ b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim_string.c @@ -0,0 +1,305 @@ +#include "test-compare.h" +#include "test-compare-dynamic_partial_string.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__f_compare_dynamic_partial_trim_string__works(void **state) { + + // A necessary work-around to to have "\01" with the "\0" being separate from the "1". + f_char_t null_before_one[] = { + 'x', 'x', 'x', '\0', '1' + }; + + const f_string_static_t string_1s[] = { + + // 1. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + + // 2. + macro_f_string_static_t_initialize("xxx ", 0, 4), + macro_f_string_static_t_initialize("xxx\t", 0, 4), + macro_f_string_static_t_initialize("xxx\0", 0, 4), + macro_f_string_static_t_initialize("xxx ", 0, 7), + macro_f_string_static_t_initialize("xxx \t ", 0, 7), + macro_f_string_static_t_initialize("xxx\0 \0\t", 0, 7), + macro_f_string_static_t_initialize("xxx\0 \0", 0, 6), + macro_f_string_static_t_initialize("xxx\0\0\t", 0, 6), + + // 3. + macro_f_string_static_t_initialize("xxx 1", 0, 5), + macro_f_string_static_t_initialize("xxx\t1", 0, 5), + macro_f_string_static_t_initialize(null_before_one, 0, 5), + macro_f_string_static_t_initialize("xxx 1 ", 0, 8), + macro_f_string_static_t_initialize("xxx 1\t ", 0, 8), + macro_f_string_static_t_initialize("xxx\01 \0\t", 0, 8), + macro_f_string_static_t_initialize("xxx\0 \01", 0, 7), + macro_f_string_static_t_initialize("xxx1\0\0\t", 0, 7), + + // 4. + macro_f_string_static_t_initialize("xxx one", 0, 7), + macro_f_string_static_t_initialize("xxx\tone", 0, 7), + macro_f_string_static_t_initialize("xxx\0one", 0, 7), + macro_f_string_static_t_initialize("xxx one ", 0, 10), + macro_f_string_static_t_initialize("xxx one\t ", 0, 10), + macro_f_string_static_t_initialize("xxx\0one \0\t", 0, 10), + macro_f_string_static_t_initialize("xxx\0 \0one", 0, 9), + macro_f_string_static_t_initialize("xxxone\0\0\t", 0, 9), + + // 5. + macro_f_string_static_t_initialize("xxx One", 0, 7), + macro_f_string_static_t_initialize("xxx\tOne", 0, 7), + macro_f_string_static_t_initialize("xxx\0One", 0, 7), + macro_f_string_static_t_initialize("xxx One ", 0, 10), + macro_f_string_static_t_initialize("xxx One\t ", 0, 10), + macro_f_string_static_t_initialize("xxx\0One \0\t", 0, 10), + macro_f_string_static_t_initialize("xxx\0 \0One", 0, 9), + macro_f_string_static_t_initialize("xxxOne\0\0\t", 0, 9), + + // 6. + macro_f_string_static_t_initialize("xxx \0ne", 0, 7), + macro_f_string_static_t_initialize("xxx\t\0ne", 0, 7), + macro_f_string_static_t_initialize("xxx\0\0ne", 0, 7), + macro_f_string_static_t_initialize("xxx \0ne ", 0, 10), + macro_f_string_static_t_initialize("xxx \0ne\t ", 0, 10), + macro_f_string_static_t_initialize("xxx\0\0ne \0\t", 0, 10), + macro_f_string_static_t_initialize("xxx\0 \0\0ne", 0, 9), + macro_f_string_static_t_initialize("xxx\0ne\0\0\t", 0, 9), + + // 7. + macro_f_string_static_t_initialize("xxx o\0ne", 0, 8), + macro_f_string_static_t_initialize("xxx\to\0ne", 0, 8), + macro_f_string_static_t_initialize("xxx\0o\0ne", 0, 8), + macro_f_string_static_t_initialize("xxx o\0ne ", 0, 11), + macro_f_string_static_t_initialize("xxx o\0ne\t ", 0, 11), + macro_f_string_static_t_initialize("xxx\0o\0ne \0\t", 0, 11), + macro_f_string_static_t_initialize("xxx\0 \0o\0ne", 0, 10), + macro_f_string_static_t_initialize("xxxo\0ne\0\0\t", 0, 10), + + // 8. + macro_f_string_static_t_initialize("xxx one\0", 0, 8), + macro_f_string_static_t_initialize("xxx\tone\0", 0, 8), + macro_f_string_static_t_initialize("xxx\0one\0", 0, 8), + macro_f_string_static_t_initialize("xxx one\0 ", 0, 11), + macro_f_string_static_t_initialize("xxx one\0\t ", 0, 11), + macro_f_string_static_t_initialize("xxx\0one\0 \0\t", 0, 11), + macro_f_string_static_t_initialize("xxx\0 \0one\0", 0, 10), + macro_f_string_static_t_initialize("xxxone\0\0\0\t", 0, 10), + }; + + const f_string_static_t string_2s[] = { + + // 1. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 2. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 3. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 4. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 5. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 6. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 7. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + + // 8. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("aa", 0, 2), + macro_f_string_static_t_initialize("aa1", 0, 3), + macro_f_string_static_t_initialize("aaone", 0, 5), + macro_f_string_static_t_initialize("aaOne", 0, 5), + macro_f_string_static_t_initialize("aa\0ne", 0, 5), + macro_f_string_static_t_initialize("aao\0ne", 0, 6), + macro_f_string_static_t_initialize("aaone\0", 0, 6), + }; + + const f_string_range_t range_0 = macro_f_string_range_t_initialize(1, 0); + f_string_range_t range_1 = macro_f_string_range_t_initialize(3, 9); + f_string_range_t range_2 = macro_f_string_range_t_initialize(2, 0); + + const f_status_t expects[] = { + + // 1. + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 2. + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 3. + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 4. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + + // 5. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 6. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + + // 7. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + + // 8. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + }; + + uint8_t i = 0; + f_status_t status = F_none; + + // First eight are against empty strings for first argument. + for (; i < 8; ++i) { + + if (i % 8 == 0) { + status = f_compare_dynamic_partial_trim_string(string_1s[i].string, string_2s[i], 0, range_0); + } + else { + range_2.stop = string_2s[i].used - 1; + + status = f_compare_dynamic_partial_trim_string(string_1s[i].string, string_2s[i], 0, range_2); + } + + assert_int_equal(status, expects[i]); + } // for + + for (; i < 64; ++i) { + + range_1.stop = string_1s[i].used - 1; + + if (i % 8 == 0) { + status = f_compare_dynamic_partial_trim_string(string_1s[i].string + range_1.start, string_2s[i], (range_1.stop - range_1.start) + 1, range_0); + } + else { + range_2.stop = string_2s[i].used - 1; + + status = f_compare_dynamic_partial_trim_string(string_1s[i].string + range_1.start, string_2s[i], (range_1.stop - range_1.start) + 1, range_2); + } + + assert_int_equal(status, expects[i]); + } // for +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim_string.h b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim_string.h new file mode 100644 index 0000000..127a25b --- /dev/null +++ b/level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim_string.h @@ -0,0 +1,22 @@ +/** + * FLL - Level 0 + * + * Project: Compare + * API Version: 0.7 + * Licenses: lgpl-2.1-or-later + * + * Test the compare project. + */ +#ifndef _TEST__F_compare_dynamic_partial_trim_string_h +#define _TEST__F_compare_dynamic_partial_trim_string_h + +// f_compare_dynamic_partial_trim_string() only returns memory failures. + +/** + * Test that function works. + * + * @see f_compare_dynamic_partial_trim_string() + */ +extern void test__f_compare_dynamic_partial_trim_string__works(void **state); + +#endif // _TEST__F_compare_dynamic_partial_trim_string_h diff --git a/level_0/f_compare/tests/unit/c/test-compare-dynamic_string.h b/level_0/f_compare/tests/unit/c/test-compare-dynamic_string.h index f711961..59891bf 100644 --- a/level_0/f_compare/tests/unit/c/test-compare-dynamic_string.h +++ b/level_0/f_compare/tests/unit/c/test-compare-dynamic_string.h @@ -1,7 +1,7 @@ /** * FLL - Level 0 * - * Project: Control Group + * Project: Compare * API Version: 0.7 * Licenses: lgpl-2.1-or-later * @@ -10,12 +10,12 @@ #ifndef _TEST__F_compare_dynamic_string_h #define _TEST__F_compare_dynamic_string_h -// f_compare_() only returns memory failures. +// f_compare_dynamic_string() only returns memory failures. /** * Test that function works. * - * @see f_compare() + * @see f_compare_dynamic_string() */ extern void test__f_compare_dynamic_string__works(void **state); diff --git a/level_0/f_compare/tests/unit/c/test-compare-dynamic_trim.c b/level_0/f_compare/tests/unit/c/test-compare-dynamic_trim.c new file mode 100644 index 0000000..7b945e6 --- /dev/null +++ b/level_0/f_compare/tests/unit/c/test-compare-dynamic_trim.c @@ -0,0 +1,373 @@ +#include "test-compare.h" +#include "test-compare-dynamic_trim.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__f_compare_dynamic_trim__trims(void **state) { + + const f_string_static_t string_1s[] = { + macro_f_string_static_t_initialize(" ", 0, 1), + macro_f_string_static_t_initialize("\t", 0, 1), + macro_f_string_static_t_initialize(" \0\t", 0, 3), + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize(" space", 0, 6), + macro_f_string_static_t_initialize("space ", 0, 6), + macro_f_string_static_t_initialize(" space ", 0, 7), + macro_f_string_static_t_initialize(" \t space \t ", 0, 11), + macro_f_string_static_t_initialize("space space", 0, 11), + macro_f_string_static_t_initialize(" space\tspace ", 0, 13), + macro_f_string_static_t_initialize("\t\0\tspace\t\0 space \0 ", 0, 19), + macro_f_string_static_t_initialize(" space\tspace ", 0, 13), + macro_f_string_static_t_initialize("\t\0\tspace\t\0 space \0 ", 0, 19), + }; + + const f_string_static_t string_2s[] = { + f_string_empty_s, + f_string_empty_s, + f_string_empty_s, + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize("space space", 0, 11), + macro_f_string_static_t_initialize("space\tspace", 0, 11), + macro_f_string_static_t_initialize("space\t\0 space", 0, 13), + macro_f_string_static_t_initialize("space space", 0, 11), + macro_f_string_static_t_initialize("space space", 0, 11), + }; + + const f_status_t expects[] = { + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + }; + + uint8_t i = 0; + + for (; i < 13; ++i) { + + const f_status_t status = f_compare_dynamic_trim(string_1s[i], string_2s[i]); + + assert_int_equal(status, expects[i]); + } // for + + for (i = 0; i < 13; ++i) { + + const f_status_t status = f_compare_dynamic_trim(string_2s[i], string_1s[i]); + + assert_int_equal(status, expects[i]); + } // for + + for (i = 0; i < 10; ++i) { + + const f_status_t status = f_compare_dynamic_trim(string_1s[i], string_1s[i]); + + assert_int_equal(status, F_equal_to); + } // for + + for (i = 0; i < 10; ++i) { + + const f_status_t status = f_compare_dynamic_trim(string_2s[i], string_2s[i]); + + assert_int_equal(status, F_equal_to); + } // for +} + +void test__f_compare_dynamic_trim__something_misses_nothing(void **state) { + + const f_string_static_t string_1s[] = { + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize(" space", 0, 6), + macro_f_string_static_t_initialize("space ", 0, 6), + macro_f_string_static_t_initialize(" space ", 0, 7), + macro_f_string_static_t_initialize(" \t space \t ", 0, 11), + macro_f_string_static_t_initialize("space space", 0, 11), + macro_f_string_static_t_initialize(" space\tspace ", 0, 11), + macro_f_string_static_t_initialize("\t\0\tspace\t\0 space \0 ", 0, 19), + macro_f_string_static_t_initialize(" space\tspace ", 0, 11), + macro_f_string_static_t_initialize("\t\0\tspace\t\0 space \0 ", 0, 19), + }; + + for (uint8_t i = 0; i < 10; ++i) { + + const f_status_t status = f_compare_dynamic_trim(string_1s[i], f_string_empty_s); + + assert_int_equal(status, F_equal_to_not); + } // for +} + +void test__f_compare_dynamic_trim__works(void **state) { + + const f_string_static_t string_1s[] = { + + // 1. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + + // 2. + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + + // 3. + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + + // 4. + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + + // 5. + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + + // 6. + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + + // 7. + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + + // 8. + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + }; + + const f_string_static_t string_2s[] = { + + // 1. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 2. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 3. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 4. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 5. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 6. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 7. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 8. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + }; + + const f_status_t expects[] = { + + // 1. + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 2. + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 3. + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 4. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + + // 5. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 6. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + + // 7. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + + // 8. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + }; + + for (uint8_t i = 0; i < 64; ++i) { + + const f_status_t status = f_compare_dynamic_trim(string_1s[i], string_2s[i]); + + assert_int_equal(status, expects[i]); + } // for +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_0/f_compare/tests/unit/c/test-compare-dynamic_trim.h b/level_0/f_compare/tests/unit/c/test-compare-dynamic_trim.h new file mode 100644 index 0000000..932bc00 --- /dev/null +++ b/level_0/f_compare/tests/unit/c/test-compare-dynamic_trim.h @@ -0,0 +1,36 @@ +/** + * FLL - Level 0 + * + * Project: Compare + * API Version: 0.7 + * Licenses: lgpl-2.1-or-later + * + * Test the compare project. + */ +#ifndef _TEST__F_compare_dynamic_trim_h +#define _TEST__F_compare_dynamic_trim_h + +// f_compare_dynamic_trim() only returns memory failures. + +/** + * Test that function trims. + * + * @see f_compare_dynamic_trim() + */ +extern void test__f_compare_dynamic_trim__trims(void **state); + +/** + * Test that function doesn't match empty string to a non-empty string. + * + * @see f_compare_dynamic_trim() + */ +extern void test__f_compare_dynamic_trim__something_misses_nothing(void **state); + +/** + * Test that function works. + * + * @see f_compare_dynamic_trim() + */ +extern void test__f_compare_dynamic_trim__works(void **state); + +#endif // _TEST__F_compare_dynamic_trim_h diff --git a/level_0/f_compare/tests/unit/c/test-compare-dynamic_trim_string.c b/level_0/f_compare/tests/unit/c/test-compare-dynamic_trim_string.c new file mode 100644 index 0000000..b9d783b --- /dev/null +++ b/level_0/f_compare/tests/unit/c/test-compare-dynamic_trim_string.c @@ -0,0 +1,373 @@ +#include "test-compare.h" +#include "test-compare-dynamic_trim_string.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__f_compare_dynamic_trim_string__trims(void **state) { + + const f_string_static_t string_1s[] = { + macro_f_string_static_t_initialize(" ", 0, 1), + macro_f_string_static_t_initialize("\t", 0, 1), + macro_f_string_static_t_initialize(" \0\t", 0, 3), + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize(" space", 0, 6), + macro_f_string_static_t_initialize("space ", 0, 6), + macro_f_string_static_t_initialize(" space ", 0, 7), + macro_f_string_static_t_initialize(" \t space \t ", 0, 11), + macro_f_string_static_t_initialize("space space", 0, 11), + macro_f_string_static_t_initialize(" space\tspace ", 0, 13), + macro_f_string_static_t_initialize("\t\0\tspace\t\0 space \0 ", 0, 19), + macro_f_string_static_t_initialize(" space\tspace ", 0, 13), + macro_f_string_static_t_initialize("\t\0\tspace\t\0 space \0 ", 0, 19), + }; + + const f_string_static_t string_2s[] = { + f_string_empty_s, + f_string_empty_s, + f_string_empty_s, + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize("space space", 0, 11), + macro_f_string_static_t_initialize("space\tspace", 0, 11), + macro_f_string_static_t_initialize("space\t\0 space", 0, 13), + macro_f_string_static_t_initialize("space space", 0, 11), + macro_f_string_static_t_initialize("space space", 0, 11), + }; + + const f_status_t expects[] = { + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + }; + + uint8_t i = 0; + + for (; i < 13; ++i) { + + const f_status_t status = f_compare_dynamic_trim_string(string_1s[i].string, string_2s[i], string_1s[i].used); + + assert_int_equal(status, expects[i]); + } // for + + for (i = 0; i < 13; ++i) { + + const f_status_t status = f_compare_dynamic_trim_string(string_2s[i].string, string_1s[i], string_2s[i].used); + + assert_int_equal(status, expects[i]); + } // for + + for (i = 0; i < 10; ++i) { + + const f_status_t status = f_compare_dynamic_trim_string(string_1s[i].string, string_1s[i], string_1s[i].used); + + assert_int_equal(status, F_equal_to); + } // for + + for (i = 0; i < 10; ++i) { + + const f_status_t status = f_compare_dynamic_trim_string(string_2s[i].string, string_2s[i], string_2s[i].used); + + assert_int_equal(status, F_equal_to); + } // for +} + +void test__f_compare_dynamic_trim_string__something_misses_nothing(void **state) { + + const f_string_static_t string_1s[] = { + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize(" space", 0, 6), + macro_f_string_static_t_initialize("space ", 0, 6), + macro_f_string_static_t_initialize(" space ", 0, 7), + macro_f_string_static_t_initialize(" \t space \t ", 0, 11), + macro_f_string_static_t_initialize("space space", 0, 11), + macro_f_string_static_t_initialize(" space\tspace ", 0, 11), + macro_f_string_static_t_initialize("\t\0\tspace\t\0 space \0 ", 0, 19), + macro_f_string_static_t_initialize(" space\tspace ", 0, 11), + macro_f_string_static_t_initialize("\t\0\tspace\t\0 space \0 ", 0, 19), + }; + + for (uint8_t i = 0; i < 10; ++i) { + + const f_status_t status = f_compare_dynamic_trim_string(string_1s[i].string, f_string_empty_s, string_1s[i].used); + + assert_int_equal(status, F_equal_to_not); + } // for +} + +void test__f_compare_dynamic_trim_string__works(void **state) { + + const f_string_static_t string_1s[] = { + + // 1. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + + // 2. + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + + // 3. + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + + // 4. + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + + // 5. + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + + // 6. + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + + // 7. + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + + // 8. + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + }; + + const f_string_static_t string_2s[] = { + + // 1. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 2. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 3. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 4. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 5. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 6. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 7. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 8. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + }; + + const f_status_t expects[] = { + + // 1. + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 2. + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 3. + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 4. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + + // 5. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 6. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + + // 7. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + + // 8. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + }; + + for (uint8_t i = 0; i < 64; ++i) { + + const f_status_t status = f_compare_dynamic_trim_string(string_1s[i].string, string_2s[i], string_1s[i].used); + + assert_int_equal(status, expects[i]); + } // for +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_0/f_compare/tests/unit/c/test-compare-dynamic_trim_string.h b/level_0/f_compare/tests/unit/c/test-compare-dynamic_trim_string.h new file mode 100644 index 0000000..30b8767 --- /dev/null +++ b/level_0/f_compare/tests/unit/c/test-compare-dynamic_trim_string.h @@ -0,0 +1,36 @@ +/** + * FLL - Level 0 + * + * Project: Compare + * API Version: 0.7 + * Licenses: lgpl-2.1-or-later + * + * Test the compare project. + */ +#ifndef _TEST__F_compare_dynamic_trim_string_h +#define _TEST__F_compare_dynamic_trim_string_h + +// f_compare_dynamic_trim_string() only returns memory failures. + +/** + * Test that function trims. + * + * @see f_compare_dynamic_trim_string() + */ +extern void test__f_compare_dynamic_trim_string__trims(void **state); + +/** + * Test that function doesn't match empty string to a non-empty string. + * + * @see f_compare_dynamic_trim_string() + */ +extern void test__f_compare_dynamic_trim_string__something_misses_nothing(void **state); + +/** + * Test that function works. + * + * @see f_compare_dynamic_trim_string() + */ +extern void test__f_compare_dynamic_trim_string__works(void **state); + +#endif // _TEST__F_compare_dynamic_trim_string_h diff --git a/level_0/f_compare/tests/unit/c/test-compare-except.c b/level_0/f_compare/tests/unit/c/test-compare-except.c new file mode 100644 index 0000000..e7f2bb3 --- /dev/null +++ b/level_0/f_compare/tests/unit/c/test-compare-except.c @@ -0,0 +1,282 @@ +#include "test-compare.h" +#include "test-compare-except.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__f_compare_except__works(void **state) { + + const f_string_static_t string_1s[] = { + + // 1. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + + // 2. + macro_f_string_static_t_initialize("SKIP", 0, 4), + macro_f_string_static_t_initialize("SKIP", 0, 4), + macro_f_string_static_t_initialize("SKIP", 0, 4), + macro_f_string_static_t_initialize("SKIP", 0, 4), + macro_f_string_static_t_initialize("SKIP", 0, 4), + macro_f_string_static_t_initialize("SKIP", 0, 4), + macro_f_string_static_t_initialize("SKIP", 0, 4), + macro_f_string_static_t_initialize("SKIP", 0, 4), + + // 3. + macro_f_string_static_t_initialize("SKIP1", 0, 5), + macro_f_string_static_t_initialize("SKIP1", 0, 5), + macro_f_string_static_t_initialize("SKIP1", 0, 5), + macro_f_string_static_t_initialize("SKIP1", 0, 5), + macro_f_string_static_t_initialize("SKIP1", 0, 5), + macro_f_string_static_t_initialize("SKIP1", 0, 5), + macro_f_string_static_t_initialize("SKIP1", 0, 5), + macro_f_string_static_t_initialize("SKIP1", 0, 5), + + // 4. + macro_f_string_static_t_initialize("SKIPone", 0, 7), + macro_f_string_static_t_initialize("SKIPone", 0, 7), + macro_f_string_static_t_initialize("SKIPone", 0, 7), + macro_f_string_static_t_initialize("SKIPone", 0, 7), + macro_f_string_static_t_initialize("SKIPone", 0, 7), + macro_f_string_static_t_initialize("SKIPone", 0, 7), + macro_f_string_static_t_initialize("SKIPone", 0, 7), + macro_f_string_static_t_initialize("SKIPone", 0, 7), + + // 5. + macro_f_string_static_t_initialize("SKIPOne", 0, 7), + macro_f_string_static_t_initialize("SKIPOne", 0, 7), + macro_f_string_static_t_initialize("SKIPOne", 0, 7), + macro_f_string_static_t_initialize("SKIPOne", 0, 7), + macro_f_string_static_t_initialize("SKIPOne", 0, 7), + macro_f_string_static_t_initialize("SKIPOne", 0, 7), + macro_f_string_static_t_initialize("SKIPOne", 0, 7), + macro_f_string_static_t_initialize("SKIPOne", 0, 7), + + // 6. + macro_f_string_static_t_initialize("SKIP\0ne", 0, 7), + macro_f_string_static_t_initialize("SKIP\0ne", 0, 7), + macro_f_string_static_t_initialize("SKIP\0ne", 0, 7), + macro_f_string_static_t_initialize("SKIP\0ne", 0, 7), + macro_f_string_static_t_initialize("SKIP\0ne", 0, 7), + macro_f_string_static_t_initialize("SKIP\0ne", 0, 7), + macro_f_string_static_t_initialize("SKIP\0ne", 0, 7), + macro_f_string_static_t_initialize("SKIP\0ne", 0, 7), + + // 7. + macro_f_string_static_t_initialize("SKIPo\0ne", 0, 8), + macro_f_string_static_t_initialize("SKIPo\0ne", 0, 8), + macro_f_string_static_t_initialize("SKIPo\0ne", 0, 8), + macro_f_string_static_t_initialize("SKIPo\0ne", 0, 8), + macro_f_string_static_t_initialize("SKIPo\0ne", 0, 8), + macro_f_string_static_t_initialize("SKIPo\0ne", 0, 8), + macro_f_string_static_t_initialize("SKIPo\0ne", 0, 8), + macro_f_string_static_t_initialize("SKIPo\0ne", 0, 8), + + // 8. + macro_f_string_static_t_initialize("SKIPone\0", 0, 8), + macro_f_string_static_t_initialize("SKIPone\0", 0, 8), + macro_f_string_static_t_initialize("SKIPone\0", 0, 8), + macro_f_string_static_t_initialize("SKIPone\0", 0, 8), + macro_f_string_static_t_initialize("SKIPone\0", 0, 8), + macro_f_string_static_t_initialize("SKIPone\0", 0, 8), + macro_f_string_static_t_initialize("SKIPone\0", 0, 8), + macro_f_string_static_t_initialize("SKIPone\0", 0, 8), + }; + + const f_string_static_t string_2s[] = { + + // 1. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 2. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 3. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 4. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 5. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 6. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 7. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 8. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + }; + + const f_status_t expects[] = { + + // 1. + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 2. + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 3. + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 4. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + + // 5. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 6. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + + // 7. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + + // 8. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + }; + + f_array_length_t except_1[] = { + 0, 1, 2, 3, + }; + const f_array_lengths_t excepts_1 = macro_f_array_lengths_t_initialize(except_1, 0, 4); + const f_array_lengths_t excepts_2 = f_array_lengths_t_initialize; + + for (uint8_t i = 0; i < 64; ++i) { + + const f_status_t status = f_compare_except(string_1s[i].string, string_2s[i].string, string_1s[i].used, string_2s[i].used, excepts_1, excepts_2); + + assert_int_equal(status, expects[i]); + } // for + + for (uint8_t i = 0; i < 64; ++i) { + + const f_status_t status = f_compare_except(string_2s[i].string, string_1s[i].string, string_2s[i].used, string_1s[i].used, excepts_2, excepts_1); + + assert_int_equal(status, expects[i]); + } // for +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_0/f_compare/tests/unit/c/test-compare-except.h b/level_0/f_compare/tests/unit/c/test-compare-except.h new file mode 100644 index 0000000..d8c0ad5 --- /dev/null +++ b/level_0/f_compare/tests/unit/c/test-compare-except.h @@ -0,0 +1,22 @@ +/** + * FLL - Level 0 + * + * Project: Compare + * API Version: 0.7 + * Licenses: lgpl-2.1-or-later + * + * Test the compare project. + */ +#ifndef _TEST__F_compare_except_h +#define _TEST__F_compare_except_h + +// f_compare_() only returns memory failures. + +/** + * Test that function works. + * + * @see f_compare_except() + */ +extern void test__f_compare_except__works(void **state); + +#endif // _TEST__F_compare_except_h diff --git a/level_0/f_compare/tests/unit/c/test-compare-trim.c b/level_0/f_compare/tests/unit/c/test-compare-trim.c new file mode 100644 index 0000000..9754ebf --- /dev/null +++ b/level_0/f_compare/tests/unit/c/test-compare-trim.c @@ -0,0 +1,373 @@ +#include "test-compare.h" +#include "test-compare-trim.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__f_compare_trim__trims(void **state) { + + const f_string_static_t string_1s[] = { + macro_f_string_static_t_initialize(" ", 0, 1), + macro_f_string_static_t_initialize("\t", 0, 1), + macro_f_string_static_t_initialize(" \0\t", 0, 3), + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize(" space", 0, 6), + macro_f_string_static_t_initialize("space ", 0, 6), + macro_f_string_static_t_initialize(" space ", 0, 7), + macro_f_string_static_t_initialize(" \t space \t ", 0, 11), + macro_f_string_static_t_initialize("space space", 0, 11), + macro_f_string_static_t_initialize(" space\tspace ", 0, 13), + macro_f_string_static_t_initialize("\t\0\tspace\t\0 space \0 ", 0, 19), + macro_f_string_static_t_initialize(" space\tspace ", 0, 13), + macro_f_string_static_t_initialize("\t\0\tspace\t\0 space \0 ", 0, 19), + }; + + const f_string_static_t string_2s[] = { + f_string_empty_s, + f_string_empty_s, + f_string_empty_s, + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize("space space", 0, 11), + macro_f_string_static_t_initialize("space\tspace", 0, 11), + macro_f_string_static_t_initialize("space\t\0 space", 0, 13), + macro_f_string_static_t_initialize("space space", 0, 11), + macro_f_string_static_t_initialize("space space", 0, 11), + }; + + const f_status_t expects[] = { + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + }; + + uint8_t i = 0; + + for (; i < 13; ++i) { + + const f_status_t status = f_compare_trim(string_1s[i].string, string_2s[i].string, string_1s[i].used, string_2s[i].used); + + assert_int_equal(status, expects[i]); + } // for + + for (i = 0; i < 13; ++i) { + + const f_status_t status = f_compare_trim(string_2s[i].string, string_1s[i].string, string_2s[i].used, string_1s[i].used); + + assert_int_equal(status, expects[i]); + } // for + + for (i = 0; i < 10; ++i) { + + const f_status_t status = f_compare_trim(string_1s[i].string, string_1s[i].string, string_1s[i].used, string_1s[i].used); + + assert_int_equal(status, F_equal_to); + } // for + + for (i = 0; i < 10; ++i) { + + const f_status_t status = f_compare_trim(string_2s[i].string, string_2s[i].string, string_2s[i].used, string_2s[i].used); + + assert_int_equal(status, F_equal_to); + } // for +} + +void test__f_compare_trim__something_misses_nothing(void **state) { + + const f_string_static_t string_1s[] = { + macro_f_string_static_t_initialize("space", 0, 5), + macro_f_string_static_t_initialize(" space", 0, 6), + macro_f_string_static_t_initialize("space ", 0, 6), + macro_f_string_static_t_initialize(" space ", 0, 7), + macro_f_string_static_t_initialize(" \t space \t ", 0, 11), + macro_f_string_static_t_initialize("space space", 0, 11), + macro_f_string_static_t_initialize(" space\tspace ", 0, 11), + macro_f_string_static_t_initialize("\t\0\tspace\t\0 space \0 ", 0, 19), + macro_f_string_static_t_initialize(" space\tspace ", 0, 11), + macro_f_string_static_t_initialize("\t\0\tspace\t\0 space \0 ", 0, 19), + }; + + for (uint8_t i = 0; i < 10; ++i) { + + const f_status_t status = f_compare_trim(string_1s[i].string, f_string_empty_s.string, string_1s[i].used, f_string_empty_s.used); + + assert_int_equal(status, F_equal_to_not); + } // for +} + +void test__f_compare_trim__works(void **state) { + + const f_string_static_t string_1s[] = { + + // 1. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize(0, 0, 0), + + // 2. + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + + // 3. + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("1", 0, 1), + + // 4. + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("one", 0, 3), + + // 5. + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + + // 6. + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + + // 7. + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + + // 8. + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + }; + + const f_string_static_t string_2s[] = { + + // 1. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 2. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 3. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 4. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 5. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 6. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 7. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + + // 8. + macro_f_string_static_t_initialize(0, 0, 0), + macro_f_string_static_t_initialize("", 0, 0), + macro_f_string_static_t_initialize("1", 0, 1), + macro_f_string_static_t_initialize("one", 0, 3), + macro_f_string_static_t_initialize("One", 0, 3), + macro_f_string_static_t_initialize("\0ne", 0, 3), + macro_f_string_static_t_initialize("o\0ne", 0, 4), + macro_f_string_static_t_initialize("one\0", 0, 4), + }; + + const f_status_t expects[] = { + + // 1. + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 2. + F_equal_to, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 3. + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 4. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + + // 5. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + + // 6. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + + // 7. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + + // 8. + F_equal_to_not, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to_not, + F_equal_to_not, + F_equal_to, + F_equal_to, + }; + + for (uint8_t i = 0; i < 64; ++i) { + + const f_status_t status = f_compare_trim(string_1s[i].string, string_2s[i].string, string_1s[i].used, string_2s[i].used); + + assert_int_equal(status, expects[i]); + } // for +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_0/f_compare/tests/unit/c/test-compare-trim.h b/level_0/f_compare/tests/unit/c/test-compare-trim.h new file mode 100644 index 0000000..1ca490f --- /dev/null +++ b/level_0/f_compare/tests/unit/c/test-compare-trim.h @@ -0,0 +1,36 @@ +/** + * FLL - Level 0 + * + * Project: Compare + * API Version: 0.7 + * Licenses: lgpl-2.1-or-later + * + * Test the compare project. + */ +#ifndef _TEST__F_compare_trim_h +#define _TEST__F_compare_trim_h + +// f_compare_trim() only returns memory failures. + +/** + * Test that function trims. + * + * @see f_compare_trim() + */ +extern void test__f_compare_trim__trims(void **state); + +/** + * Test that function doesn't match empty string to a non-empty string. + * + * @see f_compare_trim() + */ +extern void test__f_compare_trim__something_misses_nothing(void **state); + +/** + * Test that function works. + * + * @see f_compare_trim() + */ +extern void test__f_compare_trim__works(void **state); + +#endif // _TEST__F_compare_trim_h diff --git a/level_0/f_compare/tests/unit/c/test-compare.c b/level_0/f_compare/tests/unit/c/test-compare.c index 631d440..2e93f54 100644 --- a/level_0/f_compare/tests/unit/c/test-compare.c +++ b/level_0/f_compare/tests/unit/c/test-compare.c @@ -22,52 +22,58 @@ int main(void) { cmocka_unit_test(test__f_compare___works), cmocka_unit_test(test__f_compare_dynamic__works), - //cmocka_unit_test(test__f_compare_dynamic_partial__works), - //cmocka_unit_test(test__f_compare_dynamic_partial_dynamic__works), + cmocka_unit_test(test__f_compare_dynamic_partial__works), + cmocka_unit_test(test__f_compare_dynamic_partial_dynamic__works), //cmocka_unit_test(test__f_compare_dynamic_partial_except__works), //cmocka_unit_test(test__f_compare_dynamic_partial_except_dynamic__works), //cmocka_unit_test(test__f_compare_dynamic_partial_except_string__works), //cmocka_unit_test(test__f_compare_dynamic_partial_except_trim__works), //cmocka_unit_test(test__f_compare_dynamic_partial_except_trim_dynamic__works), //cmocka_unit_test(test__f_compare_dynamic_partial_except_trim_string__works), - //cmocka_unit_test(test__f_compare_dynamic_partial_string__works), - //cmocka_unit_test(test__f_compare_dynamic_partial_trim_dynamic__works), - //cmocka_unit_test(test__f_compare_dynamic_partial_trim_string__works), + cmocka_unit_test(test__f_compare_dynamic_partial_string__works), + cmocka_unit_test(test__f_compare_dynamic_partial_trim__works), + cmocka_unit_test(test__f_compare_dynamic_partial_trim_dynamic__works), + cmocka_unit_test(test__f_compare_dynamic_partial_trim_string__works), cmocka_unit_test(test__f_compare_dynamic_string__works), - //cmocka_unit_test(test__f_compare_dynamic_trim__works), - //cmocka_unit_test(test__f_compare_dynamic_trim_string__works), + cmocka_unit_test(test__f_compare_dynamic_trim__trims), + cmocka_unit_test(test__f_compare_dynamic_trim__something_misses_nothing), + cmocka_unit_test(test__f_compare_dynamic_trim__works), + cmocka_unit_test(test__f_compare_dynamic_trim_string__trims), + cmocka_unit_test(test__f_compare_dynamic_trim_string__something_misses_nothing), + cmocka_unit_test(test__f_compare_dynamic_trim_string__works), //cmocka_unit_test(test__f_compare_dynamic_except__works), //cmocka_unit_test(test__f_compare_dynamic_except_string__works), //cmocka_unit_test(test__f_compare_dynamic_except_trim__works), - //cmocka_unit_test(test__f_compare_except__works), + cmocka_unit_test(test__f_compare_except__works), //cmocka_unit_test(test__f_compare_except_trim__works), //cmocka_unit_test(test__f_compare_except_trim_string__works), - //cmocka_unit_test(test__f_compare_trim__works), + cmocka_unit_test(test__f_compare_trim__trims), + cmocka_unit_test(test__f_compare_trim__something_misses_nothing), + cmocka_unit_test(test__f_compare_trim__works), #ifndef _di_level_0_parameter_checking_ // f_compare() doesn't use parameter checking. // f_compare_dynamic() doesn't use parameter checking. - //cmocka_unit_test(test__f_compare_dynamic__parameter_checking), - //cmocka_unit_test(test__f_compare_dynamic_partial__parameter_checking), - //cmocka_unit_test(test__f_compare_dynamic_partial_dynamic__parameter_checking), - //cmocka_unit_test(test__f_compare_dynamic_partial_except__parameter_checking), - //cmocka_unit_test(test__f_compare_dynamic_partial_except_dynamic__parameter_checking), - //cmocka_unit_test(test__f_compare_dynamic_partial_except_string__parameter_checking), - //cmocka_unit_test(test__f_compare_dynamic_partial_except_trim__parameter_checking), - //cmocka_unit_test(test__f_compare_dynamic_partial_except_trim_dynamic__parameter_checking), - //cmocka_unit_test(test__f_compare_dynamic_partial_except_trim_string__parameter_checking), - //cmocka_unit_test(test__f_compare_dynamic_partial_string__parameter_checking), - //cmocka_unit_test(test__f_compare_dynamic_partial_trim_dynamic__parameter_checking), + // f_compare_dynamic_partial() doesn't use parameter checking. + // f_compare_dynamic_partial_dynamic() doesn't use parameter checking. + // f_compare_dynamic_partial_except() doesn't use parameter checking. + // f_compare_dynamic_partial_except_dynamic() doesn't use parameter checking. + // f_compare_dynamic_partial_except_string() doesn't use parameter checking. + // f_compare_dynamic_partial_except_trim() doesn't use parameter checking. + // f_compare_dynamic_partial_except_trim_dynamic() doesn't use parameter checking. + // f_compare_dynamic_partial_except_trim_string() doesn't use parameter checking. + // f_compare_dynamic_partial_string() doesn't use parameter checking. + // f_compare_dynamic_partial_trim_dynamic() doesn't use parameter checking. // f_compare_dynamic_string() doesn't use parameter checking. // f_compare_dynamic_trim() doesn't use parameter checking. // f_compare_dynamic_trim_string() doesn't use parameter checking. - //cmocka_unit_test(test__f_compare_dynamic_except___parameter_checking), - //cmocka_unit_test(test__f_compare_dynamic_except_string___parameter_checking), - //cmocka_unit_test(test__f_compare_dynamic_except_trim___parameter_checking), - //cmocka_unit_test(test__f_compare_except___parameter_checking), - //cmocka_unit_test(test__f_compare_except_trim___parameter_checking), - //cmocka_unit_test(test__f_compare_except_trim_string___parameter_checking), - //cmocka_unit_test(test__f_compare_trim___parameter_checking), + // f_compare_dynamic_except() doesn't use parameter checking. + // f_compare_dynamic_except_string() doesn't use parameter checking. + // f_compare_dynamic_except_trim() doesn't use parameter checking. + // f_compare_except() doesn't use parameter checking. + // f_compare_except_trim() doesn't use parameter checking. + // f_compare_except_trim_string() doesn't use parameter checking. + // f_compare_trim() doesn't use parameter checking. #endif // _di_level_0_parameter_checking_ }; diff --git a/level_0/f_compare/tests/unit/c/test-compare.h b/level_0/f_compare/tests/unit/c/test-compare.h index 596a7f4..4f14822 100644 --- a/level_0/f_compare/tests/unit/c/test-compare.h +++ b/level_0/f_compare/tests/unit/c/test-compare.h @@ -25,27 +25,28 @@ // Test includes. #include "test-compare-.h" #include "test-compare-dynamic.h" -//#include "test-compare-dynamic_partial.h" -//#include "test-compare-dynamic_partial_dynamic.h" +#include "test-compare-dynamic_partial.h" +#include "test-compare-dynamic_partial_dynamic.h" //#include "test-compare-dynamic_partial_except.h" //#include "test-compare-dynamic_partial_except_dynamic.h" //#include "test-compare-dynamic_partial_except_string.h" //#include "test-compare-dynamic_partial_except_trim.h" //#include "test-compare-dynamic_partial_except_trim_dynamic.h" //#include "test-compare-dynamic_partial_except_trim_string.h" -//#include "test-compare-dynamic_partial_string.h" -//#include "test-compare-dynamic_partial_trim_dynamic.h" -//#include "test-compare-dynamic_partial_trim_string.h" +#include "test-compare-dynamic_partial_string.h" +#include "test-compare-dynamic_partial_trim.h" +#include "test-compare-dynamic_partial_trim_dynamic.h" +#include "test-compare-dynamic_partial_trim_string.h" #include "test-compare-dynamic_string.h" -//#include "test-compare-dynamic_trim.h" -//#include "test-compare-dynamic_trim_string.h" +#include "test-compare-dynamic_trim.h" +#include "test-compare-dynamic_trim_string.h" //#include "test-compare-dynamic_except.h" //#include "test-compare-dynamic_except_string.h" //#include "test-compare-dynamic_except_trim.h" -//#include "test-compare-except.h" +#include "test-compare-except.h" //#include "test-compare-except_trim.h" //#include "test-compare-except_trim_string.h" -//#include "test-compare-trim.h" +#include "test-compare-trim.h" #ifdef __cplusplus extern "C" { -- 1.8.3.1