brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.0 KiB · 21418bd Raw
131 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// FILE_DEPENDENCIES: underflow.dat, underflow_utf8.dat11 12// <fstream>13 14// int_type underflow();15 16// This test is not entirely portable17 18#include <fstream>19#include <cstddef>20#include <cassert>21 22#include "test_macros.h"23#include "platform_support.h" // locale name macros24 25template <class CharT>26struct test_buf27    : public std::basic_filebuf<CharT>28{29    typedef std::basic_filebuf<CharT> base;30    typedef typename base::char_type  char_type;31    typedef typename base::int_type   int_type;32 33    char_type* eback() const {return base::eback();}34    char_type* gptr()  const {return base::gptr();}35    char_type* egptr() const {return base::egptr();}36    void gbump(int n) {base::gbump(n);}37 38    virtual int_type underflow() {return base::underflow();}39};40 41int main(int, char**)42{43    {44        test_buf<char> f;45        assert(f.open("underflow.dat", std::ios_base::in) != 0);46        assert(f.is_open());47        assert(f.eback() == 0);48        assert(f.gptr() == 0);49        assert(f.egptr() == 0);50        assert(f.underflow() == '1');51        assert(f.eback() != 0);52        assert(f.eback() == f.gptr());53        assert(*f.gptr() == '1');54        assert(f.egptr() - f.eback() == 9);55    }56    {57        test_buf<char> f;58        assert(f.open("underflow.dat", std::ios_base::in) != 0);59        assert(f.pubsetbuf(0, 0));60        assert(f.is_open());61        assert(f.eback() == 0);62        assert(f.gptr() == 0);63        assert(f.egptr() == 0);64        assert(f.underflow() == '1');65        assert(f.eback() != 0);66        assert(f.eback() == f.gptr());67        assert(*f.gptr() == '1');68        assert(f.egptr() - f.eback() == 8);69        f.gbump(8);70        assert(f.sgetc() == '9');71        assert(f.eback()[0] == '5');72        assert(f.eback()[1] == '6');73        assert(f.eback()[2] == '7');74        assert(f.eback()[3] == '8');75        assert(f.gptr() - f.eback() == 4);76        assert(*f.gptr() == '9');77        assert(f.egptr() - f.gptr() == 1);78    }79#ifndef TEST_HAS_NO_WIDE_CHARACTERS80    {81        test_buf<wchar_t> f;82        assert(f.open("underflow.dat", std::ios_base::in) != 0);83        assert(f.is_open());84        assert(f.eback() == 0);85        assert(f.gptr() == 0);86        assert(f.egptr() == 0);87        assert(f.underflow() == L'1');88        assert(f.eback() != 0);89        assert(f.eback() == f.gptr());90        assert(*f.gptr() == L'1');91        assert(f.egptr() - f.eback() == 9);92    }93    {94        test_buf<wchar_t> f;95        assert(f.pubsetbuf(0, 0));96        assert(f.open("underflow.dat", std::ios_base::in) != 0);97        assert(f.is_open());98        assert(f.eback() == 0);99        assert(f.gptr() == 0);100        assert(f.egptr() == 0);101        assert(f.underflow() == L'1');102        assert(f.eback() != 0);103        assert(f.eback() == f.gptr());104        assert(*f.gptr() == L'1');105        assert(f.egptr() - f.eback() == 8);106        f.gbump(8);107        assert(f.sgetc() == L'9');108        assert(f.eback()[0] == L'5');109        assert(f.eback()[1] == L'6');110        assert(f.eback()[2] == L'7');111        assert(f.eback()[3] == L'8');112        assert(f.gptr() - f.eback() == 4);113        assert(*f.gptr() == L'9');114        assert(f.egptr() - f.gptr() == 1);115    }116    {117        typedef std::char_traits<wchar_t> Traits;118        test_buf<wchar_t> f;119        f.pubimbue(std::locale(LOCALE_en_US_UTF_8));120        assert(f.open("underflow_utf8.dat", std::ios_base::in) != 0);121        assert(f.is_open());122        assert(f.sbumpc() == 0x4E51);123        assert(f.sbumpc() == 0x4E52);124        assert(f.sbumpc() == 0x4E53);125        assert(f.sbumpc() == static_cast<Traits::int_type>(-1));126    }127#endif // TEST_HAS_NO_WIDE_CHARACTERS128 129  return 0;130}131