// 2000-08-02 bkoz

// Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library.  This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING.  If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.

// Include all the headers except for iostream.
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
#include <cassert>
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
//#include <testsuite_hooks.h>
#define VERIFY(x) x

// Include iostream last, just to make is as difficult as possible to
// properly initialize the standard iostream objects.
#include <iostream>

// Make sure all the standard streams are defined.
int
test01()
{
  bool test = true;

  char array1[20];
  typedef std::ios::traits_type ctraits_type;
  ctraits_type::int_type i = 15;
  ctraits_type::copy(array1, "testing istream", i);
  array1[i] = '\0';
  std::cout << "testing cout" << std::endl;
  std::cerr << "testing cerr" << std::endl;
  VERIFY( std::cerr.flags() & std::ios_base::unitbuf );
  std::clog << "testing clog" << std::endl;
  // std::cin >> array1; // requires somebody to type something in.
  VERIFY( std::cin.tie() == &std::cout );

  return 0;
}

// libstdc++/2523
void test02()
{
  using namespace std;
  int i;
  cin >> i;
  cout << "i == " << i << endl;
}

// libstdc++/2523
void test03()
{
  using namespace std;
  ios_base::sync_with_stdio(false);

  int i;
  cin >> i;
  cout << "i == " << i << endl;
}

// Interactive test, to be exercised as follows:
// assign stderr to stdout in shell command line,
// pipe stdout to cat process and/or redirect stdout to file.
// a.out >& output
// "hello fine world\n" should be written to stdout, and output, in
// proper order.  This is a version of the scott snyder test taken
// from: http://gcc.gnu.org/ml/libstdc++/1999-q4/msg00108.html
void test04()
{
  using namespace std;

  cout << "hello ";
  cout.flush();
  cerr << "fine ";
  cerr.flush();
  cout << "world" << endl;
  cout.flush();
}

// Interactive test, to be exercised as follows:
// run test under truss(1) or strace(1).  Look at
// size and pattern of write system calls.
// Should be 2 or 3 write(1,[...]) calls when run interactively
// depending upon buffering mode enforced.
void test05()
{
  std::cout << "hello" << ' ' << "world" << std::endl;
  std::cout << "Enter your name: ";
  std::string s;
  std::cin >> s;
  std::cout << "hello " << s << std::endl;
}

// libstdc++/5280
// Interactive test: input "1234^D^D" for i should terminate for EOF.
void test06()
{
  using namespace std;
  int i;
  cin >> i;
  if (!cin.good()) 
    {
      cerr << endl;
      cerr << "i == " << i << endl;
      cerr << "cin.rdstate() == " << cin.rdstate() << endl;
      cerr << "cin.bad() == " << cin.bad() << endl;      
      cerr << "cin.fail() == " << cin.fail() << endl;      
      cerr << "cin.eof() == " << cin.eof() << endl;
    }   
  else
    cerr << "i == " << i << endl;
}

// libstdc++/6548
void test07()
{
  bool test = true;
  std::cout << "Enter 'test':";
  std::string s;
  std::getline(std::cin, s, '\n');
  VERIFY( s == "test" );
}

// libstdc++/6648
// Interactive tests: each one (run alone) must terminate upon a single '\n'.
void test08()
{
  bool test = true;
  char buff[2048];
  std::cout << "Enter name: ";
  std::cin.getline(buff, 2048);
}

void test09()
{
  bool test = true;
  std::cout << "Enter favorite beach: ";
  std::cin.ignore(2048, '\n');
}

// http://gcc.gnu.org/ml/libstdc++/2002-08/msg00060.html
// Should only have to hit enter once.
void
test10()
{
  using namespace std;
  cout << "Press ENTER once\n";
  cin.ignore(1);
  cout << "_M_gcount: "<< cin.gcount() << endl;
}

int 
main()
{
  test01();

  // test02();
  // test03();
  // test04();
  // test05();
  // test06();
  // test07();
  // test08();
  // test09();
  // test10();
  return 0;
}
