You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by se...@apache.org on 2008/05/22 00:50:00 UTC
svn commit: r658917 -
/stdcxx/branches/4.2.x/tests/iostream/27.istream.get.cpp
Author: sebor
Date: Wed May 21 15:50:00 2008
New Revision: 658917
URL: http://svn.apache.org/viewvc?rev=658917&view=rev
Log:
2008-05-21 Martin Sebor <se...@roguewave.com>
* tests/iostream/27.istream.get.cpp: Added a (naive) test exercising
basic_istream::get() and the ability to extract '\xff' from the stream
without confusing it for EOF.
Added:
stdcxx/branches/4.2.x/tests/iostream/27.istream.get.cpp (with props)
Added: stdcxx/branches/4.2.x/tests/iostream/27.istream.get.cpp
URL: http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/tests/iostream/27.istream.get.cpp?rev=658917&view=auto
==============================================================================
--- stdcxx/branches/4.2.x/tests/iostream/27.istream.get.cpp (added)
+++ stdcxx/branches/4.2.x/tests/iostream/27.istream.get.cpp Wed May 21 15:50:00 2008
@@ -0,0 +1,170 @@
+/************************************************************************
+ *
+ * 27.istream.get.cpp - test exercising istream::get()
+ *
+ * $Id$
+ *
+ ***************************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ *
+ **************************************************************************/
+
+#include <fstream>
+#include <sstream>
+
+#include <cstdio>
+#include <cstring>
+
+#include <driver.h>
+
+
+template <class CharT, class FileStream>
+void test_get (FileStream &f, const char *type,
+ const CharT array [], std::size_t)
+{
+ rw_assert (!!f, 0, __LINE__, "basic_ifstream<%s, Traits>", type);
+
+ const CharT delim = f.widen ('\xff');
+
+ CharT buf [5] = { 0 }; // 4 chars + terminating null
+ const std::size_t bufsize = sizeof buf / sizeof *buf;
+
+ std::size_t n = 0;
+
+ // read chars into character buffer, at most 4 at a time
+ while (f.get (buf, bufsize, delim)) {
+
+ rw_assert (f.good () && array [n] == *buf, 0, __LINE__,
+ "%d. basic_ifstream<%s>::get (%p, %d, '\\x%x')",
+ n, type, buf, bufsize, delim);
+
+ ++n;
+
+ CharT ch;
+ f.get (ch);
+
+ rw_assert (f.good () && ch == array [n], 0, __LINE__,
+ "%d. basic_ifstream<%s>::get ('\\x%x'); expected '\\x%x'",
+ n, type, ch, array [n]);
+ ++n;
+ }
+
+ // reached the end of stream
+ rw_assert ((std::ios::eofbit | std::ios::failbit) == f.rdstate (),
+ 0, __LINE__, "basic_ifstream<%s>::get(...)", type);
+}
+
+
+template <class CharT>
+void run_test (CharT, const char *tname)
+{
+ typedef CharT char_type;
+ typedef std::char_traits<char_type> traits_type;
+
+ CharT array [256]; // array of chars
+
+ const std::size_t nelems = sizeof array / sizeof *array;
+
+ // use tmpname(buffer) instead of tmpnam(0) because HP-UX returns 0
+ // for tmpnam (0) on MT environments
+ char fname [L_tmpnam];
+ std::tmpnam (fname);
+
+ rw_fatal (0 != fname, 0, __LINE__, "tmpnam(%#p) != 0", fname);
+
+ if (1) {
+ std::basic_ofstream<char_type, traits_type> f (fname);
+
+ rw_assert (!!f, 0, __LINE__,
+ "basic_ofstream <%s>::basic_ofstream (#%s)",
+ tname, fname);
+
+ // populate array with some chars with '\xff' interspersed
+
+ CharT *p = array;
+
+ for (std::size_t i = 0; std::size_t (i) < nelems / 2; ++i) {
+ *p++ = char_type (i + 1);
+
+ // separate each character with a `\xff'
+ *p++ = f.widen ('\xff');
+ }
+
+ // write array to stream in one shot
+ f.write (array, nelems);
+
+ rw_assert (f.good (), 0, __LINE__,
+ "basic_ofstream<%s>::write (%p, %d)",
+ tname, array, nelems);
+
+ f.close ();
+
+ rw_assert (f.good (), 0, __LINE__,
+ "basic_ofstream<%s>::close()", tname);
+ }
+
+ if (1) {
+ std::basic_ifstream<char_type, traits_type> f (fname);
+
+ rw_assert (!!f, 0, __LINE__,
+ "basic_ifstream<%s>::basic_ifstream (%#s)",
+ tname, fname);
+
+ // see if we can read the whole thing in correctly
+ test_get (f, tname, array, nelems);
+
+ // should have reached EOF above
+ rw_assert ((std::ios::eofbit | std::ios::failbit) == f.rdstate (),
+ 0, __LINE__,
+ "basic_ifstream<%s>::get(...)", tname);
+
+ f.close ();
+
+ // successful close should have no effect on rdstate
+ rw_assert ((std::ios::eofbit | std::ios::failbit) == f.rdstate (),
+ 0, __LINE__,
+ "basic_ifstream<%s>::get(...)", tname);
+ }
+
+ std::remove (fname);
+}
+
+
+static int run_test (int, char**)
+{
+ run_test (char (), "char");
+
+#ifndef _RWSTD_NO_WCHAR_T
+
+ run_test (wchar_t (), "wchar_t");
+
+#endif // _RWSTD_NO_WCHAR_T
+
+ return 0;
+}
+
+/**************************************************************************/
+
+int main (int argc, char *argv[])
+{
+ return rw_test (argc, argv, __FILE__,
+ "istream.get",
+ 0 /* no comment */,
+ run_test,
+ "", 0);
+}
Propchange: stdcxx/branches/4.2.x/tests/iostream/27.istream.get.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: stdcxx/branches/4.2.x/tests/iostream/27.istream.get.cpp
------------------------------------------------------------------------------
svn:keywords = Id