Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_34_1/libs/serialization/test/test_iterators.cpp @ 33

Last change on this file since 33 was 29, checked in by landauf, 16 years ago

updated boost from 1_33_1 to 1_34_1

File size: 5.8 KB
Line 
1/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
2// test_iterators.cpp
3
4// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
5// Use, modification and distribution is subject to the Boost Software
6// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
7// http://www.boost.org/LICENSE_1_0.txt)
8
9#include <algorithm>
10#include <vector>
11#include <cstdlib> // for rand
12#include <functional>
13#include <sstream> // used to test stream iterators
14
15#include <boost/config.hpp>
16#ifdef BOOST_NO_STDC_NAMESPACE
17namespace std{
18    using ::rand; 
19}
20#endif
21
22#include <boost/detail/workaround.hpp>
23#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
24#include <boost/archive/dinkumware.hpp>
25#endif
26
27#ifndef BOOST_NO_CWCHAR
28#include <boost/archive/iterators/mb_from_wchar.hpp>
29#include <boost/archive/iterators/wchar_from_mb.hpp>
30#endif
31#include <boost/archive/iterators/xml_escape.hpp>
32#include <boost/archive/iterators/xml_unescape.hpp>
33#include <boost/archive/iterators/transform_width.hpp>
34#include <boost/archive/iterators/istream_iterator.hpp>
35#include <boost/archive/iterators/ostream_iterator.hpp>
36
37#include <boost/test/test_tools.hpp>
38
39#ifndef BOOST_NO_CWCHAR
40
41void test_wchar_from_mb(const wchar_t *la, const char * a, const unsigned int size){
42    typedef boost::archive::iterators::wchar_from_mb<const char *> translator;
43    BOOST_CHECK((
44        std::equal(
45            translator(BOOST_MAKE_PFTO_WRAPPER(a)),
46            translator(BOOST_MAKE_PFTO_WRAPPER(a + size)),
47            la
48        )
49    ));
50}
51
52void test_mb_from_wchar(const char * a, const wchar_t *la, const unsigned int size){
53    typedef boost::archive::iterators::mb_from_wchar<const wchar_t *> translator;
54    BOOST_CHECK(
55        std::equal(
56            translator(BOOST_MAKE_PFTO_WRAPPER(la)), 
57            translator(BOOST_MAKE_PFTO_WRAPPER(la + size)), 
58            a
59        )
60    );
61}
62
63#endif
64
65template<class CharType>
66void test_xml_escape(
67    const CharType * xml_escaped, 
68    const CharType * xml, 
69    unsigned int size
70){
71    typedef boost::archive::iterators::xml_escape<const CharType *> translator;
72
73    BOOST_CHECK(
74        std::equal(
75            translator(BOOST_MAKE_PFTO_WRAPPER(xml)),
76            translator(BOOST_MAKE_PFTO_WRAPPER(xml + size)),
77            xml_escaped
78        )
79    );
80}
81
82template<class CharType>
83void test_xml_unescape(
84    const CharType * xml, 
85    const CharType * xml_escaped, 
86    unsigned int size
87){
88
89    // test xml_unescape
90    typedef boost::archive::iterators::xml_unescape<const CharType *> translator;
91
92    BOOST_CHECK(
93        std::equal(
94            translator(BOOST_MAKE_PFTO_WRAPPER(xml_escaped)),
95            translator(BOOST_MAKE_PFTO_WRAPPER(xml_escaped + size)),
96            xml
97        )
98    );
99}
100
101template<int BitsOut, int BitsIn>
102void test_transform_width(unsigned int size){
103    // test transform_width
104    char rawdata[8];
105   
106    char * rptr;
107    for(rptr = rawdata + 6; rptr-- > rawdata;)
108        *rptr = std::rand();
109
110    // convert 8 to 6 bit characters
111    typedef boost::archive::iterators::transform_width<
112        char *, BitsOut, BitsIn
113    > translator1;
114
115    std::vector<char> v6;
116
117    std::copy(
118        translator1(BOOST_MAKE_PFTO_WRAPPER(static_cast<char *>(rawdata))),
119        translator1(BOOST_MAKE_PFTO_WRAPPER(rawdata + size)),
120        std::back_inserter(v6)
121    );
122
123    // check to see we got the expected # of characters out
124    if(0 ==  size)
125        BOOST_CHECK(v6.size() == 0);
126    else
127        BOOST_CHECK(v6.size() == (size * BitsIn - 1 ) / BitsOut + 1);
128
129    typedef boost::archive::iterators::transform_width<
130        std::vector<char>::iterator, BitsIn, BitsOut
131    > translator2;
132
133    BOOST_CHECK(
134        std::equal(
135            rawdata,
136            rawdata + size,
137            translator2(BOOST_MAKE_PFTO_WRAPPER(v6.begin()))
138        )
139    );
140
141}
142
143template<class CharType>
144void test_stream_iterators(
145    const CharType * test_data, 
146    unsigned int size
147){
148    std::basic_stringstream<CharType> ss;
149    boost::archive::iterators::ostream_iterator<CharType> osi =
150        boost::archive::iterators::ostream_iterator<CharType>(ss);
151    std::copy(test_data, test_data + size, osi);
152
153    BOOST_CHECK(size == ss.str().size());
154
155    boost::archive::iterators::istream_iterator<CharType> isi =
156        boost::archive::iterators::istream_iterator<CharType>(ss);
157    BOOST_CHECK(std::equal(test_data, test_data + size,isi));
158}
159
160int
161test_main(int /* argc */, char* /* argv */ [] )
162{
163    const char xml[] = "<+>+&+\"+'";
164    const char xml_escaped[] = "&lt;+&gt;+&amp;+&quot;+&apos;";
165    test_xml_escape<const char>(
166        xml_escaped, 
167        xml, 
168        sizeof(xml) / sizeof(char) - 1
169    );
170    test_xml_unescape<const char>(
171        xml, 
172        xml_escaped, 
173        sizeof(xml_escaped) / sizeof(char) - 1
174    );
175
176    const char a[] = "abcdefghijklmnopqrstuvwxyz";
177
178    #ifndef BOOST_NO_CWCHAR
179    const wchar_t wxml[] = L"<+>+&+\"+'";
180    const wchar_t wxml_escaped[] = L"&lt;+&gt;+&amp;+&quot;+&apos;";
181    test_xml_escape<const wchar_t>(
182        wxml_escaped, 
183        wxml, 
184        sizeof(wxml) / sizeof(wchar_t) - 1
185    );
186    test_xml_unescape<const wchar_t>(
187        wxml, 
188        wxml_escaped, 
189        sizeof(wxml_escaped) / sizeof(wchar_t) - 1
190    );
191
192    const wchar_t la[] = L"abcdefghijklmnopqrstuvwxyz";
193
194    test_wchar_from_mb(la, a, sizeof(a) / sizeof(char) - 1);
195    test_mb_from_wchar(a, la, sizeof(la) / sizeof(wchar_t) - 1);
196
197    test_stream_iterators<wchar_t>(la, sizeof(la)/sizeof(wchar_t) - 1);
198    #endif
199
200    test_stream_iterators<char>(a, sizeof(a) - 1);
201
202    test_transform_width<6, 8>(0);
203    test_transform_width<6, 8>(1);
204    test_transform_width<6, 8>(2);
205    test_transform_width<6, 8>(3);
206    test_transform_width<6, 8>(4);
207    test_transform_width<6, 8>(5);
208    test_transform_width<6, 8>(6);
209    test_transform_width<6, 8>(7);
210    test_transform_width<6, 8>(8);
211
212    return EXIT_SUCCESS;
213}
Note: See TracBrowser for help on using the repository browser.