xref: /llvm-project/libcxx/test/std/input.output/file.streams/fstreams/filebuf.virtuals/pbackfail.pass.cpp (revision df88d80337d5e0ee0e50ca599d6436854951d8fa)
15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
95a83710eSEric Fiselier // <fstream>
105a83710eSEric Fiselier 
115a83710eSEric Fiselier // int_type pbackfail(int_type c = traits::eof());
125a83710eSEric Fiselier 
13*df88d803SLouis Dionne // FILE_DEPENDENCIES: underflow.dat
14*df88d803SLouis Dionne 
155a83710eSEric Fiselier #include <fstream>
165a83710eSEric Fiselier #include <cassert>
175a83710eSEric Fiselier 
186e083f62SBilly Robert O'Neal III #include "test_macros.h"
196e083f62SBilly Robert O'Neal III 
205a83710eSEric Fiselier template <class CharT>
215a83710eSEric Fiselier struct test_buf
225a83710eSEric Fiselier     : public std::basic_filebuf<CharT>
235a83710eSEric Fiselier {
245a83710eSEric Fiselier     typedef std::basic_filebuf<CharT>  base;
255a83710eSEric Fiselier     typedef typename base::char_type   char_type;
265a83710eSEric Fiselier     typedef typename base::int_type    int_type;
275a83710eSEric Fiselier     typedef typename base::traits_type traits_type;
285a83710eSEric Fiselier 
ebacktest_buf295a83710eSEric Fiselier     char_type* eback() const {return base::eback();}
gptrtest_buf305a83710eSEric Fiselier     char_type* gptr()  const {return base::gptr();}
egptrtest_buf315a83710eSEric Fiselier     char_type* egptr() const {return base::egptr();}
gbumptest_buf325a83710eSEric Fiselier     void gbump(int n) {base::gbump(n);}
335a83710eSEric Fiselier 
pbackfailtest_buf345a83710eSEric Fiselier     virtual int_type pbackfail(int_type c = traits_type::eof()) {return base::pbackfail(c);}
355a83710eSEric Fiselier };
365a83710eSEric Fiselier 
main(int,char **)372df59c50SJF Bastien int main(int, char**)
385a83710eSEric Fiselier {
395a83710eSEric Fiselier     {
405a83710eSEric Fiselier         test_buf<char> f;
415a83710eSEric Fiselier         assert(f.open("underflow.dat", std::ios_base::in) != 0);
425a83710eSEric Fiselier         assert(f.is_open());
435a83710eSEric Fiselier         assert(f.sbumpc() == '1');
445a83710eSEric Fiselier         assert(f.sgetc() == '2');
456e083f62SBilly Robert O'Neal III         typename test_buf<char>::int_type pbackResult = f.pbackfail('a');
466e083f62SBilly Robert O'Neal III         LIBCPP_ASSERT(pbackResult == -1);
476e083f62SBilly Robert O'Neal III         if (pbackResult != -1) {
486e083f62SBilly Robert O'Neal III             assert(f.sbumpc() == 'a');
496e083f62SBilly Robert O'Neal III             assert(f.sgetc() == '2');
506e083f62SBilly Robert O'Neal III         }
515a83710eSEric Fiselier     }
525a83710eSEric Fiselier     {
535a83710eSEric Fiselier         test_buf<char> f;
545a83710eSEric Fiselier         assert(f.open("underflow.dat", std::ios_base::in | std::ios_base::out) != 0);
555a83710eSEric Fiselier         assert(f.is_open());
565a83710eSEric Fiselier         assert(f.sbumpc() == '1');
575a83710eSEric Fiselier         assert(f.sgetc() == '2');
586e083f62SBilly Robert O'Neal III         typename test_buf<char>::int_type pbackResult = f.pbackfail('a');
596e083f62SBilly Robert O'Neal III         LIBCPP_ASSERT(pbackResult == 'a');
606e083f62SBilly Robert O'Neal III         if (pbackResult != -1) {
615a83710eSEric Fiselier             assert(f.sbumpc() == 'a');
625a83710eSEric Fiselier             assert(f.sgetc() == '2');
635a83710eSEric Fiselier         }
645a83710eSEric Fiselier     }
652df59c50SJF Bastien 
662df59c50SJF Bastien   return 0;
676e083f62SBilly Robert O'Neal III }
68