2323#include < spanstream>
2424
2525#include " constexpr_char_traits.h"
26- #include " test_convertible .h"
26+ #include " nasty_string .h"
2727#include " test_macros.h"
2828
2929template <typename CharT, typename TraitsT = std::char_traits<CharT>>
@@ -33,20 +33,78 @@ void test() {
3333 CharT arr[4 ];
3434 std::span<CharT> sp{arr};
3535
36- // TODO:
36+ // Mode: default (`in` | `out`)
37+ {
38+ SpBuf spBuf{sp};
39+ assert (spBuf.span ().data () == arr);
40+ // Mode `out` counts read characters
41+ assert (spBuf.span ().empty ());
42+ assert (spBuf.span ().size () == 0 );
3743
38- // Mode: default
44+ spBuf.pubsetbuf (nullptr , 0 );
45+ assert (spBuf.span ().data () == nullptr );
46+ // Mode `out` counts read characters
47+ assert (spBuf.span ().empty ());
48+ assert (spBuf.span ().size () == 0 );
49+ }
50+ // Mode: `ios_base::in`
3951 {
40- SpBuf rhsSpBuf{sp};
41- SpBuf spBuf (std::span<CharT>{});
42- spBuf.swap (rhsSpBuf);
43- // assert(spBuf.span().data() == arr);
44- // assert(!spBuf.span().empty());
45- // assert(spBuf.span().size() == 4);
52+ SpBuf spBuf{sp, std::ios_base::in};
53+ assert (spBuf.span ().data () == arr);
54+ assert (!spBuf.span ().empty ());
55+ assert (spBuf.span ().size () == 4 );
56+
57+ spBuf.pubsetbuf (nullptr , 0 );
58+ assert (spBuf.span ().data () == nullptr );
59+ assert (spBuf.span ().empty ());
60+ assert (spBuf.span ().size () == 0 );
61+ }
62+ // Mode `ios_base::out`
63+ {
64+ SpBuf spBuf{sp, std::ios_base::out};
65+ assert (spBuf.span ().data () == arr);
66+ // Mode `out` counts read characters
67+ assert (spBuf.span ().empty ());
68+ assert (spBuf.span ().size () == 0 );
69+
70+ spBuf.pubsetbuf (nullptr , 0 );
71+ assert (spBuf.span ().data () == nullptr );
72+ // Mode `out` counts read characters
73+ assert (spBuf.span ().empty ());
74+ assert (spBuf.span ().size () == 0 );
75+ }
76+ // Mode: multiple
77+ {
78+ SpBuf spBuf{sp, std::ios_base::in | std::ios_base::out | std::ios_base::binary};
79+ assert (spBuf.span ().data () == arr);
80+ // Mode `out` counts read characters
81+ assert (spBuf.span ().empty ());
82+ assert (spBuf.span ().size () == 0 );
83+
84+ spBuf.pubsetbuf (nullptr , 0 );
85+ assert (spBuf.span ().data () == nullptr );
86+ // Mode `out` counts read characters
87+ assert (spBuf.span ().empty ());
88+ assert (spBuf.span ().size () == 0 );
89+ }
90+ // Mode: `ios_base::ate`
91+ {
92+ SpBuf spBuf{sp, std::ios_base::out | std::ios_base::ate};
93+ assert (spBuf.span ().data () == arr);
94+ assert (!spBuf.span ().empty ());
95+ assert (spBuf.span ().size () == 4 );
96+
97+ spBuf.pubsetbuf (nullptr , 0 );
98+ assert (spBuf.span ().data () == nullptr );
99+ assert (spBuf.span ().empty ());
100+ assert (spBuf.span ().size () == 0 );
46101 }
47102}
48103
49104int main (int , char **) {
105+ #ifndef TEST_HAS_NO_NASTY_STRING
106+ test<nasty_char, nasty_char_traits>();
107+ #endif
50108 test<char >();
51109 test<char , constexpr_char_traits<char >>();
52110#ifndef TEST_HAS_NO_WIDE_CHARACTERS
0 commit comments