//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// <sstream>

// template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
// class basic_stringbuf

// int_type overflow(int_type c = traits::eof());

#include <sstream>
#include <cassert>

#include "test_macros.h"

int overflow_called = 0;

template <class CharT>
struct testbuf
    : public std::basic_stringbuf<CharT>
{
    typedef std::basic_stringbuf<CharT> base;
    explicit testbuf(const std::basic_string<CharT>& str,
                     std::ios_base::openmode which = std::ios_base::in | std::ios_base::out)
        : base(str, which) {}

    typename base::int_type
        overflow(typename base::int_type c = base::traits_type::eof())
        {++overflow_called; return base::overflow(c);}

    void pbump(int n) {base::pbump(n);}
};

int main(int, char**)
{
    {  // sanity check
    testbuf<char> tb("");
    tb.overflow();
    }
    {
        testbuf<char> sb("abc");
        assert(sb.sputc('1') == '1');
        assert(sb.str() == "1bc");
        assert(sb.sputc('2') == '2');
        assert(sb.str() == "12c");
        assert(sb.sputc('3') == '3');
        assert(sb.str() == "123");
        assert(sb.sputc('4') == '4');
        assert(sb.str() == "1234");
        assert(sb.sputc('5') == '5');
        assert(sb.str() == "12345");
        assert(sb.sputc('6') == '6');
        assert(sb.str() == "123456");
        assert(sb.sputc('7') == '7');
        assert(sb.str() == "1234567");
        assert(sb.sputc('8') == '8');
        assert(sb.str() == "12345678");
        assert(sb.sputc('9') == '9');
        assert(sb.str() == "123456789");
        assert(sb.sputc('0') == '0');
        assert(sb.str() == "1234567890");
        assert(sb.sputc('1') == '1');
        assert(sb.str() == "12345678901");
    }
    {
        testbuf<wchar_t> sb(L"abc");
        assert(sb.sputc(L'1') == L'1');
        assert(sb.str() == L"1bc");
        assert(sb.sputc(L'2') == L'2');
        assert(sb.str() == L"12c");
        assert(sb.sputc(L'3') == L'3');
        assert(sb.str() == L"123");
        assert(sb.sputc(L'4') == L'4');
        assert(sb.str() == L"1234");
        assert(sb.sputc(L'5') == L'5');
        assert(sb.str() == L"12345");
        assert(sb.sputc(L'6') == L'6');
        assert(sb.str() == L"123456");
        assert(sb.sputc(L'7') == L'7');
        assert(sb.str() == L"1234567");
        assert(sb.sputc(L'8') == L'8');
        assert(sb.str() == L"12345678");
        assert(sb.sputc(L'9') == L'9');
        assert(sb.str() == L"123456789");
        assert(sb.sputc(L'0') == L'0');
        assert(sb.str() == L"1234567890");
        assert(sb.sputc(L'1') == L'1');
        assert(sb.str() == L"12345678901");
    }
    {
        testbuf<char> sb("abc", std::ios_base::app | std::ios_base::out);
        assert(sb.sputc('1') == '1');
        assert(sb.str() == "abc1");
        assert(sb.sputc('2') == '2');
        assert(sb.str() == "abc12");
    }

  return 0;
}
