• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 // Copyright 2018 Peter Dimov.
3 // Distributed under the Boost Software License, Version 1.0.
4 
5 // Avoid spurious VC++ warnings
6 #define _CRT_SECURE_NO_WARNINGS
7 
8 #include <boost/system/error_code.hpp>
9 #include <boost/core/lightweight_test.hpp>
10 #include <cstdio>
11 
12 using namespace boost::system;
13 
14 struct http_category_impl: public error_category
15 {
16     // clang++ 3.8 and below: initialization of const object
17     // requires a user-provided default constructor
http_category_implhttp_category_impl18     BOOST_SYSTEM_CONSTEXPR http_category_impl() BOOST_NOEXCEPT
19     {
20     }
21 
namehttp_category_impl22     char const * name() const BOOST_NOEXCEPT
23     {
24         return "http";
25     }
26 
messagehttp_category_impl27     std::string message( int ev ) const
28     {
29         char buffer[ 32 ];
30 
31         std::sprintf( buffer, "HTTP/1.0 %d", ev );
32         return buffer;
33     }
34 
failedhttp_category_impl35     bool failed( int ev ) const BOOST_NOEXCEPT
36     {
37         return !( ev >= 200 && ev < 300 );
38     }
39 };
40 
http_category()41 error_category const & http_category()
42 {
43     static const http_category_impl instance;
44     return instance;
45 }
46 
47 #define TEST_NOT_FAILED(ec) BOOST_TEST( !ec.failed() ); BOOST_TEST( ec? false: true ); BOOST_TEST( !ec );
48 #define TEST_FAILED(ec) BOOST_TEST( ec.failed() ); BOOST_TEST( ec ); BOOST_TEST( !!ec );
49 
test()50 template<class Ec> void test()
51 {
52     {
53         Ec ec;
54         TEST_NOT_FAILED( ec );
55 
56         ec.assign( 1, generic_category() );
57         TEST_FAILED( ec );
58 
59         ec.clear();
60         TEST_NOT_FAILED( ec );
61 
62         ec = Ec( 1, generic_category() );
63         TEST_FAILED( ec );
64 
65         ec = Ec();
66         TEST_NOT_FAILED( ec );
67     }
68 
69     {
70         Ec ec;
71         TEST_NOT_FAILED( ec );
72 
73         ec.assign( 1, system_category() );
74         TEST_FAILED( ec );
75 
76         ec.clear();
77         TEST_NOT_FAILED( ec );
78 
79         ec = Ec( 1, system_category() );
80         TEST_FAILED( ec );
81 
82         ec = Ec();
83         TEST_NOT_FAILED( ec );
84     }
85 
86     {
87         Ec ec( 0, generic_category() );
88         TEST_NOT_FAILED( ec );
89 
90         ec.assign( 1, system_category() );
91         TEST_FAILED( ec );
92 
93         ec = Ec( 0, system_category() );
94         TEST_NOT_FAILED( ec );
95     }
96 
97     {
98         Ec ec( 1, generic_category() );
99         TEST_FAILED( ec );
100 
101         ec.assign( 0, system_category() );
102         TEST_NOT_FAILED( ec );
103     }
104 
105     {
106         Ec ec( 0, system_category() );
107         TEST_NOT_FAILED( ec );
108 
109         ec.assign( 1, generic_category() );
110         TEST_FAILED( ec );
111 
112         ec = Ec( 0, generic_category() );
113         TEST_NOT_FAILED( ec );
114     }
115 
116     {
117         Ec ec( 1, system_category() );
118         TEST_FAILED( ec );
119 
120         ec.assign( 0, generic_category() );
121         TEST_NOT_FAILED( ec );
122     }
123 
124     {
125         Ec ec( 0, http_category() );
126         TEST_FAILED( ec );
127 
128         ec.assign( 200, http_category() );
129         TEST_NOT_FAILED( ec );
130 
131         ec = Ec( 404, http_category() );
132         TEST_FAILED( ec );
133     }
134 
135 }
136 
main()137 int main()
138 {
139     BOOST_TEST( !generic_category().failed( 0 ) );
140     BOOST_TEST( generic_category().failed( 7 ) );
141 
142     BOOST_TEST( !system_category().failed( 0 ) );
143     BOOST_TEST( system_category().failed( 7 ) );
144 
145     BOOST_TEST( http_category().failed( 0 ) );
146     BOOST_TEST( !http_category().failed( 200 ) );
147     BOOST_TEST( http_category().failed( 404 ) );
148 
149     test<error_code>();
150     test<error_condition>();
151 
152     {
153         error_condition ec( errc::success );
154         TEST_NOT_FAILED( ec );
155 
156         ec = errc::address_family_not_supported;
157         TEST_FAILED( ec );
158     }
159 
160     {
161         error_condition ec( errc::address_family_not_supported );
162         TEST_FAILED( ec );
163 
164         ec = errc::success;
165         TEST_NOT_FAILED( ec );
166     }
167 
168     {
169         error_code ec( make_error_code( errc::success ) );
170         TEST_NOT_FAILED( ec );
171 
172         ec = make_error_code( errc::address_family_not_supported );
173         TEST_FAILED( ec );
174     }
175 
176     {
177         error_code ec( make_error_code( errc::address_family_not_supported ) );
178         TEST_FAILED( ec );
179 
180         ec = make_error_code( errc::success );
181         TEST_NOT_FAILED( ec );
182     }
183 
184     return boost::report_errors();
185 }
186