intrusive_list.t.h 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  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. class intrusive_list_TestSuite : public CxxTest::TestSuite {
  9. public:
  10. void test_erases_on_destruction() {
  11. intrusive_list<element_stub> list { &element_stub::node1 };
  12. TS_ASSERT( list.empty() );
  13. {
  14. element_stub stub;
  15. list.push_back( & stub );
  16. TS_ASSERT_EQUALS( list.size(), 1 );
  17. }
  18. TS_ASSERT( list.empty() );
  19. }
  20. void test_cannot_insert_twice() {
  21. intrusive_list<element_stub> list { &element_stub::node1 };
  22. element_stub stub;
  23. list.push_back( & stub );
  24. TS_ASSERT_THROWS( list.push_back( & stub ) , std::logic_error );
  25. TS_ASSERT_EQUALS( list.size(), 1 );
  26. }
  27. void test_insert_cannot_move() {
  28. intrusive_list<element_stub> list1 { &element_stub::node1 };
  29. intrusive_list<element_stub> list2 { &element_stub::node1 };
  30. element_stub stub;
  31. list1.push_back( & stub );
  32. TS_ASSERT_THROWS( list2.push_back( & stub ) , std::logic_error );
  33. TS_ASSERT( list2.empty() );
  34. }
  35. void test_transfer_relocated_node() {
  36. intrusive_list<element_stub> list1 { &element_stub::node1 };
  37. intrusive_list<element_stub> list2 { &element_stub::node1 };
  38. element_stub stub;
  39. list1.push_back( & stub );
  40. list2.transfer( list2.end(), & stub );
  41. TS_ASSERT( list1.empty() );
  42. TS_ASSERT_EQUALS( list2.size(), 1 );
  43. }
  44. };