copyfmt.pass.cpp revision c0d0cbad9ed434267a7af9531bdeeae52eb6d706
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===//
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//                     The LLVM Compiler Infrastructure
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This file is dual licensed under the MIT and the University of Illinois Open
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Source Licenses. See LICENSE.TXT for details.
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===//
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// <ios>
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// template <class charT, class traits> class basic_ios
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// basic_ios& copyfmt(const basic_ios& rhs);
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <ios>
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <streambuf>
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <cassert>
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "../../../../platform_support.h" // locale name macros
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct testbuf
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : public std::streambuf
2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
25e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch};
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)bool f1_called = false;
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool f2_called = false;
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool g1_called = false;
3109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool g2_called = false;
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool g3_called = false;
33f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void f1(std::ios_base::event ev, std::ios_base& stream, int index)
3509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ev == std::ios_base::erase_event)
37f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    {
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        assert(!f1_called);
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        assert( f2_called);
40bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        assert(!g1_called);
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        assert(!g2_called);
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        assert(!g3_called);
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        assert(stream.getloc().name() == LOCALE_en_US_UTF_8);
44926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        assert(index == 4);
45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        f1_called = true;
4609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
4709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void f2(std::ios_base::event ev, std::ios_base& stream, int index)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ev == std::ios_base::erase_event)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        assert(!f1_called);
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        assert(!f2_called);
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        assert(!g1_called);
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        assert(!g2_called);
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        assert(!g3_called);
58bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        assert(stream.getloc().name() == LOCALE_en_US_UTF_8);
591e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        assert(index == 5);
60c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        f2_called = true;
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
63
64void g1(std::ios_base::event ev, std::ios_base& stream, int index)
65{
66    if (ev == std::ios_base::copyfmt_event)
67    {
68        assert( f1_called);
69        assert( f2_called);
70        assert(!g1_called);
71        assert( g2_called);
72        assert( g3_called);
73        assert(stream.getloc().name() == LOCALE_fr_FR_UTF_8);
74        assert(index == 7);
75        g1_called = true;
76    }
77}
78
79void g2(std::ios_base::event ev, std::ios_base& stream, int index)
80{
81    if (ev == std::ios_base::copyfmt_event)
82    {
83        assert( f1_called);
84        assert( f2_called);
85        assert(!g1_called);
86        assert(!g2_called);
87        assert( g3_called);
88        assert(stream.getloc().name() == LOCALE_fr_FR_UTF_8);
89        assert(index == 8);
90        g2_called = true;
91    }
92}
93
94void g3(std::ios_base::event ev, std::ios_base& stream, int index)
95{
96    if (ev == std::ios_base::copyfmt_event)
97    {
98        assert( f1_called);
99        assert( f2_called);
100        assert(!g1_called);
101        assert(!g2_called);
102        assert(!g3_called);
103        assert(stream.getloc().name() == LOCALE_fr_FR_UTF_8);
104        assert(index == 9);
105        g3_called = true;
106    }
107}
108
109int main()
110{
111    testbuf sb1;
112    std::ios ios1(&sb1);
113    ios1.flags(std::ios::boolalpha | std::ios::dec | std::ios::fixed);
114    ios1.precision(1);
115    ios1.width(11);
116    ios1.imbue(std::locale(LOCALE_en_US_UTF_8));
117    ios1.exceptions(std::ios::failbit);
118    ios1.setstate(std::ios::eofbit);
119    ios1.register_callback(f1, 4);
120    ios1.register_callback(f2, 5);
121    ios1.iword(0) = 1;
122    ios1.iword(1) = 2;
123    ios1.iword(2) = 3;
124    char c1, c2, c3;
125    ios1.pword(0) = &c1;
126    ios1.pword(1) = &c2;
127    ios1.pword(2) = &c3;
128    ios1.tie((std::ostream*)1);
129    ios1.fill('1');
130
131    testbuf sb2;
132    std::ios ios2(&sb2);
133    ios2.flags(std::ios::showpoint | std::ios::uppercase);
134    ios2.precision(2);
135    ios2.width(12);
136    ios2.imbue(std::locale(LOCALE_fr_FR_UTF_8));
137    ios2.exceptions(std::ios::eofbit);
138    ios2.setstate(std::ios::goodbit);
139    ios2.register_callback(g1, 7);
140    ios2.register_callback(g2, 8);
141    ios2.register_callback(g3, 9);
142    ios2.iword(0) = 4;
143    ios2.iword(1) = 5;
144    ios2.iword(2) = 6;
145    ios2.iword(3) = 7;
146    ios2.iword(4) = 8;
147    ios2.iword(5) = 9;
148    char d1, d2;
149    ios2.pword(0) = &d1;
150    ios2.pword(1) = &d2;
151    ios2.tie((std::ostream*)2);
152    ios2.fill('2');
153
154    ios1.copyfmt(ios1);
155    assert(!f1_called);
156
157    try
158    {
159        ios1.copyfmt(ios2);
160        assert(false);
161    }
162    catch (std::ios_base::failure&)
163    {
164    }
165    assert(ios1.rdstate() == std::ios::eofbit);
166    assert(ios1.rdbuf() == &sb1);
167    assert(ios1.flags() == (std::ios::showpoint | std::ios::uppercase));
168    assert(ios1.precision() == 2);
169    assert(ios1.width() == 12);
170    assert(ios1.getloc().name() == LOCALE_fr_FR_UTF_8);
171    assert(ios1.exceptions() == std::ios::eofbit);
172    assert(f1_called);
173    assert(f2_called);
174    assert(g1_called);
175    assert(g2_called);
176    assert(g3_called);
177    assert(ios1.iword(0) == 4);
178    assert(ios1.iword(1) == 5);
179    assert(ios1.iword(2) == 6);
180    assert(ios1.iword(3) == 7);
181    assert(ios1.iword(4) == 8);
182    assert(ios1.iword(5) == 9);
183    assert(ios1.pword(0) == &d1);
184    assert(ios1.pword(1) == &d2);
185    assert(ios1.tie() == (std::ostream*)2);
186    assert(ios1.fill() == '2');
187}
188