[libcxx-commits] [libcxx] f1d0d6f - [libcxx] [test] Fix the monetary locale pos/neg_format test for Windows and macOS

Martin Storsjö via libcxx-commits libcxx-commits at lists.llvm.org
Sun Feb 27 12:08:32 PST 2022


Author: Martin Storsjö
Date: 2022-02-27T21:49:14+02:00
New Revision: f1d0d6f70c63a465c102742c7b910cc201a9502e

URL: https://github.com/llvm/llvm-project/commit/f1d0d6f70c63a465c102742c7b910cc201a9502e
DIFF: https://github.com/llvm/llvm-project/commit/f1d0d6f70c63a465c102742c7b910cc201a9502e.diff

LOG: [libcxx] [test] Fix the monetary locale pos/neg_format test for Windows and macOS

The zh_CN.UTF-8 locale on Glibc has got `n_sign_posn == 4` (which means
having the negative sign just after the currency symbol), but has
`int_n_sign_posn == 1` (which means before the string).

On Windows, there's no separate `int_n_sign_posn` field, so the same
`n_sign_posn` (which is 4 there too) is used for international currency
formatting too. This makes the ordering for the international case on
Windows be the same as for the national one right above it.

On Apple platforms, the fr_FR.UTF-8 locale has got `n_sign_posn == 2`
but `p_sign_posn == 1`, giving a different order for the French locale
for the negative format.

On Apple platforms for the zh_CN.UTF-8 locale, both `n_sign_posn` and
`int_n_sign_posn` are 4, but `p_sign_posn` and `int_p_sign_posn` are 1.

Differential Revision: https://reviews.llvm.org/D120550

Added: 
    

Modified: 
    libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/neg_format.pass.cpp
    libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/pos_format.pass.cpp

Removed: 
    


################################################################################
diff  --git a/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/neg_format.pass.cpp b/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/neg_format.pass.cpp
index 8b85dc07a90b0..c84c63b1a30e6 100644
--- a/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/neg_format.pass.cpp
+++ b/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/neg_format.pass.cpp
@@ -6,13 +6,9 @@
 //
 //===----------------------------------------------------------------------===//
 //
-// XFAIL: darwin
-//
 // NetBSD does not support LC_MONETARY at the moment
 // XFAIL: netbsd
 
-// XFAIL: LIBCXX-WINDOWS-FIXME
-
 // REQUIRES: locale.en_US.UTF-8
 // REQUIRES: locale.fr_FR.UTF-8
 // REQUIRES: locale.ru_RU.UTF-8
@@ -65,180 +61,176 @@ class Fwt
 };
 #endif // TEST_HAS_NO_WIDE_CHARACTERS
 
