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 2007/05/13 00:27:38 UTC

svn commit: r537522 - /incubator/stdcxx/trunk/tests/localization/22.locale.money.get.cpp

Author: sebor
Date: Sat May 12 15:27:36 2007
New Revision: 537522

URL: http://svn.apache.org/viewvc?view=rev&rev=537522
Log:
2007-05-12  Martin Sebor  <se...@roguewave.com>

	* 22.locale.money.get.cpp (PunctData): New base class for the test
	Punct facet.
	(Punct): Derived from PunctData.
	(narrow, widen): Removed.
	(do_test): Used PunctData instead of Punct. User the testuite helpers
	rw_expand() and rw_narrow() instead of narrow() and widen(). Used the
	%{*Ac} directive to format either narrow and wide character strings.
	(test_memfun): Renamed...
	(test_get): ...to this and used PunctData instead of Punct.
	(test_long_double, test_string): Called test_get().

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

Modified: incubator/stdcxx/trunk/tests/localization/22.locale.money.get.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/tests/localization/22.locale.money.get.cpp?view=diff&rev=537522&r1=537521&r2=537522
==============================================================================
--- incubator/stdcxx/trunk/tests/localization/22.locale.money.get.cpp (original)
+++ incubator/stdcxx/trunk/tests/localization/22.locale.money.get.cpp Sat May 12 15:27:36 2007
@@ -30,13 +30,11 @@
 #include <locale>
 
 #include <cstdio>     // for sscanf()
-#include <cstdlib>    // for mbstowcs(), wcstombs()
-#include <cstring>    // for strcat(), strlen()
-#include <cwchar>     // for wcslen()
 
 #include <cmdopt.h>   // for rw_enabled()
 #include <driver.h>   // for rw_assert(), rw_test(), ...
-#include <valcmp.h>   // for rw_fltcmp()
+#include <rw_char.h>  // for rw_expand()
+#include <valcmp.h>   // for rw_ldblcmp()
 
 
 #ifndef _RWSTD_NO_LONG_DOUBLE
@@ -105,105 +103,127 @@
 
 /**************************************************************************/
 
+template <class charT>
+struct PunctData
+{
+    static charT                     decimal_point_ [2];
+    static charT                     thousands_sep_ [2];
+    static const char               *grouping_ [2];
+    static const charT              *curr_symbol_ [2];
+    static const charT              *positive_sign_ [2];
+    static const charT              *negative_sign_ [2];
+    static std::money_base::pattern  format_ [2][2];
+    static int                       frac_digits_ [2];
+};
+
+
+template <class charT>
+const char*
+PunctData<charT>::grouping_ [2] = { "", "" };
+
+template <class charT>
+charT
+PunctData<charT>::decimal_point_ [2] = { '.', '.' };
+
+template <class charT>
+charT
+PunctData<charT>::thousands_sep_ [2] = { ',', ',' };
+
+template <class charT>
+const charT*
+PunctData<charT>::curr_symbol_ [2];
+
+template <class charT>
+const charT*
+PunctData<charT>::positive_sign_ [2];
+
+template <class charT>
+const charT*
+PunctData<charT>::negative_sign_ [2];
+
+template <class charT>
+std::money_base::pattern PunctData<charT>::format_ [2][2] = {
+    {   // local
+        { { // positive
+                std::money_base::symbol, std::money_base::sign,
+                std::money_base::none,   std::money_base::value
+            } },
+        { { // negative
+                std::money_base::symbol, std::money_base::sign,
+                std::money_base::none,   std::money_base::value
+            } }
+    },
+
+    {   // international
+        { { // positive
+                std::money_base::symbol, std::money_base::sign,
+                std::money_base::none,   std::money_base::value
+            } },
+        { { // negative
+                std::money_base::symbol, std::money_base::sign,
+                std::money_base::none,   std::money_base::value
+            } }
+    }
+};
+
+template <class charT>
+int PunctData<charT>::frac_digits_ [2];
+
+
 template <class charT, bool Intl>
