1 //===----------------------------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // UNSUPPORTED: no-threads
10 // UNSUPPORTED: no-localization
11 // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME
13 // REQUIRES: locale.fr_FR.UTF-8
15 // TODO FMT This test should not require std::to_chars(floating-point)
16 // XFAIL: availability-fp_to_chars-missing
22 // template<class charT, class traits>
23 // basic_ostream<charT, traits>&
24 // operator<<(basic_ostream<charT, traits>& out, thread::id id);
32 #include "make_string.h"
33 #include "platform_support.h" // locale name macros
34 #include "test_macros.h"
36 template <class CharT
>
38 std::thread::id id0
= std::this_thread::get_id();
39 std::basic_ostringstream
<CharT
> os
;
43 // C++23 added a formatter specialization for thread::id.
44 // This changed the requirement of ostream to have a
45 // [thread.thread.id]/2
46 // The text representation for the character type charT of an object of
47 // type thread::id is an unspecified sequence of charT ...
48 // This definition is used for both streaming and formatting.
50 // Test whether the output is identical.
51 std::basic_string
<CharT
> s
= std::format(MAKE_STRING_VIEW(CharT
, "{}"), id0
);
52 assert(s
== os
.str());
56 template <class CharT
>
57 static std::basic_string
<CharT
> format(std::ios_base::fmtflags flags
) {
58 std::basic_stringstream
<CharT
> sstr
;
60 sstr
<< std::this_thread::get_id();
64 template <class CharT
>
65 static void stream_state() {
66 std::basic_stringstream
<CharT
> sstr
;
67 sstr
<< std::this_thread::get_id();
68 std::basic_string
<CharT
> expected
= sstr
.str();
70 // Unaffected by fill, width, and align.
72 assert(expected
== format
<CharT
>(std::ios_base::dec
| std::ios_base::skipws
)); // default flags
74 assert(expected
== format
<CharT
>(std::ios_base::oct
));
75 assert(expected
== format
<CharT
>(std::ios_base::hex
));
77 assert(expected
== format
<CharT
>(std::ios_base::scientific
));
78 assert(expected
== format
<CharT
>(std::ios_base::fixed
));
80 assert(expected
== format
<CharT
>(std::ios_base::boolalpha
));
81 assert(expected
== format
<CharT
>(std::ios_base::showbase
));
82 assert(expected
== format
<CharT
>(std::ios_base::showpoint
));
83 assert(expected
== format
<CharT
>(std::ios_base::showpos
));
84 assert(expected
== format
<CharT
>(std::ios_base::skipws
)); // added for completeness
85 assert(expected
== format
<CharT
>(std::ios_base::unitbuf
)); // added for completeness
86 assert(expected
== format
<CharT
>(std::ios_base::uppercase
));
88 // Test fill, width, and align.
90 sstr
.str(std::basic_string
<CharT
>());
91 sstr
.fill(CharT('#'));
92 sstr
.width(expected
.size() + 10); // Make sure fill and align affect the output.
93 sstr
.flags(std::ios_base::dec
| std::ios_base::skipws
| std::ios_base::right
);
94 sstr
<< std::this_thread::get_id();
95 expected
= sstr
.str();
97 sstr
.str(std::basic_string
<CharT
>());
98 sstr
.fill(CharT('*'));
99 sstr
.width(expected
.size());
100 sstr
.flags(std::ios_base::dec
| std::ios_base::skipws
| std::ios_base::right
);
101 sstr
<< std::this_thread::get_id();
102 assert(expected
!= sstr
.str());
104 sstr
.str(std::basic_string
<CharT
>());
105 sstr
.fill(CharT('#'));
106 sstr
.width(expected
.size() - 1);
107 sstr
.flags(std::ios_base::dec
| std::ios_base::skipws
| std::ios_base::right
);
108 sstr
<< std::this_thread::get_id();
109 assert(expected
!= sstr
.str());
111 sstr
.str(std::basic_string
<CharT
>());
112 sstr
.fill(CharT('#'));
113 sstr
.width(expected
.size());
114 sstr
.flags(std::ios_base::dec
| std::ios_base::skipws
| std::ios_base::left
);
115 sstr
<< std::this_thread::get_id();
116 assert(expected
!= sstr
.str());
118 sstr
.str(std::basic_string
<CharT
>());
119 sstr
.fill(CharT('#'));
120 sstr
.width(expected
.size());
121 sstr
.flags(std::ios_base::dec
| std::ios_base::skipws
| std::ios_base::internal
);
122 sstr
<< std::this_thread::get_id();
123 assert(expected
== sstr
.str()); // internal does *not* affect strings
125 // Test the locale's numpunct.
127 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8
));
128 sstr
.str(std::basic_string
<CharT
>());
129 sstr
.fill(CharT('#'));
130 sstr
.width(expected
.size());
131 sstr
<< std::this_thread::get_id();
132 assert(expected
== sstr
.str());
135 template <class CharT
>
138 stream_state
<CharT
>();
141 int main(int, char**) {
143 #ifndef TEST_HAS_NO_WIDE_CHARACTERS