+void assert_symbol_sign_none_value(std::money_base::pattern p)
+{
+    assert(p.field[0] == std::money_base::symbol);
+    assert(p.field[1] == std::money_base::sign);
+    assert(p.field[2] == std::money_base::none);
+    assert(p.field[3] == std::money_base::value);
+}
+
+void assert_sign_symbol_none_value(std::money_base::pattern p)
+{
+    assert(p.field[0] == std::money_base::sign);
+    assert(p.field[1] == std::money_base::symbol);
+    assert(p.field[2] == std::money_base::none);
+    assert(p.field[3] == std::money_base::value);
+}
+
+void assert_value_none_symbol_sign(std::money_base::pattern p)
+{
+    assert(p.field[0] == std::money_base::value);
+    assert(p.field[1] == std::money_base::none);
+    assert(p.field[2] == std::money_base::symbol);
+    assert(p.field[3] == std::money_base::sign);
+}
+
+void assert_sign_value_none_symbol(std::money_base::pattern p)
+{
+    assert(p.field[0] == std::money_base::sign);
+    assert(p.field[1] == std::money_base::value);
+    assert(p.field[2] == std::money_base::none);
+    assert(p.field[3] == std::money_base::symbol);
+}
+
 int main(int, char**)
 {
     {
         Fnf f("C", 1);
         std::money_base::pattern p = f.neg_format();
-        assert(p.field[0] == std::money_base::symbol);
-        assert(p.field[1] == std::money_base::sign);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+        assert_symbol_sign_none_value(p);
     }
     {
         Fnt f("C", 1);
         std::money_base::pattern p = f.neg_format();
-        assert(p.field[0] == std::money_base::symbol);
-        assert(p.field[1] == std::money_base::sign);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+        assert_symbol_sign_none_value(p);
     }
 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f("C", 1);
         std::money_base::pattern p = f.neg_format();
-        assert(p.field[0] == std::money_base::symbol);
-        assert(p.field[1] == std::money_base::sign);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+        assert_symbol_sign_none_value(p);
     }
     {
         Fwt f("C", 1);
         std::money_base::pattern p = f.neg_format();
-        assert(p.field[0] == std::money_base::symbol);
-        assert(p.field[1] == std::money_base::sign);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+        assert_symbol_sign_none_value(p);
     }
 #endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         Fnf f(LOCALE_en_US_UTF_8, 1);
         std::money_base::pattern p = f.neg_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::symbol);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+        assert_sign_symbol_none_value(p);
     }
     {
         Fnt f(LOCALE_en_US_UTF_8, 1);
         std::money_base::pattern p = f.neg_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::symbol);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+        assert_sign_symbol_none_value(p);
     }
 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_en_US_UTF_8, 1);
         std::money_base::pattern p = f.neg_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::symbol);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+        assert_sign_symbol_none_value(p);
     }
     {
         Fwt f(LOCALE_en_US_UTF_8, 1);
         std::money_base::pattern p = f.neg_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::symbol);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+        assert_sign_symbol_none_value(p);
     }
 #endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         Fnf f(LOCALE_fr_FR_UTF_8, 1);
         std::money_base::pattern p = f.neg_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::value);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::symbol);
+#ifdef __APPLE__
+        assert_value_none_symbol_sign(p);
+#else
+        assert_sign_value_none_symbol(p);
+#endif
     }
     {
         Fnt f(LOCALE_fr_FR_UTF_8, 1);
         std::money_base::pattern p = f.neg_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::value);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::symbol);
+#ifdef __APPLE__
+        assert_value_none_symbol_sign(p);
+#else
+        assert_sign_value_none_symbol(p);
+#endif
     }
 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_fr_FR_UTF_8, 1);
         std::money_base::pattern p = f.neg_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::value);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::symbol);
+#ifdef __APPLE__
+        assert_value_none_symbol_sign(p);
+#else
+        assert_sign_value_none_symbol(p);
+#endif
     }
     {
         Fwt f(LOCALE_fr_FR_UTF_8, 1);
         std::money_base::pattern p = f.neg_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::value);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::symbol);
+#ifdef __APPLE__
+        assert_value_none_symbol_sign(p);
+#else
+        assert_sign_value_none_symbol(p);
+#endif
     }
 #endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         Fnf f(LOCALE_ru_RU_UTF_8, 1);
         std::money_base::pattern p = f.neg_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::value);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::symbol);
+        assert_sign_value_none_symbol(p);
     }
     {
         Fnt f(LOCALE_ru_RU_UTF_8, 1);
         std::money_base::pattern p = f.neg_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::value);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::symbol);
+        assert_sign_value_none_symbol(p);
     }
 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_ru_RU_UTF_8, 1);
         std::money_base::pattern p = f.neg_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::value);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::symbol);
+        assert_sign_value_none_symbol(p);
     }
     {
         Fwt f(LOCALE_ru_RU_UTF_8, 1);
         std::money_base::pattern p = f.neg_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::value);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::symbol);
+        assert_sign_value_none_symbol(p);
     }
 #endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         Fnf f(LOCALE_zh_CN_UTF_8, 1);
         std::money_base::pattern p = f.neg_format();
-        assert(p.field[0] == std::money_base::symbol);
-        assert(p.field[1] == std::money_base::sign);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+        assert_symbol_sign_none_value(p);
     }
     {
         Fnt f(LOCALE_zh_CN_UTF_8, 1);
         std::money_base::pattern p = f.neg_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::symbol);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+#if defined(_WIN32) || defined(__APPLE__)
