15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
9*88ffc727SLouis Dionne // UNSUPPORTED: libcpp-has-no-localization
10*88ffc727SLouis Dionne 
115a83710eSEric Fiselier // <complex>
125a83710eSEric Fiselier 
135a83710eSEric Fiselier // template<class T, class charT, class traits>
145a83710eSEric Fiselier //   basic_ostream<charT, traits>&
155a83710eSEric Fiselier //   operator<<(basic_ostream<charT, traits>& o, const complex<T>& x);
165a83710eSEric Fiselier 
175a83710eSEric Fiselier #include <complex>
185a83710eSEric Fiselier #include <sstream>
195a83710eSEric Fiselier #include <cassert>
205a83710eSEric Fiselier 
217fc6a556SMarshall Clow #include "test_macros.h"
227fc6a556SMarshall Clow 
23ec0dc70eSLouis Dionne int main(int, char**) {
24ec0dc70eSLouis Dionne     // Basic test
255a83710eSEric Fiselier     {
26ec0dc70eSLouis Dionne         std::complex<double> const c(1, 2);
275a83710eSEric Fiselier         std::ostringstream os;
285a83710eSEric Fiselier         os << c;
295a83710eSEric Fiselier         assert(os.str() == "(1,2)");
30aa0b991dSAntonio Sanchez     }
31ec0dc70eSLouis Dionne 
32ec0dc70eSLouis Dionne     // Test with various widths.
33ec0dc70eSLouis Dionne     // In particular, make sure the width() is 0 after the operation, which
34ec0dc70eSLouis Dionne     // should be the case because [complex.ops] says about operator<< for complex:
35ec0dc70eSLouis Dionne     //
36ec0dc70eSLouis Dionne     //   Effects: Inserts the complex number x onto the stream o as if it
37ec0dc70eSLouis Dionne     //   were implemented as follows:
38ec0dc70eSLouis Dionne     //
39ec0dc70eSLouis Dionne     //     basic_ostringstream<charT, traits> s;
40ec0dc70eSLouis Dionne     //     s.flags(o.flags());
41ec0dc70eSLouis Dionne     //     s.imbue(o.getloc());
42ec0dc70eSLouis Dionne     //     s.precision(o.precision());
43ec0dc70eSLouis Dionne     //     s << '(' << x.real() << "," << x.imag() << ')';
44ec0dc70eSLouis Dionne     //     return o << s.str();
45ec0dc70eSLouis Dionne     //
46ec0dc70eSLouis Dionne     // Since operator<< for std::string sets o.width(0), operator<< for
47ec0dc70eSLouis Dionne     // std::complex should do the same.
48aa0b991dSAntonio Sanchez     {
49ec0dc70eSLouis Dionne         for (int width = 0; width <= 5; ++width) {
50ec0dc70eSLouis Dionne             std::complex<double> const c(1, 2);
51ec0dc70eSLouis Dionne             std::ostringstream os;
52ec0dc70eSLouis Dionne             os.width(width);
53ec0dc70eSLouis Dionne             os.fill('_');
54ec0dc70eSLouis Dionne             os << c;
55ec0dc70eSLouis Dionne             assert(os.width() == 0);
56ec0dc70eSLouis Dionne             assert(os.str() == "(1,2)");
57ec0dc70eSLouis Dionne         }
58ec0dc70eSLouis Dionne         {
59ec0dc70eSLouis Dionne             std::complex<double> const c(1, 2);
60ec0dc70eSLouis Dionne             std::ostringstream os;
61ec0dc70eSLouis Dionne             os.width(6);
62ec0dc70eSLouis Dionne             os.fill('_');
63ec0dc70eSLouis Dionne             os << c;
64ec0dc70eSLouis Dionne             assert(os.width() == 0);
65ec0dc70eSLouis Dionne             assert(os.str() == "_(1,2)");
66ec0dc70eSLouis Dionne         }
67ec0dc70eSLouis Dionne         {
68ec0dc70eSLouis Dionne             std::complex<double> const c(1, 2);
69ec0dc70eSLouis Dionne             std::ostringstream os;
70ec0dc70eSLouis Dionne             os.width(7);
71ec0dc70eSLouis Dionne             os.fill('_');
72ec0dc70eSLouis Dionne             os << c;
73ec0dc70eSLouis Dionne             assert(os.width() == 0);
74ec0dc70eSLouis Dionne             assert(os.str() == "__(1,2)");
75ec0dc70eSLouis Dionne         }
76ec0dc70eSLouis Dionne         {
77ec0dc70eSLouis Dionne             std::complex<double> const c(1, 2);
78aa0b991dSAntonio Sanchez             std::ostringstream os;
79aa0b991dSAntonio Sanchez             os.width(8);
80aa0b991dSAntonio Sanchez             os.fill('_');
81aa0b991dSAntonio Sanchez             os << c;
82ec0dc70eSLouis Dionne             assert(os.width() == 0);
83aa0b991dSAntonio Sanchez             assert(os.str() == "___(1,2)");
84aa0b991dSAntonio Sanchez         }
85ec0dc70eSLouis Dionne         // Insert something after the complex and make sure the
86ec0dc70eSLouis Dionne         // stream's width has been reset as expected.
87ec0dc70eSLouis Dionne         {
88ec0dc70eSLouis Dionne             std::complex<double> const c(1, 2);
89ec0dc70eSLouis Dionne             std::ostringstream os;
90ec0dc70eSLouis Dionne             os.width(8);
91ec0dc70eSLouis Dionne             os.fill('_');
92ec0dc70eSLouis Dionne             os << c;
93ec0dc70eSLouis Dionne             assert(os.width() == 0);
94ec0dc70eSLouis Dionne 
95ec0dc70eSLouis Dionne             os << "hello";
96ec0dc70eSLouis Dionne             assert(os.str() == "___(1,2)hello");
97ec0dc70eSLouis Dionne         }
98ec0dc70eSLouis Dionne 
99ec0dc70eSLouis Dionne         // Test with numbers that result in different output lengths, to
100ec0dc70eSLouis Dionne         // make sure we handle custom width() correctly.
101ec0dc70eSLouis Dionne         {
102ec0dc70eSLouis Dionne             std::complex<double> const c(123, 456);
103ec0dc70eSLouis Dionne             std::ostringstream os;
104ec0dc70eSLouis Dionne             os.width(4);
105ec0dc70eSLouis Dionne             os.fill('_');
106ec0dc70eSLouis Dionne             os << c;
107ec0dc70eSLouis Dionne             assert(os.width() == 0);
108ec0dc70eSLouis Dionne             assert(os.str() == "(123,456)");
109ec0dc70eSLouis Dionne         }
110ec0dc70eSLouis Dionne         {
111ec0dc70eSLouis Dionne             std::complex<double> const c(123, 456);
112ec0dc70eSLouis Dionne             std::ostringstream os;
113ec0dc70eSLouis Dionne             os.width(12);
114ec0dc70eSLouis Dionne             os.fill('_');
115ec0dc70eSLouis Dionne             os << c;
116ec0dc70eSLouis Dionne             assert(os.width() == 0);
117ec0dc70eSLouis Dionne             assert(os.str() == "___(123,456)");
118ec0dc70eSLouis Dionne 
119ec0dc70eSLouis Dionne             os << "hello";
120ec0dc70eSLouis Dionne             assert(os.str() == "___(123,456)hello");
121ec0dc70eSLouis Dionne         }
122ec0dc70eSLouis Dionne 
123ec0dc70eSLouis Dionne         // Make sure left fill behaves correctly
124ec0dc70eSLouis Dionne         {
125ec0dc70eSLouis Dionne             std::complex<double> const c(123, 456);
126ec0dc70eSLouis Dionne             std::ostringstream os;
127ec0dc70eSLouis Dionne             os.width(12);
128ec0dc70eSLouis Dionne             os.fill('_');
129ec0dc70eSLouis Dionne             os << std::left << c;
130ec0dc70eSLouis Dionne             assert(os.width() == 0);
131ec0dc70eSLouis Dionne             assert(os.str() == "(123,456)___");
132ec0dc70eSLouis Dionne 
133ec0dc70eSLouis Dionne             os << "xy";
134ec0dc70eSLouis Dionne             assert(os.str() == "(123,456)___xy");
135ec0dc70eSLouis Dionne         }
136ec0dc70eSLouis Dionne     }
1372df59c50SJF Bastien 
1382df59c50SJF Bastien     return 0;
1395a83710eSEric Fiselier }
140