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