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 // int_type underflow();
15 
16 #include <sstream>
17 #include <cassert>
18 
19 #include "test_macros.h"
20 
21 template <class CharT>
22 struct testbuf
23     : public std::basic_stringbuf<CharT>
24 {
25     typedef std::basic_stringbuf<CharT> base;
26     explicit testbuf(const std::basic_string<CharT>& str)
27         : base(str) {}
28 
29     typename base::int_type underflow() {return base::underflow();}
30     void pbump(int n) {base::pbump(n);}
31 };
32 
33 int main(int, char**)
34 {
35     {
36         testbuf<char> sb("123");
37         sb.pbump(3);
38         assert(sb.underflow() == '1');
39         assert(sb.underflow() == '1');
40         assert(sb.snextc() == '2');
41         assert(sb.underflow() == '2');
42         assert(sb.underflow() == '2');
43         assert(sb.snextc() == '3');
44         assert(sb.underflow() == '3');
45         assert(sb.underflow() == '3');
46         assert(sb.snextc() == std::char_traits<char>::eof());
47         assert(sb.underflow() == std::char_traits<char>::eof());
48         assert(sb.underflow() == std::char_traits<char>::eof());
49         sb.sputc('4');
50         assert(sb.underflow() == '4');
51         assert(sb.underflow() == '4');
52     }
53     {
54         testbuf<wchar_t> sb(L"123");
55         sb.pbump(3);
56         assert(sb.underflow() == L'1');
57         assert(sb.underflow() == L'1');
58         assert(sb.snextc() == L'2');
59         assert(sb.underflow() == L'2');
60         assert(sb.underflow() == L'2');
61         assert(sb.snextc() == L'3');
62         assert(sb.underflow() == L'3');
63         assert(sb.underflow() == L'3');
64         assert(sb.snextc() == std::char_traits<wchar_t>::eof());
65         assert(sb.underflow() == std::char_traits<wchar_t>::eof());
66         assert(sb.underflow() == std::char_traits<wchar_t>::eof());
67         sb.sputc(L'4');
68         assert(sb.underflow() == L'4');
69         assert(sb.underflow() == L'4');
70     }
71 
72   return 0;
73 }
74