/
solidbase
/
C3_s21_stringplus
Обзор
Документация
Войти
/
solidbase
/
C3_s21_stringplus
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
src/tests/test_sscanf.c
592 строки
19 KB
Dmitrii Isaev
earliema: Add scanset %[...] support
03 фев 2026, 13:07
03 фев 2026, 13:07
b1d36bf
Код
Авторство
О чём код?
#include <check.h> #include <math.h> #include <stdlib.h> #include <string.h> #include <wchar.h> #include "../s21_string.h" //------------------------------------------------------------------------------ // Tests for %d specifier (signed decimal integer) //------------------------------------------------------------------------------ START_TEST(sscanf_d_basic) { int s21_val = 0, std_val = 0; int s21_res = s21_sscanf("123", "%d", &s21_val); int std_res = sscanf("123", "%d", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_int_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_d_negative) { int s21_val = 0, std_val = 0; int s21_res = s21_sscanf("-456", "%d", &s21_val); int std_res = sscanf("-456", "%d", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_int_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_d_positive_sign) { int s21_val = 0, std_val = 0; int s21_res = s21_sscanf("+789", "%d", &s21_val); int std_res = sscanf("+789", "%d", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_int_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_d_with_spaces) { int s21_val = 0, std_val = 0; int s21_res = s21_sscanf(" 42", "%d", &s21_val); int std_res = sscanf(" 42", "%d", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_int_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_d_multiple) { int s21_a = 0, s21_b = 0, std_a = 0, std_b = 0; int s21_res = s21_sscanf("10 20", "%d %d", &s21_a, &s21_b); int std_res = sscanf("10 20", "%d %d", &std_a, &std_b); ck_assert_int_eq(s21_res, std_res); ck_assert_int_eq(s21_a, std_a); ck_assert_int_eq(s21_b, std_b); } END_TEST //------------------------------------------------------------------------------ // Tests for %c specifier (character) //------------------------------------------------------------------------------ START_TEST(sscanf_c_basic) { char s21_val = 0, std_val = 0; int s21_res = s21_sscanf("A", "%c", &s21_val); int std_res = sscanf("A", "%c", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_int_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_c_space) { char s21_val = 0, std_val = 0; int s21_res = s21_sscanf(" X", "%c", &s21_val); int std_res = sscanf(" X", "%c", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_int_eq(s21_val, std_val); } END_TEST //------------------------------------------------------------------------------ // Tests for %s specifier (string) //------------------------------------------------------------------------------ START_TEST(sscanf_s_basic) { char s21_val[50] = {0}, std_val[50] = {0}; int s21_res = s21_sscanf("Hello", "%s", s21_val); int std_res = sscanf("Hello", "%s", std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_str_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_s_with_spaces) { char s21_val[50] = {0}, std_val[50] = {0}; int s21_res = s21_sscanf(" World", "%s", s21_val); int std_res = sscanf(" World", "%s", std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_str_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_s_multiple) { char s21_a[50] = {0}, s21_b[50] = {0}, std_a[50] = {0}, std_b[50] = {0}; int s21_res = s21_sscanf("Hello World", "%s %s", s21_a, s21_b); int std_res = sscanf("Hello World", "%s %s", std_a, std_b); ck_assert_int_eq(s21_res, std_res); ck_assert_str_eq(s21_a, std_a); ck_assert_str_eq(s21_b, std_b); } END_TEST //------------------------------------------------------------------------------ // Tests for %i specifier (auto-detect base) //------------------------------------------------------------------------------ START_TEST(sscanf_i_decimal) { int s21_val = 0, std_val = 0; int s21_res = s21_sscanf("123", "%i", &s21_val); int std_res = sscanf("123", "%i", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_int_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_i_octal) { int s21_val = 0, std_val = 0; int s21_res = s21_sscanf("0755", "%i", &s21_val); int std_res = sscanf("0755", "%i", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_int_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_i_hex) { int s21_val = 0, std_val = 0; int s21_res = s21_sscanf("0x1A", "%i", &s21_val); int std_res = sscanf("0x1A", "%i", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_int_eq(s21_val, std_val); } END_TEST //------------------------------------------------------------------------------ // Tests for %u specifier (unsigned decimal) //------------------------------------------------------------------------------ START_TEST(sscanf_u_basic) { unsigned int s21_val = 0, std_val = 0; int s21_res = s21_sscanf("12345", "%u", &s21_val); int std_res = sscanf("12345", "%u", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_uint_eq(s21_val, std_val); } END_TEST //------------------------------------------------------------------------------ // Tests for %o specifier (octal) //------------------------------------------------------------------------------ START_TEST(sscanf_o_basic) { unsigned int s21_val = 0, std_val = 0; int s21_res = s21_sscanf("755", "%o", &s21_val); int std_res = sscanf("755", "%o", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_uint_eq(s21_val, std_val); } END_TEST //------------------------------------------------------------------------------ // Tests for %x/%X specifier (hexadecimal) //------------------------------------------------------------------------------ START_TEST(sscanf_x_lowercase) { unsigned int s21_val = 0, std_val = 0; int s21_res = s21_sscanf("ff", "%x", &s21_val); int std_res = sscanf("ff", "%x", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_uint_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_x_uppercase) { unsigned int s21_val = 0, std_val = 0; int s21_res = s21_sscanf("FF", "%X", &s21_val); int std_res = sscanf("FF", "%X", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_uint_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_x_with_prefix) { unsigned int s21_val = 0, std_val = 0; int s21_res = s21_sscanf("0xABCD", "%x", &s21_val); int std_res = sscanf("0xABCD", "%x", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_uint_eq(s21_val, std_val); } END_TEST //------------------------------------------------------------------------------ // Tests for %f, %e, %E, %g, %G specifiers (floating point) //------------------------------------------------------------------------------ START_TEST(sscanf_f_basic) { float s21_val = 0, std_val = 0; int s21_res = s21_sscanf("3.14", "%f", &s21_val); int std_res = sscanf("3.14", "%f", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_float_eq_tol(s21_val, std_val, 1e-6); } END_TEST START_TEST(sscanf_f_negative) { float s21_val = 0, std_val = 0; int s21_res = s21_sscanf("-2.718", "%f", &s21_val); int std_res = sscanf("-2.718", "%f", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_float_eq_tol(s21_val, std_val, 1e-6); } END_TEST START_TEST(sscanf_f_scientific) { float s21_val = 0, std_val = 0; int s21_res = s21_sscanf("1.5e10", "%f", &s21_val); int std_res = sscanf("1.5e10", "%f", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_float_eq_tol(s21_val, std_val, 1e4); } END_TEST START_TEST(sscanf_e_basic) { float s21_val = 0, std_val = 0; int s21_res = s21_sscanf("1.23e-4", "%e", &s21_val); int std_res = sscanf("1.23e-4", "%e", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_float_eq_tol(s21_val, std_val, 1e-10); } END_TEST START_TEST(sscanf_g_basic) { float s21_val = 0, std_val = 0; int s21_res = s21_sscanf("123.456", "%g", &s21_val); int std_res = sscanf("123.456", "%g", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_float_eq_tol(s21_val, std_val, 1e-3); } END_TEST //------------------------------------------------------------------------------ // Tests for %p specifier (pointer) //------------------------------------------------------------------------------ START_TEST(sscanf_p_basic) { void* s21_val = NULL; void* std_val = NULL; int s21_res = s21_sscanf("0x7fff5fbff8c8", "%p", &s21_val); int std_res = sscanf("0x7fff5fbff8c8", "%p", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_ptr_eq(s21_val, std_val); } END_TEST //------------------------------------------------------------------------------ // Tests for %n specifier (characters read count) //------------------------------------------------------------------------------ START_TEST(sscanf_n_basic) { int s21_val = 0, std_val = 0; int s21_n = 0, std_n = 0; int s21_res = s21_sscanf("12345", "%d%n", &s21_val, &s21_n); int std_res = sscanf("12345", "%d%n", &std_val, &std_n); ck_assert_int_eq(s21_res, std_res); ck_assert_int_eq(s21_val, std_val); ck_assert_int_eq(s21_n, std_n); } END_TEST //------------------------------------------------------------------------------ // Tests for %% specifier (literal percent) //------------------------------------------------------------------------------ START_TEST(sscanf_percent) { int s21_val = 0, std_val = 0; int s21_res = s21_sscanf("100%", "%d%%", &s21_val); int std_res = sscanf("100%", "%d%%", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_int_eq(s21_val, std_val); } END_TEST //------------------------------------------------------------------------------ // Tests for * (suppress assignment) //------------------------------------------------------------------------------ START_TEST(sscanf_suppress_d) { int s21_val = 0, std_val = 0; int s21_res = s21_sscanf("123 456", "%*d %d", &s21_val); int std_res = sscanf("123 456", "%*d %d", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_int_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_suppress_s) { char s21_val[50] = {0}, std_val[50] = {0}; int s21_res = s21_sscanf("Hello World", "%*s %s", s21_val); int std_res = sscanf("Hello World", "%*s %s", std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_str_eq(s21_val, std_val); } END_TEST //------------------------------------------------------------------------------ // Tests for width modifier //------------------------------------------------------------------------------ START_TEST(sscanf_width_d) { int s21_val = 0, std_val = 0; int s21_res = s21_sscanf("12345", "%3d", &s21_val); int std_res = sscanf("12345", "%3d", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_int_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_width_s) { char s21_val[50] = {0}, std_val[50] = {0}; int s21_res = s21_sscanf("HelloWorld", "%5s", s21_val); int std_res = sscanf("HelloWorld", "%5s", std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_str_eq(s21_val, std_val); } END_TEST //------------------------------------------------------------------------------ // Tests for length modifiers (h, l, L) //------------------------------------------------------------------------------ START_TEST(sscanf_hd) { short s21_val = 0, std_val = 0; int s21_res = s21_sscanf("32767", "%hd", &s21_val); int std_res = sscanf("32767", "%hd", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_int_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_ld) { long s21_val = 0, std_val = 0; int s21_res = s21_sscanf("2147483647", "%ld", &s21_val); int std_res = sscanf("2147483647", "%ld", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_int_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_hhd) { signed char s21_val = 0, std_val = 0; int s21_res = s21_sscanf("127", "%hhd", &s21_val); int std_res = sscanf("127", "%hhd", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_int_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_hhu) { unsigned char s21_val = 0, std_val = 0; int s21_res = s21_sscanf("255", "%hhu", &s21_val); int std_res = sscanf("255", "%hhu", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_uint_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_lld) { long long s21_val = 0, std_val = 0; int s21_res = s21_sscanf("9223372036854775807", "%lld", &s21_val); int std_res = sscanf("9223372036854775807", "%lld", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_int_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_llu) { unsigned long long s21_val = 0, std_val = 0; int s21_res = s21_sscanf("18446744073709551615", "%llu", &s21_val); int std_res = sscanf("18446744073709551615", "%llu", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_uint_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_lf) { double s21_val = 0, std_val = 0; int s21_res = s21_sscanf("3.141592653589793", "%lf", &s21_val); int std_res = sscanf("3.141592653589793", "%lf", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_double_eq_tol(s21_val, std_val, 1e-15); } END_TEST START_TEST(sscanf_Lf) { long double s21_val = 0, std_val = 0; int s21_res = s21_sscanf("3.14159265358979323846", "%Lf", &s21_val); int std_res = sscanf("3.14159265358979323846", "%Lf", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_ldouble_eq_tol(s21_val, std_val, 1e-18); } END_TEST START_TEST(sscanf_lc) { wchar_t s21_val = 0, std_val = 0; int s21_res = s21_sscanf("A", "%lc", &s21_val); int std_res = sscanf("A", "%lc", &std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_int_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_ls) { wchar_t s21_val[50] = {0}, std_val[50] = {0}; int s21_res = s21_sscanf("Hello", "%ls", s21_val); int std_res = sscanf("Hello", "%ls", std_val); ck_assert_int_eq(s21_res, std_res); for (int i = 0; s21_val[i] || std_val[i]; i++) { ck_assert_int_eq(s21_val[i], std_val[i]); } } END_TEST //------------------------------------------------------------------------------ // Tests for %[...] scanset specifier //------------------------------------------------------------------------------ START_TEST(sscanf_scanset_basic) { char s21_val[50] = {0}, std_val[50] = {0}; int s21_res = s21_sscanf("abc123", "%[abc]", s21_val); int std_res = sscanf("abc123", "%[abc]", std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_str_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_scanset_negated) { char s21_val[50] = {0}, std_val[50] = {0}; int s21_res = s21_sscanf("abc123", "%[^0-9]", s21_val); int std_res = sscanf("abc123", "%[^0-9]", std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_str_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_scanset_range) { char s21_val[50] = {0}, std_val[50] = {0}; int s21_res = s21_sscanf("hello123", "%[a-z]", s21_val); int std_res = sscanf("hello123", "%[a-z]", std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_str_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_scanset_digits) { char s21_val[50] = {0}, std_val[50] = {0}; int s21_res = s21_sscanf("12345abc", "%[0-9]", s21_val); int std_res = sscanf("12345abc", "%[0-9]", std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_str_eq(s21_val, std_val); } END_TEST START_TEST(sscanf_scanset_with_width) { char s21_val[50] = {0}, std_val[50] = {0}; int s21_res = s21_sscanf("abcdefgh", "%5[a-z]", s21_val); int std_res = sscanf("abcdefgh", "%5[a-z]", std_val); ck_assert_int_eq(s21_res, std_res); ck_assert_str_eq(s21_val, std_val); } END_TEST //------------------------------------------------------------------------------ // Create test suite //------------------------------------------------------------------------------ Suite* sscanf_suite(void) { Suite* s = suite_create("SSCANF Functions"); TCase* tc_d = tcase_create("sscanf_d"); tcase_add_test(tc_d, sscanf_d_basic); tcase_add_test(tc_d, sscanf_d_negative); tcase_add_test(tc_d, sscanf_d_positive_sign); tcase_add_test(tc_d, sscanf_d_with_spaces); tcase_add_test(tc_d, sscanf_d_multiple); suite_add_tcase(s, tc_d); TCase* tc_c = tcase_create("sscanf_c"); tcase_add_test(tc_c, sscanf_c_basic); tcase_add_test(tc_c, sscanf_c_space); suite_add_tcase(s, tc_c); TCase* tc_s = tcase_create("sscanf_s"); tcase_add_test(tc_s, sscanf_s_basic); tcase_add_test(tc_s, sscanf_s_with_spaces); tcase_add_test(tc_s, sscanf_s_multiple); suite_add_tcase(s, tc_s); TCase* tc_i = tcase_create("sscanf_i"); tcase_add_test(tc_i, sscanf_i_decimal); tcase_add_test(tc_i, sscanf_i_octal); tcase_add_test(tc_i, sscanf_i_hex); suite_add_tcase(s, tc_i); TCase* tc_u = tcase_create("sscanf_u"); tcase_add_test(tc_u, sscanf_u_basic); suite_add_tcase(s, tc_u); TCase* tc_o = tcase_create("sscanf_o"); tcase_add_test(tc_o, sscanf_o_basic); suite_add_tcase(s, tc_o); TCase* tc_x = tcase_create("sscanf_x"); tcase_add_test(tc_x, sscanf_x_lowercase); tcase_add_test(tc_x, sscanf_x_uppercase); tcase_add_test(tc_x, sscanf_x_with_prefix); suite_add_tcase(s, tc_x); TCase* tc_f = tcase_create("sscanf_f"); tcase_add_test(tc_f, sscanf_f_basic); tcase_add_test(tc_f, sscanf_f_negative); tcase_add_test(tc_f, sscanf_f_scientific); tcase_add_test(tc_f, sscanf_e_basic); tcase_add_test(tc_f, sscanf_g_basic); suite_add_tcase(s, tc_f); TCase* tc_p = tcase_create("sscanf_p"); tcase_add_test(tc_p, sscanf_p_basic); suite_add_tcase(s, tc_p); TCase* tc_n = tcase_create("sscanf_n"); tcase_add_test(tc_n, sscanf_n_basic); suite_add_tcase(s, tc_n); TCase* tc_percent = tcase_create("sscanf_percent"); tcase_add_test(tc_percent, sscanf_percent); suite_add_tcase(s, tc_percent); TCase* tc_suppress = tcase_create("sscanf_suppress"); tcase_add_test(tc_suppress, sscanf_suppress_d); tcase_add_test(tc_suppress, sscanf_suppress_s); suite_add_tcase(s, tc_suppress); TCase* tc_width = tcase_create("sscanf_width"); tcase_add_test(tc_width, sscanf_width_d); tcase_add_test(tc_width, sscanf_width_s); suite_add_tcase(s, tc_width); TCase* tc_length = tcase_create("sscanf_length"); tcase_add_test(tc_length, sscanf_hd); tcase_add_test(tc_length, sscanf_ld); tcase_add_test(tc_length, sscanf_hhd); tcase_add_test(tc_length, sscanf_hhu); tcase_add_test(tc_length, sscanf_lld); tcase_add_test(tc_length, sscanf_llu); tcase_add_test(tc_length, sscanf_lf); tcase_add_test(tc_length, sscanf_Lf); tcase_add_test(tc_length, sscanf_lc); tcase_add_test(tc_length, sscanf_ls); suite_add_tcase(s, tc_length); TCase* tc_scanset = tcase_create("sscanf_scanset"); tcase_add_test(tc_scanset, sscanf_scanset_basic); tcase_add_test(tc_scanset, sscanf_scanset_negated); tcase_add_test(tc_scanset, sscanf_scanset_range); tcase_add_test(tc_scanset, sscanf_scanset_digits); tcase_add_test(tc_scanset, sscanf_scanset_with_width); suite_add_tcase(s, tc_scanset); return s; } int main(void) { Suite* s = sscanf_suite(); SRunner* sr = srunner_create(s); printf("\033[1;33m"); srunner_run_all(sr, CK_NORMAL); int number_failed = srunner_ntests_failed(sr); srunner_free(sr); printf("\033[0m"); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; }