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