underflow.pass.cpp revision bc8d3f97eb5c958007f2713238472e0c1c8fe02c
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===//
2926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)//
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ��������������������The LLVM Compiler Infrastructure
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// License. See LICENSE.TXT for details.
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===//
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// <fstream>
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// int_type underflow();
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This test is not entirely portable
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <fstream>
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <cassert>
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template <class CharT>
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct test_buf
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : public std::basic_filebuf<CharT>
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef std::basic_filebuf<CharT> base;
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef typename base::char_type  char_type;
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef typename base::int_type   int_type;
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    char_type* eback() const {return base::eback();}
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    char_type* gptr()  const {return base::gptr();}
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    char_type* egptr() const {return base::egptr();}
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void gbump(int n) {base::gbump(n);}
31d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
32d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    virtual int_type underflow() {return base::underflow();}
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
34c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
3593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)int main()
36d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
37c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    {
38f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        test_buf<char> f;
3993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        assert(f.open("underflow.dat", std::ios_base::in) != 0);
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        assert(f.is_open());
41c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        assert(f.eback() == 0);
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        assert(f.gptr() == 0);
43d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        assert(f.egptr() == 0);
44d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        assert(f.underflow() == '1');
45d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        assert(f.eback() != 0);
4683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        assert(f.eback() == f.gptr());
47323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        assert(*f.gptr() == '1');
48323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        assert(f.egptr() - f.eback() == 9);
49323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
50323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    {
51323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        test_buf<char> f;
5293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        assert(f.open("underflow.dat", std::ios_base::in) != 0);
5393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        assert(f.pubsetbuf(0, 0));
5493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        assert(f.is_open());
5593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        assert(f.eback() == 0);
5693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        assert(f.gptr() == 0);
5793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        assert(f.egptr() == 0);
5893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        assert(f.underflow() == '1');
5993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        assert(f.eback() != 0);
6093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        assert(f.eback() == f.gptr());
6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        assert(*f.gptr() == '1');
62c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        assert(f.egptr() - f.eback() == 8);
637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        f.gbump(8);
64d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        assert(f.sgetc() == '9');
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        assert(f.eback()[0] == '5');
66e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        assert(f.eback()[1] == '6');
67e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        assert(f.eback()[2] == '7');
68e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        assert(f.eback()[3] == '8');
69e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        assert(f.gptr() - f.eback() == 4);
70e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        assert(*f.gptr() == '9');
71e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        assert(f.egptr() - f.gptr() == 1);
72e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
73e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    {
74c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        test_buf<wchar_t> f;
75e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        assert(f.open("underflow.dat", std::ios_base::in) != 0);
76c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        assert(f.is_open());
77d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        assert(f.eback() == 0);
78c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        assert(f.gptr() == 0);
79e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        assert(f.egptr() == 0);
80e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        assert(f.underflow() == L'1');
81d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        assert(f.eback() != 0);
8253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        assert(f.eback() == f.gptr());
8351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        assert(*f.gptr() == L'1');
8451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        assert(f.egptr() - f.eback() == 9);
85e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
8693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
8793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        test_buf<wchar_t> f;
8883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        assert(f.pubsetbuf(0, 0));
8909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        assert(f.open("underflow.dat", std::ios_base::in) != 0);
9009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        assert(f.is_open());
9193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        assert(f.eback() == 0);
9293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        assert(f.gptr() == 0);
9310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        assert(f.egptr() == 0);
9410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        assert(f.underflow() == L'1');
9510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        assert(f.eback() != 0);
9610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        assert(f.eback() == f.gptr());
9710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        assert(*f.gptr() == L'1');
9810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        assert(f.egptr() - f.eback() == 8);
9910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        f.gbump(8);
10093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        assert(f.sgetc() == L'9');
10110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        assert(f.eback()[0] == L'5');
10210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        assert(f.eback()[1] == L'6');
10310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        assert(f.eback()[2] == L'7');
10410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        assert(f.eback()[3] == L'8');
10509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        assert(f.gptr() - f.eback() == 4);
106d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        assert(*f.gptr() == L'9');
107d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        assert(f.egptr() - f.gptr() == 1);
10810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    }
109d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    {
11009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        test_buf<wchar_t> f;
11109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        f.pubimbue(std::locale("en_US.UTF-8"));
11210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        assert(f.open("underflow_utf8.dat", std::ios_base::in) != 0);
11310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        assert(f.is_open());
11409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        assert(f.sbumpc() == 0x4E51);
11583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        assert(f.sbumpc() == 0x4E52);
1167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        assert(f.sbumpc() == 0x4E53);
1177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        assert(f.sbumpc() == -1);
1187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
119d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
120d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)