Skip to content

Commit 6a4f012

Browse files
committed
Tests: basic_spanbuf improved tests for constructors and member functions
1 parent b2f234b commit 6a4f012

File tree

8 files changed

+912
-269
lines changed

8 files changed

+912
-269
lines changed

libcxx/test/std/input.output/span.streams/spanbuf/spanbuf.assign/move.pass.cpp

Lines changed: 318 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -24,54 +24,337 @@
2424
#include <spanstream>
2525

2626
#include "constexpr_char_traits.h"
27-
#include "test_convertible.h"
27+
#include "nasty_string.h"
2828
#include "test_macros.h"
2929

30+
template <typename CharT, typename TraitsT>
31+
struct TestSpanBuf : std::basic_spanbuf<CharT, TraitsT> {
32+
using std::basic_spanbuf<CharT, TraitsT>::basic_spanbuf;
33+
34+
TestSpanBuf(std::basic_spanbuf<CharT, TraitsT>&& rhs_p) : std::basic_spanbuf<CharT, TraitsT>(std::move(rhs_p)) {}
35+
36+
void check_postconditions(TestSpanBuf<CharT, TraitsT> const& rhs_p) const {
37+
assert(this->span().data() == rhs_p.span().data());
38+
assert(this->span().size() == rhs_p.span().size());
39+
assert(this->eback() == rhs_p.eback());
40+
assert(this->gptr() == rhs_p.gptr());
41+
assert(this->egptr() == rhs_p.egptr());
42+
assert(this->pbase() == rhs_p.pbase());
43+
assert(this->pptr() == rhs_p.pptr());
44+
assert(this->epptr() == rhs_p.epptr());
45+
assert(this->getloc() == rhs_p.getloc());
46+
}
47+
};
48+
49+
template <typename CharT, typename TraitsT = std::char_traits<CharT>>
50+
void test_postconditions() {
51+
using SpBuf = std::basic_spanbuf<CharT, TraitsT>;
52+
53+
// Empty `span`
54+
{
55+
// Mode: default
56+
{
57+
std::span<CharT> sp;
58+
TestSpanBuf<CharT, TraitsT> rhsSpBuf(sp);
59+
TestSpanBuf<CharT, TraitsT> spBuf = std::move(static_cast<SpBuf&>(rhsSpBuf));
60+
assert(rhsSpBuf.span().data() == nullptr);
61+
assert(spBuf.span().data() == nullptr);
62+
spBuf.check_postconditions(rhsSpBuf);
63+
}
64+
// Mode: `in`
65+
{
66+
std::span<CharT> sp;
67+
TestSpanBuf<CharT, TraitsT> rhsSpBuf(sp, std::ios_base::in);
68+
TestSpanBuf<CharT, TraitsT> spBuf = std::move(static_cast<SpBuf&>(rhsSpBuf));
69+
assert(rhsSpBuf.span().data() == nullptr);
70+
assert(spBuf.span().data() == nullptr);
71+
spBuf.check_postconditions(rhsSpBuf);
72+
}
73+
// Mode: `out`
74+
{
75+
std::span<CharT> sp;
76+
TestSpanBuf<CharT, TraitsT> rhsSpBuf(sp, std::ios_base::out);
77+
TestSpanBuf<CharT, TraitsT> spBuf = std::move(static_cast<SpBuf&>(rhsSpBuf));
78+
assert(rhsSpBuf.span().data() == nullptr);
79+
assert(spBuf.span().data() == nullptr);
80+
spBuf.check_postconditions(rhsSpBuf);
81+
}
82+
// Mode: multiple
83+
{
84+
std::span<CharT> sp;
85+
TestSpanBuf<CharT, TraitsT> rhsSpBuf(sp, std::ios_base::in | std::ios_base::out | std::ios_base::binary);
86+
TestSpanBuf<CharT, TraitsT> spBuf = std::move(static_cast<SpBuf&>(rhsSpBuf));
87+
assert(rhsSpBuf.span().data() == nullptr);
88+
assert(spBuf.span().data() == nullptr);
89+
spBuf.check_postconditions(rhsSpBuf);
90+
}
91+
// Mode: `ate`
92+
{
93+
std::span<CharT> sp;
94+
TestSpanBuf<CharT, TraitsT> rhsSpBuf(sp, std::ios_base::out | std::ios_base::ate);
95+
TestSpanBuf<CharT, TraitsT> spBuf = std::move(static_cast<SpBuf&>(rhsSpBuf));
96+
assert(rhsSpBuf.span().data() == nullptr);
97+
assert(spBuf.span().data() == nullptr);
98+
spBuf.check_postconditions(rhsSpBuf);
99+
}
100+
}
101+
102+
// Non-empty `span`
103+
{
104+
CharT arr[4];
105+
106+
// Mode: default
107+
{
108+
std::span<CharT> sp{arr};
109+
TestSpanBuf<CharT, TraitsT> rhsSpBuf(sp);
110+
TestSpanBuf<CharT, TraitsT> spBuf = std::move(static_cast<SpBuf&>(rhsSpBuf));
111+
assert(rhsSpBuf.span().data() == arr);
112+
assert(spBuf.span().data() == arr);
113+
spBuf.check_postconditions(rhsSpBuf);
114+
}
115+
// Mode: `in`
116+
{
117+
std::span<CharT> sp{arr};
118+
TestSpanBuf<CharT, TraitsT> rhsSpBuf(sp, std::ios_base::in);
119+
TestSpanBuf<CharT, TraitsT> spBuf = std::move(static_cast<SpBuf&>(rhsSpBuf));
120+
assert(rhsSpBuf.span().data() == arr);
121+
assert(spBuf.span().data() == arr);
122+
spBuf.check_postconditions(rhsSpBuf);
123+
}
124+
// Mode: `out`
125+
{
126+
std::span<CharT> sp{arr};
127+
TestSpanBuf<CharT, TraitsT> rhsSpBuf(sp, std::ios_base::out);
128+
TestSpanBuf<CharT, TraitsT> spBuf = std::move(static_cast<SpBuf&>(rhsSpBuf));
129+
assert(rhsSpBuf.span().data() == arr);
130+
assert(spBuf.span().data() == arr);
131+
spBuf.check_postconditions(rhsSpBuf);
132+
}
133+
// Mode: multiple
134+
{
135+
std::span<CharT> sp{arr};
136+
TestSpanBuf<CharT, TraitsT> rhsSpBuf(sp, std::ios_base::in | std::ios_base::out | std::ios_base::binary);
137+
TestSpanBuf<CharT, TraitsT> spBuf = std::move(static_cast<SpBuf&>(rhsSpBuf));
138+
assert(rhsSpBuf.span().data() == arr);
139+
assert(spBuf.span().data() == arr);
140+
spBuf.check_postconditions(rhsSpBuf);
141+
}
142+
// Mode: `ate`
143+
{
144+
std::span<CharT> sp{arr};
145+
TestSpanBuf<CharT, TraitsT> rhsSpBuf(sp, std::ios_base::out | std::ios_base::ate);
146+
TestSpanBuf<CharT, TraitsT> spBuf = std::move(static_cast<SpBuf&>(rhsSpBuf));
147+
assert(rhsSpBuf.span().data() == arr);
148+
assert(spBuf.span().data() == arr);
149+
spBuf.check_postconditions(rhsSpBuf);
150+
}
151+
}
152+
}
153+
30154
template <typename CharT, typename TraitsT = std::char_traits<CharT>>
31155
void test() {
32156
using SpBuf = std::basic_spanbuf<CharT, TraitsT>;
33157

34-
CharT arr[4];
35-
std::span<CharT> sp{arr};
158+
// Empty `span`
159+
{
160+
// Mode: default (`in` | `out`)
161+
{
162+
SpBuf rhsSpBuf;
163+
assert(rhsSpBuf.span().data() == nullptr);
164+
// Mode `out` counts read characters
165+
assert(rhsSpBuf.span().empty());
166+
assert(rhsSpBuf.span().size() == 0);
167+
168+
SpBuf spBuf = std::move(rhsSpBuf);
169+
assert(spBuf.span().data() == nullptr);
170+
// Mode `out` counts read characters
171+
assert(spBuf.span().empty());
172+
assert(spBuf.span().size() == 0);
173+
174+
// After move
175+
assert(rhsSpBuf.span().data() == nullptr);
176+
assert(rhsSpBuf.span().empty());
177+
assert(rhsSpBuf.span().size() == 0);
178+
}
179+
// Mode: `in`
180+
{
181+
SpBuf rhsSpBuf{std::ios_base::in};
182+
assert(rhsSpBuf.span().data() == nullptr);
183+
// Mode `out` counts read characters
184+
assert(rhsSpBuf.span().empty());
185+
assert(rhsSpBuf.span().size() == 0);
186+
187+
SpBuf spBuf = std::move(rhsSpBuf);
188+
assert(spBuf.span().data() == nullptr);
189+
assert(spBuf.span().empty());
190+
assert(spBuf.span().size() == 0);
191+
192+
// After move
193+
assert(rhsSpBuf.span().data() == nullptr);
194+
assert(rhsSpBuf.span().empty());
195+
assert(rhsSpBuf.span().size() == 0);
196+
}
197+
// Mode: `out`
198+
{
199+
SpBuf rhsSpBuf{std::ios_base::out};
200+
assert(rhsSpBuf.span().data() == nullptr);
201+
// Mode `out` counts read characters
202+
assert(rhsSpBuf.span().empty());
203+
assert(rhsSpBuf.span().size() == 0);
36204

37-
// TODO:
205+
SpBuf spBuf = std::move(rhsSpBuf);
206+
assert(spBuf.span().data() == nullptr);
207+
// Mode `out` counts read characters
208+
assert(spBuf.span().empty());
209+
assert(spBuf.span().size() == 0);
38210

39-
// Mode: default
211+
// After move
212+
assert(rhsSpBuf.span().data() == nullptr);
213+
// Mode `out` counts read characters
214+
assert(rhsSpBuf.span().empty());
215+
assert(rhsSpBuf.span().size() == 0);
216+
}
217+
// Mode: multiple
218+
{
219+
SpBuf rhsSpBuf{std::ios_base::out | std::ios_base::in | std::ios_base::binary};
220+
assert(rhsSpBuf.span().data() == nullptr);
221+
// Mode `out` counts read characters
222+
assert(rhsSpBuf.span().empty());
223+
assert(rhsSpBuf.span().size() == 0);
224+
225+
SpBuf spBuf = std::move(rhsSpBuf);
226+
assert(spBuf.span().data() == nullptr);
227+
// Mode `out` counts read characters
228+
assert(spBuf.span().empty());
229+
assert(spBuf.span().size() == 0);
230+
231+
// After move
232+
assert(rhsSpBuf.span().data() == nullptr);
233+
assert(rhsSpBuf.span().empty());
234+
assert(rhsSpBuf.span().size() == 0);
235+
}
236+
// Mode: `ate`
237+
{
238+
SpBuf rhsSpBuf{std::ios_base::ate};
239+
SpBuf spBuf = std::move(rhsSpBuf);
240+
assert(spBuf.span().data() == nullptr);
241+
assert(spBuf.span().empty());
242+
assert(spBuf.span().size() == 0);
243+
244+
// After move
245+
assert(rhsSpBuf.span().data() == nullptr);
246+
assert(rhsSpBuf.span().empty());
247+
assert(rhsSpBuf.span().size() == 0);
248+
}
249+
}
250+
251+
// Non-empty `span`
40252
{
41-
SpBuf rhsSpBuf{sp};
42-
SpBuf spBuf = std::move(rhsSpBuf);
43-
(void)spBuf;
44-
// assert(spBuf.span().data() == arr);
45-
// assert(!spBuf.span().empty());
46-
// assert(spBuf.span().size() == 4);
253+
CharT arr[4];
254+
std::span<CharT> sp{arr};
255+
256+
// Mode: default (`in` | `out`)
257+
{
258+
SpBuf rhsSpBuf{sp};
259+
assert(rhsSpBuf.span().data() == arr);
260+
// Mode `out` counts read characters
261+
assert(rhsSpBuf.span().empty());
262+
assert(rhsSpBuf.span().size() == 0);
263+
264+
SpBuf spBuf = std::move(rhsSpBuf);
265+
assert(spBuf.span().data() == arr);
266+
// Mode `out` counts read characters
267+
assert(spBuf.span().empty());
268+
assert(spBuf.span().size() == 0);
269+
270+
// After move
271+
assert(rhsSpBuf.span().data() == arr);
272+
assert(rhsSpBuf.span().empty());
273+
assert(rhsSpBuf.span().size() == 0);
274+
}
275+
// Mode: `in`
276+
{
277+
SpBuf rhsSpBuf{sp, std::ios_base::in};
278+
assert(rhsSpBuf.span().data() == arr);
279+
assert(!rhsSpBuf.span().empty());
280+
assert(rhsSpBuf.span().size() == 4);
281+
282+
SpBuf spBuf = std::move(rhsSpBuf);
283+
assert(spBuf.span().data() == arr);
284+
assert(!spBuf.span().empty());
285+
assert(spBuf.span().size() == 4);
286+
}
287+
// Mode `out`
288+
{
289+
SpBuf rhsSpBuf{sp, std::ios_base::out};
290+
assert(rhsSpBuf.span().data() == arr);
291+
// Mode `out` counts read characters
292+
assert(rhsSpBuf.span().empty());
293+
assert(rhsSpBuf.span().size() == 0);
294+
295+
SpBuf spBuf = std::move(rhsSpBuf);
296+
assert(spBuf.span().data() == arr);
297+
// Mode `out` counts read characters
298+
assert(spBuf.span().empty());
299+
assert(spBuf.span().size() == 0);
300+
301+
// After move
302+
assert(rhsSpBuf.span().data() == arr);
303+
assert(rhsSpBuf.span().empty());
304+
assert(rhsSpBuf.span().size() == 0);
305+
}
306+
// Mode: multiple
307+
{
308+
SpBuf rhsSpBuf{sp, std::ios_base::out | std::ios_base::in | std::ios_base::binary};
309+
assert(rhsSpBuf.span().data() == arr);
310+
// Mode `out` counts read characters
311+
assert(rhsSpBuf.span().empty());
312+
assert(rhsSpBuf.span().size() == 0);
313+
314+
SpBuf spBuf = std::move(rhsSpBuf);
315+
assert(spBuf.span().data() == arr);
316+
// Mode `out` counts read characters
317+
assert(spBuf.span().empty());
318+
assert(spBuf.span().size() == 0);
319+
320+
// After move
321+
assert(rhsSpBuf.span().data() == arr);
322+
assert(rhsSpBuf.span().empty());
323+
assert(rhsSpBuf.span().size() == 0);
324+
}
325+
// Mode: `ate`
326+
{
327+
SpBuf rhsSpBuf{sp, std::ios_base::ate};
328+
assert(rhsSpBuf.span().data() == arr);
329+
assert(!rhsSpBuf.span().empty());
330+
assert(rhsSpBuf.span().size() == 4);
331+
332+
SpBuf spBuf = std::move(rhsSpBuf);
333+
assert(spBuf.span().data() == arr);
334+
assert(!spBuf.span().empty());
335+
assert(spBuf.span().size() == 4);
336+
337+
// After move
338+
assert(rhsSpBuf.span().data() == arr);
339+
assert(!rhsSpBuf.span().empty());
340+
assert(rhsSpBuf.span().size() == 4);
341+
}
47342
}
48-
// // Mode: `ios_base::in`
49-
// {
50-
// SpBuf rhsSpBuf{sp, std::ios_base::in};
51-
// SpBuf spBuf = std::move(rhsSpBuf);
52-
// assert(spBuf.span().data() == arr);
53-
// assert(!spBuf.span().empty());
54-
// assert(spBuf.span().size() == 4);
55-
// }
56-
// // Mode `ios_base::out`
57-
// {
58-
// SpBuf rhsSpBuf{sp, std::ios_base::out};
59-
// SpBuf spBuf = std::move(rhsSpBuf);
60-
// assert(spBuf.span().data() == arr);
61-
// assert(spBuf.span().empty());
62-
// assert(spBuf.span().size() == 0);
63-
// }
64-
// // Mode: multiple
65-
// {
66-
// SpBuf rhsSpBuf{sp, std::ios_base::in | std::ios_base::out | std::ios_base::binary};
67-
// SpBuf spBuf = std::move(rhsSpBuf);
68-
// assert(spBuf.span().data() == arr);
69-
// assert(spBuf.span().empty());
70-
// assert(spBuf.span().size() == 0);
71-
// }
72343
}
73344

74345
int main(int, char**) {
346+
#ifndef TEST_HAS_NO_NASTY_STRING
347+
test_postconditions<nasty_char, nasty_char_traits>();
348+
#endif
349+
test_postconditions<char>();
350+
test_postconditions<char, constexpr_char_traits<char>>();
351+
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
352+
test_postconditions<wchar_t>();
353+
test_postconditions<wchar_t, constexpr_char_traits<wchar_t>>();
354+
#endif
355+
#ifndef TEST_HAS_NO_NASTY_STRING
356+
test<nasty_char, nasty_char_traits>();
357+
#endif
75358
test<char>();
76359
test<char, constexpr_char_traits<char>>();
77360
#ifndef TEST_HAS_NO_WIDE_CHARACTERS

0 commit comments

Comments
 (0)