| /* |
| __ _____ _____ _____ |
| __| | __| | | | JSON for Modern C++ (test suite) |
| | | |__ | | | | | | version 3.8.0 |
| |_____|_____|_____|_|___| https://github.com/nlohmann/json |
| |
| Licensed under the MIT License <http://opensource.org/licenses/MIT>. |
| SPDX-License-Identifier: MIT |
| Copyright (c) 2018 Vitaliy Manushkin <agri@akamo.info>. |
| |
| Permission is hereby granted, free of charge, to any person obtaining a copy |
| of this software and associated documentation files (the "Software"), to deal |
| in the Software without restriction, including without limitation the rights |
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| copies of the Software, and to permit persons to whom the Software is |
| furnished to do so, subject to the following conditions: |
| |
| The above copyright notice and this permission notice shall be included in all |
| copies or substantial portions of the Software. |
| |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| SOFTWARE. |
| */ |
| |
| #include "doctest_compatibility.h" |
| |
| #include <nlohmann/json.hpp> |
| |
| TEST_CASE("Alternative number types") |
| { |
| SECTION("8 bit integers") |
| { |
| using json8 = nlohmann::basic_json<std::map, std::vector, std::string, bool, std::int8_t, std::uint8_t>; |
| |
| SECTION("unsigned") |
| { |
| std::uint8_t unsigned_max = 255; |
| json8 j_unsigned_max = json8::parse("255"); |
| CHECK(j_unsigned_max.is_number_unsigned()); |
| CHECK(j_unsigned_max.dump() == "255"); |
| CHECK((j_unsigned_max.get<std::uint8_t>() == unsigned_max)); |
| CHECK(json8::parse(j_unsigned_max.dump()) == j_unsigned_max); |
| |
| json8 j_overflow = json8::parse("256"); |
| CHECK(j_overflow.is_number_float()); |
| CHECK(j_overflow.dump() == "256.0"); |
| } |
| |
| SECTION("signed") |
| { |
| std::int8_t signed_min = -128; |
| json8 j_signed_min = json8::parse("-128"); |
| CHECK(j_signed_min.is_number_integer()); |
| CHECK(j_signed_min.dump() == "-128"); |
| CHECK((j_signed_min.get<std::int8_t>() == signed_min)); |
| CHECK(json8::parse(j_signed_min.dump()) == j_signed_min); |
| |
| json8 j_underflow = json8::parse("-129"); |
| CHECK(j_underflow.is_number_float()); |
| CHECK(j_underflow.dump() == "-129.0"); |
| } |
| } |
| |
| SECTION("16 bit integers") |
| { |
| using json16 = nlohmann::basic_json<std::map, std::vector, std::string, bool, std::int16_t, std::uint16_t>; |
| |
| SECTION("unsigned") |
| { |
| std::uint16_t unsigned_max = 65535; |
| json16 j_unsigned_max = json16::parse("65535"); |
| CHECK(j_unsigned_max.is_number_unsigned()); |
| CHECK(j_unsigned_max.dump() == "65535"); |
| CHECK((j_unsigned_max.get<std::uint16_t>() == unsigned_max)); |
| CHECK(json16::parse(j_unsigned_max.dump()) == j_unsigned_max); |
| |
| json16 j_overflow = json16::parse("65536"); |
| CHECK(j_overflow.is_number_float()); |
| CHECK(j_overflow.dump() == "65536.0"); |
| } |
| |
| SECTION("signed") |
| { |
| std::int16_t signed_min = -32768; |
| json16 j_signed_min = json16::parse("-32768"); |
| CHECK(j_signed_min.is_number_integer()); |
| CHECK(j_signed_min.dump() == "-32768"); |
| CHECK((j_signed_min.get<std::int16_t>() == signed_min)); |
| CHECK(json16::parse(j_signed_min.dump()) == j_signed_min); |
| |
| json16 j_underflow = json16::parse("-32769"); |
| CHECK(j_underflow.is_number_float()); |
| CHECK(j_underflow.dump() == "-32769.0"); |
| } |
| } |
| |
| // 128-bit arithmetic does not work with sanitizers |
| #if defined(__SIZEOF_INT128__) && !defined(__SANITIZE_ADDRESS__) |
| SECTION("128 bit integers") |
| { |
| using json128 = nlohmann::basic_json<std::map, std::vector, std::string, bool, __int128_t, __uint128_t>; |
| |
| SECTION("unsigned") |
| { |
| __uint128_t unsigned_max = (340282366920938463463.374607431768211455) * std::pow(10, 18); |
| json128 j_unsigned_max = json128::parse("340282366920938463463374607431768211455"); |
| CHECK(j_unsigned_max.is_number_unsigned()); |
| CHECK(j_unsigned_max.dump() == "340282366920938463463374607431768211455"); |
| //CHECK((j_unsigned_max.get<__uint128_t>() == unsigned_max)); |
| CHECK(json128::parse(j_unsigned_max.dump()) == j_unsigned_max); |
| } |
| |
| SECTION("signed") |
| { |
| __int128_t signed_min = (-170141183460469231731.687303715884105728) * std::pow(10, 18); |
| json128 j_signed_min = json128::parse("-170141183460469231731687303715884105728"); |
| CHECK(j_signed_min.is_number_integer()); |
| CHECK(j_signed_min.dump() == "-170141183460469231731687303715884105728"); |
| CHECK((j_signed_min.get<__int128_t>() == signed_min)); |
| CHECK(json128::parse(j_signed_min.dump()) == j_signed_min); |
| } |
| } |
| #endif |
| } |