1 /***********************************************************************************
2 test_list.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 #include "TestClass.h"
18 #include "LeakCheck.h"
19 # if defined (EH_NEW_HEADERS)
20 #include <list>
21 #else
22 #include <list.h>
23 #endif
24 #include "test_construct.h"
25 #include "test_assign_op.h"
26 #include "test_push_back.h"
27 #include "test_insert.h"
28 #include "test_push_front.h"
29 #include "nc_alloc.h"
30
31 typedef EH_STD::__list__<TestClass, eh_allocator(TestClass) > TestList;
32
33 inline sequence_container_tag
container_category(const TestList &)34 container_category(const TestList&)
35 {
36 return sequence_container_tag();
37 }
38
39 //
40 // list sort() member test operation. Does not verify stability.
41 //
42 struct test_list_sort
43 {
test_list_sorttest_list_sort44 test_list_sort()
45 {
46 gTestController.SetCurrentTestName("list::sort()");
47 }
48
operator ()test_list_sort49 void operator()( TestList& list ) const
50 {
51 list.sort();
52
53 gTestController.CancelFailureCountdown();
54
55 for ( TestList::iterator p = list.begin(); p != list.end(); p++ )
56 if ( p != list.begin() ) {
57 TestList::iterator tmp=p;
58 --tmp;
59 EH_ASSERT( *p >= *tmp );
60 }
61 }
62 };
63
test_list()64 void test_list()
65 {
66 TestList testList, testList2;
67 size_t listSize = random_number(random_base);
68
69 while ( testList.size() < listSize )
70 {
71 TestClass x;
72 testList.push_back( x );
73 testList2.push_back( TestClass() );
74 }
75
76 StrongCheck( testList, test_insert_one<TestList>(testList) );
77 StrongCheck( testList, test_insert_one<TestList>(testList, 0) );
78 StrongCheck( testList, test_insert_one<TestList>(testList, (int)testList.size()) );
79
80 WeakCheck( testList, test_insert_n<TestList>(testList, random_number(random_base) ) );
81 WeakCheck( testList, test_insert_n<TestList>(testList, random_number(random_base), 0 ) );
82 WeakCheck( testList, test_insert_n<TestList>(testList, random_number(random_base), (int)testList.size() ) );
83
84 size_t insCnt = random_number(random_base);
85 TestClass *insFirst = new TestList::value_type[1+insCnt];
86
87 WeakCheck( testList, insert_range_tester(testList, insFirst, insFirst+insCnt) );
88 WeakCheck( testList, insert_range_at_begin_tester(testList, insFirst, insFirst+insCnt) );
89 WeakCheck( testList, insert_range_at_end_tester(testList, insFirst, insFirst+insCnt) );
90
91 ConstCheck( 0, test_construct_pointer_range<TestList>(insFirst, insFirst+insCnt) );
92 delete[] insFirst;
93
94 WeakCheck( testList, insert_range_tester(testList, testList2.begin(), testList2.end() ) );
95
96 StrongCheck( testList, test_push_front<TestList>(testList) );
97 StrongCheck( testList, test_push_back<TestList>(testList) );
98
99 StrongCheck( testList, test_list_sort() ); // Simply to verify strength.
100
101 ConstCheck( 0, test_default_construct<TestList>() );
102 ConstCheck( 0, test_construct_n<TestList>( random_number(random_base) ) );
103 ConstCheck( 0, test_construct_n_instance<TestList>( random_number(random_base) ) );
104 ConstCheck( 0, test_construct_iter_range<TestList>( testList2 ) );
105 ConstCheck( testList, test_copy_construct<TestList>() );
106
107 WeakCheck( testList, test_assign_op<TestList>( testList2 ) );
108 }
109