Skip to content

Commit 3b027fe

Browse files
committed
Add test for the size_t class
Verify the constructor and increment/decrement operators
1 parent fcd634a commit 3b027fe

File tree

3 files changed

+253
-1
lines changed

3 files changed

+253
-1
lines changed

include/boost/test/data/size.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ namespace data {
3030
// ************** size_t ************** //
3131
// ************************************************************************** //
3232

33-
//! Utility for handling the size of a datasets
33+
//! Utility for handling the size of a dataset
3434
class size_t {
3535
struct dummy { void nonnull() {} };
3636
typedef void (dummy::*safe_bool)();

test/Jamfile.v2

+1
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ test-suite "framework-ts"
150150
[ boost.test-self-test run : framework-ts : decorators-datatestcase-test : : : : : : $(requirements_datasets) ]
151151
[ compile-fail framework-ts/master-test-suite-non-copyable-test.cpp ../build//included ]
152152
[ boost.test-self-test run : framework-ts : log-count-skipped-test : included : baseline-outputs/log-count-skipped-tests.pattern ]
153+
[ boost.test-self-test run : framework-ts : dataset-size : included ]
153154

154155
# ticket 13371: "Use-after-free with --log_sink=file"
155156
# this single check is not enough as we should check for various command line options: we make extensive

test/framework-ts/dataset-size.cpp

+251
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
1+
// (C) Copyright Alexander Grund 2025.
2+
// Distributed under the Boost Software License, Version 1.0.
3+
// (See accompanying file LICENSE_1_0.txt or copy at
4+
// http://www.boost.org/LICENSE_1_0.txt)
5+
6+
#define BOOST_TEST_MODULE dataset size class
7+
#include <boost/test/unit_test.hpp>
8+
9+
#include <boost/test/data/size.hpp>
10+
#include <limits>
11+
12+
namespace data = boost::unit_test::data;
13+
14+
BOOST_AUTO_TEST_CASE(test_constructor)
15+
{
16+
data::size_t sz0;
17+
BOOST_TEST(!sz0.is_inf());
18+
BOOST_TEST(sz0.value() == 0u);
19+
BOOST_TEST(!sz0);
20+
21+
data::size_t sz2 = sz0;
22+
BOOST_TEST(!sz2.is_inf());
23+
BOOST_TEST(sz2.value() == 0u);
24+
BOOST_TEST(!sz2);
25+
26+
data::size_t sz1(42);
27+
BOOST_TEST(!sz1.is_inf());
28+
BOOST_TEST(sz1.value() == 42u);
29+
BOOST_TEST(!!sz1);
30+
31+
data::size_t sz3 = sz1;
32+
BOOST_TEST(!sz3.is_inf());
33+
BOOST_TEST(sz3.value() == 42u);
34+
BOOST_TEST(!!sz3);
35+
36+
data::size_t sz4(true);
37+
BOOST_TEST(sz4.is_inf());
38+
BOOST_TEST(sz4.value() == 0u);
39+
BOOST_TEST(!!sz4);
40+
41+
data::size_t sz5(false);
42+
BOOST_TEST(sz5.is_inf());
43+
BOOST_TEST(sz5.value() == 0u);
44+
BOOST_TEST(!!sz5);
45+
46+
sz2 = sz5;
47+
BOOST_TEST(sz2.is_inf());
48+
BOOST_TEST(sz2.value() == 0u);
49+
BOOST_TEST(!!sz2);
50+
51+
sz2 = sz1;
52+
BOOST_TEST(!sz2.is_inf());
53+
BOOST_TEST(sz2.value() == 42u);
54+
BOOST_TEST(!!sz2);
55+
}
56+
57+
BOOST_AUTO_TEST_CASE(test_unary_ops)
58+
{
59+
data::size_t sz(100);
60+
61+
data::size_t sz2 = ++sz;
62+
BOOST_TEST(!sz.is_inf());
63+
BOOST_TEST(sz.value() == 101u);
64+
BOOST_TEST(!sz2.is_inf());
65+
BOOST_TEST(sz2.value() == 101u);
66+
67+
sz2 = sz++;
68+
BOOST_TEST(!sz.is_inf());
69+
BOOST_TEST(sz.value() == 102u);
70+
BOOST_TEST(!sz2.is_inf());
71+
BOOST_TEST(sz2.value() == 101u);
72+
73+
sz2 = --sz;
74+
BOOST_TEST(!sz.is_inf());
75+
BOOST_TEST(sz.value() == 101u);
76+
BOOST_TEST(!sz2.is_inf());
77+
BOOST_TEST(sz2.value() == 101u);
78+
79+
sz2 = sz--;
80+
BOOST_TEST(!sz.is_inf());
81+
BOOST_TEST(sz.value() == 100u);
82+
BOOST_TEST(!sz2.is_inf());
83+
BOOST_TEST(sz2.value() == 101u);
84+
85+
// Over- and underflow
86+
BOOST_CONSTEXPR_OR_CONST std::size_t maxVal = (std::numeric_limits<size_t>::max)();
87+
sz = maxVal;
88+
sz2 = ++sz;
89+
BOOST_TEST(!sz.is_inf());
90+
BOOST_TEST(sz.value() == 0u);
91+
BOOST_TEST(!sz2.is_inf());
92+
BOOST_TEST(sz2.value() == 0u);
93+
94+
sz = maxVal;
95+
sz2 = sz++;
96+
BOOST_TEST(!sz.is_inf());
97+
BOOST_TEST(sz.value() == 0);
98+
BOOST_TEST(!sz2.is_inf());
99+
BOOST_TEST(sz2.value() == maxVal);
100+
101+
sz = 0;
102+
sz2 = --sz;
103+
BOOST_TEST(!sz.is_inf());
104+
BOOST_TEST(sz.value() == maxVal);
105+
BOOST_TEST(!sz2.is_inf());
106+
BOOST_TEST(sz2.value() == maxVal);
107+
108+
sz = 0;
109+
sz2 = sz--;
110+
BOOST_TEST(!sz.is_inf());
111+
BOOST_TEST(sz.value() == maxVal);
112+
BOOST_TEST(!sz2.is_inf());
113+
BOOST_TEST(sz2.value() == 0u);
114+
115+
//____________________________________________________________________________//
116+
sz = data::BOOST_TEST_DS_INFINITE_SIZE;
117+
sz2 = ++sz;
118+
BOOST_TEST(sz.is_inf());
119+
BOOST_TEST(sz.value() == 0u);
120+
BOOST_TEST(sz2.is_inf());
121+
BOOST_TEST(sz2.value() == 0u);
122+
123+
sz2 = sz++;
124+
BOOST_TEST(sz.is_inf());
125+
BOOST_TEST(sz.value() == 0u);
126+
BOOST_TEST(sz2.is_inf());
127+
BOOST_TEST(sz2.value() == 0u);
128+
129+
sz2 = --sz;
130+
BOOST_TEST(sz.is_inf());
131+
BOOST_TEST(sz.value() == 0u);
132+
BOOST_TEST(sz2.is_inf());
133+
BOOST_TEST(sz2.value() == 0u);
134+
135+
sz2 = sz--;
136+
BOOST_TEST(sz.is_inf());
137+
BOOST_TEST(sz.value() == 0u);
138+
BOOST_TEST(sz2.is_inf());
139+
BOOST_TEST(sz2.value() == 0u);
140+
}
141+
142+
BOOST_AUTO_TEST_CASE(test_binary_inc)
143+
{
144+
data::size_t sz(100);
145+
146+
sz += 5;
147+
BOOST_TEST(!sz.is_inf());
148+
BOOST_TEST(sz.value() == 105u);
149+
150+
sz += data::size_t(5);
151+
BOOST_TEST(!sz.is_inf());
152+
BOOST_TEST(sz.value() == 110u);
153+
154+
sz += data::BOOST_TEST_DS_INFINITE_SIZE;
155+
BOOST_TEST(sz.is_inf());
156+
BOOST_TEST(sz.value() == 0u);
157+
158+
//____________________________________________________________________________//
159+
sz = data::BOOST_TEST_DS_INFINITE_SIZE;
160+
161+
sz += 5;
162+
BOOST_TEST(sz.is_inf());
163+
BOOST_TEST(sz.value() == 0u);
164+
165+
sz += data::size_t(5);
166+
BOOST_TEST(sz.is_inf());
167+
BOOST_TEST(sz.value() == 0u);
168+
169+
sz += data::BOOST_TEST_DS_INFINITE_SIZE;
170+
BOOST_TEST(sz.is_inf());
171+
BOOST_TEST(sz.value() == 0u);
172+
173+
//____________________________________________________________________________//
174+
data::size_t sz2(100);
175+
176+
sz = sz2 + 5;
177+
BOOST_TEST(!sz.is_inf());
178+
BOOST_TEST(sz.value() == 105u);
179+
180+
sz = sz2 + data::size_t(5);
181+
BOOST_TEST(!sz.is_inf());
182+
BOOST_TEST(sz.value() == 105u);
183+
184+
sz = sz2 + data::BOOST_TEST_DS_INFINITE_SIZE;
185+
BOOST_TEST(sz.is_inf());
186+
BOOST_TEST(sz.value() == 0u);
187+
188+
//____________________________________________________________________________//
189+
sz2 = data::BOOST_TEST_DS_INFINITE_SIZE;
190+
191+
sz = sz2 + 5;
192+
BOOST_TEST(sz.is_inf());
193+
BOOST_TEST(sz.value() == 0u);
194+
195+
sz = sz2 + data::size_t(5);
196+
BOOST_TEST(sz.is_inf());
197+
BOOST_TEST(sz.value() == 0u);
198+
199+
sz = sz2 + data::BOOST_TEST_DS_INFINITE_SIZE;
200+
BOOST_TEST(sz.is_inf());
201+
BOOST_TEST(sz.value() == 0u);
202+
}
203+
204+
BOOST_AUTO_TEST_CASE(test_binary_dec)
205+
{
206+
data::size_t sz(100);
207+
208+
sz -= 5;
209+
BOOST_TEST(!sz.is_inf());
210+
BOOST_TEST(sz.value() == 95u);
211+
212+
sz -= data::size_t(5);
213+
BOOST_TEST(!sz.is_inf());
214+
BOOST_TEST(sz.value() == 90u);
215+
216+
sz -= data::BOOST_TEST_DS_INFINITE_SIZE;
217+
BOOST_TEST(!sz.is_inf());
218+
BOOST_TEST(sz.value() == 90u);
219+
220+
//____________________________________________________________________________//
221+
sz = data::BOOST_TEST_DS_INFINITE_SIZE;
222+
223+
sz -= 5;
224+
BOOST_TEST(sz.is_inf());
225+
BOOST_TEST(sz.value() == 0u);
226+
227+
sz -= data::size_t(5);
228+
BOOST_TEST(sz.is_inf());
229+
BOOST_TEST(sz.value() == 0u);
230+
231+
sz -= data::BOOST_TEST_DS_INFINITE_SIZE;
232+
BOOST_TEST(sz.is_inf());
233+
BOOST_TEST(sz.value() == 0u);
234+
235+
BOOST_CONSTEXPR_OR_CONST std::size_t maxVal = (std::numeric_limits<size_t>::max)();
236+
// Underflow is avoided for data::size_t values
237+
sz = 1;
238+
sz -= 5;
239+
BOOST_TEST(!sz.is_inf());
240+
BOOST_TEST(sz.value() == maxVal - 5u + 2u);
241+
242+
sz = 1;
243+
sz -= data::size_t(5);
244+
BOOST_TEST(!sz.is_inf());
245+
BOOST_TEST(sz.value() == 0u);
246+
247+
sz = 1;
248+
sz -= data::BOOST_TEST_DS_INFINITE_SIZE;
249+
BOOST_TEST(!sz.is_inf());
250+
BOOST_TEST(sz.value() == 1u);
251+
}

0 commit comments

Comments
 (0)