2016-08-04 22:55:47 +03:00
/*
__ _____ _____ _____
__ | | __ | | | | JSON for Modern C + + ( test suite )
2022-01-03 00:35:35 +03:00
| | | __ | | | | | | version 3.10 .5
2016-08-04 22:55:47 +03:00
| _____ | _____ | _____ | _ | ___ | https : //github.com/nlohmann/json
Licensed under the MIT License < http : //opensource.org/licenses/MIT>.
2018-05-03 18:41:45 +03:00
SPDX - License - Identifier : MIT
2022-01-03 00:35:35 +03:00
Copyright ( c ) 2013 - 2022 Niels Lohmann < http : //nlohmann.me>.
2016-08-04 22:55:47 +03:00
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 .
*/
2019-01-13 19:41:21 +03:00
# include "doctest_compatibility.h"
2016-08-04 22:55:47 +03:00
2018-01-29 13:21:11 +03:00
# include <nlohmann/json.hpp>
2016-08-04 22:55:47 +03:00
using nlohmann : : json ;
TEST_CASE ( " reference access " )
{
// create a JSON value with different types
json json_types =
{
{ " 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 09:15:18 +03:00
auto & p1 = value . get_ref < test_type & > ( ) ;
2016-08-04 22:55:47 +03:00
CHECK ( & p1 = = value . get_ptr < test_type * > ( ) ) ;
CHECK ( p1 = = value . get < test_type > ( ) ) ;
2021-03-24 09:15:18 +03:00
const auto & p2 = value . get_ref < const test_type & > ( ) ;
2016-08-04 22:55:47 +03: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 17:55:35 +03: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-04 22:55:47 +03: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 09:15:18 +03:00
const auto & p2 = value . get_ref < const test_type & > ( ) ;
2016-08-04 22:55:47 +03: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 09:15:18 +03:00
auto & p1 = value . get_ref < test_type & > ( ) ;
2016-08-04 22:55:47 +03:00
CHECK ( & p1 = = value . get_ptr < test_type * > ( ) ) ;
CHECK ( p1 = = value . get < test_type > ( ) ) ;
2021-03-24 09:15:18 +03:00
const auto & p2 = value . get_ref < const test_type & > ( ) ;
2016-08-04 22:55:47 +03:00
CHECK ( & p2 = = value . get_ptr < const test_type * > ( ) ) ;
CHECK ( p2 = = value . get < test_type > ( ) ) ;
// check if mismatching references throw correctly
2022-03-24 17:55:35 +03: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-04 22:55:47 +03:00
CHECK_NOTHROW ( value . get_ref < json : : array_t & > ( ) ) ;
2022-03-24 17:55:35 +03: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-04 22:55:47 +03: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 09:15:18 +03:00
auto & p1 = value . get_ref < test_type & > ( ) ;
2016-08-04 22:55:47 +03:00
CHECK ( & p1 = = value . get_ptr < test_type * > ( ) ) ;
CHECK ( p1 = = value . get < test_type > ( ) ) ;
2021-03-24 09:15:18 +03:00
const auto & p2 = value . get_ref < const test_type & > ( ) ;
2016-08-04 22:55:47 +03:00
CHECK ( & p2 = = value . get_ptr < const test_type * > ( ) ) ;
CHECK ( p2 = = value . get < test_type > ( ) ) ;
// check if mismatching references throw correctly
2022-03-24 17:55:35 +03: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-04 22:55:47 +03:00
CHECK_NOTHROW ( value . get_ref < json : : string_t & > ( ) ) ;
2022-03-24 17:55:35 +03: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-04 22:55:47 +03: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 09:15:18 +03:00
auto & p1 = value . get_ref < test_type & > ( ) ;
2016-08-04 22:55:47 +03:00
CHECK ( & p1 = = value . get_ptr < test_type * > ( ) ) ;
CHECK ( p1 = = value . get < test_type > ( ) ) ;
2021-03-24 09:15:18 +03:00
const auto & p2 = value . get_ref < const test_type & > ( ) ;
2016-08-04 22:55:47 +03:00
CHECK ( & p2 = = value . get_ptr < const test_type * > ( ) ) ;
CHECK ( p2 = = value . get < test_type > ( ) ) ;
// check if mismatching references throw correctly
2022-03-24 17:55:35 +03: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-04 22:55:47 +03:00
CHECK_NOTHROW ( value . get_ref < json : : boolean_t & > ( ) ) ;
2022-03-24 17:55:35 +03: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-04 22:55:47 +03:00
}
SECTION ( " reference access to number_integer_t " )
{
using test_type = json : : number_integer_t ;
2017-10-22 09:53:27 +03:00
json value = - 23 ;
2016-08-04 22:55:47 +03:00
// check if references are returned correctly
2021-03-24 09:15:18 +03:00
auto & p1 = value . get_ref < test_type & > ( ) ;
2016-08-04 22:55:47 +03:00
CHECK ( & p1 = = value . get_ptr < test_type * > ( ) ) ;
CHECK ( p1 = = value . get < test_type > ( ) ) ;
2021-03-24 09:15:18 +03:00
const auto & p2 = value . get_ref < const test_type & > ( ) ;
2016-08-04 22:55:47 +03:00
CHECK ( & p2 = = value . get_ptr < const test_type * > ( ) ) ;
CHECK ( p2 = = value . get < test_type > ( ) ) ;
// check if mismatching references throw correctly
2022-03-24 17:55:35 +03: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-04 22:55:47 +03:00
CHECK_NOTHROW ( value . get_ref < json : : number_integer_t & > ( ) ) ;
2022-03-24 17:55:35 +03: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 09:53:27 +03: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 09:15:18 +03:00
auto & p1 = value . get_ref < test_type & > ( ) ;
2017-10-22 09:53:27 +03:00
CHECK ( & p1 = = value . get_ptr < test_type * > ( ) ) ;
CHECK ( p1 = = value . get < test_type > ( ) ) ;
2021-03-24 09:15:18 +03:00
const auto & p2 = value . get_ref < const test_type & > ( ) ;
2017-10-22 09:53:27 +03:00
CHECK ( & p2 = = value . get_ptr < const test_type * > ( ) ) ;
CHECK ( p2 = = value . get < test_type > ( ) ) ;
// check if mismatching references throw correctly
2022-03-24 17:55:35 +03: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 09:53:27 +03:00
CHECK_NOTHROW ( value . get_ref < json : : number_unsigned_t & > ( ) ) ;
2022-03-24 17:55:35 +03: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-04 22:55:47 +03: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 09:15:18 +03:00
auto & p1 = value . get_ref < test_type & > ( ) ;
2016-08-04 22:55:47 +03:00
CHECK ( & p1 = = value . get_ptr < test_type * > ( ) ) ;
CHECK ( p1 = = value . get < test_type > ( ) ) ;
2021-03-24 09:15:18 +03:00
const auto & p2 = value . get_ref < const test_type & > ( ) ;
2016-08-04 22:55:47 +03:00
CHECK ( & p2 = = value . get_ptr < const test_type * > ( ) ) ;
CHECK ( p2 = = value . get < test_type > ( ) ) ;
// check if mismatching references throw correctly
2022-03-24 17:55:35 +03: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-04 22:55:47 +03:00
CHECK_NOTHROW ( value . get_ref < json : : number_float_t & > ( ) ) ;
}
}