-struct Punct: std::moneypunct<charT, Intl>
+struct Punct: std::moneypunct<charT, Intl>, PunctData<charT>
 {
     typedef std::moneypunct<charT, Intl> Base;
     typedef typename Base::char_type     char_type;
     typedef typename Base::string_type   string_type;
 
-    static char_type                 decimal_point_;
-    static char_type                 thousands_sep_;
-    static const char               *grouping_;
-    static const char_type          *curr_symbol_;
-    static const char_type          *positive_sign_;
-    static const char_type          *negative_sign_;
-    static std::money_base::pattern  format_ [2];
-    static int                       frac_digits_;
-
     static int n_thousands_sep_;   // number of calls to do_thousands_sep()
 
     Punct (std::size_t ref): Base (ref) { }
 
     char_type do_decimal_point () const {
-        return decimal_point_;
+        return this->decimal_point_ [Intl];
     }
 
     int do_frac_digits () const {
-        return frac_digits_;
+        return this->frac_digits_ [Intl];
     }
 
     virtual string_type do_curr_symbol () const {
         foo ();
-        return curr_symbol_ ? curr_symbol_ : string_type ();
+        return this->curr_symbol_ [Intl] ?
+            this->curr_symbol_ [Intl] : string_type ();
     }
 
     virtual std::string do_grouping () const {
-        return grouping_ ? std::string (grouping_) : std::string ();
+        return this->grouping_ [Intl] ? this->grouping_ [Intl] : "";
     }
 
     virtual char_type do_thousands_sep () const {
         ++n_thousands_sep_;
-        return thousands_sep_;
+        return this->thousands_sep_ [Intl];
     }
 
     virtual string_type do_positive_sign () const {
-        return positive_sign_ ? positive_sign_ : string_type ();
+        return this->positive_sign_  [Intl] ?
+            this->positive_sign_ [Intl] : string_type ();
     }
 
     virtual string_type do_negative_sign () const {
-        return negative_sign_ ? negative_sign_ : string_type ();
+        return this->negative_sign_ [Intl] ?
+            this->negative_sign_ [Intl] : string_type ();
     }
 
     virtual std::money_base::pattern do_pos_format () const {
-        return format_ [0];
+        return this->format_ [Intl][0];
     }
 
     virtual std::money_base::pattern do_neg_format () const {
-        return format_ [1];
+        return this->format_ [Intl][1];
     }
 };
 
 template <class charT, bool Intl>
-const char* Punct<charT, Intl>::grouping_ = "";
-
-template <class charT, bool Intl>
-typename Punct<charT, Intl>::char_type
-Punct<charT, Intl>::decimal_point_ = '.';
-
-template <class charT, bool Intl>
-typename Punct<charT, Intl>::char_type
-Punct<charT, Intl>::thousands_sep_ = ',';
-
-template <class charT, bool Intl>
-const typename Punct<charT, Intl>::char_type*
-Punct<charT, Intl>::curr_symbol_;
-
-template <class charT, bool Intl>
-const typename Punct<charT, Intl>::char_type*
-Punct<charT, Intl>::positive_sign_;
-
-template <class charT, bool Intl>
-const typename Punct<charT, Intl>::char_type*
-Punct<charT, Intl>::negative_sign_;
-
-template <class charT, bool Intl>
-std::money_base::pattern Punct<charT, Intl>::format_[2] = {
-    { { // positive
-        std::money_base::symbol, std::money_base::sign,
-        std::money_base::none,   std::money_base::value
-    } },
-    { { // negative
-        std::money_base::symbol, std::money_base::sign,
-        std::money_base::none,   std::money_base::value
-    } }
-};
-
-template <class charT, bool Intl>
-int Punct<charT, Intl>::frac_digits_;
-
-
-template <class charT, bool Intl>
 int Punct<charT, Intl>::n_thousands_sep_;
 
 
@@ -221,72 +241,6 @@
 
 /**************************************************************************/
 
