brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.4 KiB · 9016143 Raw
150 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// REQUIRES: locale.en_US.UTF-810 11// <fstream>12 13// int_type overflow(int_type c = traits::eof());14 15// This test is not entirely portable16 17#include <fstream>18#include <cassert>19 20#include "test_macros.h"21#include "platform_support.h" // locale name macros22 23template <class CharT>24struct test_buf25    : public std::basic_filebuf<CharT>26{27    typedef std::basic_filebuf<CharT>  base;28    typedef typename base::char_type   char_type;29    typedef typename base::int_type    int_type;30    typedef typename base::traits_type traits_type;31 32    char_type* pbase() const {return base::pbase();}33    char_type* pptr()  const {return base::pptr();}34    char_type* epptr() const {return base::epptr();}35    void gbump(int n) {base::gbump(n);}36 37    virtual int_type overflow(int_type c = traits_type::eof()) {return base::overflow(c);}38};39 40int main(int, char**)41{42    {43        test_buf<char> f;44        assert(f.open("overflow.dat", std::ios_base::out) != 0);45        assert(f.is_open());46        assert(f.pbase() == 0);47        assert(f.pptr() == 0);48        assert(f.epptr() == 0);49        assert(f.overflow('a') == 'a');50        assert(f.pbase() != 0);51        assert(f.pptr() == f.pbase());52        assert(f.epptr() - f.pbase() == 4095);53    }54    {55        test_buf<char> f;56        assert(f.open("overflow.dat", std::ios_base::in) != 0);57        assert(f.is_open());58        assert(f.sgetc() == 'a');59    }60    std::remove("overflow.dat");61    {62        test_buf<char> f;63        f.pubsetbuf(0, 0);64        assert(f.open("overflow.dat", std::ios_base::out) != 0);65        assert(f.is_open());66        assert(f.pbase() == 0);67        assert(f.pptr() == 0);68        assert(f.epptr() == 0);69        assert(f.overflow('a') == 'a');70        assert(f.pbase() == 0);71        assert(f.pptr() == 0);72        assert(f.epptr() == 0);73    }74    {75        test_buf<char> f;76        assert(f.open("overflow.dat", std::ios_base::in) != 0);77        assert(f.is_open());78        assert(f.sgetc() == 'a');79    }80    std::remove("overflow.dat");81 82#ifndef TEST_HAS_NO_WIDE_CHARACTERS83    {84        test_buf<wchar_t> f;85        assert(f.open("overflow.dat", std::ios_base::out) != 0);86        assert(f.is_open());87        assert(f.pbase() == 0);88        assert(f.pptr() == 0);89        assert(f.epptr() == 0);90        assert(f.overflow(L'a') == L'a');91        assert(f.pbase() != 0);92        assert(f.pptr() == f.pbase());93        assert(f.epptr() - f.pbase() == 4095);94    }95    {96        test_buf<wchar_t> f;97        assert(f.open("overflow.dat", std::ios_base::in) != 0);98        assert(f.is_open());99        assert(f.sgetc() == L'a');100    }101    std::remove("overflow.dat");102    {103        test_buf<wchar_t> f;104        f.pubsetbuf(0, 0);105        assert(f.open("overflow.dat", std::ios_base::out) != 0);106        assert(f.is_open());107        assert(f.pbase() == 0);108        assert(f.pptr() == 0);109        assert(f.epptr() == 0);110        assert(f.overflow(L'a') == L'a');111        assert(f.pbase() == 0);112        assert(f.pptr() == 0);113        assert(f.epptr() == 0);114    }115    {116        test_buf<wchar_t> f;117        assert(f.open("overflow.dat", std::ios_base::in) != 0);118        assert(f.is_open());119        assert(f.sgetc() == L'a');120    }121    std::remove("overflow.dat");122    {123        test_buf<wchar_t> f;124        f.pubimbue(std::locale(LOCALE_en_US_UTF_8));125        assert(f.open("overflow.dat", std::ios_base::out) != 0);126        assert(f.sputc(0x4E51) == 0x4E51);127        assert(f.sputc(0x4E52) == 0x4E52);128        assert(f.sputc(0x4E53) == 0x4E53);129    }130    {131        test_buf<char> f;132        assert(f.open("overflow.dat", std::ios_base::in) != 0);133        assert(f.is_open());134        assert(f.sbumpc() == 0xE4);135        assert(f.sbumpc() == 0xB9);136        assert(f.sbumpc() == 0x91);137        assert(f.sbumpc() == 0xE4);138        assert(f.sbumpc() == 0xB9);139        assert(f.sbumpc() == 0x92);140        assert(f.sbumpc() == 0xE4);141        assert(f.sbumpc() == 0xB9);142        assert(f.sbumpc() == 0x93);143        assert(f.sbumpc() == -1);144    }145    std::remove("overflow.dat");146#endif // TEST_HAS_NO_WIDE_CHARACTERS147 148  return 0;149}150