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