-const char* narrow (char *dst, const char *src)
-{
-    if (src == dst || !src || !dst)
-        return src;
-
-    std::memcpy (dst, src, std::strlen (src) + 1);
-    return dst;
-}
-
-
-const char* widen (char *dst, const char *src)
-{
-    if (src == dst || !src || !dst)
-        return src;
-
-    std::memcpy (dst, src, std::strlen (src) + 1);
-    return dst;
-}
-
-
-const char* narrow (char *dst, const wchar_t *src)
-{
-    static char buf [4096];
-
-    if (!src)
-        return 0;
-
-    if (!dst)
-        dst = buf;
-
-    std::size_t len = std::wcslen (src);
-
-    RW_ASSERT (len < sizeof buf);
-
-    len = std::wcstombs (dst, src, sizeof buf / sizeof *buf);
-
-    if (std::size_t (-1) == len)
-        *dst = 0;
-
-    return dst;
-}
-
-
-const wchar_t* widen (wchar_t *dst, const char *src)
-{
-    static wchar_t buf [4096];
-
-    if (!src)
-        return 0;
-
-    if (!dst)
-        dst = buf;
-
-    std::size_t len = std::strlen (src);
-
-    RW_ASSERT (len < sizeof buf /sizeof *buf);
-
-    len = std::mbstowcs (dst, src, sizeof buf / sizeof *buf);
-
-    if (std::size_t (-1) == len)
-        *dst = 0;
-
-    return dst;
-}
-
-
 template <class charT>
 void do_test (charT       which,   // which overload to exercise
               const char *cname,   // the name of the charT type
@@ -318,21 +272,35 @@
         fmat = pat.field;
     }
 
+    // local format? (the opposite of interantional)
+    const bool locl = !intl;
+
     // take care to initialize Punct static data before installing
     // the facet in case locale or the base facet calls the overridden
     // virtuals early to cache the results
-    Punct<charT, false>::format_ [1].field [0] = fmat [0];
-    Punct<charT, false>::format_ [1].field [1] = fmat [1];
-    Punct<charT, false>::format_ [1].field [2] = fmat [2];
-    Punct<charT, false>::format_ [1].field [3] = fmat [3];
+    PunctData<charT>::format_ [intl][1].field [0] = fmat [0];
+    PunctData<charT>::format_ [intl][1].field [1] = fmat [1];
+    PunctData<charT>::format_ [intl][1].field [2] = fmat [2];
+    PunctData<charT>::format_ [intl][1].field [3] = fmat [3];
+
+    PunctData<charT>::format_ [locl][1].field [0] = fmat [3];
+    PunctData<charT>::format_ [locl][1].field [1] = fmat [2];
+    PunctData<charT>::format_ [locl][1].field [2] = fmat [1];
+    PunctData<charT>::format_ [locl][1].field [3] = fmat [0];
 
     // zero out positive format (not used by money_get)
-    Punct<charT, false>::format_ [0] = std::money_base::pattern ();
+    PunctData<charT>::format_ [intl][0] = std::money_base::pattern ();
+    PunctData<charT>::format_ [locl][0] = std::money_base::pattern ();
+
+    // expand (widen) currency symbol
+    PunctData<charT>::curr_symbol_ [intl] = rw_expand ((charT*)0, cursym);
+    PunctData<charT>::curr_symbol_ [locl] = 0;
+    
+    PunctData<charT>::grouping_ [intl] = grouping;
+    PunctData<charT>::grouping_ [locl] = 0;
 
-    charT wcursym_buf [40];
-    Punct<charT, false>::curr_symbol_ = widen (wcursym_buf, cursym);
-    Punct<charT, false>::grouping_    = grouping;
-    Punct<charT, false>::frac_digits_ = frac_digits;
+    PunctData<charT>::frac_digits_ [intl] = frac_digits;
+    PunctData<charT>::frac_digits_ [locl] = frac_digits + 1;
 
     Ios<charT> io;
     MoneyGet<charT> mg;
@@ -351,9 +319,8 @@
 
     io.flags (std::ios_base::fmtflags (flags));
 
-    // widen input string if necessary
-    charT wstr_buf [4096];
-    const charT *next = widen (wstr_buf, str);
+    // expand (widen) input sequence
+    const charT* const next = rw_expand ((charT*)0, str);
 
     std::ios_base::iostate err = std::ios_base::goodbit;
 
