--- /dev/null
+#include "test-fss.h"
+#include "test-fss-count_slash.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void test__f_fss_count_slash__parameter_checking(void **state) {
+
+ const f_string_static_t test = macro_f_string_static_t_initialize_1("test", 4, 0);
+
+ f_number_unsigned_t count = 0;
+ f_range_t range = f_range_t_initialize;
+ f_state_t state_data = f_state_t_initialize;
+
+ {
+ f_fss_count_slash(test, 0, 0, &state_data);
+
+ assert_int_equal(state_data.status, F_status_set_error(F_parameter));
+ }
+
+ {
+ f_fss_count_slash(test, &range, 0, &state_data);
+
+ assert_int_equal(state_data.status, F_status_set_error(F_parameter));
+ }
+
+ {
+ f_fss_count_slash(test, 0, &count, &state_data);
+
+ assert_int_equal(state_data.status, F_status_set_error(F_parameter));
+ }
+}
+
+void test__f_fss_count_slash__returns_data_not(void **state) {
+
+ f_state_t state_data = f_state_t_initialize;
+ f_number_unsigned_t count = 0;
+ f_range_t range = f_range_t_initialize;
+
+ {
+ f_fss_count_slash(f_string_empty_s, &range, &count, &state_data);
+
+ assert_int_equal(state_data.status, F_data_not);
+ }
+}
+
+void test__f_fss_count_slash__works(void **state) {
+
+ const f_string_static_t buffers[] = {
+ macro_f_string_static_t_initialize_3("F_data_not", 0),
+ macro_f_string_static_t_initialize_3("none", 4),
+ macro_f_string_static_t_initialize_3("\\1", 2),
+ macro_f_string_static_t_initialize_3("\\\\two", 5),
+ macro_f_string_static_t_initialize_3("\\\\\\three", 8),
+ macro_f_string_static_t_initialize_3("\\⸙\n", 5),
+ macro_f_string_static_t_initialize_3("\\\\全全", 8),
+ macro_f_string_static_t_initialize_3("after\\", 6),
+ macro_f_string_static_t_initialize_3("e\\lse", 5),
+ macro_f_string_static_t_initialize_3("\\\0null", 6),
+ macro_f_string_static_t_initialize_3("\0\\null", 6),
+ macro_f_string_static_t_initialize_3("\\\0\\null", 7),
+ macro_f_string_static_t_initialize_3("\\\0\0\\null", 8),
+ macro_f_string_static_t_initialize_3("\\\\", 2),
+ macro_f_string_static_t_initialize_3("\\\\", 2),
+ macro_f_string_static_t_initialize_3("F_data_not", 10),
+ macro_f_string_static_t_initialize_3("\\́", 4), // Slash followed by U+0301.
+ macro_f_string_static_t_initialize_3("\\J", 5), // Slash followed by U+2060 then "J".
+ macro_f_string_static_t_initialize_3("\\\\́", 5), // Two slashes followed by U+0301.
+ macro_f_string_static_t_initialize_3("\\\\J", 6), // Two slashes followed by U+2060 then "J".
+ };
+
+ const f_number_unsigned_t counts[] = {
+ 0, // "F_data_not"
+ 0, // "none"
+ 1, // "\\1"
+ 2, // "\\\\two"
+ 3, // "\\\\\\three"
+ 1, // "\\⸙\n"
+ 2, // "\\\\全全"
+ 0, // "after\\"
+ 0, // "e\\lse"
+ 1, // "\\\0null"
+ 1, // "\0\\null"
+ 2, // "\\\0\\null"
+ 2, // "\\\0\0\\null"
+ 2, // "\\\\"
+ 1, // "\\\\"
+ 0, // "F_data_not"
+ 0, // "\\́"
+ 0, // "\\J"
+ 1, // "\\\\́"
+ 1, // "\\\\J"
+ };
+
+ const f_range_t ranges[] = {
+ macro_f_range_t_initialize_1(0, buffers[0].used), // "F_data_not"
+ macro_f_range_t_initialize_1(0, buffers[1].used), // "none"
+ macro_f_range_t_initialize_1(0, buffers[2].used), // "\\1"
+ macro_f_range_t_initialize_1(0, buffers[3].used), // "\\\\two"
+ macro_f_range_t_initialize_1(0, buffers[4].used), // "\\\\\\three"
+ macro_f_range_t_initialize_1(0, buffers[5].used), // "\\⸙\n"
+ macro_f_range_t_initialize_1(0, buffers[6].used), // "\\\\全全"
+ macro_f_range_t_initialize_1(0, buffers[7].used), // "after\\"
+ macro_f_range_t_initialize_1(0, buffers[8].used), // "e\\lse"
+ macro_f_range_t_initialize_1(0, buffers[9].used), // "\\\0null"
+ macro_f_range_t_initialize_1(0, buffers[10].used), // "\0\\null"
+ macro_f_range_t_initialize_1(0, buffers[11].used), // "\\\0\\null"
+ macro_f_range_t_initialize_1(0, buffers[12].used), // "\\\0\0\\null"
+ macro_f_range_t_initialize_1(0, buffers[13].used), // "\\"
+ macro_f_range_t_initialize_1(0, 0), // "\\"
+ macro_f_range_t_initialize_1(buffers[15].used + 1, 0), // "F_data_not"
+ macro_f_range_t_initialize_1(0, buffers[16].used), // "\\́"
+ macro_f_range_t_initialize_1(0, buffers[17].used), // "\\J"
+ macro_f_range_t_initialize_1(0, buffers[18].used), // "\\\\́"
+ macro_f_range_t_initialize_1(0, buffers[19].used), // "\\\\J"
+ };
+
+ const f_status_t statuss[] = {
+ F_data_not, // "F_data_not"
+ F_okay, // "none"
+ F_okay, // "\\1"
+ F_okay, // "\\\\two"
+ F_okay, // "\\\\\\three"
+ F_okay, // "\\⸙\n"
+ F_okay, // "\\\\全全"
+ F_okay, // "after\\"
+ F_okay, // "e\\lse"
+ F_okay, // "\\\0null"
+ F_okay, // "\0\\null"
+ F_okay, // "\\\0\\null"
+ F_okay, // "\\\0\0\\null"
+ F_okay_eos, // "\\"
+ F_okay_stop, // "\\"
+ F_data_not, // "F_data_not"
+ F_combarudoo, // "\\́"
+ F_bound, // "\\J"
+ F_combarudoo, // "\\\\́"
+ F_bound, // "\\\\J"
+ };
+
+ const f_number_unsigned_t starts[] = {
+ 0, // "F_data_not"
+ 0, // "none"
+ 1, // "\\1"
+ 2, // "\\\\two"
+ 3, // "\\\\\\three"
+ 1, // "\\⸙\n"
+ 2, // "\\\\全全"
+ 0, // "after\\"
+ 0, // "e\\lse"
+ 2, // "\\\0null"
+ 2, // "\0\\null"
+ 3, // "\\\0\\null"
+ 4, // "\\\0\0\\null"
+ 2, // "\\"
+ 1, // "\\"
+ buffers[15].used + 1, // "F_data_not"
+ 4, // "\\́"
+ 4, // "\\J"
+ 5, // "\\\\́"
+ 5, // "\\\\J"
+ };
+
+ for (uint8_t i = 0; i < 20; ++i) {
+
+ f_state_t state_data = f_state_t_initialize;
+ f_range_t range = ranges[i];
+ f_number_unsigned_t count = 0;
+
+ f_fss_count_slash(buffers[i], &range, &count, &state_data);
+
+ if (state_data.status != statuss[i]) {
+ printf("[ -------> ] --- [01] Failure with f_fss_count_slash(), with line %u '%s', status = %u, expecting %u.\n", i, buffers[i].string, state_data.status, statuss[i]);
+ }
+
+ assert_int_equal(state_data.status, statuss[i]);
+
+ if (count != counts[i]) {
+ printf("[ -------> ] --- [02] Failure with f_fss_count_slash(), with line %u '%s', count = %lu, expecting %lu.\n", i, buffers[i].string, count, counts[i]);
+ }
+
+ assert_int_equal(count, counts[i]);
+
+ if (range.start != starts[i]) {
+ printf("[ -------> ] --- [03] Failure with f_fss_count_slash(), with line %u '%s', range.start = %lu, expecting %lu.\n", i, buffers[i].string, range.start, starts[i]);
+ }
+
+ assert_int_equal(range.start, starts[i]);
+ } // for
+}
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
cmocka_unit_test(test__f_fss_apply_delimit_range__returns_data_not),
cmocka_unit_test(test__f_fss_count_lines__returns_data_not),
cmocka_unit_test(test__f_fss_count_lines_range__returns_data_not),
+ cmocka_unit_test(test__f_fss_count_slash__returns_data_not),
cmocka_unit_test(test__f_fss_seek_to_eol__returns_data_not),
cmocka_unit_test(test__f_fss_skip_past_combining_joiner__returns_data_not),
cmocka_unit_test(test__f_fss_skip_past_delimit__returns_data_not),
cmocka_unit_test(test__f_fss_apply_delimit_range__works),
cmocka_unit_test(test__f_fss_count_lines__works),
cmocka_unit_test(test__f_fss_count_lines_range__works),
+ cmocka_unit_test(test__f_fss_count_slash__works),
cmocka_unit_test(test__f_fss_is_combining__works),
cmocka_unit_test(test__f_fss_is_graph__works),
cmocka_unit_test(test__f_fss_is_space__works),
cmocka_unit_test(test__f_fss_apply_delimit_range__parameter_checking),
cmocka_unit_test(test__f_fss_count_lines__parameter_checking),
cmocka_unit_test(test__f_fss_count_lines_range__parameter_checking),
+ cmocka_unit_test(test__f_fss_count_slash__parameter_checking),
// f_fss_fail_utf() doesn't use parameter checking.
// f_fss_fail_utf_false() doesn't use parameter checking.
// f_fss_is_combining() doesn't use parameter checking.