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 2006/08/09 03:12:06 UTC

svn commit: r429911 - /incubator/stdcxx/trunk/tests/localization/22.locale.messages.cpp

Author: sebor
Date: Tue Aug  8 18:12:06 2006
New Revision: 429911

URL: http://svn.apache.org/viewvc?rev=429911&view=rev
Log:
2006-08-08  Martin Sebor  <se...@roguewave.com>

	* messages.cpp (test_has_facet): Exercised the behavior of has_facet
	and use_facet with messages_byname (in addition to the base class).
	(test_use_nls_path): Handled getcwd() errors, called open_catalog
	instead of invoking messages::open() directly.
	(open_catalog, test_open_close, test_use_codecvt): Added missing
	argument to rw_assert().
	(stress_test): Asserted a precondition.

Modified:
    incubator/stdcxx/trunk/tests/localization/22.locale.messages.cpp

Modified: incubator/stdcxx/trunk/tests/localization/22.locale.messages.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/tests/localization/22.locale.messages.cpp?rev=429911&r1=429910&r2=429911&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/localization/22.locale.messages.cpp (original)
+++ incubator/stdcxx/trunk/tests/localization/22.locale.messages.cpp Tue Aug  8 18:12:06 2006
@@ -2,7 +2,7 @@
  *
  * 22.locale.messages.cpp - tests exercising the std::messages facet
  *
- * $Id: //stdlib/dev/tests/stdlib/locale/messages.cpp#43 $
+ * $Id: //stdlib/dev/tests/stdlib/locale/messages.cpp#45 $
  *
  ***************************************************************************
  *
@@ -353,25 +353,71 @@
 template <class charT>
 void test_has_facet (const char *loc_name, const char *cname)
 {
-    const std::locale loc (loc_name);
+    // construct a copy of the named locale or default
+    // when no name is specified
+    const std::locale loc =
+        loc_name ? std::locale (loc_name) : std::locale ();
 
     typedef std::messages<charT> Messages;
 
-    const bool facet_exists = std::has_facet<Messages> (loc);
+    // verify that the facet exists in the locale
+    bool facet_exists = std::has_facet<Messages>(loc);
 
     rw_assert (facet_exists, 0, __LINE__,
-               "has_facet<messages<%s> >(locale(%#s)) == true",
-               cname, loc_name);
+               "has_facet<messages<%s> >(locale(%{?}%#s%{;})) == true",
+               cname, 0 != loc_name, loc_name);
 
     try {
+        // verify that use facet doesn't throw an exception
         std::use_facet<Messages>(loc);
     }
 #ifndef _RWSTD_NO_EXCEPTIONS
 
     catch (std::exception &ex) {
         rw_assert (0, 0, __LINE__,
-                   "use_fact<messages<%s> >(locale(%#s)) unexpectedly threw "
-                   "exception(%#s)", cname, loc_name, ex.what ());
+                   "use_fact<messages<%s> >(locale(%{?}%#s%{;})) "
+                   "unexpectedly threw exception(%#s)",
+                   cname, 0 != loc_name, loc_name, ex.what ());
+    }
+    catch (...) {
+        rw_assert (0, 0, __LINE__,
+                   "use_fact<messages<%s> >(locale(%{?}%#s%{;})) "
+                   "unexpectedly threw an unknown exception",
+                   cname, 0 != loc_name, loc_name);
+    }
+
+    typedef std::messages_byname<charT> MessagesByname;
+
+    const bool byname = loc_name
+        && std::strcmp (loc_name, "C") && std::strcmp (loc_name, "POSIX");
+ 
+    facet_exists = std::has_facet<MessagesByname>(loc);
+
+    rw_assert (byname == facet_exists, 0, __LINE__,
+               "has_fact<messages_byname<%s> >(locale(%{?}%#s%{;})) == %b",
+               cname, 0 != loc_name, loc_name);
+
+    try {
+        // verify that use facet throws an exception only
+        // for the default and "C" locales
+        std::use_facet<MessagesByname>(loc);
+
+        rw_assert (byname, 0, __LINE__,
+                   "use_fact<messages_byname<%s> >(locale(%{?}%#s%{;})) "
+                   "failed to throw",
+                   cname, 0 != loc_name, loc_name);
+    }
+    catch (std::exception &ex) {
+        rw_assert (!byname, 0, __LINE__,
+                   "use_fact<messages_byname<%s> >(locale(%{?}%#s%{;})) "
+                   "unexpectedly threw exception(%#s)",
+                   cname, 0 != loc_name, loc_name, ex.what ());
+    }
+    catch (...) {
+        rw_assert (0, 0, __LINE__,
+                   "use_fact<messages<%s> >(locale(%{?}%#s%{;})) "
+                   "unexpectedly threw an unknown exception",
+                   cname, 0 != loc_name, loc_name);
     }
 
 #endif   // _RWSTD_NO_EXCEPTIONS
