2022-07-20 18:38:07 +08:00
// __ _____ _____ _____
// __| | __| | | | JSON for Modern C++ (supporting code)
2023-11-29 05:36:31 +08:00
// | | |__ | | | | | | version 3.11.3
2022-07-20 18:38:07 +08:00
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
//
2023-11-26 22:51:19 +08:00
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
2022-07-20 18:38:07 +08:00
// SPDX-License-Identifier: MIT
2016-08-05 03:55:47 +08:00
2019-01-14 00:41:21 +08:00
# include "doctest_compatibility.h"
2016-08-05 03:55:47 +08:00
2018-01-29 18:21:11 +08:00
# include <nlohmann/json.hpp>
2016-08-05 03:55:47 +08:00
using nlohmann : : json ;
TEST_CASE ( " reference access " )
{
// create a JSON value with different types
2022-09-13 18:58:26 +08:00
const json json_types =
2016-08-05 03:55:47 +08:00
{
{ " boolean " , true } ,
{
" number " , {
{ " integer " , 42 } ,
{ " floating-point " , 17.23 }
}
} ,
{ " string " , " Hello, world! " } ,
{ " array " , { 1 , 2 , 3 , 4 , 5 } } ,
{ " null " , nullptr }
} ;
SECTION ( " reference access to object_t " )
{
using test_type = json : : object_t ;
json value = { { " one " , 1 } , { " two " , 2 } } ;
// check if references are returned correctly
2021-03-24 14:15:18 +08:00
auto & p1 = value . get_ref < test_type & > ( ) ;
2016-08-05 03:55:47 +08:00
CHECK ( & p1 = = value . get_ptr < test_type * > ( ) ) ;
CHECK ( p1 = = value . get < test_type > ( ) ) ;
2021-03-24 14:15:18 +08:00
const auto & p2 = value . get_ref < const test_type & > ( ) ;
2016-08-05 03:55:47 +08:00
CHECK ( & p2 = = value . get_ptr < const test_type * > ( ) ) ;
CHECK ( p2 = = value . get < test_type > ( ) ) ;
// check if mismatching references throw correctly
CHECK_NOTHROW ( value . get_ref < json : : object_t & > ( ) ) ;
2022-03-24 22:55:35 +08:00
CHECK_THROWS_WITH_AS ( value . get_ref < json : : array_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is object " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : string_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is object " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : boolean_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is object " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : number_integer_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is object " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : number_unsigned_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is object " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : number_float_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is object " , json : : type_error & ) ;
2016-08-05 03:55:47 +08:00
}
SECTION ( " const reference access to const object_t " )
{
using test_type = json : : object_t ;
const json value = { { " one " , 1 } , { " two " , 2 } } ;
// this should not compile
// test_type& p1 = value.get_ref<test_type&>();
// check if references are returned correctly
2021-03-24 14:15:18 +08:00
const auto & p2 = value . get_ref < const test_type & > ( ) ;
2016-08-05 03:55:47 +08:00
CHECK ( & p2 = = value . get_ptr < const test_type * > ( ) ) ;
CHECK ( p2 = = value . get < test_type > ( ) ) ;
}
SECTION ( " reference access to array_t " )
{
using test_type = json : : array_t ;
json value = { 1 , 2 , 3 , 4 } ;
// check if references are returned correctly
2021-03-24 14:15:18 +08:00
auto & p1 = value . get_ref < test_type & > ( ) ;
2016-08-05 03:55:47 +08:00
CHECK ( & p1 = = value . get_ptr < test_type * > ( ) ) ;
CHECK ( p1 = = value . get < test_type > ( ) ) ;
2021-03-24 14:15:18 +08:00
const auto & p2 = value . get_ref < const test_type & > ( ) ;
2016-08-05 03:55:47 +08:00
CHECK ( & p2 = = value . get_ptr < const test_type * > ( ) ) ;
CHECK ( p2 = = value . get < test_type > ( ) ) ;
// check if mismatching references throw correctly
2022-03-24 22:55:35 +08:00
CHECK_THROWS_WITH_AS ( value . get_ref < json : : object_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is array " , json : : type_error & ) ;
2016-08-05 03:55:47 +08:00
CHECK_NOTHROW ( value . get_ref < json : : array_t & > ( ) ) ;
2022-03-24 22:55:35 +08:00
CHECK_THROWS_WITH_AS ( value . get_ref < json : : string_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is array " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : boolean_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is array " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : number_integer_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is array " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : number_unsigned_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is array " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : number_float_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is array " , json : : type_error & ) ;
2016-08-05 03:55:47 +08:00
}
SECTION ( " reference access to string_t " )
{
using test_type = json : : string_t ;
json value = " hello " ;
// check if references are returned correctly
2021-03-24 14:15:18 +08:00
auto & p1 = value . get_ref < test_type & > ( ) ;
2016-08-05 03:55:47 +08:00
CHECK ( & p1 = = value . get_ptr < test_type * > ( ) ) ;
CHECK ( p1 = = value . get < test_type > ( ) ) ;
2021-03-24 14:15:18 +08:00
const auto & p2 = value . get_ref < const test_type & > ( ) ;
2016-08-05 03:55:47 +08:00
CHECK ( & p2 = = value . get_ptr < const test_type * > ( ) ) ;
CHECK ( p2 = = value . get < test_type > ( ) ) ;
// check if mismatching references throw correctly
2022-03-24 22:55:35 +08:00
CHECK_THROWS_WITH_AS ( value . get_ref < json : : object_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is string " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : array_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is string " , json : : type_error & ) ;
2016-08-05 03:55:47 +08:00
CHECK_NOTHROW ( value . get_ref < json : : string_t & > ( ) ) ;
2022-03-24 22:55:35 +08:00
CHECK_THROWS_WITH_AS ( value . get_ref < json : : boolean_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is string " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : number_integer_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is string " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : number_unsigned_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is string " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : number_float_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is string " , json : : type_error & ) ;
2016-08-05 03:55:47 +08:00
}
SECTION ( " reference access to boolean_t " )
{
using test_type = json : : boolean_t ;
json value = false ;
// check if references are returned correctly
2021-03-24 14:15:18 +08:00
auto & p1 = value . get_ref < test_type & > ( ) ;
2016-08-05 03:55:47 +08:00
CHECK ( & p1 = = value . get_ptr < test_type * > ( ) ) ;
CHECK ( p1 = = value . get < test_type > ( ) ) ;
2021-03-24 14:15:18 +08:00
const auto & p2 = value . get_ref < const test_type & > ( ) ;
2016-08-05 03:55:47 +08:00
CHECK ( & p2 = = value . get_ptr < const test_type * > ( ) ) ;
CHECK ( p2 = = value . get < test_type > ( ) ) ;
// check if mismatching references throw correctly
2022-03-24 22:55:35 +08:00
CHECK_THROWS_WITH_AS ( value . get_ref < json : : object_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is boolean " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : array_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is boolean " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : string_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is boolean " , json : : type_error & ) ;
2016-08-05 03:55:47 +08:00
CHECK_NOTHROW ( value . get_ref < json : : boolean_t & > ( ) ) ;
2022-03-24 22:55:35 +08:00
CHECK_THROWS_WITH_AS ( value . get_ref < json : : number_integer_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is boolean " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : number_unsigned_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is boolean " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : number_float_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is boolean " , json : : type_error & ) ;
2016-08-05 03:55:47 +08:00
}
SECTION ( " reference access to number_integer_t " )
{
using test_type = json : : number_integer_t ;
2017-10-22 14:53:27 +08:00
json value = - 23 ;
2016-08-05 03:55:47 +08:00
// check if references are returned correctly
2021-03-24 14:15:18 +08:00
auto & p1 = value . get_ref < test_type & > ( ) ;
2016-08-05 03:55:47 +08:00
CHECK ( & p1 = = value . get_ptr < test_type * > ( ) ) ;
CHECK ( p1 = = value . get < test_type > ( ) ) ;
2021-03-24 14:15:18 +08:00
const auto & p2 = value . get_ref < const test_type & > ( ) ;
2016-08-05 03:55:47 +08:00
CHECK ( & p2 = = value . get_ptr < const test_type * > ( ) ) ;
CHECK ( p2 = = value . get < test_type > ( ) ) ;
// check if mismatching references throw correctly
2022-03-24 22:55:35 +08:00
CHECK_THROWS_WITH_AS ( value . get_ref < json : : object_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is number " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : array_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is number " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : string_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is number " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : boolean_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is number " , json : : type_error & ) ;
2016-08-05 03:55:47 +08:00
CHECK_NOTHROW ( value . get_ref < json : : number_integer_t & > ( ) ) ;
2022-03-24 22:55:35 +08:00
CHECK_THROWS_WITH_AS ( value . get_ref < json : : number_unsigned_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is number " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : number_float_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is number " , json : : type_error & ) ;
2017-10-22 14:53:27 +08:00
}
SECTION ( " reference access to number_unsigned_t " )
{
using test_type = json : : number_unsigned_t ;
json value = 23u ;
// check if references are returned correctly
2021-03-24 14:15:18 +08:00
auto & p1 = value . get_ref < test_type & > ( ) ;
2017-10-22 14:53:27 +08:00
CHECK ( & p1 = = value . get_ptr < test_type * > ( ) ) ;
CHECK ( p1 = = value . get < test_type > ( ) ) ;
2021-03-24 14:15:18 +08:00
const auto & p2 = value . get_ref < const test_type & > ( ) ;
2017-10-22 14:53:27 +08:00
CHECK ( & p2 = = value . get_ptr < const test_type * > ( ) ) ;
CHECK ( p2 = = value . get < test_type > ( ) ) ;
// check if mismatching references throw correctly
2022-03-24 22:55:35 +08:00
CHECK_THROWS_WITH_AS ( value . get_ref < json : : object_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is number " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : array_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is number " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : string_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is number " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : boolean_t & > ( ) ,
" [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is number " , json : : type_error & ) ;
//CHECK_THROWS_WITH_AS(value.get_ref<json::number_integer_t&>(),
// "[json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is number", json::type_error&);
2017-10-22 14:53:27 +08:00
CHECK_NOTHROW ( value . get_ref < json : : number_unsigned_t & > ( ) ) ;
2022-03-24 22:55:35 +08:00
CHECK_THROWS_WITH_AS ( value . get_ref < json : : number_float_t & > ( ) , " [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is number " , json : : type_error & ) ;
2016-08-05 03:55:47 +08:00
}
SECTION ( " reference access to number_float_t " )
{
using test_type = json : : number_float_t ;
json value = 42.23 ;
// check if references are returned correctly
2021-03-24 14:15:18 +08:00
auto & p1 = value . get_ref < test_type & > ( ) ;
2016-08-05 03:55:47 +08:00
CHECK ( & p1 = = value . get_ptr < test_type * > ( ) ) ;
CHECK ( p1 = = value . get < test_type > ( ) ) ;
2021-03-24 14:15:18 +08:00
const auto & p2 = value . get_ref < const test_type & > ( ) ;
2016-08-05 03:55:47 +08:00
CHECK ( & p2 = = value . get_ptr < const test_type * > ( ) ) ;
CHECK ( p2 = = value . get < test_type > ( ) ) ;
// check if mismatching references throw correctly
2022-03-24 22:55:35 +08:00
CHECK_THROWS_WITH_AS ( value . get_ref < json : : object_t & > ( ) , " [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is number " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : array_t & > ( ) , " [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is number " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : string_t & > ( ) , " [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is number " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : boolean_t & > ( ) , " [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is number " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : number_integer_t & > ( ) , " [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is number " , json : : type_error & ) ;
CHECK_THROWS_WITH_AS ( value . get_ref < json : : number_unsigned_t & > ( ) , " [json.exception.type_error.303] incompatible ReferenceType for get_ref, actual type is number " , json : : type_error & ) ;
2016-08-05 03:55:47 +08:00
CHECK_NOTHROW ( value . get_ref < json : : number_float_t & > ( ) ) ;
}
}