AlexSSH

Tests for DoublyLinkedList

Sep 26th, 2023 (edited)
153
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.89 KB | None | 0 0
  1. #include <iostream>
  2. #include <unordered_set>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. // -------- Шаблоны тестирующих функций ----------
  8. #pragma region TEST_LIB
  9.  
  10. template<typename T, typename U>
  11. void
  12. AssertEqualImpl(const T &t, const U &u, const std::string &t_str, const std::string &u_str, const std::string &file,
  13.                 const std::string &func, unsigned line, const std::string &hint) {
  14.     if (t != u) {
  15.         std::cout << std::boolalpha;
  16.         std::cout << file << "(" << line << "): " << func << ": ";
  17.         std::cout << "ASSERT_EQUAL(" << t_str << ", " << u_str << ") failed: ";
  18.         std::cout << t << " != " << u << ".";
  19.         if (!hint.empty()) {
  20.             std::cout << " Hint: " << hint;
  21.         }
  22.         std::cout << std::endl;
  23.         abort();
  24.     }
  25. }
  26.  
  27. #define ASSERT_EQUAL(a, b) AssertEqualImpl((a), (b), #a, #b, __FILE__, __FUNCTION__, __LINE__, ""s)
  28.  
  29. #define ASSERT_EQUAL_HINT(a, b, hint) AssertEqualImpl((a), (b), #a, #b, __FILE__, __FUNCTION__, __LINE__, (hint))
  30.  
  31. void
  32. AssertImpl(bool value, const std::string &expr_str, const std::string &file, const std::string &func, unsigned line,
  33.            const std::string &hint) {
  34.     if (!value) {
  35.         cout << file << "("s << line << "): "s << func << ": "s;
  36.         cout << "ASSERT("s << expr_str << ") failed."s;
  37.         if (!hint.empty()) {
  38.             cout << " Hint: "s << hint;
  39.         }
  40.         cout << endl;
  41.         abort();
  42.     }
  43. }
  44.  
  45. #define ASSERT(expr) AssertImpl(!!(expr), #expr, __FILE__, __FUNCTION__, __LINE__, ""s)
  46.  
  47. #define ASSERT_HINT(expr, hint) AssertImpl(!!(expr), #expr, __FILE__, __FUNCTION__, __LINE__, (hint))
  48.  
  49. template<typename T, typename U>
  50. void RunTestImpl(T &test, U &func) {
  51.     test();
  52.     std::cerr << func << " OK" << std::endl;
  53. }
  54.  
  55. #define RUN_TEST(func)  RunTestImpl((func), #func)
  56.  
  57. #pragma endregion TEST_LIB
  58. // -------- Конец шаблонов тестирующих функций ----------
  59.  
  60. // -------- DoublyLinkedList ----------
  61.  
  62. class DoublyLinkedListTester;
  63.  
  64. class DoublyLinkedList {
  65. public:
  66.     // ВАШИ МЕТОДЫ
  67.  
  68.     friend DoublyLinkedListTester;
  69.  
  70. private:
  71.     // ВАШИ ПОЛЯ
  72. };
  73.  
  74. class DoublyLinkedListTester {
  75. private:
  76.  
  77.     static vector<int> ListToVector(const DoublyLinkedList &list) {
  78.         vector<int> result;
  79.         auto current = list.head;
  80.         while (current) {
  81.             result.push_back(current->data);
  82.             current = current->next;
  83.         }
  84.         return result;
  85.     }
  86.  
  87.     static bool CompareList(const DoublyLinkedList &list, vector<int> expected) {
  88.         auto tmp = ListToVector(list);
  89.         return tmp == expected;
  90.     }
  91.  
  92.     // -------- Тестирующие функций ----------
  93.  
  94. #pragma region TESTS
  95.  
  96.     static void TestPushFront() {
  97.         DoublyLinkedList list;
  98.  
  99.         // Тестируем вставку в пустой список
  100.         list.pushFront(1);
  101.         ASSERT_EQUAL(list.size, 1);
  102.         list.popBack();
  103.         ASSERT_EQUAL(list.size, 0);
  104.  
  105.         // Тестируем вставку нескольких элементов
  106.         list.pushFront(2);
  107.         list.pushFront(3);
  108.         list.pushFront(4);
  109.         ASSERT_EQUAL(list.size, 3);
  110.         ASSERT(CompareList(list, {4, 3, 2}));
  111.  
  112.         // Проверяем порядок элементов
  113.         list.reverse();
  114.         ASSERT(CompareList(list, {2, 3, 4}));
  115.     }
  116.  
  117.     static void TestPushBack() {
  118.         DoublyLinkedList list;
  119.  
  120.         // Тестируем вставку в пустой список
  121.         list.pushBack(1);
  122.         ASSERT_EQUAL(list.size, 1);
  123.         list.popFront();
  124.         ASSERT_EQUAL(list.size, 0);
  125.  
  126.         // Тестируем вставку нескольких элементов
  127.         list.pushBack(2);
  128.         list.pushBack(3);
  129.         list.pushBack(4);
  130.         ASSERT_EQUAL(list.size, 3);
  131.         ASSERT(CompareList(list, {2, 3, 4}));
  132.  
  133.         // Проверяем порядок элементов
  134.         list.reverse();
  135.         ASSERT(CompareList(list, {4, 3, 2}));
  136.     }
  137.  
  138.     static void TestPopFront() {
  139.         DoublyLinkedList list;
  140.         list.pushBack(1);
  141.         list.pushBack(2);
  142.         list.pushBack(3);
  143.  
  144.         // Тестируем удаление из начала списка
  145.         list.popFront();
  146.         ASSERT_EQUAL(list.size, 2);
  147.         ASSERT(CompareList(list, {2, 3}));
  148.  
  149.         list.popFront();
  150.         list.popFront();
  151.         ASSERT_EQUAL(list.size, 0);
  152.  
  153.         // Попытка удаления из пустого списка
  154.         try {
  155.             list.popFront();
  156.             ASSERT(false); // Убедимся, что исключение не было брошено.
  157.         } catch (const std::runtime_error &) {
  158.             ASSERT(true); // Если исключение было брошено, то тест считается успешным.
  159.         }
  160.     }
  161.  
  162.     static void TestPopBack() {
  163.         DoublyLinkedList list;
  164.         list.pushBack(1);
  165.         list.pushBack(2);
  166.         list.pushBack(3);
  167.  
  168.         // Тестируем удаление из конца списка
  169.         list.popBack();
  170.         ASSERT_EQUAL(list.size, 2);
  171.         ASSERT(CompareList(list, {1, 2}));
  172.  
  173.         list.popBack();
  174.         list.popBack();
  175.         ASSERT_EQUAL(list.size, 0);
  176.  
  177.         // Попытка удаления из пустого списка
  178.         try {
  179.             list.popBack();
  180.             ASSERT(false); // Убедимся, что исключение не было брошено.
  181.         } catch (const std::runtime_error &) {
  182.             ASSERT(true); // Если исключение было брошено, то тест считается успешным.
  183.         }
  184.     }
  185.  
  186.     static void TestInsert() {
  187.         DoublyLinkedList list;
  188.         list.pushBack(1);
  189.         list.pushBack(3);
  190.  
  191.         // Тестируем вставку в середину списка
  192.         auto node1 = list.head;
  193.         list.insert(node1, 2);
  194.         ASSERT(CompareList(list, {1, 2, 3}));
  195.  
  196.         // Тестируем в конец
  197.         auto node2 = list.tail;
  198.         list.insert(node2, 4);
  199.         ASSERT(CompareList(list, {1, 2, 3, 4}));
  200.  
  201.         // Попытка вставки после некорректной позиции
  202.         DoublyLinkedList anotherList;
  203.         try {
  204.             anotherList.insert(nullptr, 42);
  205.             ASSERT(false); // Убедимся, что исключение не было брошено.
  206.         } catch (const std::runtime_error &) {
  207.             ASSERT(true); // Если исключение было брошено, то тест считается успешным.
  208.         }
  209.         anotherList.pushBack(1);
  210.         try {
  211.             list.insert(anotherList.head, 43);
  212.             ASSERT(false); // Убедимся, что исключение не было брошено.
  213.         } catch (const std::runtime_error &) {
  214.             ASSERT(true); // Если исключение было брошено, то тест считается успешным.
  215.         }
  216.     }
  217.  
  218.     static void TestPop() {
  219.         DoublyLinkedList list;
  220.         list.pushBack(1);
  221.         list.pushBack(2);
  222.         list.pushBack(3);
  223.  
  224.         // Тестируем удаление по указателю
  225.         auto node2 = list.head->next;
  226.         list.pop(node2);
  227.         ASSERT_EQUAL(list.size, 2);
  228.         ASSERT(CompareList(list, {1, 3}));
  229.  
  230.         auto node1 = list.head;
  231.         list.pop(node1);
  232.         ASSERT_EQUAL(list.size, 1);
  233.         ASSERT(CompareList(list, {3}));
  234.  
  235.         auto node3 = list.head;
  236.         list.pop(node3);
  237.         ASSERT_EQUAL(list.size, 0);
  238.  
  239.         // Попытка удаления с некорректным указателем
  240.         try {
  241.             list.pop(nullptr);
  242.             ASSERT(false); // Убедимся, что исключение не было брошено.
  243.         } catch (const std::runtime_error &) {
  244.             ASSERT(true); // Если исключение было брошено, то тест считается успешным.
  245.         }
  246.  
  247.         DoublyLinkedList anotherList;
  248.         try {
  249.             list.pop(anotherList.head);
  250.             ASSERT(false); // Убедимся, что исключение не было брошено.
  251.         } catch (const std::runtime_error &) {
  252.             ASSERT(true); // Если исключение было брошено, то тест считается успешным.
  253.         }
  254.     }
  255.  
  256.     static void TestErase() {
  257.         DoublyLinkedList list;
  258.         list.pushBack(1);
  259.         list.pushBack(2);
  260.         list.pushBack(3);
  261.  
  262.         // Тестируем полное удаление списка
  263.         list.erase();
  264.         ASSERT_EQUAL(list.size, 0);
  265.  
  266.         // Попытка удаления из пустого списка
  267.         try {
  268.             list.erase();
  269.             ASSERT(true); // Убедимся, что исключение не было брошено.
  270.         } catch (...) {
  271.             ASSERT(false); // Если исключение было брошено, то тест считается успешным.
  272.         }
  273.     }
  274.  
  275.     static void TestReverse() {
  276.         DoublyLinkedList list;
  277.         list.pushBack(1);
  278.         list.pushBack(2);
  279.         list.pushBack(3);
  280.  
  281.         // Тестируем обращение порядка элементов
  282.         list.reverse();
  283.         ASSERT(CompareList(list, {3, 2, 1}));
  284.     }
  285.  
  286.     static void TestRemoveDuplicates() {
  287.         DoublyLinkedList list;
  288.         list.pushBack(1);
  289.         list.pushBack(2);
  290.         list.pushBack(1);
  291.         list.pushBack(1);
  292.         list.pushBack(3);
  293.  
  294.         // Тестируем удаление дубликатов
  295.         list.removeDuplicates();
  296.         ASSERT(CompareList(list, {1, 2, 3}));
  297.     }
  298.  
  299.     static void TestReplace() {
  300.         DoublyLinkedList list;
  301.         list.pushBack(1);
  302.         list.pushBack(2);
  303.         list.pushBack(3);
  304.  
  305.         // Тестируем замену элементов
  306.         list.replace(2, 4);
  307.         ASSERT(CompareList(list, {1, 4, 3}));
  308.  
  309.         // Попытка замены элемента, который не входит в список
  310.         list.replace(5, 6);
  311.         ASSERT(CompareList(list, {1, 4, 3}));
  312.     }
  313.  
  314. #pragma endregion TESTS
  315.  
  316.     // -------- Конец тестирующих функций ----------
  317.  
  318. public:
  319.     static void Test() {
  320.         RUN_TEST(TestPushFront);
  321.         RUN_TEST(TestPushBack);
  322.         RUN_TEST(TestPopFront);
  323.         RUN_TEST(TestPopBack);
  324.         RUN_TEST(TestInsert);
  325.         RUN_TEST(TestPop);
  326.         RUN_TEST(TestErase);
  327.         RUN_TEST(TestReverse);
  328.         RUN_TEST(TestRemoveDuplicates);
  329.         RUN_TEST(TestReplace);
  330.     }
  331. };
  332.  
  333. // -------- DoublyLinkedList ----------
  334.  
  335. int main() {
  336.     DoublyLinkedListTester::Test();
  337.     return 0;
  338. }
Advertisement
Comments
  • AlexSSH
    2 years
    # text 0.20 KB | 0 0
    1. // Дополнительные методы класса нужные для тестов
    2. [[nodiscard]] int getSize() const { return size; }
    3.  
    4. [[nodiscard]] NodePtr getHead() const { return head; }
Add Comment
Please, Sign In to add comment