@@ -393,9 +439,9 @@
         cat = (msgs.open)(cat_name, loc);
 
         rw_assert (!expect_exception, 0, line,
-                   "messages<%s>::open(%#s, locale(%#s)) failed "
+                   "messages<%s>::open(%#s, locale(%#s)) ==> %d: failed "
                    "to throw an expected exception",
-                   cname, cat_name, loc.name ().c_str ());
+                   cname, cat_name, loc.name ().c_str (), cat);
     }
 
 #ifndef _RWSTD_NO_EXCEPTIONS
@@ -433,7 +479,8 @@
 
         rw_assert (!expect_exception, 0, line,
                    "messages<%s>::close(%d) failed "
-                   "to throw an expected exception", cname);
+                   "to throw an expected exception",
+                   cname, cat);
     }
 
 #ifndef _RWSTD_NO_EXCEPTIONS
@@ -490,7 +537,7 @@
                0, __LINE__,
                "std::messages<%s>::close() leaked %d file descriptor(s) "
                "(or descriptor mismatch)",
-               fdcount [1] - fdcount [0]);
+               cname, fdcount [1] - fdcount [0]);
 }
 
 /***************************************************************************/
@@ -606,7 +653,7 @@
 
     if (!rw_error (-1 < cat, 0, __LINE__,
                    "messages<%s>::open(%#s, locale(%#s)) >= -1, got %d",
-                   CAT_NAME, loc.name ().c_str (), cat))
+                   cname, CAT_NAME, loc.name ().c_str (), cat))
         return;
 
     cvt.check_state_ = true;
@@ -653,9 +700,13 @@
 void test_use_nls_path (const char *cname)
 {
     // get working directory
-    char cwd[2048];
-    getcwd(cwd, 2048);
-    char *nlspath = new char[std::strlen(cwd) + 512];
+    char cwd [2048];
+    cwd [0] = '\0';
+    if (!rw_error (0 != getcwd (cwd, 2048), 0, __LINE__,
+                   "getcwd(%#p, %u) failed: %{#m} (%m)", cwd, 2048))
+        return;
+
+    char* const nlspath = new char [std::strlen (cwd) + 512];
 
     // create NLSPATH string
     std::sprintf (nlspath, "NLSPATH=%s/%%N.cat", cwd);
@@ -666,7 +717,8 @@
     const std::messages<charT>& msgs =
         std::use_facet <std::messages<charT> >(loc);
 
-    const std::messages_base::catalog cat = (msgs.open)(NLS_CAT_NAME, loc);
+    const std::messages_base::catalog cat =
+        open_catalog (msgs, NLS_CAT_NAME, loc, false, "char", __LINE__);
 
     if (-1 == cat) {
 
@@ -689,6 +741,9 @@
 template <class charT>
 void stress_test (const char *cname)
 {
+    // NLSPATH must be defined
+    RW_ASSERT (0 != std::getenv ("NLSPATH"));
+
     char catalog_names [24][24];
     std::messages_base::catalog cats[24];
 
@@ -793,7 +848,14 @@
 {
     if (rw_note (0 <= opt_has_facet, 0, __LINE__,
                  "has_facet<messages<%s> > tests disabled", cname)) {
+
+        // exercise has_facet and use_facet in the default locale
+        test_has_facet<charT>(0, cname);
+
+        // exercise has_facet and use_facet in locale("C")
         test_has_facet<charT>("C", cname);
+
+        // exercise has_facet and use_facet in a named locale
         test_has_facet<charT>(locname, cname);
     }