1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 // <sstream>
10
11 // template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
12 // class basic_stringbuf
13
14 // pos_type seekoff(off_type off, ios_base::seekdir way,
15 // ios_base::openmode which = ios_base::in | ios_base::out);
16
17 #include <sstream>
18 #include <cassert>
19
20 #include "test_macros.h"
21
main(int,char **)22 int main(int, char**)
23 {
24 {
25 std::stringbuf sb(std::ios_base::in);
26 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == -1);
27 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == -1);
28 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == -1);
29 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in | std::ios_base::out) == -1);
30 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in | std::ios_base::out) == -1);
31 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in | std::ios_base::out) == -1);
32 assert(sb.pubseekoff(0, std::ios_base::beg, std::ios_base::in) == 0);
33 assert(sb.pubseekoff(0, std::ios_base::cur, std::ios_base::in) == 0);
34 assert(sb.pubseekoff(0, std::ios_base::end, std::ios_base::in) == 0);
35 }
36 {
37 std::stringbuf sb(std::ios_base::out);
38 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == -1);
39 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == -1);
40 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == -1);
41 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in | std::ios_base::out) == -1);
42 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in | std::ios_base::out) == -1);
43 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in | std::ios_base::out) == -1);
44 assert(sb.pubseekoff(0, std::ios_base::beg, std::ios_base::out) == 0);
45 assert(sb.pubseekoff(0, std::ios_base::cur, std::ios_base::out) == 0);
46 assert(sb.pubseekoff(0, std::ios_base::end, std::ios_base::out) == 0);
47 }
48 {
49 std::stringbuf sb("0123456789", std::ios_base::in);
50 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == -1);
51 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == -1);
52 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == -1);
53 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in | std::ios_base::out) == -1);
54 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in | std::ios_base::out) == -1);
55 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in | std::ios_base::out) == -1);
56 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == 3);
57 assert(sb.sgetc() == '3');
58 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == 6);
59 assert(sb.sgetc() == '6');
60 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == 7);
61 assert(sb.sgetc() == '7');
62 }
63 {
64 std::stringbuf sb("0123456789", std::ios_base::out);
65 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == -1);
66 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == -1);
67 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == -1);
68 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out | std::ios_base::in) == -1);
69 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out | std::ios_base::in) == -1);
70 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out | std::ios_base::in) == -1);
71 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == 3);
72 assert(sb.sputc('a') == 'a');
73 assert(sb.str() == "012a456789");
74 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == 7);
75 assert(sb.sputc('b') == 'b');
76 assert(sb.str() == "012a456b89");
77 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == 7);
78 assert(sb.sputc('c') == 'c');
79 assert(sb.str() == "012a456c89");
80 }
81 {
82 std::stringbuf sb("0123456789");
83 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == 3);
84 assert(sb.sgetc() == '3');
85 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == 6);
86 assert(sb.sgetc() == '6');
87 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == 7);
88 assert(sb.sgetc() == '7');
89 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out | std::ios_base::in) == 3);
90 assert(sb.sgetc() == '3');
91 assert(sb.sputc('a') == 'a');
92 assert(sb.str() == "012a456789");
93 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out | std::ios_base::in) == -1);
94 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out | std::ios_base::in) == 7);
95 assert(sb.sgetc() == '7');
96 assert(sb.sputc('c') == 'c');
97 assert(sb.str() == "012a456c89");
98 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == 3);
99 assert(sb.sputc('3') == '3');
100 assert(sb.str() == "0123456c89");
101 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == 7);
102 assert(sb.sputc('7') == '7');
103 assert(sb.str() == "0123456789");
104 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == 7);
105 assert(sb.sputc('c') == 'c');
106 assert(sb.str() == "0123456c89");
107 }
108 {
109 std::wstringbuf sb(L"0123456789", std::ios_base::in);
110 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == -1);
111 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == -1);
112 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == -1);
113 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in | std::ios_base::out) == -1);
114 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in | std::ios_base::out) == -1);
115 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in | std::ios_base::out) == -1);
116 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == 3);
117 assert(sb.sgetc() == L'3');
118 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == 6);
119 assert(sb.sgetc() == L'6');
120 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == 7);
121 assert(sb.sgetc() == L'7');
122 }
123 {
124 std::wstringbuf sb(L"0123456789", std::ios_base::out);
125 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == -1);
126 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == -1);
127 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == -1);
128 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out | std::ios_base::in) == -1);
129 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out | std::ios_base::in) == -1);
130 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out | std::ios_base::in) == -1);
131 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == 3);
132 assert(sb.sputc(L'a') == L'a');
133 assert(sb.str() == L"012a456789");
134 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == 7);
135 assert(sb.sputc(L'b') == L'b');
136 assert(sb.str() == L"012a456b89");
137 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == 7);
138 assert(sb.sputc(L'c') == L'c');
139 assert(sb.str() == L"012a456c89");
140 }
141 {
142 std::wstringbuf sb(L"0123456789");
143 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::in) == 3);
144 assert(sb.sgetc() == L'3');
145 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::in) == 6);
146 assert(sb.sgetc() == L'6');
147 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::in) == 7);
148 assert(sb.sgetc() == L'7');
149 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out | std::ios_base::in) == 3);
150 assert(sb.sgetc() == L'3');
151 assert(sb.sputc(L'a') == L'a');
152 assert(sb.str() == L"012a456789");
153 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out | std::ios_base::in) == -1);
154 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out | std::ios_base::in) == 7);
155 assert(sb.sgetc() == L'7');
156 assert(sb.sputc(L'c') == L'c');
157 assert(sb.str() == L"012a456c89");
158 assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == 3);
159 assert(sb.sputc(L'3') == L'3');
160 assert(sb.str() == L"0123456c89");
161 assert(sb.pubseekoff(3, std::ios_base::cur, std::ios_base::out) == 7);
162 assert(sb.sputc(L'7') == L'7');
163 assert(sb.str() == L"0123456789");
164 assert(sb.pubseekoff(-3, std::ios_base::end, std::ios_base::out) == 7);
165 assert(sb.sputc(L'c') == L'c');
166 assert(sb.str() == L"0123456c89");
167 }
168
169 return 0;
170 }
171