This only back ports unit tests for the functions that are present in 0.6.x.
--- /dev/null
+# 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
--- /dev/null
+# 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
--- /dev/null
+#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
--- /dev/null
+/**
+ * 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
--- /dev/null
+#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
--- /dev/null
+/**
+ * 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
--- /dev/null
+#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
--- /dev/null
+/**
+ * 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
--- /dev/null
+#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
--- /dev/null
+/**
+ * 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
--- /dev/null
+#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
--- /dev/null
+/**
+ * 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
--- /dev/null
+#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
--- /dev/null
+/**
+ * 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
--- /dev/null
+#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
--- /dev/null
+/**
+ * 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 <stdarg.h>
+#include <stddef.h>
+#include <setjmp.h>
+#include <stdint.h>
+
+// cmocka includes.
+#include <cmocka.h>
+
+// FLL-1 includes.
+#include <fll/level_1/utf.h>
+
+// 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