| 1297 | //------------------------------------------------------ |
| 1298 | |
| 1299 | void |
| 1300 | testLongNumberOverlfow() |
| 1301 | { |
| 1302 | #ifdef BOOST_JSON_EXPENSIVE_TESTS |
| 1303 | std::array<char, 1000> zeroes; |
| 1304 | zeroes.fill('0'); |
| 1305 | |
| 1306 | stream_parser p; |
| 1307 | { |
| 1308 | p.write("1", 1); |
| 1309 | |
| 1310 | std::size_t count = 0; |
| 1311 | while( static_cast<std::size_t>( INT_MAX - zeroes.size() ) > count ) |
| 1312 | count += p.write( zeroes.data(), zeroes.size() ); |
| 1313 | |
| 1314 | system::error_code ec; |
| 1315 | p.write(zeroes.data(), zeroes.size(), ec); |
| 1316 | BOOST_TEST( ec == error::exponent_overflow ); |
| 1317 | } |
| 1318 | |
| 1319 | p.reset(); |
| 1320 | { |
| 1321 | p.write("0.", 2); |
| 1322 | |
| 1323 | std::size_t count = 0; |
| 1324 | while( static_cast<std::size_t>( INT_MAX - zeroes.size() ) > count ) |
| 1325 | count += p.write( zeroes.data(), zeroes.size() ); |
| 1326 | |
| 1327 | system::error_code ec; |
| 1328 | p.write(zeroes.data(), zeroes.size(), ec); |
| 1329 | BOOST_TEST( ec == error::exponent_overflow ); |
| 1330 | } |
| 1331 | |
| 1332 | p.reset(); |
| 1333 | { |
| 1334 | p.write("0.", 2); |
| 1335 | |
| 1336 | int count = INT_MIN; |
| 1337 | while( static_cast<int>( count + zeroes.size() ) < 0 ) |
| 1338 | count += static_cast<int>( |
| 1339 | p.write( zeroes.data(), zeroes.size() )); |
| 1340 | |
| 1341 | p.write(zeroes.data(), -2 - count); |
| 1342 | p.write("1e", 2); |
| 1343 | // at this point we've filled bias to the brim |
| 1344 | |
| 1345 | std::string const int_min = std::to_string(INT_MIN); |
| 1346 | p.write( int_min.data(), int_min.size() ); |
| 1347 | |
| 1348 | system::error_code ec; |
| 1349 | p.finish(ec); |
| 1350 | BOOST_TEST( ec == error::exponent_overflow ); |
| 1351 | } |
| 1352 | |
| 1353 | p.reset(); |
| 1354 | { |
| 1355 | std::string const uint64_max |
| 1356 | = std::to_string(18446744073709551615U); |