TC_rt_memcmp.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /*
  2. * Copyright (c) 2006-2024, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-05-06 Phillip Johnston the first version
  9. * 2024-12-24 Meco Man port to utest
  10. */
  11. #include <rtklibc.h>
  12. #include <utest.h>
  13. static void TC_rt_memcmp_str(void)
  14. {
  15. const char* s = "abc 123";
  16. uassert_int_equal(rt_memcmp("abc", "abc", 4), 0);
  17. uassert_int_equal(rt_memcmp(s, "abc", 3), 0);
  18. uassert_int_equal(rt_memcmp("abc", s, 3), 0);
  19. /* The following tests intentionally use a length > 3 */
  20. /* To test what rt_memcmp does in such a situation */
  21. uassert_value_greater(rt_memcmp(s, "abc", 6), 0);
  22. uassert_value_less(rt_memcmp("abc", s, 6), 0);
  23. }
  24. static void TC_rt_memcmp_int_array(void)
  25. {
  26. int arr1[] = {1, 2, 3, 4, 5};
  27. int arr2[] = {1, 2, 3, 4, 5};
  28. int arr3[] = {1, 2, 3, 4, 6};
  29. uassert_int_equal(rt_memcmp(arr1, arr2, sizeof(arr1)), 0);
  30. uassert_value_less(rt_memcmp(arr1, arr3, sizeof(arr1)), 0);
  31. uassert_value_greater(rt_memcmp(arr3, arr1, sizeof(arr1)), 0);
  32. }
  33. static void TC_rt_memcmp_float_array(void)
  34. {
  35. float arr1[] = {1.0f, 2.0f, 3.0f};
  36. float arr2[] = {1.0f, 2.0f, 3.0f};
  37. float arr3[] = {1.0f, 2.0f, 3.1f};
  38. uassert_int_equal(rt_memcmp(arr1, arr2, sizeof(arr1)), 0);
  39. uassert_value_less(rt_memcmp(arr1, arr3, sizeof(arr1)), 0);
  40. uassert_value_greater(rt_memcmp(arr3, arr1, sizeof(arr1)), 0);
  41. }
  42. typedef struct {
  43. int id;
  44. float value;
  45. } Item;
  46. static void TC_rt_memcmp_struct_array(void)
  47. {
  48. Item arr1[] = {{1, 1.0f}, {2, 2.0f}};
  49. Item arr2[] = {{1, 1.0f}, {2, 2.0f}};
  50. Item arr3[] = {{1, 1.0f}, {2, 2.1f}};
  51. uassert_int_equal(rt_memcmp(arr1, arr2, sizeof(arr1)), 0);
  52. uassert_value_less(rt_memcmp(arr1, arr3, sizeof(arr1)), 0);
  53. uassert_value_greater(rt_memcmp(arr3, arr1, sizeof(arr1)), 0);
  54. }
  55. typedef struct {
  56. int id;
  57. float value;
  58. char name[10];
  59. } MixedItem;
  60. static void TC_rt_memcmp_mixed_array(void)
  61. {
  62. MixedItem arr1[] = {{1, 1.0f, "item1"}, {2, 2.0f, "item2"}};
  63. MixedItem arr2[] = {{1, 1.0f, "item1"}, {2, 2.0f, "item2"}};
  64. MixedItem arr3[] = {{1, 1.0f, "item1"}, {2, 2.1f, "item2"}};
  65. uassert_int_equal(rt_memcmp(arr1, arr2, sizeof(arr1)), 0);
  66. uassert_value_less(rt_memcmp(arr1, arr3, sizeof(arr1)), 0);
  67. uassert_value_greater(rt_memcmp(arr3, arr1, sizeof(arr1)), 0);
  68. }
  69. typedef struct {
  70. int id;
  71. float score;
  72. } Student;
  73. typedef struct {
  74. Student students[3];
  75. char className[10];
  76. } Class;
  77. static void TC_rt_memcmp_nested_struct_array(void)
  78. {
  79. Class class1 = {
  80. .students = {{1, 90.5}, {2, 85.0}, {3, 92.0}},
  81. .className = "ClassA"
  82. };
  83. Class class2 = {
  84. .students = {{1, 90.5}, {2, 85.0}, {3, 92.0}},
  85. .className = "ClassA"
  86. };
  87. Class class3 = {
  88. .students = {{1, 90.5}, {2, 85.1}, {3, 92.0}},
  89. .className = "ClassA"
  90. };
  91. uassert_int_equal(rt_memcmp(&class1, &class2, sizeof(Class)), 0);
  92. uassert_int_not_equal(rt_memcmp(&class1, &class3, sizeof(Class)), 0);
  93. }
  94. static void TC_rt_memcmp_partial_match(void)
  95. {
  96. char arr1[] = "abcdefghijklmnopqrstuvwxyz";
  97. char arr2[] = "abcdefghijklmxyznopqrstuvw";
  98. uassert_int_equal(rt_memcmp(arr1, arr2, 13), 0);
  99. uassert_int_not_equal(rt_memcmp(arr1, arr2, sizeof(arr1)), 0);
  100. }
  101. #define LARGE_ARRAY_SIZE 500
  102. static void TC_rt_memcmp_large_array(void)
  103. {
  104. int *arr1 = rt_calloc(LARGE_ARRAY_SIZE, sizeof(int));
  105. int *arr2 = rt_calloc(LARGE_ARRAY_SIZE, sizeof(int));
  106. uassert_not_null(arr1);
  107. uassert_not_null(arr2);
  108. for (int i = 0; i < LARGE_ARRAY_SIZE; i++) {
  109. arr1[i] = i;
  110. arr2[i] = i;
  111. }
  112. uassert_int_equal(rt_memcmp(arr1, arr2, LARGE_ARRAY_SIZE * sizeof(int)), 0);
  113. arr2[LARGE_ARRAY_SIZE - 1] = LARGE_ARRAY_SIZE;
  114. uassert_value_less(rt_memcmp(arr1, arr2, LARGE_ARRAY_SIZE * sizeof(int)), 0);
  115. uassert_value_greater(rt_memcmp(arr2, arr1, LARGE_ARRAY_SIZE * sizeof(int)), 0);
  116. rt_free(arr1);
  117. rt_free(arr2);
  118. }
  119. static void utest_do_tc(void)
  120. {
  121. UTEST_UNIT_RUN(TC_rt_memcmp_str);
  122. UTEST_UNIT_RUN(TC_rt_memcmp_int_array);
  123. UTEST_UNIT_RUN(TC_rt_memcmp_float_array);
  124. UTEST_UNIT_RUN(TC_rt_memcmp_struct_array);
  125. UTEST_UNIT_RUN(TC_rt_memcmp_mixed_array);
  126. UTEST_UNIT_RUN(TC_rt_memcmp_nested_struct_array);
  127. UTEST_UNIT_RUN(TC_rt_memcmp_partial_match);
  128. UTEST_UNIT_RUN(TC_rt_memcmp_large_array);
  129. }
  130. UTEST_TC_EXPORT(utest_do_tc, "klibc.rt_memcmp", RT_NULL, RT_NULL, 1000);