1// 1999-06-08 bkoz
2
3// Copyright (C) 1999 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 2, 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 COPYING.  If not, write to the Free
18// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
19// USA.
20
21// 21.3.4 basic_string element access
22
23#include <string>
24#include <stdexcept>
25#include <testsuite_hooks.h>
26
27bool test01(void)
28{
29  bool test = true;
30  typedef std::string::size_type csize_type;
31  typedef std::string::const_reference cref;
32  typedef std::string::reference ref;
33  csize_type npos = std::string::npos;
34  csize_type csz01, csz02;
35
36  const std::string str01("tamarindo, costa rica");
37  std::string str02("41st street beach, capitola, california");
38  std::string str03;
39
40  // const_reference operator[] (size_type pos) const;
41  csz01 = str01.size();
42  cref cref1 = str01[csz01 - 1];
43  VERIFY( cref1 == 'a' );
44  cref cref2 = str01[csz01];
45  VERIFY( cref2 == char() );
46
47  // reference operator[] (size_type pos);
48  csz02 = str02.size();
49  ref ref1 = str02[csz02 - 1];
50  VERIFY( ref1 == 'a' );
51  ref ref2 = str02[1];
52  VERIFY( ref2 == '1' );
53
54  // const_reference at(size_type pos) const;
55  csz01 = str01.size();
56  cref cref3 = str01.at(csz01 - 1);
57  VERIFY( cref3 == 'a' );
58  try {
59    cref cref4 = str01.at(csz01);
60    VERIFY( false ); // Should not get here, as exception thrown.
61  }
62  catch(std::out_of_range& fail) {
63    VERIFY( true );
64  }
65  catch(...) {
66    VERIFY( false );
67  }
68
69  // reference at(size_type pos);
70  csz01 = str02.size();
71  ref ref3 = str02.at(csz02 - 1);
72  VERIFY( ref3 == 'a' );
73  try {
74    ref ref4 = str02.at(csz02);
75    VERIFY( false ); // Should not get here, as exception thrown.
76  }
77  catch(std::out_of_range& fail) {
78    VERIFY( true );
79  }
80  catch(...) {
81    VERIFY( false );
82  }
83
84#ifdef DEBUG_ASSERT
85  assert(test);
86#endif
87  return test;
88}
89
90int main()
91{
92  test01();
93  return 0;
94}
95