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