#pragma once #include #include "intrusive_list.hpp" struct element_stub { element_stub() : node1(this) { } intrusive_node node1; }; struct twonode_stub { twonode_stub() : node1(this), node2(this) { } intrusive_node node1, node2; }; class intrusive_list_TestSuite : public CxxTest::TestSuite { public: void test_erases_on_destruction() { intrusive_list list { &element_stub::node1 }; TS_ASSERT( list.empty() ); { element_stub stub; list.push_back( & stub ); TS_ASSERT_EQUALS( list.size(), 1 ); } TS_ASSERT( list.empty() ); } void test_cannot_insert_twice() { intrusive_list list { &element_stub::node1 }; element_stub stub; list.push_back( & stub ); TS_ASSERT_THROWS( list.push_back( & stub ) , std::logic_error ); TS_ASSERT_EQUALS( list.size(), 1 ); } void test_insert_cannot_move() { intrusive_list list1 { &element_stub::node1 }; intrusive_list list2 { &element_stub::node1 }; element_stub stub; list1.push_back( & stub ); TS_ASSERT_THROWS( list2.push_back( & stub ) , std::logic_error ); TS_ASSERT( list2.empty() ); } void test_transfer_relocated_node() { intrusive_list list1 { &element_stub::node1 }; intrusive_list list2 { &element_stub::node1 }; element_stub stub; list1.push_back( & stub ); list2.transfer( list2.end(), & stub ); TS_ASSERT( list1.empty() ); TS_ASSERT_EQUALS( list2.size(), 1 ); } void test_element_with_multiple_nodes_can_be_in_multiple_lists() { intrusive_list list1 { &twonode_stub::node1 }; intrusive_list list2 { &twonode_stub::node2 }; twonode_stub stub; list1.push_back( & stub ); list2.push_back( & stub ); TS_ASSERT_EQUALS( list1.size(), 1 ); TS_ASSERT_EQUALS( list2.size(), 1 ); TS_ASSERT_EQUALS( &list1.front(), &list2.front() ); } };