103 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// <sstream>10 11// template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >12// class basic_stringbuf13 14// int_type pbackfail(int_type c = traits::eof());15 16#include <sstream>17#include <cassert>18 19#include "test_macros.h"20 21template <class CharT>22struct testbuf23 : public std::basic_stringbuf<CharT>24{25 typedef std::basic_stringbuf<CharT> base;26 explicit testbuf(const std::basic_string<CharT>& str,27 std::ios_base::openmode which = std::ios_base::in | std::ios_base::out)28 : base(str, which) {}29 30 typename base::int_type31 pbackfail(typename base::int_type c = base::traits_type::eof())32 {return base::pbackfail(c);}33 34 void pbump(int n) {base::pbump(n);}35};36 37int main(int, char**)38{39 // check pbackfail40 {41 testbuf<char> tb("");42 tb.pbackfail();43 }44 {45 testbuf<char> sb("123", std::ios_base::in);46 assert(sb.sgetc() == '1');47 assert(sb.snextc() == '2');48 assert(sb.snextc() == '3');49 assert(sb.sgetc() == '3');50 assert(sb.snextc() == std::char_traits<char>::eof());51 assert(sb.pbackfail('3') == '3');52 assert(sb.pbackfail('3') == std::char_traits<char>::eof());53 assert(sb.pbackfail('2') == '2');54 assert(sb.pbackfail(std::char_traits<char>::eof()) != std::char_traits<char>::eof());55 assert(sb.pbackfail(std::char_traits<char>::eof()) == std::char_traits<char>::eof());56 assert(sb.str() == "123");57 }58 {59 testbuf<char> sb("123");60 assert(sb.sgetc() == '1');61 assert(sb.snextc() == '2');62 assert(sb.snextc() == '3');63 assert(sb.sgetc() == '3');64 assert(sb.snextc() == std::char_traits<char>::eof());65 assert(sb.pbackfail('3') == '3');66 assert(sb.pbackfail('3') == '3');67 assert(sb.pbackfail(std::char_traits<char>::eof()) != std::char_traits<char>::eof());68 assert(sb.pbackfail(std::char_traits<char>::eof()) == std::char_traits<char>::eof());69 assert(sb.str() == "133");70 }71#ifndef TEST_HAS_NO_WIDE_CHARACTERS72 {73 testbuf<wchar_t> sb(L"123", std::ios_base::in);74 assert(sb.sgetc() == L'1');75 assert(sb.snextc() == L'2');76 assert(sb.snextc() == L'3');77 assert(sb.sgetc() == L'3');78 assert(sb.snextc() == std::char_traits<wchar_t>::eof());79 assert(sb.pbackfail(L'3') == L'3');80 assert(sb.pbackfail(L'3') == std::char_traits<wchar_t>::eof());81 assert(sb.pbackfail(L'2') == L'2');82 assert(sb.pbackfail(std::char_traits<wchar_t>::eof()) != std::char_traits<wchar_t>::eof());83 assert(sb.pbackfail(std::char_traits<wchar_t>::eof()) == std::char_traits<wchar_t>::eof());84 assert(sb.str() == L"123");85 }86 {87 testbuf<wchar_t> sb(L"123");88 assert(sb.sgetc() == L'1');89 assert(sb.snextc() == L'2');90 assert(sb.snextc() == L'3');91 assert(sb.sgetc() == L'3');92 assert(sb.snextc() == std::char_traits<wchar_t>::eof());93 assert(sb.pbackfail(L'3') == L'3');94 assert(sb.pbackfail(L'3') == L'3');95 assert(sb.pbackfail(std::char_traits<wchar_t>::eof()) != std::char_traits<wchar_t>::eof());96 assert(sb.pbackfail(std::char_traits<wchar_t>::eof()) == std::char_traits<wchar_t>::eof());97 assert(sb.str() == L"133");98 }99#endif100 101 return 0;102}103