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 20:49:17 UTC
svn commit: r430112 -
/incubator/stdcxx/trunk/tests/localization/22.locale.messages.cpp
Author: sebor
Date: Wed Aug 9 11:49:16 2006
New Revision: 430112
URL: http://svn.apache.org/viewvc?rev=430112&view=rev
Log:
2006-08-09 Martin Sebor <se...@roguewave.com>
* messages.cpp (<stdlib.h>): Removed an unnecessary #include directive.
(open_catalog): Improved diagnostics to include failure (in addition
to exception) detection.
(test_open_close, test_get, test_use_codecvt, test_use_nls_path):
Simplified the handling of errors from open().
(stress_test): Removed catalog extension (since it's already present
in the value of NLSPATH). Replaced hardcoded values with a constant.
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=430112&r1=430111&r2=430112&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/localization/22.locale.messages.cpp (original)
+++ incubator/stdcxx/trunk/tests/localization/22.locale.messages.cpp Wed Aug 9 11:49:16 2006
@@ -2,7 +2,7 @@
*
* 22.locale.messages.cpp - tests exercising the std::messages facet
*
- * $Id: //stdlib/dev/tests/stdlib/locale/messages.cpp#45 $
+ * $Id: //stdlib/dev/tests/stdlib/locale/messages.cpp#46 $
*
***************************************************************************
*
@@ -40,28 +40,23 @@
#include <cstring> // for strlen()
#include <cstdlib> // for getcwd(), getenv()
-#include <cstdio> // for file operations
+#include <cstdio> // for FILE, fopen(), fprintf()
#include <clocale> // for LC_ALL
#include <cwchar> // for mbsinit()
#ifndef _RWSTD_NO_NEW_HEADER
-
-# include <stdio.h> // for fileno
-# include <stdlib.h> // for getcwd
-
+# include <stdio.h> // for fileno()
# if defined (_MSC_VER)
-# include <io.h> // for _open
+# include <io.h> // for _open()
# include <direct.h>
# else
# include <sys/types.h>
# include <sys/stat.h>
-# include <unistd.h> // for getcwd
+# include <unistd.h> // for getcwd()
# endif
-
# include <fcntl.h> // for mode flags for _open
-
#endif // _RWSTD_NO_NEW_HEADER
#undef open
@@ -430,18 +425,37 @@
std::messages_base::catalog
open_catalog (const std::messages<charT> &msgs,
const char *cat_name, const std::locale &loc,
- bool expect_exception, const char *cname, int line)
+ int expect, const char *cname, int line)
{
std::messages_base::catalog cat = -1;
+ // expect is set to:
+ // * 0 (or greater) when the caller expects the call to open()
+ // to succeed
+ // * -1 when the caller expects the call to open() to fail
+ // by returning -1
+ // * -2 (or less) when the caller expects the call to open()
+ // to exit by throwing an exception
+ const bool expect_success = expect >= 0;
+ const bool expect_failure = expect == -1;
+ const bool expect_exception = expect < -1;
+
+ const char* const nlspath = std::getenv ("NLSPATH");
+
try {
// an already closed cat should throw an exception
cat = (msgs.open)(cat_name, loc);
- rw_assert (!expect_exception, 0, line,
- "messages<%s>::open(%#s, locale(%#s)) ==> %d: failed "
- "to throw an expected exception",
- cname, cat_name, loc.name ().c_str (), cat);
+ const bool success =
+ expect_success && -1 < cat || expect_failure && cat < 0;
+
+ rw_assert (success, 0, line,
+ "messages<%s>::open(%#s, locale(%#s))"
+ "%{?} > -1%{:}%{?} == -1 %{;}%{;}, got %d"
+ "%{?}; failed to throw an exception%{;}; NLSPATH=%s",
+ cname, cat_name, loc.name ().c_str (),
+ expect_success, expect_failure, cat,
+ expect_exception, nlspath);
}
#ifndef _RWSTD_NO_EXCEPTIONS
@@ -449,14 +463,14 @@
catch (std::exception &ex) {
rw_assert (expect_exception, 0, line,
"messages<%s>::open(%#s, locale(%#s)) unexpectedly "
- "threw exception(%#s)",
- cname, cat_name, loc.name ().c_str (), ex.what ());
+ "threw exception(%#s); NLSPATH=%s",
+ cname, cat_name, loc.name ().c_str (), ex.what (), nlspath);
}
catch (...) {
rw_assert (expect_exception, 0, line,
"messages<%s>::open(%#s, locale(%#s)) unexpectedly "
- "threw an unknown exception",
- cname, cat_name, loc.name ().c_str ());
+ "threw an unknown exception; NLSPATH=%s",
+ cname, cat_name, loc.name ().c_str (), nlspath);
}
#endif // _RWSTD_NO_EXCEPTIONS
@@ -513,7 +527,7 @@
next_fd [0] = rw_nextfd (fdcount + 0);
rw_info (0, 0, __LINE__,
- "std::messages<%s>::open () and close() in locale (\"%s\")",
+ "std::messages<%s>::open() and close() in locale(#%s)",
cname, loc_name);
const std::locale loc (loc_name);
@@ -522,7 +536,7 @@
std::use_facet<std::messages<charT> >(loc);
const std::messages_base::catalog cat =
- open_catalog (msgs, CAT_NAME, loc, false, cname, __LINE__);
+ open_catalog (msgs, CAT_NAME, loc, 0, cname, __LINE__);
// close a (presumably successfully) opened catalog
close_catalog (msgs, cat, cat < 0, cname, __LINE__);
@@ -558,13 +572,9 @@
std::messages_base::catalog cat = -1;
- cat = open_catalog (msgs, CAT_NAME, loc, false, cname, __LINE__);
-
- rw_assert (-1 <= cat, 0, __LINE__,
- "messages<%s>::open(%#s, locale(%#s)) <= -1, got %d",
- cname, CAT_NAME, loc_name, cat);
+ cat = open_catalog (msgs, CAT_NAME, loc, 0, cname, __LINE__);
- if (cat == -1)
+ if (cat < 0)
return;
typedef std::char_traits<charT> Traits;
@@ -649,11 +659,9 @@
std::messages_base::catalog cat = -1;
- cat = open_catalog (msgs, CAT_NAME, loc, false, cname, __LINE__);
+ cat = open_catalog (msgs, CAT_NAME, loc, 0, cname, __LINE__);
- if (!rw_error (-1 < cat, 0, __LINE__,
- "messages<%s>::open(%#s, locale(%#s)) >= -1, got %d",
- cname, CAT_NAME, loc.name ().c_str (), cat))
+ if (cat < 0)
return;
cvt.check_state_ = true;
@@ -718,19 +726,10 @@
std::use_facet <std::messages<charT> >(loc);
const std::messages_base::catalog cat =
- open_catalog (msgs, NLS_CAT_NAME, loc, false, "char", __LINE__);
-
- if (-1 == cat) {
-
- const char* const envvar = std::getenv ("NLSPATH");
+ open_catalog (msgs, NLS_CAT_NAME, loc, 0, "char", __LINE__);
- rw_assert (0, 0, __LINE__,
- "messages<%s>::open(%#s, locale ()) != -1; "
- "NLSPATH=%s", cname, NLS_CAT_NAME, envvar);
- }
- else {
+ if (-1 < cat)
close_catalog (msgs, cat, false, cname, __LINE__);
- }
delete[] nlspath;
}
@@ -745,8 +744,11 @@
RW_ASSERT (0 != std::getenv ("NLSPATH"));
char catalog_names [24][24];
- std::messages_base::catalog cats[24];
+ const std::size_t NCATS = sizeof catalog_names / sizeof *catalog_names;
+
+ std::messages_base::catalog cats [NCATS];
+ // detect descriptor leaks
const int fd1 = open (__FILE__, O_RDONLY);
const std::locale loc = std::locale::classic ();
@@ -754,34 +756,35 @@
const std::messages<charT>& msgs =
std::use_facet<std::messages<charT> > (loc);
- char msg_name[24];
+ std::size_t i;
- int i;
+ for (i = 0; i < NCATS; i++) {
+
+ char msg_name [NCATS];
- for (i = 0; i < 24; i++) {
#ifndef _WIN32
- std::sprintf (msg_name, "rwstdmessages_%d.msg", i);
+ std::sprintf (msg_name, "rwstdmessages_%d.msg", int (i));
#else
- std::sprintf (msg_name, "rwstdmessages_%d.rc", i);
+ std::sprintf (msg_name, "rwstdmessages_%d.rc", int (i));
#endif
generate_catalog (msg_name, messages);
- char *dot = std::strrchr (msg_name, '.');
+
+ const char* const dot = std::strrchr (msg_name, '.');
std::strncpy (catalog_names[i], msg_name, dot - msg_name);
*(catalog_names[i] + (dot - msg_name)) = '\0';
-#ifndef _WIN32
- std::strcat (catalog_names[i], ".cat");
-#else
+#ifdef _WIN32
std::strcat (catalog_names[i], ".dll");
-#endif
+#endif // _WIN32
+ // open each catalog (expect success)
cats [i] = open_catalog (msgs, catalog_names [i],
- loc, false, cname, __LINE__);
+ loc, 0, cname, __LINE__);
}
// close smallest first and check for descriptor leaks
- for (i = 0; i < 24; ++i) {
+ for (i = 0; i < NCATS; ++i) {
if (-1 != cats [i])
close_catalog (msgs, cats [i], false, cname, __LINE__);
}
@@ -791,13 +794,13 @@
"messages<%s>::close() leaked %d file descriptors",
cname, fd2 - fd1 - 1);
- //open again, close largest first and check for descriptor leaks
- for (i = 0; i < 24; ++i) {
+ // open again, close largest first and check for descriptor leaks
+ for (i = 0; i < NCATS; ++i) {
cats [i] = open_catalog (msgs, catalog_names [i],
- loc, false, cname, __LINE__);
+ loc, 0, cname, __LINE__);
}
- for (i = 23; i >= 0 ; --i) {
+ for (i = NCATS; i-- > 0; ) {
if (-1 != cats [i])
close_catalog (msgs, cats [i], false, cname, __LINE__);
}
@@ -813,24 +816,7 @@
close (fd1);
close (fd2);
- for (i = 0; i < 24; ++i) {
-
-#ifndef _WIN32
- std::sprintf (msg_name, "rwstdmessages_%d.msg", i);
-#else
- std::sprintf (msg_name, "rwstdmessages_%d.dll", i);
-
- std::remove (msg_name);
-
- std::sprintf (msg_name, "rwstdmessages_%d.rc", i);
-#endif
-
- std::remove (msg_name);
-
- std::sprintf (msg_name, "rwstdmessages_%d.cat", i);
-
- std::remove (msg_name);
- }
+ rw_system (SHELL_RM_F "rwstdmessages_*");
}
/**************************************************************************/