+        assert_symbol_sign_none_value(p);
+#else
+        assert_sign_symbol_none_value(p);
+#endif
     }
 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_zh_CN_UTF_8, 1);
         std::money_base::pattern p = f.neg_format();
-        assert(p.field[0] == std::money_base::symbol);
-        assert(p.field[1] == std::money_base::sign);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+        assert_symbol_sign_none_value(p);
     }
     {
         Fwt f(LOCALE_zh_CN_UTF_8, 1);
         std::money_base::pattern p = f.neg_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::symbol);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+#if defined(_WIN32) || defined(__APPLE__)
+        assert_symbol_sign_none_value(p);
+#else
+        assert_sign_symbol_none_value(p);
+#endif
     }
 #endif // TEST_HAS_NO_WIDE_CHARACTERS
 

diff  --git a/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/pos_format.pass.cpp b/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/pos_format.pass.cpp
index 900d55f7001d3..7dbcf412bd7b4 100644
--- a/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/pos_format.pass.cpp
+++ b/libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/pos_format.pass.cpp
@@ -6,13 +6,9 @@
 //
 //===----------------------------------------------------------------------===//
 //
-// XFAIL: darwin
-//
 // NetBSD does not support LC_MONETARY at the moment
 // XFAIL: netbsd
 
-// XFAIL: LIBCXX-WINDOWS-FIXME
-
 // REQUIRES: locale.en_US.UTF-8
 // REQUIRES: locale.fr_FR.UTF-8
 // REQUIRES: locale.ru_RU.UTF-8
@@ -65,180 +61,168 @@ class Fwt
 };
 #endif // TEST_HAS_NO_WIDE_CHARACTERS
 
+void assert_symbol_sign_none_value(std::money_base::pattern p)
+{
+    assert(p.field[0] == std::money_base::symbol);
+    assert(p.field[1] == std::money_base::sign);
+    assert(p.field[2] == std::money_base::none);
+    assert(p.field[3] == std::money_base::value);
+}
+
+void assert_sign_symbol_none_value(std::money_base::pattern p)
+{
+    assert(p.field[0] == std::money_base::sign);
+    assert(p.field[1] == std::money_base::symbol);
+    assert(p.field[2] == std::money_base::none);
+    assert(p.field[3] == std::money_base::value);
+}
+
+void assert_value_none_symbol_sign(std::money_base::pattern p)
+{
+    assert(p.field[0] == std::money_base::value);
+    assert(p.field[1] == std::money_base::none);
+    assert(p.field[2] == std::money_base::symbol);
+    assert(p.field[3] == std::money_base::sign);
+}
+
+void assert_sign_value_none_symbol(std::money_base::pattern p)
+{
+    assert(p.field[0] == std::money_base::sign);
+    assert(p.field[1] == std::money_base::value);
+    assert(p.field[2] == std::money_base::none);
+    assert(p.field[3] == std::money_base::symbol);
+}
+
 int main(int, char**)
 {
     {
         Fnf f("C", 1);
         std::money_base::pattern p = f.pos_format();
-        assert(p.field[0] == std::money_base::symbol);
-        assert(p.field[1] == std::money_base::sign);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+        assert_symbol_sign_none_value(p);
     }
     {
         Fnt f("C", 1);
         std::money_base::pattern p = f.pos_format();
-        assert(p.field[0] == std::money_base::symbol);
-        assert(p.field[1] == std::money_base::sign);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+        assert_symbol_sign_none_value(p);
     }
 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f("C", 1);
         std::money_base::pattern p = f.pos_format();
-        assert(p.field[0] == std::money_base::symbol);
-        assert(p.field[1] == std::money_base::sign);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+        assert_symbol_sign_none_value(p);
     }
     {
         Fwt f("C", 1);
         std::money_base::pattern p = f.pos_format();
-        assert(p.field[0] == std::money_base::symbol);
-        assert(p.field[1] == std::money_base::sign);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+        assert_symbol_sign_none_value(p);
     }
 #endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         Fnf f(LOCALE_en_US_UTF_8, 1);
         std::money_base::pattern p = f.pos_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::symbol);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+        assert_sign_symbol_none_value(p);
     }
     {
         Fnt f(LOCALE_en_US_UTF_8, 1);
         std::money_base::pattern p = f.pos_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::symbol);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+        assert_sign_symbol_none_value(p);
     }
 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_en_US_UTF_8, 1);
         std::money_base::pattern p = f.pos_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::symbol);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+        assert_sign_symbol_none_value(p);
     }
     {
         Fwt f(LOCALE_en_US_UTF_8, 1);
         std::money_base::pattern p = f.pos_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::symbol);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+        assert_sign_symbol_none_value(p);
     }
 #endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         Fnf f(LOCALE_fr_FR_UTF_8, 1);
         std::money_base::pattern p = f.pos_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::value);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::symbol);
