intrusive_list.t.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #pragma once
  2. #include <cxxtest/TestSuite.h>
  3. #include "intrusive_list.hpp"
  4. class element_stub {
  5. public:
  6. element_stub()
  7. : node1( this ) {
  8. }
  9. intrusive_node<element_stub> node1;
  10. };
  11. class intrusive_list_TestSuite : public CxxTest::TestSuite {
  12. public:
  13. void test_erases_on_destruction() {
  14. intrusive_list<element_stub> list { &element_stub::node1 };
  15. TS_ASSERT( list.empty() );
  16. {
  17. element_stub stub;
  18. list.push_back( & stub );
  19. TS_ASSERT_EQUALS( list.size(), 1 );
  20. }
  21. TS_ASSERT( list.empty() );
  22. }
  23. void test_cannot_insert_twice() {
  24. intrusive_list<element_stub> list { &element_stub::node1 };
  25. element_stub stub;
  26. list.push_back( & stub );
  27. TS_ASSERT_THROWS( list.push_back( & stub ) , std::logic_error );
  28. TS_ASSERT_EQUALS( list.size(), 1 );
  29. }
  30. void test_insert_cannot_move() {
  31. intrusive_list<element_stub> list1 { &element_stub::node1 };
  32. intrusive_list<element_stub> list2 { &element_stub::node1 };
  33. element_stub stub;
  34. list1.push_back( & stub );
  35. TS_ASSERT_THROWS( list2.push_back( & stub ) , std::logic_error );
  36. TS_ASSERT( list2.empty() );
  37. }
  38. void test_transfer_relocated_node() {
  39. intrusive_list<element_stub> list1 { &element_stub::node1 };
  40. intrusive_list<element_stub> list2 { &element_stub::node1 };
  41. element_stub stub;
  42. list1.push_back( & stub );
  43. list2.transfer( list2.end(), & stub );
  44. TS_ASSERT( list1.empty() );
  45. TS_ASSERT_EQUALS( list2.size(), 1 );
  46. }
  47. };