1 //===----------------------------------------------------------------------===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // UNSUPPORTED: libcpp-has-no-localization
10 
11 // <complex>
12 
13 // template<class T, class charT, class traits>
14 //   basic_ostream<charT, traits>&
15 //   operator<<(basic_ostream<charT, traits>& o, const complex<T>& x);
16 
17 #include <complex>
18 #include <sstream>
19 #include <cassert>
20 
21 #include "test_macros.h"
22 
main(int,char **)23 int main(int, char**) {
24     // Basic test
25     {
26         std::complex<double> const c(1, 2);
27         std::ostringstream os;
28         os << c;
29         assert(os.str() == "(1,2)");
30     }
31 
32     // Test with various widths.
33     // In particular, make sure the width() is 0 after the operation, which
34     // should be the case because [complex.ops] says about operator<< for complex:
35     //
36     //   Effects: Inserts the complex number x onto the stream o as if it
37     //   were implemented as follows:
38     //
39     //     basic_ostringstream<charT, traits> s;
40     //     s.flags(o.flags());
41     //     s.imbue(o.getloc());
42     //     s.precision(o.precision());
43     //     s << '(' << x.real() << "," << x.imag() << ')';
44     //     return o << s.str();
45     //
46     // Since operator<< for std::string sets o.width(0), operator<< for
47     // std::complex should do the same.
48     {
49         for (int width = 0; width <= 5; ++width) {
50             std::complex<double> const c(1, 2);
51             std::ostringstream os;
52             os.width(width);
53             os.fill('_');
54             os << c;
55             assert(os.width() == 0);
56             assert(os.str() == "(1,2)");
57         }
58         {
59             std::complex<double> const c(1, 2);
60             std::ostringstream os;
61             os.width(6);
62             os.fill('_');
63             os << c;
64             assert(os.width() == 0);
65             assert(os.str() == "_(1,2)");
66         }
67         {
68             std::complex<double> const c(1, 2);
69             std::ostringstream os;
70             os.width(7);
71             os.fill('_');
72             os << c;
73             assert(os.width() == 0);
74             assert(os.str() == "__(1,2)");
75         }
76         {
77             std::complex<double> const c(1, 2);
78             std::ostringstream os;
79             os.width(8);
80             os.fill('_');
81             os << c;
82             assert(os.width() == 0);
83             assert(os.str() == "___(1,2)");
84         }
85         // Insert something after the complex and make sure the
86         // stream's width has been reset as expected.
87         {
88             std::complex<double> const c(1, 2);
89             std::ostringstream os;
90             os.width(8);
91             os.fill('_');
92             os << c;
93             assert(os.width() == 0);
94 
95             os << "hello";
96             assert(os.str() == "___(1,2)hello");
97         }
98 
99         // Test with numbers that result in different output lengths, to
100         // make sure we handle custom width() correctly.
101         {
102             std::complex<double> const c(123, 456);
103             std::ostringstream os;
104             os.width(4);
105             os.fill('_');
106             os << c;
107             assert(os.width() == 0);
108             assert(os.str() == "(123,456)");
109         }
110         {
111             std::complex<double> const c(123, 456);
112             std::ostringstream os;
113             os.width(12);
114             os.fill('_');
115             os << c;
116             assert(os.width() == 0);
117             assert(os.str() == "___(123,456)");
118 
119             os << "hello";
120             assert(os.str() == "___(123,456)hello");
121         }
122 
123         // Make sure left fill behaves correctly
124         {
125             std::complex<double> const c(123, 456);
126             std::ostringstream os;
127             os.width(12);
128             os.fill('_');
129             os << std::left << c;
130             assert(os.width() == 0);
131             assert(os.str() == "(123,456)___");
132 
133             os << "xy";
134             assert(os.str() == "(123,456)___xy");
135         }
136     }
137 
138     return 0;
139 }
140