@@ -374,21 +341,21 @@
             !(-1 != consumed && last - next != consumed || err != err_expect);
 
         rw_assert (success, __FILE__, lineno,
-                   "money_get<%s>::get (%s, ..., %d, ..., %s&), "
+                   "money_get<%s>::get (%{*Ac}, ..., %b, ..., %s&), "
                    "ate %d, expected %d, frac_digits = %d, "
                    "flags = %{If}, grouping = %#s, pattern = %{LM}, "
-                   "state = %{Is}, expected = %{Is}",
-                   cname, next, intl, tname,
+                   "state = %{Is}, expected %{Is}",
+                   cname, int (sizeof *next), next, intl, tname,
                    last - next, consumed, frac_digits,
                    flags, grouping, fmat,
                    err, err_expect);
 
         rw_assert (2 > rw_ldblcmp (x, val), __FILE__, lineno,
-                   "money_get<%s>::get (%s, ..., %d, ..., %s&), "
+                   "money_get<%s>::get (%{*Ac}, ..., %b, ..., %s&), "
                    "got %Lg, expected %Lg, frac_digits = %d, "
                    "flags = %{If}s, grouping = %#s, pattern = %{LM}, "
                    "state = %{Is}, expected %{Is}",
-                   cname, next, intl, tname,
+                   cname, int (sizeof *next), next, intl, tname,
                    x, val, frac_digits,
                    flags, grouping, fmat,
                    err, err_expect);
@@ -406,11 +373,11 @@
             !(-1 != consumed && last - next != consumed || err != err_expect);
 
         rw_assert (success, __FILE__, lineno,
-                   "money_get<%s>::get (%s, ..., %d, ..., "
+                   "money_get<%s>::get (%{*Ac}, ..., %b, ..., "
                    "basic_string<%s>&), ate %d, expected %d, "
                    "frac_digits = %d, flags = %{If}, grouping = %#s"
-                   ", format = %{LM}, state = %{Is}, expected = %{Is}",
-                   cname, next, intl,
+                   ", format = %{LM}, state = %{Is}, expected %{Is}",
+                   cname, int (sizeof *next), next, intl,
                    cname, last - next, consumed,
                    frac_digits, flags, grouping,
                    fmat, err, err_expect);
@@ -418,7 +385,7 @@
         if (success) {
 
             char narrow_buf [4096];
-            narrow (narrow_buf, bs.c_str ());
+            rw_narrow (narrow_buf, bs.c_str ());
 
             LongDouble x = 0;
 
@@ -434,16 +401,19 @@
                   && 1 < rw_ldblcmp (x, val));
 
             rw_assert (success, __FILE__, lineno,
-                       "money_get<%s>::get (%s, ..., %d, ..., "
+                       "money_get<%s>::get (%{*Ac}, ..., %b, ..., "
                        "basic_string<%s>&), got %s, expected %Lg, "
                        "frac_digits = %d, flags = %{If}, grouping = %#s,"
                        " pattern = %{LM}, iostate = %{Is}, expected %{Is}",
-                       cname, next, intl,
+                       cname, int (sizeof *next), next, intl,
                        cname, bs.c_str (), val,
                        frac_digits, flags, grouping,
                        fmat, err, err_expect);
         }
     }
+
+    delete[] PunctData<charT>::curr_symbol_ [intl];
+    delete[] next;
 }
 
 /**************************************************************************/
@@ -478,7 +448,7 @@
 
 
 template <class charT>
