ReactOS 0.4.15-dev-7788-g1ad9096
sort_test.cpp
Go to the documentation of this file.
1#include <vector>
2#include <algorithm>
3#include <functional>
4
5#if defined (STLPORT) && defined (_STLP_DEBUG) && defined (_STLP_DEBUG_MODE_THROWS)
6# define _STLP_DO_CHECK_BAD_PREDICATE
7# include <stdexcept>
8#endif
9
11
12#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
13using namespace std;
14#endif
15
16//
17// TestCase class
18//
19class SortTest : public CPPUNIT_NS::TestCase
20{
28#if defined (_STLP_DO_CHECK_BAD_PREDICATE)
30#endif
32
33protected:
34 void sort1();
35 void sort2();
36 void sort3();
37 void sort4();
38 void stblsrt1();
39 void stblsrt2();
41
42 static bool string_less(const char* a_, const char* b_)
43 {
44 return strcmp(a_, b_) < 0 ? 1 : 0;
45 }
46};
47
49
50//
51// tests implementation
52//
54{
55 //Check that stable_sort do sort
56 int numbers[6] = { 1, 50, -10, 11, 42, 19 };
57 stable_sort(numbers, numbers + 6);
58 //-10 1 11 19 42 50
59 CPPUNIT_ASSERT(numbers[0]==-10);
60 CPPUNIT_ASSERT(numbers[1]==1);
61 CPPUNIT_ASSERT(numbers[2]==11);
62 CPPUNIT_ASSERT(numbers[3]==19);
63 CPPUNIT_ASSERT(numbers[4]==42);
64 CPPUNIT_ASSERT(numbers[5]==50);
65
66 char const* letters[6] = {"bb", "aa", "ll", "dd", "qq", "cc" };
67 stable_sort(letters, letters + 6, string_less);
68 // aa bb cc dd ll qq
69 CPPUNIT_ASSERT( strcmp(letters[0], "aa") == 0 );
70 CPPUNIT_ASSERT( strcmp(letters[1], "bb") == 0 );
71 CPPUNIT_ASSERT( strcmp(letters[2], "cc") == 0 );
72 CPPUNIT_ASSERT( strcmp(letters[3], "dd") == 0 );
73 CPPUNIT_ASSERT( strcmp(letters[4], "ll") == 0 );
74 CPPUNIT_ASSERT( strcmp(letters[5], "qq") == 0 );
75}
76
77struct Data {
78 Data(int index, int value)
80
81 bool operator == (const Data& other) const
82 { return m_index == other.m_index && m_value == other.m_value; }
83 bool operator < (const Data& other) const
84 { return m_value < other.m_value; }
85
86private:
88};
89
91{
92 //Check that stable_sort is stable:
93 Data datas[] = {
94 Data(0, 10),
95 Data(1, 8),
96 Data(2, 6),
97 Data(3, 6),
98 Data(4, 6),
99 Data(5, 4),
100 Data(6, 9)
101 };
102 stable_sort(datas, datas + 7);
103
104 CPPUNIT_ASSERT( datas[0] == Data(5, 4) );
105 CPPUNIT_ASSERT( datas[1] == Data(2, 6) );
106 CPPUNIT_ASSERT( datas[2] == Data(3, 6) );
107 CPPUNIT_ASSERT( datas[3] == Data(4, 6) );
108 CPPUNIT_ASSERT( datas[4] == Data(1, 8) );
109 CPPUNIT_ASSERT( datas[5] == Data(6, 9) );
110 CPPUNIT_ASSERT( datas[6] == Data(0, 10) );
111}
112
114{
115 int numbers[6] = { 1, 50, -10, 11, 42, 19 };
116
117 sort(numbers, numbers + 6);
118 // -10 1 11 19 42 50
119 CPPUNIT_ASSERT(numbers[0]==-10);
120 CPPUNIT_ASSERT(numbers[1]==1);
121 CPPUNIT_ASSERT(numbers[2]==11);
122 CPPUNIT_ASSERT(numbers[3]==19);
123 CPPUNIT_ASSERT(numbers[4]==42);
124 CPPUNIT_ASSERT(numbers[5]==50);
125}
126
128{
129 int numbers[] = { 1, 50, -10, 11, 42, 19 };
130
131 int count = sizeof(numbers) / sizeof(numbers[0]);
132 sort(numbers, numbers + count, greater<int>());
133
134 // 50 42 19 11 1 -10
135 CPPUNIT_ASSERT(numbers[5]==-10);
136 CPPUNIT_ASSERT(numbers[4]==1);
137 CPPUNIT_ASSERT(numbers[3]==11);
138 CPPUNIT_ASSERT(numbers[2]==19);
139 CPPUNIT_ASSERT(numbers[1]==42);
140 CPPUNIT_ASSERT(numbers[0]==50);
141}
142
144{
145 vector<bool> boolVector;
146
147 boolVector.push_back( true );
148 boolVector.push_back( false );
149
150 sort( boolVector.begin(), boolVector.end() );
151
152 CPPUNIT_ASSERT(boolVector[0]==false);
153 CPPUNIT_ASSERT(boolVector[1]==true);
154}
155
156/*
157 * A small utility class to check a potential compiler bug
158 * that can result in a bad sort algorithm behavior. The type
159 * _Tp of the SortTestFunc has to be SortTestAux without any
160 * reference qualifier.
161 */
163 SortTestAux (bool &b) : _b(b)
164 {}
165
167 _b = true;
168 }
169
170 bool &_b;
171
172private:
173 //explicitely defined as private to avoid warnings:
175};
176
177template <class _Tp>
178void SortTestFunc (_Tp) {
179}
180
182{
183 bool copy_constructor_called = false;
184 SortTestAux instance(copy_constructor_called);
185 SortTestAux &r_instance = instance;
186 SortTestAux const& rc_instance = instance;
187
188 SortTestFunc(r_instance);
189 CPPUNIT_ASSERT(copy_constructor_called);
190 copy_constructor_called = false;
191 SortTestFunc(rc_instance);
192 CPPUNIT_ASSERT(copy_constructor_called);
193}
194
195#if defined (_STLP_DO_CHECK_BAD_PREDICATE)
197{
198 int numbers[] = { 0, 0, 1, 0, 0, 1, 0, 0 };
199 try {
200 sort(numbers, numbers + sizeof(numbers) / sizeof(numbers[0]), less_equal<int>());
201
202 //Here is means that no exception has been raised
203 CPPUNIT_ASSERT( false );
204 }
205 catch (runtime_error const&)
206 { /*OK bad predicate has been detected.*/ }
207
208 try {
209 stable_sort(numbers, numbers + sizeof(numbers) / sizeof(numbers[0]), less_equal<int>());
210
211 //Here is means that no exception has been raised
212 CPPUNIT_ASSERT( false );
213 }
214 catch (runtime_error const&)
215 { /*OK bad predicate has been detected.*/ }
216}
217#endif
_STLP_MOVE_TO_STD_NAMESPACE void sort(_RandomAccessIter __first, _RandomAccessIter __last)
Definition: _algo.c:993
_STLP_MOVE_TO_STD_NAMESPACE void stable_sort(_RandomAccessIter __first, _RandomAccessIter __last)
Definition: _algo.c:1197
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
void sort2()
Definition: sort_test.cpp:127
CPPUNIT_TEST(stblsrt1)
void bad_predicate_detected()
void sort3()
Definition: sort_test.cpp:143
void stblsrt2()
Definition: sort_test.cpp:90
void sort1()
Definition: sort_test.cpp:113
CPPUNIT_TEST_SUITE_END()
CPPUNIT_TEST(stblsrt2)
CPPUNIT_TEST(sort4)
CPPUNIT_TEST_SUITE(SortTest)
void stblsrt1()
Definition: sort_test.cpp:53
CPPUNIT_TEST(sort2)
static bool string_less(const char *a_, const char *b_)
Definition: sort_test.cpp:42
CPPUNIT_TEST(sort1)
void sort4()
Definition: sort_test.cpp:181
CPPUNIT_TEST(sort3)
#define CPPUNIT_TEST(X)
Definition: cppunit_mini.h:182
#define CPPUNIT_TEST_SUITE_REGISTRATION(X)
Definition: cppunit_mini.h:193
#define CPPUNIT_ASSERT(X)
Definition: cppunit_mini.h:200
static HINSTANCE instance
Definition: main.c:40
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint index
Definition: glext.h:6031
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
int other
Definition: msacm.c:1376
Definition: features.h:417
void SortTestFunc(_Tp)
Definition: sort_test.cpp:178
int m_value
Definition: sort_test.cpp:87
int m_index
Definition: sort_test.cpp:87
bool operator<(const Data &other) const
Definition: sort_test.cpp:83
Data(int index, int value)
Definition: sort_test.cpp:78
bool operator==(const Data &other) const
Definition: sort_test.cpp:81
SortTestAux(SortTestAux const &other)
Definition: sort_test.cpp:166
SortTestAux & operator=(SortTestAux const &)
SortTestAux(bool &b)
Definition: sort_test.cpp:163
Definition: pdh_main.c:94