1// 2003-05-20  Paolo Carlini  <pcarlini@unitus.it>
2
3// Copyright (C) 2003-2015 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15
16// You should have received a copy of the GNU General Public License along
17// with this library; see the file COPYING3.  If not see
18// <http://www.gnu.org/licenses/>.
19
20// 27.8.1.3 filebuf member functions
21// @require@ %-*.tst %-*.txt
22// @diff@ %-*.tst %-*.txt
23
24// Test that upon filebuf::close() 27.8.1.1,3 is enforced.
25
26#include <fstream>
27#include <testsuite_hooks.h>
28
29const char name_01[] = "filebuf_virtuals-1.txt"; // file with data in it
30const char name_02[] = "filebuf_virtuals-2.txt"; // empty file, need to create
31
32bool overflow_called;
33bool underflow_called;
34bool uflow_called;
35
36class Close_filebuf : public std::filebuf
37{
38public:
39  int_type overflow(int_type c)
40  {
41    overflow_called = true;
42    return std::filebuf::overflow(c);
43  }
44
45  int_type underflow()
46  {
47    underflow_called = true;
48    return std::filebuf::underflow();
49  }
50
51  int_type uflow()
52  {
53    uflow_called = true;
54    return std::filebuf::uflow();
55  }
56};
57
58void test_05()
59{
60  bool test __attribute__((unused)) = true;
61
62  Close_filebuf fb_01, fb_02;
63  char buffer[] = "xxxxxxxxxx";
64
65  // 'in'
66  fb_01.open(name_01, std::ios_base::in);
67  fb_01.sgetc();
68
69  fb_01.close();
70
71  underflow_called = false;
72  fb_01.sgetc();
73  VERIFY( underflow_called == true );
74
75  uflow_called = false;
76  fb_01.sbumpc();
77  VERIFY( uflow_called == true );
78
79  uflow_called = false;
80  fb_01.snextc();
81  VERIFY( uflow_called == true );
82
83  uflow_called = false;
84  fb_01.sgetn(buffer, sizeof(buffer));
85  VERIFY( uflow_called == true );
86
87  // 'out'
88  fb_02.open(name_02, std::ios_base::out);
89
90  fb_02.close();
91
92  overflow_called = false;
93  fb_02.sputc('T');
94  VERIFY( overflow_called == true );
95
96  overflow_called = false;
97  fb_02.sputn(buffer, sizeof(buffer));
98  VERIFY( overflow_called == true );
99}
100
101int
102main()
103{
104  test_05();
105  return 0;
106}
107