1 /*********************************************************************************** 2 test_slist.cpp 3 4 * Copyright (c) 1997 5 * Mark of the Unicorn, Inc. 6 * 7 * Permission to use, copy, modify, distribute and sell this software 8 * and its documentation for any purpose is hereby granted without fee, 9 * provided that the above copyright notice appear in all copies and 10 * that both that copyright notice and this permission notice appear 11 * in supporting documentation. Mark of the Unicorn makes no 12 * representations about the suitability of this software for any 13 * purpose. It is provided "as is" without express or implied warranty. 14 15 ***********************************************************************************/ 16 #include "Tests.h" 17 #if defined( EH_SLIST_IMPLEMENTED ) 18 # include "TestClass.h" 19 # include "LeakCheck.h" 20 # if defined (EH_NEW_HEADERS) && defined (EH_USE_SGI_STL) 21 # include <slist> 22 # else 23 # include <slist.h> 24 # endif 25 #include "test_construct.h" 26 #include "test_assign_op.h" 27 #include "test_push_back.h" 28 #include "test_insert.h" 29 #include "test_push_front.h" 30 31 #if defined (__GNUC__) && defined (__APPLE__) 32 typedef EH_STD::slist<TestClass, eh_allocator(TestClass) > TestSList; 33 #else 34 typedef EH_STD::__slist__<TestClass, eh_allocator(TestClass) > TestSList; 35 #endif 36 37 inline sequence_container_tag 38 container_category(const TestSList&) { 39 return sequence_container_tag(); 40 } 41 42 struct test_slist_sort { 43 test_slist_sort() { 44 gTestController.SetCurrentTestName("slist::sort()"); 45 } 46 void operator()( TestSList& slist ) const { 47 slist.sort(); 48 for ( TestSList::iterator p = slist.begin(), q; p != slist.end(); q = p, p++ ) 49 if ( p != slist.begin() ) { 50 EH_ASSERT( *p >= *q ); 51 } 52 } 53 }; 54 55 void test_slist() { 56 TestSList testSList, testSList2; 57 size_t slistSize = random_number(random_base); 58 59 while (testSList.size() < slistSize) { 60 TestClass x; 61 testSList.push_front( x ); 62 testSList2.push_front( TestClass() ); 63 } 64 65 StrongCheck( testSList, test_insert_one<TestSList>(testSList) ); 66 StrongCheck( testSList, test_insert_one<TestSList>(testSList, 0) ); 67 StrongCheck( testSList, test_insert_one<TestSList>(testSList, (int)testSList.size()) ); 68 69 WeakCheck( testSList, test_insert_n<TestSList>(testSList, random_number(random_base) ) ); 70 WeakCheck( testSList, test_insert_n<TestSList>(testSList, random_number(random_base), 0 ) ); 71 WeakCheck( testSList, test_insert_n<TestSList>(testSList, random_number(random_base), (int)testSList.size() ) ); 72 73 size_t insCnt = random_number(random_base); 74 TestClass *insFirst = new TestSList::value_type[1+insCnt]; 75 WeakCheck( testSList, insert_range_tester(testSList, insFirst, insFirst+insCnt) ); 76 77 ConstCheck( 0, test_construct_pointer_range<TestSList>(insFirst, insFirst+insCnt) ); 78 delete[] insFirst; 79 WeakCheck( testSList, test_insert_range<TestSList,TestSList::iterator>(testSList, testSList2.begin(), testSList2.end() ) ); 80 StrongCheck( testSList, test_push_front<TestSList>(testSList) ); 81 StrongCheck( testSList, test_slist_sort() ); // Simply to verify strength. 82 83 ConstCheck( 0, test_default_construct<TestSList>() ); 84 ConstCheck( 0, test_construct_n<TestSList>( random_number(random_base) ) ); 85 ConstCheck( 0, test_construct_n_instance<TestSList>( random_number(random_base) ) ); 86 ConstCheck( 0, test_construct_iter_range<TestSList>( testSList2 ) ); 87 ConstCheck( testSList, test_copy_construct<TestSList>() ); 88 WeakCheck( testSList, test_assign_op<TestSList>( testSList2 ) ); 89 } 90 91 #endif // EH_SLIST_IMPLEMENTED 92