-void test_memfun (charT opt, const char *cname, const char *tname)
+void test_get (charT opt, const char *cname, const char *tname)
 {
 #define T      opt, cname, tname, __LINE__
 #define TEST   do_test
@@ -496,9 +466,12 @@
     // by decimal_point(). The other symbols are defined as follows:
     //     units ::= digits [ thousandssep units ] digits ::= adigit [ digits ]
 
-    Punct<charT, false>::positive_sign_ = 0;
-    Punct<charT, false>::negative_sign_ = 0;
-    Punct<charT, false>::thousands_sep_ = '\0';
+    PunctData<charT>::positive_sign_ [0] = 0;
+    PunctData<charT>::positive_sign_ [1] = 0;
+    PunctData<charT>::negative_sign_ [0] = 0;
+    PunctData<charT>::negative_sign_ [1] = 0;
+    PunctData<charT>::thousands_sep_ [0] = '\0';
+    PunctData<charT>::thousands_sep_ [1] = '\0';
 
     // parsing zero, no curr_symbol or sign, default pattern, 0 frac_digits
     TEST (T, 0.0, "0",   1, 0, eofbit);
@@ -566,7 +539,8 @@
     TEST (T,  54321098.0, "5432.1098", 9, 0, eofbit, 4);
     TEST (T, 432109870.0, "43210.987", 9, 0, eofbit, 4);
 
-    Punct<charT, false>::thousands_sep_ = ',';
+    PunctData<charT>::thousands_sep_ [0] = ',';
+    PunctData<charT>::thousands_sep_ [1] = ';';
 
     // parsing with thousands_sep and/or grouping
     TEST (T,      0.0, "0",        1, 0, eofbit,  0, 0, "", "\1");
@@ -637,11 +611,13 @@
 
     // parsing with a simple non-empty sign
 
-    static const charT plus[]  = { '+', '\0' };
-    static const charT minus[] = { '-', '\0' };
+    static const charT plus[][2]  = { { '+', '\0' }, { '\0' } };
+    static const charT minus[][2] = { { '-', '\0' }, { '\0' } };
 
-    Punct<charT, false>::positive_sign_ = plus;
-    Punct<charT, false>::negative_sign_ = minus;
+    PunctData<charT>::positive_sign_ [0] = plus [0];
+    PunctData<charT>::negative_sign_ [0] = minus [0];
+    PunctData<charT>::positive_sign_ [1] = plus [1];
+    PunctData<charT>::negative_sign_ [1] = minus [1];
 
     TEST (T,  15.0, "+15",     3, 0, eofbit,  0, 0, "");
     TEST (T,  16.0, "+ 16",    4, 0, eofbit,  0, 0, "");
@@ -668,11 +644,13 @@
 
     // parsing with a multi-char non-empty sign
 
-    static const charT plus_plus[]   = { '+', '+', '\0' };
-    static const charT minus_minus[] = { '-', '-', '\0' };
+    static const charT plus_plus[][3]   = { { '+', '+', '\0' }, { '\0' } };
+    static const charT minus_minus[][3] = { { '-', '-', '\0' }, { '\0' } };
 
-    Punct<charT, false>::positive_sign_ = plus_plus;
-    Punct<charT, false>::negative_sign_ = minus_minus;
+    PunctData<charT>::positive_sign_ [0] = plus_plus [0];
+    PunctData<charT>::negative_sign_ [0] = minus_minus [0];
+    PunctData<charT>::positive_sign_ [1] = plus_plus [1];
+    PunctData<charT>::negative_sign_ [1] = minus_minus [1];
 
     TEST (T,  27.0, "+27+",    4, 0, eofbit, 0, 0, "");
     TEST (T,  28.0, "+  28+",  6, 0, eofbit, 0, 0, "");
@@ -703,9 +681,12 @@
     TEST (T, 0.0, "$-3.80 -",  3, 0, failbit, 0, 0, "$");
     TEST (T, 0.0, "$- 3.91 -", 7, 0, failbit, 1, 0, "$");
 
-    static const charT plus_minus[] = { '+', '-', '\0' };
-    Punct<charT, false>::positive_sign_ = plus_plus;
-    Punct<charT, false>::negative_sign_ = plus_minus;
+    static const charT plus_minus[][3] = { { '+', '-', '\0' }, { '\0' } };
+
+    PunctData<charT>::positive_sign_ [0] = plus_plus [0];
+    PunctData<charT>::positive_sign_ [1] = plus_plus [1];
+    PunctData<charT>::negative_sign_ [0] = plus_minus [0];
+    PunctData<charT>::negative_sign_ [1] = plus_minus [1];
 
     // 22.2.6.1.2, p3: if the first character of positive
     // and negative sign is the same, the result is positive
@@ -721,8 +702,10 @@
     // none = 0, space = 1, symbol = 2, sign = 3, value = 4
 
     // test various patterns
-    Punct<charT, false>::positive_sign_ = plus;
-    Punct<charT, false>::negative_sign_ = minus;
+    PunctData<charT>::positive_sign_ [0] = plus [0];
+    PunctData<charT>::positive_sign_ [1] = plus [1];
+    PunctData<charT>::negative_sign_ [0] = minus [0];
+    PunctData<charT>::negative_sign_ [1] = minus [1];
 
     TEST (T,  -100.0, "$-1",   3, showbase, eofbit,  2, "\2\3\4\0", "$");
     TEST (T,  -200.0, "$-2 ",  3, showbase, goodbit, 2, "\2\3\4\0", "$");
@@ -746,8 +729,9 @@
     TEST (T,     0.0, "14$-",  2, showbase, failbit, 2, "\4\1\2\3", "$");
     TEST (T, -1500.0, "15 $-", 5, showbase, eofbit,  2, "\4\1\2\3", "$");
 
-    const charT parens[] = { '(', ')', '\0' };
-    Punct<charT, false>::negative_sign_ = parens;
+    const charT parens[][3] = { { '(', ')', '\0' }, { '\0' } };
+    PunctData<charT>::negative_sign_ [0] = parens [0];
+    PunctData<charT>::negative_sign_ [1] = parens [1];
 
     // { sign, space, value, symbol }, with symbol required
     TEST (T, -90.0, "( 9$)",    5, showbase, eofbit, 1, "\3\1\4\2", "$");
@@ -772,8 +756,10 @@
     TEST (T, -104.0, "(104 L)", 7, 0,        eofbit,  0, "\3\4\0\2", "L");
     TEST (T, -105.0, "(105 L)", 7, showbase, eofbit,  0, "\3\4\0\2", "L");
 
-    Punct<charT, false>::positive_sign_ = plus;
-    Punct<charT, false>::negative_sign_ = minus;
+    PunctData<charT>::positive_sign_ [0] = plus [0];
+    PunctData<charT>::negative_sign_ [0] = minus [0];
+    PunctData<charT>::positive_sign_ [1] = plus [1];
+    PunctData<charT>::negative_sign_ [1] = minus [1];
 
     // { sign, value, none, symbol }
     // trailing optional curr_symbol or whitespace preceding it (regardless
@@ -797,8 +783,9 @@
     // trailing required curr_symbol is consumed
     TEST (T, -109.0, "109-$",  5, showbase, eofbit,  0, "\4\0\3\2", "$");
 
-    const charT minus_space[] = { '-', ' ', '\0' };
-    Punct<charT, false>::negative_sign_ = minus_space;
+    const charT minus_space[][3] = { { '-', ' ', '\0' }, { '\0' } };
+    PunctData<charT>::negative_sign_ [0] = minus_space [0];
+    PunctData<charT>::negative_sign_ [1] = minus_space [1];
 
     // { sign, value, none, symbol }
     // negative_sign is "- ", (note the single trailing space)
@@ -810,24 +797,30 @@
 
     // verify that optional space after value and before currency
     // symbol is treated correctly
-    Punct<charT, false>::positive_sign_ = plus_plus;
-    Punct<charT, false>::negative_sign_ = 0;
+    PunctData<charT>::positive_sign_ [0] = plus_plus [0];
+    PunctData<charT>::positive_sign_ [1] = 0;
+    PunctData<charT>::negative_sign_ [0] = 0;
+    PunctData<charT>::negative_sign_ [1] = 0;
 
     // { sign, value, none, symbol }
     TEST (T,  1090.0, "1090 $",   6, showbase, eofbit,  0, "\3\4\0\2", "$");
     TEST (T,  1091.0, "1091 $",   6, showbase, eofbit,  0, "\3\4\0\2", "$");
     TEST (T, +1092.0, "+1092 $+", 8, showbase, eofbit,  0, "\3\4\0\2", "$");
 
-    Punct<charT, false>::positive_sign_ = 0;
-    Punct<charT, false>::negative_sign_ = parens;
+    PunctData<charT>::positive_sign_ [0] = 0;
+    PunctData<charT>::positive_sign_ [1] = 0;
+    PunctData<charT>::negative_sign_ [0] = parens [0];
+    PunctData<charT>::negative_sign_ [1] = 0;
 
     TEST (T,  1093.0, "1093 $",   6, showbase, eofbit,  0, "\3\4\0\2", "$");
     TEST (T,  1094.0, "1094 $",   6, showbase, eofbit,  0, "\3\4\0\2", "$");
     TEST (T, -1095.0, "(1095 $)", 8, showbase, eofbit,  0, "\3\4\0\2", "$");
 
     // verify a single-char sign with a multichar one (see bug #428)
-    Punct<charT, false>::positive_sign_ = plus;
-    Punct<charT, false>::negative_sign_ = parens;
+    PunctData<charT>::positive_sign_ [0] = plus [0];
+    PunctData<charT>::positive_sign_ [1] = 0;
+    PunctData<charT>::negative_sign_ [0] = parens [0];
+    PunctData<charT>::negative_sign_ [1] = 0;
 
     // { sign, value, none, symbol }
     TEST (T,  1096.0, "1096 $",   6, showbase, eofbit,  0, "\3\4\0\2", "$");
@@ -835,8 +828,10 @@
     TEST (T, +1098.0, "+1098 $",  7, showbase, eofbit,  0, "\3\4\0\2", "$");
     TEST (T, -1099.0, "(1099 $)", 8, showbase, eofbit,  0, "\3\4\0\2", "$");
 
-    Punct<charT, false>::positive_sign_ = 0;
-    Punct<charT, false>::negative_sign_ = 0;
+    PunctData<charT>::positive_sign_ [0] = 0;
+    PunctData<charT>::positive_sign_ [1] = 0;
+    PunctData<charT>::negative_sign_ [0] = 0;
+    PunctData<charT>::negative_sign_ [1] = 0;
 
     // { value, none, symbol, sign }
     // trailing whitespace is not extracted (even if required by the format)
@@ -856,9 +851,12 @@
     TEST (T,  119.0, "119 $",  5, showbase, eofbit,  0, "\4\1\2\3", "$");
 
 
-    Punct<charT, false>::positive_sign_ = plus;
-    Punct<charT, false>::negative_sign_ = minus;
-    Punct<charT, false>::thousands_sep_ = ';';
+    PunctData<charT>::positive_sign_ [0] = plus [0];
+    PunctData<charT>::positive_sign_ [1] = plus [1];
+    PunctData<charT>::negative_sign_ [0] = minus [0];
+    PunctData<charT>::negative_sign_ [1] = minus [1];
+    PunctData<charT>::thousands_sep_ [0] = ';';
+    PunctData<charT>::thousands_sep_ [1] = '*';
 
     // test grouping, default pattern { symbol sign none value }
     TEST (T, 0.0, "$0",     2, 0, eofbit, 0, 0, "$", "\1");
@@ -954,8 +952,8 @@
 test_long_double (charT, const char *cname)
 {
     if (rw_enabled ("long double"))
-        test_memfun (charT (0 /* long double argument */),
-                     cname, "long double");
+        test_get (charT (0 /* long double argument */),
+                  cname, "long double");
     else
         rw_note (0, __FILE__, __LINE__, "long double test disabled");
 }
@@ -967,8 +965,8 @@
 test_string (charT, const char *cname)
 {
     if (rw_enabled ("basic_string"))
-        test_memfun (charT (1 /* basic_string argument */),
-                     cname, "basic_string");
+        test_get (charT (1 /* basic_string argument */),
+                  cname, "basic_string");
     else
         rw_note (0, __FILE__, __LINE__,
                  "basic_string<%s> test disabled", cname);