//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//

// <locale>

// wbuffer_convert<Codecvt, Elem, Tr>

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

// This test is not entirely portable

// XFAIL: libcpp-has-no-wide-characters

#include <locale>
#include <codecvt>
#include <fstream>
#include <cassert>

#include "test_macros.h"

struct test_buf
    : public std::wbuffer_convert<std::codecvt_utf8<wchar_t> >
{
    typedef std::wbuffer_convert<std::codecvt_utf8<wchar_t> > base;
    typedef base::char_type   char_type;
    typedef base::int_type    int_type;
    typedef base::traits_type traits_type;

    explicit test_buf(std::streambuf* sb) : base(sb) {}

    char_type* pbase() const {return base::pbase();}
    char_type* pptr()  const {return base::pptr();}
    char_type* epptr() const {return base::epptr();}
    void gbump(int n) {base::gbump(n);}

    virtual int_type overflow(int_type c = traits_type::eof()) {return base::overflow(c);}
};

int main(int, char**)
{
    {
        std::ofstream bs("overflow.dat");
        test_buf f(bs.rdbuf());
        assert(f.pbase() == 0);
        assert(f.pptr() == 0);
        assert(f.epptr() == 0);
        assert(f.overflow(L'a') == L'a');
        assert(f.pbase() != 0);
        assert(f.pptr() == f.pbase());
        assert(f.epptr() - f.pbase() == 4095);
    }
    {
        std::ifstream bs("overflow.dat");
        test_buf f(bs.rdbuf());
        assert(f.sgetc() == L'a');
    }
    std::remove("overflow.dat");
    {
        std::ofstream bs("overflow.dat");
        test_buf f(bs.rdbuf());
        f.pubsetbuf(0, 0);
        assert(f.pbase() == 0);
        assert(f.pptr() == 0);
        assert(f.epptr() == 0);
        assert(f.overflow('a') == 'a');
        assert(f.pbase() == 0);
        assert(f.pptr() == 0);
        assert(f.epptr() == 0);
    }
    {
        std::ifstream bs("overflow.dat");
        test_buf f(bs.rdbuf());
        assert(f.sgetc() == L'a');
    }
    std::remove("overflow.dat");
    {
        std::ofstream bs("overflow.dat");
        test_buf f(bs.rdbuf());
        assert(f.sputc(0x4E51) == 0x4E51);
        assert(f.sputc(0x4E52) == 0x4E52);
        assert(f.sputc(0x4E53) == 0x4E53);
    }
    {
        std::ifstream f("overflow.dat");
        assert(f.is_open());
        assert(f.get() == 0xE4);
        assert(f.get() == 0xB9);
        assert(f.get() == 0x91);
        assert(f.get() == 0xE4);
        assert(f.get() == 0xB9);
        assert(f.get() == 0x92);
        assert(f.get() == 0xE4);
        assert(f.get() == 0xB9);
        assert(f.get() == 0x93);
        assert(f.get() == -1);
    }
    std::remove("overflow.dat");

  return 0;
}
