intrusive_list.t.h 2.0 KB

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