From: Kevin Day Date: Fri, 31 Mar 2023 04:12:27 +0000 (-0500) Subject: Update: Back port utf string compare unit tests. X-Git-Tag: 0.6.5~21 X-Git-Url: https://git.kevux.org/?a=commitdiff_plain;h=f007398012586075431db08d388fc244b521c96d;p=fll Update: Back port utf string compare unit tests. This only back ports unit tests for the functions that are present in 0.6.x. --- diff --git a/level_1/fl_utf/data/build/settings-tests b/level_1/fl_utf/data/build/settings-tests new file mode 100644 index 0000000..5f7aa52 --- /dev/null +++ b/level_1/fl_utf/data/build/settings-tests @@ -0,0 +1,52 @@ +# fss-0001 + +build_name test-fl_utf + +version_major 0 +version_minor 6 +version_micro 5 +version_file micro +version_target minor + +modes individual clang test coverage +modes_default individual test + +build_compiler gcc +build_compiler-clang clang +build_indexer ar +build_indexer_arguments rcs +build_language c + +build_libraries -lc -lcmocka +build_libraries-individual -lf_memory -lf_string -lf_utf -lfl_utf + +build_sources_program test-utf-string_compare.c test-utf-string_dynamic_compare.c +build_sources_program test-utf-string_dynamic_partial_compare.c test-utf-string_dynamic_partial_compare_trim.c +build_sources_program test-utf-string_compare_trim.c test-utf-string_dynamic_compare_trim.c + +build_sources_program test-utf.c + +build_script no +build_shared yes +build_static no + +path_headers tests/unit/c +path_sources tests/unit/c + +has_path_standard no +preserve_path_headers yes + +search_exclusive yes +search_shared yes +search_static yes + +defines -Ibuild/includes +defines_static -Lbuild/libraries/static +defines_shared -Lbuild/libraries/shared + +flags -O2 -z now -g -fdiagnostics-color=always -Wno-logical-not-parentheses -Wno-parentheses +flags-clang -Wno-logical-op-parentheses +flags-test -fstack-protector -Wall +flags-coverage -O0 --coverage -fprofile-abs-path -fprofile-dir=build/coverage/ + +flags_program -fPIE diff --git a/level_1/fl_utf/data/build/testfile b/level_1/fl_utf/data/build/testfile new file mode 100644 index 0000000..f5a5761 --- /dev/null +++ b/level_1/fl_utf/data/build/testfile @@ -0,0 +1,56 @@ +# fss-0005 iki-0002 + +settings: + load_build yes + fail exit + + environment PATH LD_LIBRARY_PATH + environment LANG LC_ALL LC_COLLATE LC_CTYPE LC_FASTMSG LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME LOCPATH NLSPATH + environment CMOCKA_XML_FILE CMOCKA_MESSAGE_OUTPUT CMOCKA_TEST_ABORT + + # Cmocka is not fully thread-safe, set this to "1" to have cmocka call abort() on a test failure. + #CMOCKA_TEST_ABORT 1 + + # One of: STDOUT, SUBUNIT, TAP, or XML. + #define CMOCKA_MESSAGE_OUTPUT STDOUT + + # When in "XML" output mode, output to this file rather than stdout. + #define CMOCKA_XML_FILE ./out.xml + +main: + build settings individual test + build settings-tests individual test + + operate ld_library_path + + if exist build/programs/shared/test-fl_utf + shell build/programs/shared/test-fl_utf + + if exist build/programs/static/test-fl_utf + shell build/programs/static/test-fl_utf + + if not exist build/programs/shared/test-fl_utf + and not exist build/programs/static/test-fl_utf + operate not_created + +not_created: + print + print 'context:"error"Failed to test due to being unable to find either a shared or static test binary to perform tests. context:"reset"' + + exit failure + +ld_library_path: + if define LD_LIBRARY_PATH + and parameter work + define LD_LIBRARY_PATH 'build/libraries/shared:parameter:"work:value"libraries/shared:define:"LD_LIBRARY_PATH"' + + else + if define LD_LIBRARY_PATH + define LD_LIBRARY_PATH 'build/libraries/shared:define:"LD_LIBRARY_PATH"' + + else + if parameter work + define LD_LIBRARY_PATH 'build/libraries/shared:parameter:"work:value"libraries/shared' + + else + define LD_LIBRARY_PATH build/libraries/shared diff --git a/level_1/fl_utf/tests/unit/c/test-utf-string_compare.c b/level_1/fl_utf/tests/unit/c/test-utf-string_compare.c new file mode 100644 index 0000000..f758e62 --- /dev/null +++ b/level_1/fl_utf/tests/unit/c/test-utf-string_compare.c @@ -0,0 +1,285 @@ +#include "test-utf.h" +#include "test-utf-string_compare.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__fl_utf_string_compare__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, + }; + + f_status_t status = F_none; + f_utf_string_dynamic_t utf_string_1 = f_utf_string_dynamic_t_initialize; + f_utf_string_dynamic_t utf_string_2 = f_utf_string_dynamic_t_initialize; + + for (uint8_t i = 0; i < 64; ++i) { + + utf_string_1.used = 0; + utf_string_2.used = 0; + + status = test_convert_dynamic_to_utf(string_1s[i], &utf_string_1); + assert_int_equal(status, F_none); + + status = test_convert_dynamic_to_utf(string_2s[i], &utf_string_2); + assert_int_equal(status, F_none); + + status = fl_utf_string_compare(utf_string_1.string, utf_string_2.string, utf_string_1.used, utf_string_2.used); + + assert_int_equal(status, expects[i]); + } // for + + f_utf_string_dynamic_resize(0, &utf_string_1); + f_utf_string_dynamic_resize(0, &utf_string_2); +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_1/fl_utf/tests/unit/c/test-utf-string_compare.h b/level_1/fl_utf/tests/unit/c/test-utf-string_compare.h new file mode 100644 index 0000000..6008d8c --- /dev/null +++ b/level_1/fl_utf/tests/unit/c/test-utf-string_compare.h @@ -0,0 +1,22 @@ +/** + * FLL - Level 1 + * + * Project: Utf + * API Version: 0.6 + * Licenses: lgpl-2.1-or-later + * + * Test the utf project. + */ +#ifndef _TEST__FL_utf_compare_h +#define _TEST__FL_utf_compare_h + +// fl_utf_string_compare() only returns memory failures. + +/** + * Test that function works. + * + * @see fl_utf_string_compare() + */ +extern void test__fl_utf_string_compare__works(void **state); + +#endif // _TEST__FL_utf_compare_h diff --git a/level_1/fl_utf/tests/unit/c/test-utf-string_compare_trim.c b/level_1/fl_utf/tests/unit/c/test-utf-string_compare_trim.c new file mode 100644 index 0000000..53089a6 --- /dev/null +++ b/level_1/fl_utf/tests/unit/c/test-utf-string_compare_trim.c @@ -0,0 +1,434 @@ +#include "test-utf.h" +#include "test-utf-string_compare_trim.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__fl_utf_string_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; + + f_status_t status = F_none; + f_utf_string_dynamic_t utf_string_1 = f_utf_string_dynamic_t_initialize; + f_utf_string_dynamic_t utf_string_2 = f_utf_string_dynamic_t_initialize; + + for (; i < 13; ++i) { + + utf_string_1.used = 0; + utf_string_2.used = 0; + + status = test_convert_dynamic_to_utf(string_1s[i], &utf_string_1); + assert_int_equal(status, F_none); + + status = test_convert_dynamic_to_utf(string_2s[i], &utf_string_2); + assert_int_equal(status, F_none); + + status = fl_utf_string_compare_trim(utf_string_1.string, utf_string_2.string, utf_string_1.used, utf_string_2.used); + + assert_int_equal(status, expects[i]); + } // for + + for (i = 0; i < 13; ++i) { + + utf_string_1.used = 0; + utf_string_2.used = 0; + + status = test_convert_dynamic_to_utf(string_1s[i], &utf_string_1); + assert_int_equal(status, F_none); + + status = test_convert_dynamic_to_utf(string_2s[i], &utf_string_2); + assert_int_equal(status, F_none); + + status = fl_utf_string_compare_trim(utf_string_2.string, utf_string_1.string, utf_string_2.used, utf_string_1.used); + + assert_int_equal(status, expects[i]); + } // for + + for (i = 0; i < 10; ++i) { + + utf_string_1.used = 0; + + status = test_convert_dynamic_to_utf(string_1s[i], &utf_string_1); + assert_int_equal(status, F_none); + + status = fl_utf_string_compare_trim(utf_string_1.string, utf_string_1.string, utf_string_1.used, utf_string_1.used); + + assert_int_equal(status, F_equal_to); + } // for + + for (i = 0; i < 10; ++i) { + + utf_string_2.used = 0; + + status = test_convert_dynamic_to_utf(string_2s[i], &utf_string_2); + assert_int_equal(status, F_none); + + status = fl_utf_string_compare_trim(utf_string_2.string, utf_string_2.string, utf_string_2.used, utf_string_2.used); + + assert_int_equal(status, F_equal_to); + } // for + + f_utf_string_dynamic_resize(0, &utf_string_1); + f_utf_string_dynamic_resize(0, &utf_string_2); +} + +void test__fl_utf_string_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), + }; + + f_status_t status = F_none; + f_utf_string_dynamic_t utf_string_1 = f_utf_string_dynamic_t_initialize; + + for (uint8_t i = 0; i < 10; ++i) { + + utf_string_1.used = 0; + + status = test_convert_dynamic_to_utf(string_1s[i], &utf_string_1); + assert_int_equal(status, F_none); + + status = fl_utf_string_compare_trim(utf_string_1.string, f_utf_string_empty_s.string, utf_string_1.used, f_utf_string_empty_s.used); + + assert_int_equal(status, F_equal_to_not); + } // for + + f_utf_string_dynamic_resize(0, &utf_string_1); +} + +void test__fl_utf_string_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, + }; + + f_status_t status = F_none; + f_utf_string_dynamic_t utf_string_1 = f_utf_string_dynamic_t_initialize; + f_utf_string_dynamic_t utf_string_2 = f_utf_string_dynamic_t_initialize; + + for (uint8_t i = 0; i < 64; ++i) { + + utf_string_1.used = 0; + utf_string_2.used = 0; + + status = test_convert_dynamic_to_utf(string_1s[i], &utf_string_1); + assert_int_equal(status, F_none); + + status = test_convert_dynamic_to_utf(string_2s[i], &utf_string_2); + assert_int_equal(status, F_none); + + status = fl_utf_string_compare_trim(utf_string_1.string, utf_string_2.string, utf_string_1.used, utf_string_2.used); + + assert_int_equal(status, expects[i]); + } // for + + f_utf_string_dynamic_resize(0, &utf_string_1); + f_utf_string_dynamic_resize(0, &utf_string_2); +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_1/fl_utf/tests/unit/c/test-utf-string_compare_trim.h b/level_1/fl_utf/tests/unit/c/test-utf-string_compare_trim.h new file mode 100644 index 0000000..a1fd3d2 --- /dev/null +++ b/level_1/fl_utf/tests/unit/c/test-utf-string_compare_trim.h @@ -0,0 +1,36 @@ +/** + * FLL - Level 1 + * + * Project: Utf + * API Version: 0.6 + * Licenses: lgpl-2.1-or-later + * + * Test the utf project. + */ +#ifndef _TEST__FL_utf_compare_trim_h +#define _TEST__FL_utf_compare_trim_h + +// fl_utf_string_compare_trim() only returns memory failures. + +/** + * Test that function trims. + * + * @see fl_utf_string_compare_trim() + */ +extern void test__fl_utf_string_compare_trim__trims(void **state); + +/** + * Test that function doesn't match empty string to a non-empty string. + * + * @see fl_utf_string_compare_trim() + */ +extern void test__fl_utf_string_compare_trim__something_misses_nothing(void **state); + +/** + * Test that function works. + * + * @see fl_utf_string_compare_trim() + */ +extern void test__fl_utf_string_compare_trim__works(void **state); + +#endif // _TEST__FL_utf_compare_trim_h diff --git a/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_compare.c b/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_compare.c new file mode 100644 index 0000000..a16aff6 --- /dev/null +++ b/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_compare.c @@ -0,0 +1,285 @@ +#include "test-utf.h" +#include "test-utf-string_dynamic_compare.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__fl_utf_string_dynamic_compare__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, + }; + + f_status_t status = F_none; + f_utf_string_dynamic_t utf_string_1 = f_utf_string_dynamic_t_initialize; + f_utf_string_dynamic_t utf_string_2 = f_utf_string_dynamic_t_initialize; + + for (uint8_t i = 0; i < 64; ++i) { + + utf_string_1.used = 0; + utf_string_2.used = 0; + + status = test_convert_dynamic_to_utf(string_1s[i], &utf_string_1); + assert_int_equal(status, F_none); + + status = test_convert_dynamic_to_utf(string_2s[i], &utf_string_2); + assert_int_equal(status, F_none); + + status = fl_utf_string_dynamic_compare(utf_string_1, utf_string_2); + + assert_int_equal(status, expects[i]); + } // for + + f_utf_string_dynamic_resize(0, &utf_string_1); + f_utf_string_dynamic_resize(0, &utf_string_2); +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_compare.h b/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_compare.h new file mode 100644 index 0000000..176c72d --- /dev/null +++ b/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_compare.h @@ -0,0 +1,22 @@ +/** + * FLL - Level 1 + * + * Project: Utf + * API Version: 0.6 + * Licenses: lgpl-2.1-or-later + * + * Test the utf project. + */ +#ifndef _TEST__FL_utf_dynamic_compare_h +#define _TEST__FL_utf_dynamic_compare_h + +// fl_utf_string_dynamic_compare() only returns memory failures. + +/** + * Test that function works. + * + * @see fl_utf_string_dynamic_compare() + */ +extern void test__fl_utf_string_dynamic_compare__works(void **state); + +#endif // _TEST__FL_utf_dynamic_compare_h diff --git a/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_compare_trim.c b/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_compare_trim.c new file mode 100644 index 0000000..054bee3 --- /dev/null +++ b/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_compare_trim.c @@ -0,0 +1,434 @@ +#include "test-utf.h" +#include "test-utf-string_dynamic_compare_trim.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__fl_utf_string_dynamic_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; + + f_status_t status = F_none; + f_utf_string_dynamic_t utf_string_1 = f_utf_string_dynamic_t_initialize; + f_utf_string_dynamic_t utf_string_2 = f_utf_string_dynamic_t_initialize; + + for (; i < 13; ++i) { + + utf_string_1.used = 0; + utf_string_2.used = 0; + + status = test_convert_dynamic_to_utf(string_1s[i], &utf_string_1); + assert_int_equal(status, F_none); + + status = test_convert_dynamic_to_utf(string_2s[i], &utf_string_2); + assert_int_equal(status, F_none); + + status = fl_utf_string_dynamic_compare_trim(utf_string_1, utf_string_2); + + assert_int_equal(status, expects[i]); + } // for + + for (i = 0; i < 13; ++i) { + + utf_string_1.used = 0; + utf_string_2.used = 0; + + status = test_convert_dynamic_to_utf(string_1s[i], &utf_string_1); + assert_int_equal(status, F_none); + + status = test_convert_dynamic_to_utf(string_2s[i], &utf_string_2); + assert_int_equal(status, F_none); + + status = fl_utf_string_dynamic_compare_trim(utf_string_2, utf_string_1); + + assert_int_equal(status, expects[i]); + } // for + + for (i = 0; i < 10; ++i) { + + utf_string_1.used = 0; + + status = test_convert_dynamic_to_utf(string_1s[i], &utf_string_1); + assert_int_equal(status, F_none); + + status = fl_utf_string_dynamic_compare_trim(utf_string_1, utf_string_1); + + assert_int_equal(status, F_equal_to); + } // for + + for (i = 0; i < 10; ++i) { + + utf_string_2.used = 0; + + status = test_convert_dynamic_to_utf(string_2s[i], &utf_string_2); + assert_int_equal(status, F_none); + + status = fl_utf_string_dynamic_compare_trim(utf_string_2, utf_string_2); + + assert_int_equal(status, F_equal_to); + } // for + + f_utf_string_dynamic_resize(0, &utf_string_1); + f_utf_string_dynamic_resize(0, &utf_string_2); +} + +void test__fl_utf_string_dynamic_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), + }; + + f_status_t status = F_none; + f_utf_string_dynamic_t utf_string_1 = f_utf_string_dynamic_t_initialize; + + for (uint8_t i = 0; i < 10; ++i) { + + utf_string_1.used = 0; + + status = test_convert_dynamic_to_utf(string_1s[i], &utf_string_1); + assert_int_equal(status, F_none); + + status = fl_utf_string_dynamic_compare_trim(utf_string_1, f_utf_string_empty_s); + + assert_int_equal(status, F_equal_to_not); + } // for + + f_utf_string_dynamic_resize(0, &utf_string_1); +} + +void test__fl_utf_string_dynamic_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, + }; + + f_status_t status = F_none; + f_utf_string_dynamic_t utf_string_1 = f_utf_string_dynamic_t_initialize; + f_utf_string_dynamic_t utf_string_2 = f_utf_string_dynamic_t_initialize; + + for (uint8_t i = 0; i < 64; ++i) { + + utf_string_1.used = 0; + utf_string_2.used = 0; + + status = test_convert_dynamic_to_utf(string_1s[i], &utf_string_1); + assert_int_equal(status, F_none); + + status = test_convert_dynamic_to_utf(string_2s[i], &utf_string_2); + assert_int_equal(status, F_none); + + status = fl_utf_string_dynamic_compare_trim(utf_string_1, utf_string_2); + + assert_int_equal(status, expects[i]); + } // for + + f_utf_string_dynamic_resize(0, &utf_string_1); + f_utf_string_dynamic_resize(0, &utf_string_2); +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_compare_trim.h b/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_compare_trim.h new file mode 100644 index 0000000..80e72ef --- /dev/null +++ b/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_compare_trim.h @@ -0,0 +1,36 @@ +/** + * FLL - Level 1 + * + * Project: Utf + * API Version: 0.6 + * Licenses: lgpl-2.1-or-later + * + * Test the utf project. + */ +#ifndef _TEST__FL_utf_dynamic_compare_trim_h +#define _TEST__FL_utf_dynamic_compare_trim_h + +// fl_utf_string_dynamic_compare_trim() only returns memory failures. + +/** + * Test that function trims. + * + * @see fl_utf_string_dynamic_compare_trim() + */ +extern void test__fl_utf_string_dynamic_compare_trim__trims(void **state); + +/** + * Test that function doesn't match empty string to a non-empty string. + * + * @see fl_utf_string_dynamic_compare_trim() + */ +extern void test__fl_utf_string_dynamic_compare_trim__something_misses_nothing(void **state); + +/** + * Test that function works. + * + * @see fl_utf_string_dynamic_compare_trim() + */ +extern void test__fl_utf_string_dynamic_compare_trim__works(void **state); + +#endif // _TEST__FL_utf_dynamic_compare_trim_h diff --git a/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_partial_compare.c b/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_partial_compare.c new file mode 100644 index 0000000..0c6a976 --- /dev/null +++ b/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_partial_compare.c @@ -0,0 +1,323 @@ +#include "test-utf.h" +#include "test-utf-string_dynamic_partial_compare.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__fl_utf_string_dynamic_partial_compare__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), + }; + + 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; + f_utf_string_dynamic_t utf_string_1 = f_utf_string_dynamic_t_initialize; + f_utf_string_dynamic_t utf_string_2 = f_utf_string_dynamic_t_initialize; + + // First eight are against empty strings for first argument. + for (; i < 8; ++i) { + + utf_string_1.used = 0; + utf_string_2.used = 0; + + status = test_convert_dynamic_to_utf(string_1s[i], &utf_string_1); + assert_int_equal(status, F_none); + + status = test_convert_dynamic_to_utf(string_2s[i], &utf_string_2); + assert_int_equal(status, F_none); + + if (i % 8 == 0) { + status = fl_utf_string_dynamic_partial_compare(utf_string_1, utf_string_2, f_string_range_empty_c, f_string_range_empty_c); + } + else { + range_2.stop = string_2s[i].used - 1; + + status = fl_utf_string_dynamic_partial_compare(utf_string_1, utf_string_2, f_string_range_empty_c, range_2); + } + + assert_int_equal(status, expects[i]); + } // for + + for (; i < 64; ++i) { + + utf_string_1.used = 0; + utf_string_2.used = 0; + + status = test_convert_dynamic_to_utf(string_1s[i], &utf_string_1); + assert_int_equal(status, F_none); + + status = test_convert_dynamic_to_utf(string_2s[i], &utf_string_2); + assert_int_equal(status, F_none); + + range_1.stop = string_1s[i].used - 4; + + if (i % 8 == 0) { + status = fl_utf_string_dynamic_partial_compare(utf_string_1, utf_string_2, range_1, f_string_range_empty_c); + } + else { + range_2.stop = string_2s[i].used - 1; + + status = fl_utf_string_dynamic_partial_compare(utf_string_1, utf_string_2, range_1, range_2); + } + + assert_int_equal(status, expects[i]); + } // for + + f_utf_string_dynamic_resize(0, &utf_string_1); + f_utf_string_dynamic_resize(0, &utf_string_2); +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_partial_compare.h b/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_partial_compare.h new file mode 100644 index 0000000..f7aecf2 --- /dev/null +++ b/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_partial_compare.h @@ -0,0 +1,22 @@ +/** + * FLL - Level 1 + * + * Project: Utf + * API Version: 0.6 + * Licenses: lgpl-2.1-or-later + * + * Test the utf project. + */ +#ifndef _TEST__FL_utf_dynamic_compare_partial_h +#define _TEST__FL_utf_dynamic_compare_partial_h + +// fl_utf_string_dynamic_partial_compare() only returns memory failures. + +/** + * Test that function works. + * + * @see fl_utf_string_dynamic_partial_compare() + */ +extern void test__fl_utf_string_dynamic_partial_compare__works(void **state); + +#endif // _TEST__FL_utf_dynamic_compare_partial_h diff --git a/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_partial_compare_trim.c b/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_partial_compare_trim.c new file mode 100644 index 0000000..e659e8d --- /dev/null +++ b/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_partial_compare_trim.c @@ -0,0 +1,336 @@ +#include "test-utf.h" +#include "test-utf-string_dynamic_partial_compare_trim.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void test__fl_utf_string_dynamic_partial_compare_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_1[] = { + 'x', 'x', 'x', '\0', '1', 'y', 'y', 'y' + }; + + f_char_t null_before_one_2[] = { + 'x', 'x', 'x', '\0', '1', ' ', '\0', '\t', 'y', 'y', 'y' + }; + + f_char_t null_before_one_3[] = { + 'x', 'x', 'x', '\0', ' ', '\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_1, 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(null_before_one_2, 0, 11), + macro_f_string_static_t_initialize(null_before_one_3, 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), + }; + + 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; + f_utf_string_dynamic_t utf_string_1 = f_utf_string_dynamic_t_initialize; + f_utf_string_dynamic_t utf_string_2 = f_utf_string_dynamic_t_initialize; + + // First eight are against empty strings for first argument. + for (; i < 8; ++i) { + + utf_string_1.used = 0; + utf_string_2.used = 0; + + status = test_convert_dynamic_to_utf(string_1s[i], &utf_string_1); + assert_int_equal(status, F_none); + + status = test_convert_dynamic_to_utf(string_2s[i], &utf_string_2); + assert_int_equal(status, F_none); + + if (i % 8 == 0) { + status = fl_utf_string_dynamic_partial_compare_trim(utf_string_1, utf_string_2, f_string_range_empty_c, f_string_range_empty_c); + } + else { + range_2.stop = string_2s[i].used - 1; + + status = fl_utf_string_dynamic_partial_compare_trim(utf_string_1, utf_string_2, f_string_range_empty_c, range_2); + } + + assert_int_equal(status, expects[i]); + } // for + + for (; i < 64; ++i) { + + utf_string_1.used = 0; + utf_string_2.used = 0; + + status = test_convert_dynamic_to_utf(string_1s[i], &utf_string_1); + assert_int_equal(status, F_none); + + status = test_convert_dynamic_to_utf(string_2s[i], &utf_string_2); + assert_int_equal(status, F_none); + + range_1.stop = string_1s[i].used - 4; + + if (i % 8 == 0) { + status = fl_utf_string_dynamic_partial_compare_trim(utf_string_1, utf_string_2, range_1, f_string_range_empty_c); + } + else { + range_2.stop = string_2s[i].used - 1; + + status = fl_utf_string_dynamic_partial_compare_trim(utf_string_1, utf_string_2, range_1, range_2); + } + + assert_int_equal(status, expects[i]); + } // for + + f_utf_string_dynamic_resize(0, &utf_string_1); + f_utf_string_dynamic_resize(0, &utf_string_2); +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_partial_compare_trim.h b/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_partial_compare_trim.h new file mode 100644 index 0000000..9340cd6 --- /dev/null +++ b/level_1/fl_utf/tests/unit/c/test-utf-string_dynamic_partial_compare_trim.h @@ -0,0 +1,22 @@ +/** + * FLL - Level 1 + * + * Project: Utf + * API Version: 0.6 + * Licenses: lgpl-2.1-or-later + * + * Test the utf project. + */ +#ifndef _TEST__FL_utf_dynamic_compare_partial_trim_h +#define _TEST__FL_utf_dynamic_compare_partial_trim_h + +// fl_utf_string_dynamic_partial_compare_trim() only returns memory failures. + +/** + * Test that function works. + * + * @see fl_utf_string_dynamic_partial_compare_trim() + */ +extern void test__fl_utf_string_dynamic_partial_compare_trim__works(void **state); + +#endif // _TEST__FL_utf_dynamic_compare_partial_trim_h diff --git a/level_1/fl_utf/tests/unit/c/test-utf.c b/level_1/fl_utf/tests/unit/c/test-utf.c new file mode 100644 index 0000000..f56edc8 --- /dev/null +++ b/level_1/fl_utf/tests/unit/c/test-utf.c @@ -0,0 +1,67 @@ +#include "test-utf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +const f_string_range_t f_string_range_empty_c = f_string_range_t_initialize; + +int setup(void **state) { + + return 0; +} + +int setdown(void **state) { + + errno = 0; + + return 0; +} + +int main(void) { + + const struct CMUnitTest tests[] = { + + cmocka_unit_test(test__fl_utf_string_compare__works), + cmocka_unit_test(test__fl_utf_string_compare_trim__trims), + cmocka_unit_test(test__fl_utf_string_compare_trim__something_misses_nothing), + cmocka_unit_test(test__fl_utf_string_compare_trim__works), + cmocka_unit_test(test__fl_utf_string_dynamic_compare__works), + cmocka_unit_test(test__fl_utf_string_dynamic_compare_trim__trims), + cmocka_unit_test(test__fl_utf_string_dynamic_compare_trim__something_misses_nothing), + cmocka_unit_test(test__fl_utf_string_dynamic_compare_trim__works), + cmocka_unit_test(test__fl_utf_string_dynamic_partial_compare__works), + cmocka_unit_test(test__fl_utf_string_dynamic_partial_compare_trim__works), + + #ifndef _di_level_0_parameter_checking_ + // fl_utf_string_compare() doesn't use parameter checking. + // fl_utf_string_compare_trim() doesn't use parameter checking. + // fl_utf_string_dynamic_compare() doesn't use parameter checking. + // fl_utf_string_dynamic_compare_trim() doesn't use parameter checking. + // fl_utf_string_dynamic_partial_compare() doesn't use parameter checking. + // fl_utf_string_dynamic_partial_compare_trim() doesn't use parameter checking. + #endif // _di_level_0_parameter_checking_ + }; + + return cmocka_run_group_tests(tests, setup, setdown); +} + +f_status_t test_convert_dynamic_to_utf(const f_string_static_t dynamic, f_utf_string_dynamic_t * const utf) { + + f_status_t status = f_utf_string_dynamic_resize(dynamic.used, utf); + if (F_status_is_error(status)) return status; + + utf->used = 0; + + for (f_array_length_t i = 0; i < dynamic.used; ++i, ++utf->used) { + + status = f_utf_char_to_character(dynamic.string + i, dynamic.used - i, &utf->string[i]); + if (F_status_is_error(status)) return status; + } // for + + return F_none; +} + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/level_1/fl_utf/tests/unit/c/test-utf.h b/level_1/fl_utf/tests/unit/c/test-utf.h new file mode 100644 index 0000000..624f03f --- /dev/null +++ b/level_1/fl_utf/tests/unit/c/test-utf.h @@ -0,0 +1,96 @@ +/** + * FLL - Level 1 + * + * Project: Utf + * API Version: 0.6 + * Licenses: lgpl-2.1-or-later + * + * Test the utf project. + */ +#ifndef _TEST__FL_utf_h +#define _TEST__FL_utf_h + +// Libc includes. +#include +#include +#include +#include + +// cmocka includes. +#include + +// FLL-1 includes. +#include + +// Test includes. +#include "test-utf-string_compare.h" +#include "test-utf-string_compare_trim.h" +#include "test-utf-string_dynamic_compare.h" +#include "test-utf-string_dynamic_compare_trim.h" +#include "test-utf-string_dynamic_partial_compare.h" +#include "test-utf-string_dynamic_partial_compare_trim.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Back ported from 0.7.x here for convenience in tests. +extern const f_string_range_t f_string_range_empty_c; + +/** + * Perform any setup operations. + * + * @param state + * The test state. + * + * @return + * The status of this function, where 0 means success. + */ +extern int setup(void **state); + +/** + * Peform any setdown operations. + * + * @param state + * The test state. + * + * @return + * The status of this function, where 0 means success. + */ +extern int setdown(void **state); + +/** + * Run all tests. + * + * @return + * The final result of the tests. + * + * @see cmocka_run_group_tests() + * @see cmocka_unit_test() + */ +extern int main(void); + +/** + * Helper function for converting an entire dynamic string to a complete utf dynamic string. + * + * @param dynamic + * The source string. + * @param utf + * The UTF destination string. + * + * @return + * F_none on success. + * + * Errors (with error bit) from: f_utf_char_to_character(). + * Errors (with error bit) from: f_utf_string_dynamic_resize(). + * + * @see f_utf_char_to_character() + * @see f_utf_string_dynamic_resize() + */ +extern f_status_t test_convert_dynamic_to_utf(const f_string_static_t dynamic, f_utf_string_dynamic_t * const utf); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // _TEST__FL_utf_h