1 //===----------------------------------------------------------------------===//
2 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
3 // See https://llvm.org/LICENSE.txt for license information.
4 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //===----------------------------------------------------------------------===//
8 // UNSUPPORTED: c++03, c++11, c++14, c++17
9 // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME
11 // Force unicode to be disabled.
12 // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_HAS_NO_UNICODE
14 // TODO FMT This test should not require std::to_chars(floating-point)
15 // XFAIL: availability-fp_to_chars-missing
19 // Tests Unicode is ignored and handled as ASCII.
25 #include "test_macros.h"
27 // Note the comment annotations are from the Unicode test
28 static void test_char() {
29 //*** 1-byte code points ***
30 assert(std::format("{:*^3}", " ") == "* *");
31 assert(std::format("{:*^3}", "~") == "*~*");
33 //*** 2-byte code points ***
34 assert(std::format("{:*^4}", "\u00a1") == "*\u00a1*"); // INVERTED EXCLAMATION MARK
35 assert(std::format("{:*^4}", "\u07ff") == "*\u07ff*"); // NKO TAMAN SIGN
37 //*** 3-byte code points ***
38 assert(std::format("{:*^5}", "\u0800") == "*\u0800*"); // SAMARITAN LETTER ALAF
39 assert(std::format("{:*^5}", "\ufffd") == "*\ufffd*"); // REPLACEMENT CHARACTER
42 assert(std::format("{:*^5}", "\u1100") == "*\u1100*"); // HANGUL CHOSEONG KIYEOK
43 assert(std::format("{:*^5}", "\u115f") == "*\u115f*"); // HANGUL CHOSEONG FILLER
45 assert(std::format("{:*^5}", "\u2329") == "*\u2329*"); // LEFT-POINTING ANGLE BRACKET
46 assert(std::format("{:*^5}", "\u232a") == "*\u232a*"); // RIGHT-POINTING ANGLE BRACKET
48 assert(std::format("{:*^5}", "\u2e80") == "*\u2e80*"); // CJK RADICAL REPEAT
49 assert(std::format("{:*^5}", "\u303e") == "*\u303e*"); // IDEOGRAPHIC VARIATION INDICATOR
51 assert(std::format("{:*^5}", "\u3040") == "*\u3040*"); // U+3041 HIRAGANA LETTER SMALL A
52 assert(std::format("{:*^5}", "\ua4cf") == "*\ua4cf*"); // U+A4D0 LISU LETTER BA
54 assert(std::format("{:*^5}", "\uac00") == "*\uac00*"); // <Hangul Syllable, First>
55 assert(std::format("{:*^5}", "\ud7a3") == "*\ud7a3*"); // Hangul Syllable Hih
57 assert(std::format("{:*^5}", "\uf900") == "*\uf900*"); // CJK COMPATIBILITY IDEOGRAPH-F900
58 assert(std::format("{:*^5}", "\ufaff") == "*\ufaff*"); // U+FB00 LATIN SMALL LIGATURE FF
60 assert(std::format("{:*^5}", "\ufe10") == "*\ufe10*"); // PRESENTATION FORM FOR VERTICAL COMMA
61 assert(std::format("{:*^5}", "\ufe19") == "*\ufe19*"); // PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
63 assert(std::format("{:*^5}", "\ufe30") == "*\ufe30*"); // PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
64 assert(std::format("{:*^5}", "\ufe6f") == "*\ufe6f*"); // U+FE70 ARABIC FATHATAN ISOLATED FORM
66 assert(std::format("{:*^5}", "\uff00") == "*\uff00*"); // U+FF01 FULLWIDTH EXCLAMATION MARK
67 assert(std::format("{:*^5}", "\uff60") == "*\uff60*"); // FULLWIDTH RIGHT WHITE PARENTHESIS
69 assert(std::format("{:*^5}", "\uffe0") == "*\uffe0*"); // FULLWIDTH CENT SIGN
70 assert(std::format("{:*^5}", "\uffe6") == "*\uffe6*"); // FULLWIDTH WON SIGN
72 //*** 4-byte code points ***
73 assert(std::format("{:*^6}", "\U00010000") == "*\U00010000*"); // LINEAR B SYLLABLE B008 A
74 assert(std::format("{:*^6}", "\U0010FFFF") == "*\U0010FFFF*"); // Undefined Character
77 assert(std::format("{:*^6}", "\U0001f300") == "*\U0001f300*"); // CYCLONE
78 assert(std::format("{:*^6}", "\U0001f64f") == "*\U0001f64f*"); // PERSON WITH FOLDED HANDS
79 assert(std::format("{:*^6}", "\U0001f900") == "*\U0001f900*"); // CIRCLED CROSS FORMEE WITH FOUR DOTS
80 assert(std::format("{:*^6}", "\U0001f9ff") == "*\U0001f9ff*"); // NAZAR AMULET
81 assert(std::format("{:*^6}", "\U00020000") == "*\U00020000*"); // <CJK Ideograph Extension B, First>
82 assert(std::format("{:*^6}", "\U0002fffd") == "*\U0002fffd*"); // Undefined Character
83 assert(std::format("{:*^6}", "\U00030000") == "*\U00030000*"); // <CJK Ideograph Extension G, First>
84 assert(std::format("{:*^6}", "\U0003fffd") == "*\U0003fffd*"); // Undefined Character
87 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
88 // Note the comment annotations are from the Unicode test
89 static void test_wchar_t() {
90 if constexpr (sizeof(wchar_t) == 2) {
91 // TODO FMT Add these tests.
93 //*** 1-byte code points ***
94 assert(std::format(L
"{:*^3}", L
" ") == L
"* *");
95 assert(std::format(L
"{:*^3}", L
"~") == L
"*~*");
97 //*** 2-byte code points ***
98 assert(std::format(L
"{:*^3}", L
"\u00a1") == L
"*\u00a1*"); // INVERTED EXCLAMATION MARK
99 assert(std::format(L
"{:*^3}", L
"\u07ff") == L
"*\u07ff*"); // NKO TAMAN SIGN
101 //*** 3-byte code points ***
102 assert(std::format(L
"{:*^3}", L
"\u0800") == L
"*\u0800*"); // SAMARITAN LETTER ALAF
103 assert(std::format(L
"{:*^3}", L
"\ufffd") == L
"*\ufffd*"); // REPLACEMENT CHARACTER
106 assert(std::format(L
"{:*^3}", L
"\u1100") == L
"*\u1100*"); // HANGUL CHOSEONG KIYEOK
107 assert(std::format(L
"{:*^3}", L
"\u115f") == L
"*\u115f*"); // HANGUL CHOSEONG FILLER
109 assert(std::format(L
"{:*^3}", L
"\u2329") == L
"*\u2329*"); // LEFT-POINTING ANGLE BRACKET
110 assert(std::format(L
"{:*^3}", L
"\u232a") == L
"*\u232a*"); // RIGHT-POINTING ANGLE BRACKET
112 assert(std::format(L
"{:*^3}", L
"\u2e80") == L
"*\u2e80*"); // CJK RADICAL REPEAT
113 assert(std::format(L
"{:*^3}", L
"\u303e") == L
"*\u303e*"); // IDEOGRAPHIC VARIATION INDICATOR
115 assert(std::format(L
"{:*^3}", L
"\u3040") == L
"*\u3040*"); // U+3041 HIRAGANA LETTER SMALL A
116 assert(std::format(L
"{:*^3}", L
"\ua4cf") == L
"*\ua4cf*"); // U+A4D0 LISU LETTER BA
118 assert(std::format(L
"{:*^3}", L
"\uac00") == L
"*\uac00*"); // <Hangul Syllable, First>
119 assert(std::format(L
"{:*^3}", L
"\ud7a3") == L
"*\ud7a3*"); // Hangul Syllable Hih
121 assert(std::format(L
"{:*^3}", L
"\uf900") == L
"*\uf900*"); // CJK COMPATIBILITY IDEOGRAPH-F900
122 assert(std::format(L
"{:*^3}", L
"\ufaff") == L
"*\ufaff*"); // U+FB00 LATIN SMALL LIGATURE FF
124 assert(std::format(L
"{:*^3}", L
"\ufe10") == L
"*\ufe10*"); // PRESENTATION FORM FOR VERTICAL COMMA
125 assert(std::format(L
"{:*^3}", L
"\ufe19") == L
"*\ufe19*"); // PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
127 assert(std::format(L
"{:*^3}", L
"\ufe30") == L
"*\ufe30*"); // PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
128 assert(std::format(L
"{:*^3}", L
"\ufe6f") == L
"*\ufe6f*"); // U+FE70 ARABIC FATHATAN ISOLATED FORM
130 assert(std::format(L
"{:*^3}", L
"\uff00") == L
"*\uff00*"); // U+FF01 FULLWIDTH EXCLAMATION MARK
131 assert(std::format(L
"{:*^3}", L
"\uff60") == L
"*\uff60*"); // FULLWIDTH RIGHT WHITE PARENTHESIS
133 assert(std::format(L
"{:*^3}", L
"\uffe0") == L
"*\uffe0*"); // FULLWIDTH CENT SIGN
134 assert(std::format(L
"{:*^3}", L
"\uffe6") == L
"*\uffe6*"); // FULLWIDTH WON SIGN
136 //*** 4-byte code points ***
137 assert(std::format(L
"{:*^3}", L
"\U00010000") == L
"*\U00010000*"); // LINEAR B SYLLABLE B008 A
138 assert(std::format(L
"{:*^3}", L
"\U0010FFFF") == L
"*\U0010FFFF*"); // Undefined Character
141 assert(std::format(L
"{:*^3}", L
"\U0001f300") == L
"*\U0001f300*"); // CYCLONE
142 assert(std::format(L
"{:*^3}", L
"\U0001f64f") == L
"*\U0001f64f*"); // PERSON WITH FOLDED HANDS
143 assert(std::format(L
"{:*^3}", L
"\U0001f900") == L
"*\U0001f900*"); // CIRCLED CROSS FORMEE WITH FOUR DOTS
144 assert(std::format(L
"{:*^3}", L
"\U0001f9ff") == L
"*\U0001f9ff*"); // NAZAR AMULET
145 assert(std::format(L
"{:*^3}", L
"\U00020000") == L
"*\U00020000*"); // <CJK Ideograph Extension B, First>
146 assert(std::format(L
"{:*^3}", L
"\U0002fffd") == L
"*\U0002fffd*"); // Undefined Character
147 assert(std::format(L
"{:*^3}", L
"\U00030000") == L
"*\U00030000*"); // <CJK Ideograph Extension G, First>
148 assert(std::format(L
"{:*^3}", L
"\U0003fffd") == L
"*\U0003fffd*"); // Undefined Character
153 int main(int, char**) {
156 #ifndef TEST_HAS_NO_WIDE_CHARACTERS