]> Kevux Git Server - fll/commitdiff
Update: Add more f_compare unit tests and minor tweaks to f_compare.
authorKevin Day <kevin@kevux.org>
Tue, 28 Mar 2023 04:42:13 +0000 (23:42 -0500)
committerKevin Day <kevin@kevux.org>
Tue, 28 Mar 2023 04:42:13 +0000 (23:42 -0500)
29 files changed:
level_0/f_compare/c/compare.c
level_0/f_compare/c/compare.h
level_0/f_compare/c/private-compare.c
level_0/f_compare/data/build/settings-tests
level_0/f_compare/tests/unit/c/test-compare-.h
level_0/f_compare/tests/unit/c/test-compare-dynamic.h
level_0/f_compare/tests/unit/c/test-compare-dynamic_partial.c [new file with mode: 0644]
level_0/f_compare/tests/unit/c/test-compare-dynamic_partial.h [new file with mode: 0644]
level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_dynamic.c [new file with mode: 0644]
level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_dynamic.h [new file with mode: 0644]
level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_string.c [new file with mode: 0644]
level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_string.h [new file with mode: 0644]
level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim.c [new file with mode: 0644]
level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim.h [new file with mode: 0644]
level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim_dynamic.c [new file with mode: 0644]
level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim_dynamic.h [new file with mode: 0644]
level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim_string.c [new file with mode: 0644]
level_0/f_compare/tests/unit/c/test-compare-dynamic_partial_trim_string.h [new file with mode: 0644]
level_0/f_compare/tests/unit/c/test-compare-dynamic_string.h
level_0/f_compare/tests/unit/c/test-compare-dynamic_trim.c [new file with mode: 0644]
level_0/f_compare/tests/unit/c/test-compare-dynamic_trim.h [new file with mode: 0644]
level_0/f_compare/tests/unit/c/test-compare-dynamic_trim_string.c [new file with mode: 0644]
level_0/f_compare/tests/unit/c/test-compare-dynamic_trim_string.h [new file with mode: 0644]
level_0/f_compare/tests/unit/c/test-compare-except.c [new file with mode: 0644]
level_0/f_compare/tests/unit/c/test-compare-except.h [new file with mode: 0644]
level_0/f_compare/tests/unit/c/test-compare-trim.c [new file with mode: 0644]
level_0/f_compare/tests/unit/c/test-compare-trim.h [new file with mode: 0644]
level_0/f_compare/tests/unit/c/test-compare.c
level_0/f_compare/tests/unit/c/test-compare.h

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