diff --git a/tests/unittests/test_common.c b/tests/unittests/test_common.c index e6b59956..327638a7 100644 --- a/tests/unittests/test_common.c +++ b/tests/unittests/test_common.c @@ -353,6 +353,113 @@ void test_get_expanded_path(void** state) { g_free(expanded_path); } +void test_strtoi_range_valid_input(void** state) { + int value; + gchar* err_msg = NULL; + gboolean result; + + result = strtoi_range("10", &value, 0, 20, &err_msg); + assert_true(result); + assert_int_equal(10, value); + assert_null(err_msg); + + result = strtoi_range("0", &value, 0, 20, &err_msg); + assert_true(result); + assert_int_equal(0, value); + assert_null(err_msg); + + result = strtoi_range("20", &value, 0, 20, &err_msg); + assert_true(result); + assert_int_equal(20, value); + assert_null(err_msg); + + result = strtoi_range("-5", &value, -10, 0, &err_msg); + assert_true(result); + assert_int_equal(-5, value); + assert_null(err_msg); +} + +void test_strtoi_range_out_of_range(void** state) { + int value; + gchar* err_msg = NULL; + gboolean result; + + // too low, negative + result = strtoi_range("-11", &value, -10, 0, &err_msg); + assert_false(result); + assert_string_equal("Value -11 out of range. Must be in -10..0.", err_msg); + g_free(err_msg); + err_msg = NULL; + + // too low + result = strtoi_range("-1", &value, 0, 10, &err_msg); + assert_false(result); + assert_string_equal("Value -1 out of range. Must be in 0..10.", err_msg); + g_free(err_msg); + err_msg = NULL; + + // too high + result = strtoi_range("11", &value, 0, 10, &err_msg); + assert_false(result); + assert_string_equal("Value 11 out of range. Must be in 0..10.", err_msg); + g_free(err_msg); + err_msg = NULL; +} + +void test_strtoi_range_invalid_input(void** state) { + int value; + gchar* err_msg = NULL; + gboolean result; + + // not a number + result = strtoi_range("profanity", &value, 0, 10, &err_msg); + assert_false(result); + assert_string_equal("Could not convert \"profanity\" to a number.", err_msg); + g_free(err_msg); + err_msg = NULL; + + // not a number, start with digits + result = strtoi_range("23kk", &value, 0, 10, &err_msg); + assert_false(result); + assert_string_equal("Could not convert \"23kk\" to a number.", err_msg); + g_free(err_msg); + err_msg = NULL; +} + +void test_strtoi_range_null_empty_input(void** state) { + int value; + gchar* err_msg = NULL; + gboolean result; + + // NULL input string + result = strtoi_range(NULL, &value, 0, 10, &err_msg); + assert_false(result); + assert_string_equal("'str' input pointer can not be NULL", err_msg); + g_free(err_msg); + err_msg = NULL; + + // Empty input string + result = strtoi_range("", &value, 0, 10, &err_msg); + assert_false(result); + assert_string_equal("Could not convert \"\" to a number.", err_msg); + g_free(err_msg); + err_msg = NULL; +} + +void test_strtoi_range_null_err_msg(void** state) { + int value; + gboolean result; + + // valid conversion, err_msg is NULL + result = strtoi_range("5", &value, 0, 10, NULL); + assert_true(result); + assert_int_equal(5, value); + + // invalid conversion, err_msg is NULL + result = strtoi_range("profanity", &value, 0, 10, NULL); + assert_false(result); +} + void test_string_to_verbosity(void** state) { int verbosity; gchar* err_msg = NULL; diff --git a/tests/unittests/test_common.h b/tests/unittests/test_common.h index 044534a6..d3c94786 100644 --- a/tests/unittests/test_common.h +++ b/tests/unittests/test_common.h @@ -36,3 +36,8 @@ void unique_filename_from_url_td(void** state); void format_call_external_argv_td(void** state); void test_get_expanded_path(void** state); void test_string_to_verbosity(void** state); +void test_strtoi_range_valid_input(void** state); +void test_strtoi_range_out_of_range(void** state); +void test_strtoi_range_invalid_input(void** state); +void test_strtoi_range_null_empty_input(void** state); +void test_strtoi_range_null_err_msg(void** state); diff --git a/tests/unittests/unittests.c b/tests/unittests/unittests.c index 693857eb..928523a5 100644 --- a/tests/unittests/unittests.c +++ b/tests/unittests/unittests.c @@ -96,6 +96,11 @@ main(int argc, char* argv[]) cmocka_unit_test(unique_filename_from_url_td), cmocka_unit_test(test_string_to_verbosity), cmocka_unit_test(test_get_expanded_path), + cmocka_unit_test(test_strtoi_range_valid_input), + cmocka_unit_test(test_strtoi_range_out_of_range), + cmocka_unit_test(test_strtoi_range_invalid_input), + cmocka_unit_test(test_strtoi_range_null_empty_input), + cmocka_unit_test(test_strtoi_range_null_err_msg), cmocka_unit_test(clear_empty), cmocka_unit_test(reset_after_create),