underflow.pass.cpp revision b64f8b07c104c6cc986570ac8ee0ed16a9f23976
1//===----------------------------------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is dual licensed under the MIT and the University of Illinois Open 6// Source Licenses. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10// <fstream> 11 12// int_type underflow(); 13 14// This test is not entirely portable 15 16#include <fstream> 17#include <cassert> 18 19template <class CharT> 20struct test_buf 21 : public std::basic_filebuf<CharT> 22{ 23 typedef std::basic_filebuf<CharT> base; 24 typedef typename base::char_type char_type; 25 typedef typename base::int_type int_type; 26 27 char_type* eback() const {return base::eback();} 28 char_type* gptr() const {return base::gptr();} 29 char_type* egptr() const {return base::egptr();} 30 void gbump(int n) {base::gbump(n);} 31 32 virtual int_type underflow() {return base::underflow();} 33}; 34 35int main() 36{ 37 { 38 test_buf<char> f; 39 assert(f.open("underflow.dat", std::ios_base::in) != 0); 40 assert(f.is_open()); 41 assert(f.eback() == 0); 42 assert(f.gptr() == 0); 43 assert(f.egptr() == 0); 44 assert(f.underflow() == '1'); 45 assert(f.eback() != 0); 46 assert(f.eback() == f.gptr()); 47 assert(*f.gptr() == '1'); 48 assert(f.egptr() - f.eback() == 9); 49 } 50 { 51 test_buf<char> f; 52 assert(f.open("underflow.dat", std::ios_base::in) != 0); 53 assert(f.pubsetbuf(0, 0)); 54 assert(f.is_open()); 55 assert(f.eback() == 0); 56 assert(f.gptr() == 0); 57 assert(f.egptr() == 0); 58 assert(f.underflow() == '1'); 59 assert(f.eback() != 0); 60 assert(f.eback() == f.gptr()); 61 assert(*f.gptr() == '1'); 62 assert(f.egptr() - f.eback() == 8); 63 f.gbump(8); 64 assert(f.sgetc() == '9'); 65 assert(f.eback()[0] == '5'); 66 assert(f.eback()[1] == '6'); 67 assert(f.eback()[2] == '7'); 68 assert(f.eback()[3] == '8'); 69 assert(f.gptr() - f.eback() == 4); 70 assert(*f.gptr() == '9'); 71 assert(f.egptr() - f.gptr() == 1); 72 } 73 { 74 test_buf<wchar_t> f; 75 assert(f.open("underflow.dat", std::ios_base::in) != 0); 76 assert(f.is_open()); 77 assert(f.eback() == 0); 78 assert(f.gptr() == 0); 79 assert(f.egptr() == 0); 80 assert(f.underflow() == L'1'); 81 assert(f.eback() != 0); 82 assert(f.eback() == f.gptr()); 83 assert(*f.gptr() == L'1'); 84 assert(f.egptr() - f.eback() == 9); 85 } 86 { 87 test_buf<wchar_t> f; 88 assert(f.pubsetbuf(0, 0)); 89 assert(f.open("underflow.dat", std::ios_base::in) != 0); 90 assert(f.is_open()); 91 assert(f.eback() == 0); 92 assert(f.gptr() == 0); 93 assert(f.egptr() == 0); 94 assert(f.underflow() == L'1'); 95 assert(f.eback() != 0); 96 assert(f.eback() == f.gptr()); 97 assert(*f.gptr() == L'1'); 98 assert(f.egptr() - f.eback() == 8); 99 f.gbump(8); 100 assert(f.sgetc() == L'9'); 101 assert(f.eback()[0] == L'5'); 102 assert(f.eback()[1] == L'6'); 103 assert(f.eback()[2] == L'7'); 104 assert(f.eback()[3] == L'8'); 105 assert(f.gptr() - f.eback() == 4); 106 assert(*f.gptr() == L'9'); 107 assert(f.egptr() - f.gptr() == 1); 108 } 109 { 110 test_buf<wchar_t> f; 111 f.pubimbue(std::locale("en_US.UTF-8")); 112 assert(f.open("underflow_utf8.dat", std::ios_base::in) != 0); 113 assert(f.is_open()); 114 assert(f.sbumpc() == 0x4E51); 115 assert(f.sbumpc() == 0x4E52); 116 assert(f.sbumpc() == 0x4E53); 117 assert(f.sbumpc() == -1); 118 } 119} 120