+        assert_sign_value_none_symbol(p);
     }
     {
         Fnt f(LOCALE_fr_FR_UTF_8, 1);
         std::money_base::pattern p = f.pos_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::value);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::symbol);
+        assert_sign_value_none_symbol(p);
     }
 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_fr_FR_UTF_8, 1);
         std::money_base::pattern p = f.pos_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::value);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::symbol);
+        assert_sign_value_none_symbol(p);
     }
     {
         Fwt f(LOCALE_fr_FR_UTF_8, 1);
         std::money_base::pattern p = f.pos_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::value);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::symbol);
+        assert_sign_value_none_symbol(p);
     }
 #endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         Fnf f(LOCALE_ru_RU_UTF_8, 1);
         std::money_base::pattern p = f.pos_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::value);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::symbol);
+        assert_sign_value_none_symbol(p);
     }
     {
         Fnt f(LOCALE_ru_RU_UTF_8, 1);
         std::money_base::pattern p = f.pos_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::value);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::symbol);
+        assert_sign_value_none_symbol(p);
     }
 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_ru_RU_UTF_8, 1);
         std::money_base::pattern p = f.pos_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::value);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::symbol);
+        assert_sign_value_none_symbol(p);
     }
     {
         Fwt f(LOCALE_ru_RU_UTF_8, 1);
         std::money_base::pattern p = f.pos_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::value);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::symbol);
+        assert_sign_value_none_symbol(p);
     }
 #endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         Fnf f(LOCALE_zh_CN_UTF_8, 1);
         std::money_base::pattern p = f.pos_format();
-        assert(p.field[0] == std::money_base::symbol);
-        assert(p.field[1] == std::money_base::sign);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+#ifdef __APPLE__
+        assert_sign_symbol_none_value(p);
+#else
+        assert_symbol_sign_none_value(p);
+#endif
     }
     {
         Fnt f(LOCALE_zh_CN_UTF_8, 1);
         std::money_base::pattern p = f.pos_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::symbol);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+#ifdef _WIN32
+        assert_symbol_sign_none_value(p);
+#else
+        assert_sign_symbol_none_value(p);
+#endif
     }
 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_zh_CN_UTF_8, 1);
         std::money_base::pattern p = f.pos_format();
-        assert(p.field[0] == std::money_base::symbol);
-        assert(p.field[1] == std::money_base::sign);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+#ifdef __APPLE__
+        assert_sign_symbol_none_value(p);
+#else
+        assert_symbol_sign_none_value(p);
+#endif
     }
     {
         Fwt f(LOCALE_zh_CN_UTF_8, 1);
         std::money_base::pattern p = f.pos_format();
-        assert(p.field[0] == std::money_base::sign);
-        assert(p.field[1] == std::money_base::symbol);
-        assert(p.field[2] == std::money_base::none);
-        assert(p.field[3] == std::money_base::value);
+#ifdef _WIN32
+        assert_symbol_sign_none_value(p);
+#else
+        assert_sign_symbol_none_value(p);
+#endif
     }
 #endif // TEST_HAS_NO_WIDE_CHARACTERS
 


        


More information about the libcxx-commits mailing list