mem_copy_ut.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include "mem_copy.h"
  2. #include <library/cpp/testing/unittest/registar.h>
  3. namespace {
  4. class TAssignBCalled: public yexception {
  5. };
  6. struct TB {
  7. inline TB& operator=(const TB&) {
  8. throw TAssignBCalled();
  9. return *this;
  10. }
  11. };
  12. struct TC: public TB {
  13. };
  14. }
  15. Y_DECLARE_PODTYPE(TB);
  16. Y_UNIT_TEST_SUITE(TestMemCopy) {
  17. Y_UNIT_TEST(Test1) {
  18. char buf[] = "123";
  19. char buf1[sizeof(buf)];
  20. UNIT_ASSERT_EQUAL(MemCopy(buf1, buf, sizeof(buf)), buf1);
  21. for (size_t i = 0; i < sizeof(buf); ++i) {
  22. UNIT_ASSERT_VALUES_EQUAL(buf[i], buf1[i]);
  23. }
  24. }
  25. static int x = 0;
  26. struct TA {
  27. inline TA() {
  28. X = ++x;
  29. }
  30. int X;
  31. };
  32. Y_UNIT_TEST(Test2) {
  33. x = 0;
  34. TA a1[5];
  35. TA a2[5];
  36. UNIT_ASSERT_VALUES_EQUAL(a1[0].X, 1);
  37. UNIT_ASSERT_VALUES_EQUAL(a2[0].X, 6);
  38. MemCopy(a2, a1, 5);
  39. for (size_t i = 0; i < 5; ++i) {
  40. UNIT_ASSERT_VALUES_EQUAL(a1[i].X, a2[i].X);
  41. }
  42. }
  43. Y_UNIT_TEST(Test3) {
  44. TB b1[5];
  45. TB b2[5];
  46. MemCopy(b2, b1, 5);
  47. }
  48. Y_UNIT_TEST(Test4) {
  49. TC c1[5];
  50. TC c2[5];
  51. UNIT_ASSERT_EXCEPTION(MemCopy(c2, c1, 5), TAssignBCalled);
  52. }
  53. template <class T>
  54. inline void FillX(T* b, T* e) {
  55. int tmp = 0;
  56. while (b != e) {
  57. (b++)->X = ++tmp;
  58. }
  59. }
  60. Y_UNIT_TEST(Test5) {
  61. struct TD {
  62. int X;
  63. };
  64. TD orig[50];
  65. for (ssize_t i = -15; i < 15; ++i) {
  66. TD* b = orig + 20;
  67. TD* e = b + 10;
  68. FillX(b, e);
  69. TD* to = b + i;
  70. MemMove(to, b, e - b - 1);
  71. for (size_t j = 0; j < (e - b) - (size_t)1; ++j) {
  72. UNIT_ASSERT_VALUES_EQUAL(to[j].X, j + 1);
  73. }
  74. }
  75. }
  76. Y_UNIT_TEST(TestEmpty) {
  77. char* tmp = nullptr;
  78. UNIT_ASSERT(MemCopy(tmp, tmp, 0) == nullptr);
  79. UNIT_ASSERT(MemMove(tmp, tmp, 0) == nullptr);
  80. }
  81. }