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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // FILE_DEPENDENCIES: underflow.dat, underflow_utf8.dat 10 11 // <locale> 12 13 // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS 14 15 // wbuffer_convert<Codecvt, Elem, Tr> 16 17 // int_type underflow(); 18 19 // This test is not entirely portable 20 21 // XFAIL: no-wide-characters 22 23 #include <locale> 24 #include <codecvt> 25 #include <fstream> 26 #include <cassert> 27 28 #include "test_macros.h" 29 30 struct test_buf 31 : public std::wbuffer_convert<std::codecvt_utf8<wchar_t> > 32 { 33 typedef std::wbuffer_convert<std::codecvt_utf8<wchar_t> > base; 34 typedef base::char_type char_type; 35 typedef base::int_type int_type; 36 typedef base::traits_type traits_type; 37 38 explicit test_buf(std::streambuf* sb) : base(sb) {} 39 40 char_type* eback() const {return base::eback();} 41 char_type* gptr() const {return base::gptr();} 42 char_type* egptr() const {return base::egptr();} 43 void gbump(int n) {base::gbump(n);} 44 45 virtual int_type underflow() {return base::underflow();} 46 }; 47 48 int main(int, char**) 49 { 50 { 51 std::ifstream bs("underflow.dat"); 52 test_buf f(bs.rdbuf()); 53 assert(f.eback() == 0); 54 assert(f.gptr() == 0); 55 assert(f.egptr() == 0); 56 assert(f.underflow() == L'1'); 57 assert(f.eback() != 0); 58 assert(f.eback() == f.gptr()); 59 assert(*f.gptr() == L'1'); 60 assert(f.egptr() - f.eback() == 9); 61 } 62 { 63 std::ifstream bs("underflow.dat"); 64 test_buf f(bs.rdbuf()); 65 assert(f.eback() == 0); 66 assert(f.gptr() == 0); 67 assert(f.egptr() == 0); 68 assert(f.underflow() == L'1'); 69 assert(f.eback() != 0); 70 assert(f.eback() == f.gptr()); 71 assert(*f.gptr() == L'1'); 72 assert(f.egptr() - f.eback() == 9); 73 f.gbump(8); 74 assert(f.sgetc() == L'9'); 75 assert(f.eback()[0] == L'1'); 76 assert(f.eback()[1] == L'2'); 77 assert(f.eback()[2] == L'3'); 78 assert(f.eback()[3] == L'4'); 79 assert(f.gptr() - f.eback() == 8); 80 assert(*f.gptr() == L'9'); 81 assert(f.egptr() - f.gptr() == 1); 82 } 83 { 84 std::ifstream bs("underflow_utf8.dat"); 85 test_buf f(bs.rdbuf()); 86 assert(f.sbumpc() == 0x4E51); 87 assert(f.sbumpc() == 0x4E52); 88 assert(f.sbumpc() == 0x4E53); 89 assert(f.sbumpc() == test_buf::traits_type::eof()); 90 } 91 92 return 0; 93 } 94