Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
J
json
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
json
Commits
dc8ab925
Commit
dc8ab925
authored
Dec 25, 2015
by
Niels
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
more tests for exceptions (#160)
parent
76e5e29e
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
232 additions
and
93 deletions
+232
-93
json.hpp
src/json.hpp
+3
-3
json.hpp.re2c
src/json.hpp.re2c
+3
-3
unit.cpp
test/unit.cpp
+226
-87
No files found.
src/json.hpp
View file @
dc8ab925
...
@@ -6371,7 +6371,8 @@ class basic_json
...
@@ -6371,7 +6371,8 @@ class basic_json
@param[in] codepoint1 the code point (can be high surrogate)
@param[in] codepoint1 the code point (can be high surrogate)
@param[in] codepoint2 the code point (can be low surrogate or 0)
@param[in] codepoint2 the code point (can be low surrogate or 0)
@return string representation of the code point
@return string representation of the code point
@throw std::out_of_range if code point is >0x10ffff
@throw std::out_of_range if code point is >0x10ffff; example: `"code
points above 0x10FFFF are invalid"`
@throw std::invalid_argument if the low surrogate is invalid
@throw std::invalid_argument if the low surrogate is invalid
@see <http://en.wikipedia.org/wiki/UTF-8#Sample_code>
@see <http://en.wikipedia.org/wiki/UTF-8#Sample_code>
...
@@ -7765,8 +7766,7 @@ basic_json_parser_64:
...
@@ -7765,8 +7766,7 @@ basic_json_parser_64:
{
{
std
::
string
error_msg
=
"parse error - unexpected
\'
"
;
std
::
string
error_msg
=
"parse error - unexpected
\'
"
;
error_msg
+=
m_lexer
.
get_token
();
error_msg
+=
m_lexer
.
get_token
();
error_msg
+=
"
\'
("
;
error_msg
+=
"
\'
"
;
error_msg
+=
lexer
::
token_type_name
(
last_token
)
+
")"
;
throw
std
::
invalid_argument
(
error_msg
);
throw
std
::
invalid_argument
(
error_msg
);
}
}
}
}
...
...
src/json.hpp.re2c
View file @
dc8ab925
...
@@ -6371,7 +6371,8 @@ class basic_json
...
@@ -6371,7 +6371,8 @@ class basic_json
@param[in] codepoint1 the code point (can be high surrogate)
@param[in] codepoint1 the code point (can be high surrogate)
@param[in] codepoint2 the code point (can be low surrogate or 0)
@param[in] codepoint2 the code point (can be low surrogate or 0)
@return string representation of the code point
@return string representation of the code point
@throw std::out_of_range if code point is >0x10ffff
@throw std::out_of_range if code point is >0x10ffff; example: `"code
points above 0x10FFFF are invalid"`
@throw std::invalid_argument if the low surrogate is invalid
@throw std::invalid_argument if the low surrogate is invalid
@see <http://en.wikipedia.org/wiki/UTF-8#Sample_code>
@see <http://en.wikipedia.org/wiki/UTF-8#Sample_code>
...
@@ -7044,8 +7045,7 @@ class basic_json
...
@@ -7044,8 +7045,7 @@ class basic_json
{
{
std::string error_msg = "parse error - unexpected \'";
std::string error_msg = "parse error - unexpected \'";
error_msg += m_lexer.get_token();
error_msg += m_lexer.get_token();
error_msg += "\' (";
error_msg += "\'";
error_msg += lexer::token_type_name(last_token) + ")";
throw std::invalid_argument(error_msg);
throw std::invalid_argument(error_msg);
}
}
}
}
...
...
test/unit.cpp
View file @
dc8ab925
...
@@ -5941,11 +5941,15 @@ TEST_CASE("iterators")
...
@@ -5941,11 +5941,15 @@ TEST_CASE("iterators")
auto
it
=
j_object
.
begin
();
auto
it
=
j_object
.
begin
();
CHECK_THROWS_AS
(
it
[
0
],
std
::
domain_error
);
CHECK_THROWS_AS
(
it
[
0
],
std
::
domain_error
);
CHECK_THROWS_AS
(
it
[
1
],
std
::
domain_error
);
CHECK_THROWS_AS
(
it
[
1
],
std
::
domain_error
);
CHECK_THROWS_NAME
(
it
[
0
],
std
::
domain_error
,
"cannot use operator[] for object iterators"
);
CHECK_THROWS_NAME
(
it
[
1
],
std
::
domain_error
,
"cannot use operator[] for object iterators"
);
}
}
{
{
auto
it
=
j_object
.
cbegin
();
auto
it
=
j_object
.
cbegin
();
CHECK_THROWS_AS
(
it
[
0
],
std
::
domain_error
);
CHECK_THROWS_AS
(
it
[
0
],
std
::
domain_error
);
CHECK_THROWS_AS
(
it
[
1
],
std
::
domain_error
);
CHECK_THROWS_AS
(
it
[
1
],
std
::
domain_error
);
CHECK_THROWS_NAME
(
it
[
0
],
std
::
domain_error
,
"cannot use operator[] for object iterators"
);
CHECK_THROWS_NAME
(
it
[
1
],
std
::
domain_error
,
"cannot use operator[] for object iterators"
);
}
}
}
}
...
@@ -5977,11 +5981,15 @@ TEST_CASE("iterators")
...
@@ -5977,11 +5981,15 @@ TEST_CASE("iterators")
auto
it
=
j_null
.
begin
();
auto
it
=
j_null
.
begin
();
CHECK_THROWS_AS
(
it
[
0
],
std
::
out_of_range
);
CHECK_THROWS_AS
(
it
[
0
],
std
::
out_of_range
);
CHECK_THROWS_AS
(
it
[
1
],
std
::
out_of_range
);
CHECK_THROWS_AS
(
it
[
1
],
std
::
out_of_range
);
CHECK_THROWS_NAME
(
it
[
0
],
std
::
out_of_range
,
"cannot get value"
);
CHECK_THROWS_NAME
(
it
[
1
],
std
::
out_of_range
,
"cannot get value"
);
}
}
{
{
auto
it
=
j_null
.
cbegin
();
auto
it
=
j_null
.
cbegin
();
CHECK_THROWS_AS
(
it
[
0
],
std
::
out_of_range
);
CHECK_THROWS_AS
(
it
[
0
],
std
::
out_of_range
);
CHECK_THROWS_AS
(
it
[
1
],
std
::
out_of_range
);
CHECK_THROWS_AS
(
it
[
1
],
std
::
out_of_range
);
CHECK_THROWS_NAME
(
it
[
0
],
std
::
out_of_range
,
"cannot get value"
);
CHECK_THROWS_NAME
(
it
[
1
],
std
::
out_of_range
,
"cannot get value"
);
}
}
}
}
...
@@ -5991,11 +5999,13 @@ TEST_CASE("iterators")
...
@@ -5991,11 +5999,13 @@ TEST_CASE("iterators")
auto
it
=
j_value
.
begin
();
auto
it
=
j_value
.
begin
();
CHECK
(
it
[
0
]
==
json
(
42
));
CHECK
(
it
[
0
]
==
json
(
42
));
CHECK_THROWS_AS
(
it
[
1
],
std
::
out_of_range
);
CHECK_THROWS_AS
(
it
[
1
],
std
::
out_of_range
);
CHECK_THROWS_NAME
(
it
[
1
],
std
::
out_of_range
,
"cannot get value"
);
}
}
{
{
auto
it
=
j_value
.
cbegin
();
auto
it
=
j_value
.
cbegin
();
CHECK
(
it
[
0
]
==
json
(
42
));
CHECK
(
it
[
0
]
==
json
(
42
));
CHECK_THROWS_AS
(
it
[
1
],
std
::
out_of_range
);
CHECK_THROWS_AS
(
it
[
1
],
std
::
out_of_range
);
CHECK_THROWS_NAME
(
it
[
1
],
std
::
out_of_range
,
"cannot get value"
);
}
}
}
}
}
}
...
@@ -6057,6 +6067,14 @@ TEST_CASE("iterators")
...
@@ -6057,6 +6067,14 @@ TEST_CASE("iterators")
CHECK_THROWS_AS
(
it1_c
<
it2_c
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it1_c
<
it2_c
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it2_c
<
it3_c
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it2_c
<
it3_c
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it1_c
<
it3_c
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it1_c
<
it3_c
,
std
::
domain_error
);
CHECK_THROWS_NAME
(
it1
<
it1
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it1
<
it2
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it2
<
it3
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it1
<
it3
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it1_c
<
it1_c
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it1_c
<
it2_c
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it2_c
<
it3_c
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it1_c
<
it3_c
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
}
}
else
else
{
{
...
@@ -6083,6 +6101,14 @@ TEST_CASE("iterators")
...
@@ -6083,6 +6101,14 @@ TEST_CASE("iterators")
CHECK_THROWS_AS
(
it1_c
<=
it2_c
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it1_c
<=
it2_c
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it2_c
<=
it3_c
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it2_c
<=
it3_c
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it1_c
<=
it3_c
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it1_c
<=
it3_c
,
std
::
domain_error
);
CHECK_THROWS_NAME
(
it1
<=
it1
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it1
<=
it2
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it2
<=
it3
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it1
<=
it3
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it1_c
<=
it1_c
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it1_c
<=
it2_c
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it2_c
<=
it3_c
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it1_c
<=
it3_c
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
}
}
else
else
{
{
...
@@ -6110,6 +6136,14 @@ TEST_CASE("iterators")
...
@@ -6110,6 +6136,14 @@ TEST_CASE("iterators")
CHECK_THROWS_AS
(
it1_c
>
it2_c
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it1_c
>
it2_c
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it2_c
>
it3_c
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it2_c
>
it3_c
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it1_c
>
it3_c
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it1_c
>
it3_c
,
std
::
domain_error
);
CHECK_THROWS_NAME
(
it1
>
it1
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it1
>
it2
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it2
>
it3
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it1
>
it3
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it1_c
>
it1_c
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it1_c
>
it2_c
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it2_c
>
it3_c
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it1_c
>
it3_c
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
}
}
else
else
{
{
...
@@ -6137,6 +6171,14 @@ TEST_CASE("iterators")
...
@@ -6137,6 +6171,14 @@ TEST_CASE("iterators")
CHECK_THROWS_AS
(
it1_c
>=
it2_c
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it1_c
>=
it2_c
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it2_c
>=
it3_c
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it2_c
>=
it3_c
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it1_c
>=
it3_c
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it1_c
>=
it3_c
,
std
::
domain_error
);
CHECK_THROWS_NAME
(
it1
>=
it1
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it1
>=
it2
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it2
>=
it3
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it1
>=
it3
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it1_c
>=
it1_c
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it1_c
>=
it2_c
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it2_c
>=
it3_c
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
CHECK_THROWS_NAME
(
it1_c
>=
it3_c
,
std
::
domain_error
,
"cannot compare order of object iterators"
);
}
}
else
else
{
{
...
@@ -6162,9 +6204,17 @@ TEST_CASE("iterators")
...
@@ -6162,9 +6204,17 @@ TEST_CASE("iterators")
{
{
CHECK_THROWS_AS
(
j
.
rbegin
()
==
k
.
rbegin
(),
std
::
domain_error
);
CHECK_THROWS_AS
(
j
.
rbegin
()
==
k
.
rbegin
(),
std
::
domain_error
);
CHECK_THROWS_AS
(
j
.
crbegin
()
==
k
.
crbegin
(),
std
::
domain_error
);
CHECK_THROWS_AS
(
j
.
crbegin
()
==
k
.
crbegin
(),
std
::
domain_error
);
CHECK_THROWS_NAME
(
j
.
rbegin
()
==
k
.
rbegin
(),
std
::
domain_error
,
"cannot compare iterators of different containers"
);
CHECK_THROWS_NAME
(
j
.
crbegin
()
==
k
.
crbegin
(),
std
::
domain_error
,
"cannot compare iterators of different containers"
);
CHECK_THROWS_AS
(
j
.
rbegin
()
<
k
.
rbegin
(),
std
::
domain_error
);
CHECK_THROWS_AS
(
j
.
rbegin
()
<
k
.
rbegin
(),
std
::
domain_error
);
CHECK_THROWS_AS
(
j
.
crbegin
()
<
k
.
crbegin
(),
std
::
domain_error
);
CHECK_THROWS_AS
(
j
.
crbegin
()
<
k
.
crbegin
(),
std
::
domain_error
);
CHECK_THROWS_NAME
(
j
.
rbegin
()
<
k
.
rbegin
(),
std
::
domain_error
,
"cannot compare iterators of different containers"
);
CHECK_THROWS_NAME
(
j
.
crbegin
()
<
k
.
crbegin
(),
std
::
domain_error
,
"cannot compare iterators of different containers"
);
}
}
}
}
}
}
...
@@ -6184,42 +6234,52 @@ TEST_CASE("iterators")
...
@@ -6184,42 +6234,52 @@ TEST_CASE("iterators")
{
{
auto
it
=
j_object
.
rbegin
();
auto
it
=
j_object
.
rbegin
();
CHECK_THROWS_AS
(
it
+=
1
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it
+=
1
,
std
::
domain_error
);
CHECK_THROWS_NAME
(
it
+=
1
,
std
::
domain_error
,
"cannot use offsets with object iterators"
);
}
}
{
{
auto
it
=
j_object
.
crbegin
();
auto
it
=
j_object
.
crbegin
();
CHECK_THROWS_AS
(
it
+=
1
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it
+=
1
,
std
::
domain_error
);
CHECK_THROWS_NAME
(
it
+=
1
,
std
::
domain_error
,
"cannot use offsets with object iterators"
);
}
}
{
{
auto
it
=
j_object
.
rbegin
();
auto
it
=
j_object
.
rbegin
();
CHECK_THROWS_AS
(
it
+
1
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it
+
1
,
std
::
domain_error
);
CHECK_THROWS_NAME
(
it
+
1
,
std
::
domain_error
,
"cannot use offsets with object iterators"
);
}
}
{
{
auto
it
=
j_object
.
crbegin
();
auto
it
=
j_object
.
crbegin
();
CHECK_THROWS_AS
(
it
+
1
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it
+
1
,
std
::
domain_error
);
CHECK_THROWS_NAME
(
it
+
1
,
std
::
domain_error
,
"cannot use offsets with object iterators"
);
}
}
{
{
auto
it
=
j_object
.
rbegin
();
auto
it
=
j_object
.
rbegin
();
CHECK_THROWS_AS
(
it
-=
1
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it
-=
1
,
std
::
domain_error
);
CHECK_THROWS_NAME
(
it
-=
1
,
std
::
domain_error
,
"cannot use offsets with object iterators"
);
}
}
{
{
auto
it
=
j_object
.
crbegin
();
auto
it
=
j_object
.
crbegin
();
CHECK_THROWS_AS
(
it
-=
1
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it
-=
1
,
std
::
domain_error
);
CHECK_THROWS_NAME
(
it
-=
1
,
std
::
domain_error
,
"cannot use offsets with object iterators"
);
}
}
{
{
auto
it
=
j_object
.
rbegin
();
auto
it
=
j_object
.
rbegin
();
CHECK_THROWS_AS
(
it
-
1
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it
-
1
,
std
::
domain_error
);
CHECK_THROWS_NAME
(
it
-
1
,
std
::
domain_error
,
"cannot use offsets with object iterators"
);
}
}
{
{
auto
it
=
j_object
.
crbegin
();
auto
it
=
j_object
.
crbegin
();
CHECK_THROWS_AS
(
it
-
1
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it
-
1
,
std
::
domain_error
);
CHECK_THROWS_NAME
(
it
-
1
,
std
::
domain_error
,
"cannot use offsets with object iterators"
);
}
}
{
{
auto
it
=
j_object
.
rbegin
();
auto
it
=
j_object
.
rbegin
();
CHECK_THROWS_AS
(
it
-
it
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it
-
it
,
std
::
domain_error
);
CHECK_THROWS_NAME
(
it
-
it
,
std
::
domain_error
,
"cannot use offsets with object iterators"
);
}
}
{
{
auto
it
=
j_object
.
crbegin
();
auto
it
=
j_object
.
crbegin
();
CHECK_THROWS_AS
(
it
-
it
,
std
::
domain_error
);
CHECK_THROWS_AS
(
it
-
it
,
std
::
domain_error
);
CHECK_THROWS_NAME
(
it
-
it
,
std
::
domain_error
,
"cannot use offsets with object iterators"
);
}
}
}
}
...
@@ -6304,11 +6364,15 @@ TEST_CASE("iterators")
...
@@ -6304,11 +6364,15 @@ TEST_CASE("iterators")
auto
it
=
j_object
.
rbegin
();
auto
it
=
j_object
.
rbegin
();
CHECK_THROWS_AS
(
it
[
0
],
std
::
domain_error
);
CHECK_THROWS_AS
(
it
[
0
],
std
::
domain_error
);
CHECK_THROWS_AS
(
it
[
1
],
std
::
domain_error
);
CHECK_THROWS_AS
(
it
[
1
],
std
::
domain_error
);
CHECK_THROWS_NAME
(
it
[
0
],
std
::
domain_error
,
"cannot use offsets with object iterators"
);
CHECK_THROWS_NAME
(
it
[
1
],
std
::
domain_error
,
"cannot use offsets with object iterators"
);
}
}
{
{
auto
it
=
j_object
.
crbegin
();
auto
it
=
j_object
.
crbegin
();
CHECK_THROWS_AS
(
it
[
0
],
std
::
domain_error
);
CHECK_THROWS_AS
(
it
[
0
],
std
::
domain_error
);
CHECK_THROWS_AS
(
it
[
1
],
std
::
domain_error
);
CHECK_THROWS_AS
(
it
[
1
],
std
::
domain_error
);
CHECK_THROWS_NAME
(
it
[
0
],
std
::
domain_error
,
"cannot use offsets with object iterators"
);
CHECK_THROWS_NAME
(
it
[
1
],
std
::
domain_error
,
"cannot use offsets with object iterators"
);
}
}
}
}
...
@@ -6340,11 +6404,15 @@ TEST_CASE("iterators")
...
@@ -6340,11 +6404,15 @@ TEST_CASE("iterators")
auto
it
=
j_null
.
rbegin
();
auto
it
=
j_null
.
rbegin
();
CHECK_THROWS_AS
(
it
[
0
],
std
::
out_of_range
);
CHECK_THROWS_AS
(
it
[
0
],
std
::
out_of_range
);
CHECK_THROWS_AS
(
it
[
1
],
std
::
out_of_range
);
CHECK_THROWS_AS
(
it
[
1
],
std
::
out_of_range
);
CHECK_THROWS_NAME
(
it
[
0
],
std
::
out_of_range
,
"cannot get value"
);
CHECK_THROWS_NAME
(
it
[
1
],
std
::
out_of_range
,
"cannot get value"
);
}
}
{
{
auto
it
=
j_null
.
crbegin
();
auto
it
=
j_null
.
crbegin
();
CHECK_THROWS_AS
(
it
[
0
],
std
::
out_of_range
);
CHECK_THROWS_AS
(
it
[
0
],
std
::
out_of_range
);
CHECK_THROWS_AS
(
it
[
1
],
std
::
out_of_range
);
CHECK_THROWS_AS
(
it
[
1
],
std
::
out_of_range
);
CHECK_THROWS_NAME
(
it
[
0
],
std
::
out_of_range
,
"cannot get value"
);
CHECK_THROWS_NAME
(
it
[
1
],
std
::
out_of_range
,
"cannot get value"
);
}
}
}
}
...
@@ -6354,11 +6422,13 @@ TEST_CASE("iterators")
...
@@ -6354,11 +6422,13 @@ TEST_CASE("iterators")
auto
it
=
j_value
.
rbegin
();
auto
it
=
j_value
.
rbegin
();
CHECK
(
it
[
0
]
==
json
(
42
));
CHECK
(
it
[
0
]
==
json
(
42
));
CHECK_THROWS_AS
(
it
[
1
],
std
::
out_of_range
);
CHECK_THROWS_AS
(
it
[
1
],
std
::
out_of_range
);
CHECK_THROWS_NAME
(
it
[
1
],
std
::
out_of_range
,
"cannot get value"
);
}
}
{
{
auto
it
=
j_value
.
crbegin
();
auto
it
=
j_value
.
crbegin
();
CHECK
(
it
[
0
]
==
json
(
42
));
CHECK
(
it
[
0
]
==
json
(
42
));
CHECK_THROWS_AS
(
it
[
1
],
std
::
out_of_range
);
CHECK_THROWS_AS
(
it
[
1
],
std
::
out_of_range
);
CHECK_THROWS_NAME
(
it
[
1
],
std
::
out_of_range
,
"cannot get value"
);
}
}
}
}
}
}
...
@@ -6959,16 +7029,7 @@ TEST_CASE("modifiers")
...
@@ -6959,16 +7029,7 @@ TEST_CASE("modifiers")
{
{
json
j
=
1
;
json
j
=
1
;
CHECK_THROWS_AS
(
j
.
push_back
(
"Hello"
),
std
::
domain_error
);
CHECK_THROWS_AS
(
j
.
push_back
(
"Hello"
),
std
::
domain_error
);
CHECK_THROWS_NAME
(
j
.
push_back
(
"Hello"
),
std
::
domain_error
,
"cannot use push_back() with number"
);
// exception name
try
{
j
.
push_back
(
"Hello"
);
}
catch
(
std
::
domain_error
&
e
)
{
CHECK
(
e
.
what
()
==
std
::
string
(
"cannot use push_back() with number"
));
}
}
}
}
}
...
@@ -6998,16 +7059,7 @@ TEST_CASE("modifiers")
...
@@ -6998,16 +7059,7 @@ TEST_CASE("modifiers")
json
j
=
1
;
json
j
=
1
;
json
k
(
"Hello"
);
json
k
(
"Hello"
);
CHECK_THROWS_AS
(
j
.
push_back
(
k
),
std
::
domain_error
);
CHECK_THROWS_AS
(
j
.
push_back
(
k
),
std
::
domain_error
);
CHECK_THROWS_NAME
(
j
.
push_back
(
k
),
std
::
domain_error
,
"cannot use push_back() with number"
);
// exception name
try
{
j
.
push_back
(
k
);
}
catch
(
std
::
domain_error
&
e
)
{
CHECK
(
e
.
what
()
==
std
::
string
(
"cannot use push_back() with number"
));
}
}
}
}
}
}
}
...
@@ -7040,16 +7092,8 @@ TEST_CASE("modifiers")
...
@@ -7040,16 +7092,8 @@ TEST_CASE("modifiers")
json
j
=
1
;
json
j
=
1
;
json
k
(
"Hello"
);
json
k
(
"Hello"
);
CHECK_THROWS_AS
(
j
.
push_back
(
json
::
object_t
::
value_type
({
"one"
,
1
})),
std
::
domain_error
);
CHECK_THROWS_AS
(
j
.
push_back
(
json
::
object_t
::
value_type
({
"one"
,
1
})),
std
::
domain_error
);
CHECK_THROWS_NAME
(
j
.
push_back
(
json
::
object_t
::
value_type
({
"one"
,
1
})),
std
::
domain_error
,
// exception name
"cannot use push_back() with number"
);
try
{
j
.
push_back
(
k
);
}
catch
(
std
::
domain_error
&
e
)
{
CHECK
(
e
.
what
()
==
std
::
string
(
"cannot use push_back() with number"
));
}
}
}
}
}
}
}
...
@@ -7081,16 +7125,7 @@ TEST_CASE("modifiers")
...
@@ -7081,16 +7125,7 @@ TEST_CASE("modifiers")
{
{
json
j
=
1
;
json
j
=
1
;
CHECK_THROWS_AS
(
j
+=
"Hello"
,
std
::
domain_error
);
CHECK_THROWS_AS
(
j
+=
"Hello"
,
std
::
domain_error
);
CHECK_THROWS_NAME
(
j
+=
"Hello"
,
std
::
domain_error
,
"cannot use push_back() with number"
);
// exception name
try
{
j
+=
"Hello"
;
}
catch
(
std
::
domain_error
&
e
)
{
CHECK
(
e
.
what
()
==
std
::
string
(
"cannot use push_back() with number"
));
}
}
}
}
}
...
@@ -7120,16 +7155,7 @@ TEST_CASE("modifiers")
...
@@ -7120,16 +7155,7 @@ TEST_CASE("modifiers")
json
j
=
1
;
json
j
=
1
;
json
k
(
"Hello"
);
json
k
(
"Hello"
);
CHECK_THROWS_AS
(
j
+=
k
,
std
::
domain_error
);
CHECK_THROWS_AS
(
j
+=
k
,
std
::
domain_error
);
CHECK_THROWS_NAME
(
j
+=
k
,
std
::
domain_error
,
"cannot use push_back() with number"
);
// exception name
try
{
j
+=
k
;
}
catch
(
std
::
domain_error
&
e
)
{
CHECK
(
e
.
what
()
==
std
::
string
(
"cannot use push_back() with number"
));
}
}
}
}
}
}
}
...
@@ -7162,17 +7188,8 @@ TEST_CASE("modifiers")
...
@@ -7162,17 +7188,8 @@ TEST_CASE("modifiers")
json
j
=
1
;
json
j
=
1
;
json
k
(
"Hello"
);
json
k
(
"Hello"
);
CHECK_THROWS_AS
(
j
+=
json
::
object_t
::
value_type
({
"one"
,
1
}),
std
::
domain_error
);
CHECK_THROWS_AS
(
j
+=
json
::
object_t
::
value_type
({
"one"
,
1
}),
std
::
domain_error
);
CHECK_THROWS_NAME
(
j
+=
json
::
object_t
::
value_type
({
"one"
,
1
}),
std
::
domain_error
,
"cannot use push_back() with number"
);
// exception name
try
{
j
+=
json
::
object_t
::
value_type
({
"one"
,
1
});
}
catch
(
std
::
domain_error
&
e
)
{
CHECK
(
e
.
what
()
==
std
::
string
(
"cannot use push_back() with number"
));
}
}
}
}
}
}
}
...
@@ -7310,24 +7327,10 @@ TEST_CASE("modifiers")
...
@@ -7310,24 +7327,10 @@ TEST_CASE("modifiers")
CHECK_THROWS_AS
(
j_array
.
insert
(
j_array
.
end
(),
j_other_array
.
begin
(),
j_other_array2
.
end
()),
CHECK_THROWS_AS
(
j_array
.
insert
(
j_array
.
end
(),
j_other_array
.
begin
(),
j_other_array2
.
end
()),
std
::
domain_error
);
std
::
domain_error
);
// exception names
CHECK_THROWS_NAME
(
j_array
.
insert
(
j_array
.
end
(),
j_array
.
begin
(),
j_array
.
end
()),
std
::
domain_error
,
try
"passed iterators may not belong to container"
);
{
CHECK_THROWS_NAME
(
j_array
.
insert
(
j_array
.
end
(),
j_other_array
.
begin
(),
j_other_array2
.
end
()),
j_array
.
insert
(
j_array
.
end
(),
j_array
.
begin
(),
j_array
.
end
());
std
::
domain_error
,
"iterators do not fit"
);
}
catch
(
std
::
domain_error
&
e
)
{
CHECK
(
e
.
what
()
==
std
::
string
(
"passed iterators may not belong to container"
));
}
try
{
j_array
.
insert
(
j_array
.
end
(),
j_other_array
.
begin
(),
j_other_array2
.
end
());
}
catch
(
std
::
domain_error
&
e
)
{
CHECK
(
e
.
what
()
==
std
::
string
(
"iterators do not fit"
));
}
}
}
}
}
...
@@ -7372,6 +7375,17 @@ TEST_CASE("modifiers")
...
@@ -7372,6 +7375,17 @@ TEST_CASE("modifiers")
CHECK_THROWS_AS
(
j_array
.
insert
(
j_another_array
.
end
(),
j_yet_another_array
.
begin
(),
CHECK_THROWS_AS
(
j_array
.
insert
(
j_another_array
.
end
(),
j_yet_another_array
.
begin
(),
j_yet_another_array
.
end
()),
std
::
domain_error
);
j_yet_another_array
.
end
()),
std
::
domain_error
);
CHECK_THROWS_AS
(
j_array
.
insert
(
j_another_array
.
end
(),
{
1
,
2
,
3
,
4
}),
std
::
domain_error
);
CHECK_THROWS_AS
(
j_array
.
insert
(
j_another_array
.
end
(),
{
1
,
2
,
3
,
4
}),
std
::
domain_error
);
CHECK_THROWS_NAME
(
j_array
.
insert
(
j_another_array
.
end
(),
10
),
std
::
domain_error
,
"iterator does not fit current value"
);
CHECK_THROWS_NAME
(
j_array
.
insert
(
j_another_array
.
end
(),
j_value
),
std
::
domain_error
,
"iterator does not fit current value"
);
CHECK_THROWS_NAME
(
j_array
.
insert
(
j_another_array
.
end
(),
10
,
11
),
std
::
domain_error
,
"iterator does not fit current value"
);
CHECK_THROWS_NAME
(
j_array
.
insert
(
j_another_array
.
end
(),
j_yet_another_array
.
begin
(),
j_yet_another_array
.
end
()),
std
::
domain_error
,
"iterator does not fit current value"
);
CHECK_THROWS_NAME
(
j_array
.
insert
(
j_another_array
.
end
(),
{
1
,
2
,
3
,
4
}),
std
::
domain_error
,
"iterator does not fit current value"
);
}
}
SECTION
(
"non-array type"
)
SECTION
(
"non-array type"
)
...
@@ -7385,6 +7399,17 @@ TEST_CASE("modifiers")
...
@@ -7385,6 +7399,17 @@ TEST_CASE("modifiers")
CHECK_THROWS_AS
(
j_nonarray
.
insert
(
j_nonarray
.
end
(),
j_yet_another_array
.
begin
(),
CHECK_THROWS_AS
(
j_nonarray
.
insert
(
j_nonarray
.
end
(),
j_yet_another_array
.
begin
(),
j_yet_another_array
.
end
()),
std
::
domain_error
);
j_yet_another_array
.
end
()),
std
::
domain_error
);
CHECK_THROWS_AS
(
j_nonarray
.
insert
(
j_nonarray
.
end
(),
{
1
,
2
,
3
,
4
}),
std
::
domain_error
);
CHECK_THROWS_AS
(
j_nonarray
.
insert
(
j_nonarray
.
end
(),
{
1
,
2
,
3
,
4
}),
std
::
domain_error
);
CHECK_THROWS_NAME
(
j_nonarray
.
insert
(
j_nonarray
.
end
(),
10
),
std
::
domain_error
,
"cannot use insert() with number"
);
CHECK_THROWS_NAME
(
j_nonarray
.
insert
(
j_nonarray
.
end
(),
j_value
),
std
::
domain_error
,
"cannot use insert() with number"
);
CHECK_THROWS_NAME
(
j_nonarray
.
insert
(
j_nonarray
.
end
(),
10
,
11
),
std
::
domain_error
,
"cannot use insert() with number"
);
CHECK_THROWS_NAME
(
j_nonarray
.
insert
(
j_nonarray
.
end
(),
j_yet_another_array
.
begin
(),
j_yet_another_array
.
end
()),
std
::
domain_error
,
"cannot use insert() with number"
);
CHECK_THROWS_NAME
(
j_nonarray
.
insert
(
j_nonarray
.
end
(),
{
1
,
2
,
3
,
4
}),
std
::
domain_error
,
"cannot use insert() with number"
);
}
}
}
}
...
@@ -7437,6 +7462,7 @@ TEST_CASE("modifiers")
...
@@ -7437,6 +7462,7 @@ TEST_CASE("modifiers")
json
::
array_t
a
=
{
"foo"
,
"bar"
,
"baz"
};
json
::
array_t
a
=
{
"foo"
,
"bar"
,
"baz"
};
CHECK_THROWS_AS
(
j
.
swap
(
a
),
std
::
domain_error
);
CHECK_THROWS_AS
(
j
.
swap
(
a
),
std
::
domain_error
);
CHECK_THROWS_NAME
(
j
.
swap
(
a
),
std
::
domain_error
,
"cannot use swap() with number"
);
}
}
}
}
...
@@ -7462,6 +7488,7 @@ TEST_CASE("modifiers")
...
@@ -7462,6 +7488,7 @@ TEST_CASE("modifiers")
json
::
object_t
o
=
{{
"cow"
,
"Kuh"
},
{
"chicken"
,
"Huhn"
}};
json
::
object_t
o
=
{{
"cow"
,
"Kuh"
},
{
"chicken"
,
"Huhn"
}};
CHECK_THROWS_AS
(
j
.
swap
(
o
),
std
::
domain_error
);
CHECK_THROWS_AS
(
j
.
swap
(
o
),
std
::
domain_error
);
CHECK_THROWS_NAME
(
j
.
swap
(
o
),
std
::
domain_error
,
"cannot use swap() with number"
);
}
}
}
}
...
@@ -7487,6 +7514,7 @@ TEST_CASE("modifiers")
...
@@ -7487,6 +7514,7 @@ TEST_CASE("modifiers")
json
::
string_t
s
=
"Hallo Welt"
;
json
::
string_t
s
=
"Hallo Welt"
;
CHECK_THROWS_AS
(
j
.
swap
(
s
),
std
::
domain_error
);
CHECK_THROWS_AS
(
j
.
swap
(
s
),
std
::
domain_error
);
CHECK_THROWS_NAME
(
j
.
swap
(
s
),
std
::
domain_error
,
"cannot use swap() with number"
);
}
}
}
}
}
}
...
@@ -7871,6 +7899,7 @@ TEST_CASE("iterator class")
...
@@ -7871,6 +7899,7 @@ TEST_CASE("iterator class")
json
j
(
json
::
value_t
::
null
);
json
j
(
json
::
value_t
::
null
);
json
::
iterator
it
=
j
.
begin
();
json
::
iterator
it
=
j
.
begin
();
CHECK_THROWS_AS
(
*
it
,
std
::
out_of_range
);
CHECK_THROWS_AS
(
*
it
,
std
::
out_of_range
);
CHECK_THROWS_NAME
(
*
it
,
std
::
out_of_range
,
"cannot get value"
);
}
}
SECTION
(
"number"
)
SECTION
(
"number"
)
...
@@ -7880,6 +7909,7 @@ TEST_CASE("iterator class")
...
@@ -7880,6 +7909,7 @@ TEST_CASE("iterator class")
CHECK
(
*
it
==
json
(
17
));
CHECK
(
*
it
==
json
(
17
));
it
=
j
.
end
();
it
=
j
.
end
();
CHECK_THROWS_AS
(
*
it
,
std
::
out_of_range
);
CHECK_THROWS_AS
(
*
it
,
std
::
out_of_range
);
CHECK_THROWS_NAME
(
*
it
,
std
::
out_of_range
,
"cannot get value"
);
}
}
SECTION
(
"object"
)
SECTION
(
"object"
)
...
@@ -7904,6 +7934,7 @@ TEST_CASE("iterator class")
...
@@ -7904,6 +7934,7 @@ TEST_CASE("iterator class")
json
j
(
json
::
value_t
::
null
);
json
j
(
json
::
value_t
::
null
);
json
::
iterator
it
=
j
.
begin
();
json
::
iterator
it
=
j
.
begin
();
CHECK_THROWS_AS
(
it
->
type_name
(),
std
::
out_of_range
);
CHECK_THROWS_AS
(
it
->
type_name
(),
std
::
out_of_range
);
CHECK_THROWS_NAME
(
it
->
type_name
(),
std
::
out_of_range
,
"cannot get value"
);
}
}
SECTION
(
"number"
)
SECTION
(
"number"
)
...
@@ -7913,6 +7944,7 @@ TEST_CASE("iterator class")
...
@@ -7913,6 +7944,7 @@ TEST_CASE("iterator class")
CHECK
(
it
->
type_name
()
==
"number"
);
CHECK
(
it
->
type_name
()
==
"number"
);
it
=
j
.
end
();
it
=
j
.
end
();
CHECK_THROWS_AS
(
it
->
type_name
(),
std
::
out_of_range
);
CHECK_THROWS_AS
(
it
->
type_name
(),
std
::
out_of_range
);
CHECK_THROWS_NAME
(
it
->
type_name
(),
std
::
out_of_range
,
"cannot get value"
);
}
}
SECTION
(
"object"
)
SECTION
(
"object"
)
...
@@ -8235,6 +8267,7 @@ TEST_CASE("const_iterator class")
...
@@ -8235,6 +8267,7 @@ TEST_CASE("const_iterator class")
json
j
(
json
::
value_t
::
null
);
json
j
(
json
::
value_t
::
null
);
json
::
const_iterator
it
=
j
.
cbegin
();
json
::
const_iterator
it
=
j
.
cbegin
();
CHECK_THROWS_AS
(
*
it
,
std
::
out_of_range
);
CHECK_THROWS_AS
(
*
it
,
std
::
out_of_range
);
CHECK_THROWS_NAME
(
*
it
,
std
::
out_of_range
,
"cannot get value"
);
}
}
SECTION
(
"number"
)
SECTION
(
"number"
)
...
@@ -8244,6 +8277,7 @@ TEST_CASE("const_iterator class")
...
@@ -8244,6 +8277,7 @@ TEST_CASE("const_iterator class")
CHECK
(
*
it
==
json
(
17
));
CHECK
(
*
it
==
json
(
17
));
it
=
j
.
cend
();
it
=
j
.
cend
();
CHECK_THROWS_AS
(
*
it
,
std
::
out_of_range
);
CHECK_THROWS_AS
(
*
it
,
std
::
out_of_range
);
CHECK_THROWS_NAME
(
*
it
,
std
::
out_of_range
,
"cannot get value"
);
}
}
SECTION
(
"object"
)
SECTION
(
"object"
)
...
@@ -8268,6 +8302,7 @@ TEST_CASE("const_iterator class")
...
@@ -8268,6 +8302,7 @@ TEST_CASE("const_iterator class")
json
j
(
json
::
value_t
::
null
);
json
j
(
json
::
value_t
::
null
);
json
::
const_iterator
it
=
j
.
cbegin
();
json
::
const_iterator
it
=
j
.
cbegin
();
CHECK_THROWS_AS
(
it
->
type_name
(),
std
::
out_of_range
);
CHECK_THROWS_AS
(
it
->
type_name
(),
std
::
out_of_range
);
CHECK_THROWS_NAME
(
it
->
type_name
(),
std
::
out_of_range
,
"cannot get value"
);
}
}
SECTION
(
"number"
)
SECTION
(
"number"
)
...
@@ -8277,6 +8312,7 @@ TEST_CASE("const_iterator class")
...
@@ -8277,6 +8312,7 @@ TEST_CASE("const_iterator class")
CHECK
(
it
->
type_name
()
==
"number"
);
CHECK
(
it
->
type_name
()
==
"number"
);
it
=
j
.
cend
();
it
=
j
.
cend
();
CHECK_THROWS_AS
(
it
->
type_name
(),
std
::
out_of_range
);
CHECK_THROWS_AS
(
it
->
type_name
(),
std
::
out_of_range
);
CHECK_THROWS_NAME
(
it
->
type_name
(),
std
::
out_of_range
,
"cannot get value"
);
}
}
SECTION
(
"object"
)
SECTION
(
"object"
)
...
@@ -8675,6 +8711,8 @@ TEST_CASE("lexer class")
...
@@ -8675,6 +8711,8 @@ TEST_CASE("lexer class")
{
{
CHECK
(
json
::
lexer
::
to_unicode
(
0x1F4A9
)
==
"💩"
);
CHECK
(
json
::
lexer
::
to_unicode
(
0x1F4A9
)
==
"💩"
);
CHECK_THROWS_AS
(
json
::
lexer
::
to_unicode
(
0x200000
),
std
::
out_of_range
);
CHECK_THROWS_AS
(
json
::
lexer
::
to_unicode
(
0x200000
),
std
::
out_of_range
);
CHECK_THROWS_NAME
(
json
::
lexer
::
to_unicode
(
0x200000
),
std
::
out_of_range
,
"code points above 0x10FFFF are invalid"
);
}
}
}
}
...
@@ -8734,11 +8772,19 @@ TEST_CASE("parser class")
...
@@ -8734,11 +8772,19 @@ TEST_CASE("parser class")
{
{
// error: tab in string
// error: tab in string
CHECK_THROWS_AS
(
json
::
parser
(
"
\"\t\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"
\"\t\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_NAME
(
json
::
parser
(
"
\"\t\"
"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '
\"
'"
);
// error: newline in string
// error: newline in string
CHECK_THROWS_AS
(
json
::
parser
(
"
\"\n\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"
\"\n\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"
\"\r\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"
\"\r\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_NAME
(
json
::
parser
(
"
\"\n\"
"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '
\"
'"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"
\"\r\"
"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '
\"
'"
);
// error: backspace in string
// error: backspace in string
CHECK_THROWS_AS
(
json
::
parser
(
"
\"\b\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"
\"\b\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_NAME
(
json
::
parser
(
"
\"\b\"
"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '
\"
'"
);
}
}
SECTION
(
"escaped"
)
SECTION
(
"escaped"
)
...
@@ -8875,6 +8921,39 @@ TEST_CASE("parser class")
...
@@ -8875,6 +8921,39 @@ TEST_CASE("parser class")
CHECK_THROWS_AS
(
json
::
parser
(
"-0e0-:"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"-0e0-:"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"-0e-:"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"-0e-:"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"-0f"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"-0f"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_NAME
(
json
::
parser
(
"01"
).
parse
(),
std
::
invalid_argument
,
"parse error - 0 is not a number"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"--1"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '-'"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"1."
).
parse
(),
std
::
invalid_argument
,
"parse error - 1 is not a number"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"1E"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected 'E' (<parse error>); expected <end of input>"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"1E-"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected 'E' (<parse error>); expected <end of input>"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"1.E1"
).
parse
(),
std
::
invalid_argument
,
"parse error - 1 is not a number"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"-1E"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected 'E' (<parse error>); expected <end of input>"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"-0E#"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected 'E' (<parse error>); expected <end of input>"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"-0E-#"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected 'E' (<parse error>); expected <end of input>"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"-0#"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '#' (<parse error>); expected <end of input>"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"-0.0:"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected ':' (:); expected <end of input>"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"-0.0Z"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected 'Z' (<parse error>); expected <end of input>"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"-0E123:"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected ':' (:); expected <end of input>"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"-0e0-:"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '-' (<parse error>); expected <end of input>"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"-0e-:"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected 'e' (<parse error>); expected <end of input>"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"-0f"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected 'f' (<parse error>); expected <end of input>"
);
}
}
}
}
}
}
...
@@ -8899,44 +8978,89 @@ TEST_CASE("parser class")
...
@@ -8899,44 +8978,89 @@ TEST_CASE("parser class")
// unexpected end of null
// unexpected end of null
CHECK_THROWS_AS
(
json
::
parser
(
"n"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"n"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"n"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"nu"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"nu"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"nul"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"nul"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_NAME
(
json
::
parser
(
"n"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected 'n'"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"nu"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected 'n'"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"nul"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected 'n'"
);
// unexpected end of true
// unexpected end of true
CHECK_THROWS_AS
(
json
::
parser
(
"t"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"t"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"t"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"tr"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"tr"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"tru"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"tru"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_NAME
(
json
::
parser
(
"t"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected 't'"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"tr"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected 't'"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"tru"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected 't'"
);
// unexpected end of false
// unexpected end of false
CHECK_THROWS_AS
(
json
::
parser
(
"f"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"f"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"fa"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"fa"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"fal"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"fal"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"fals"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"fals"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_NAME
(
json
::
parser
(
"f"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected 'f'"
);
// unexpected end of array
CHECK_THROWS_NAME
(
json
::
parser
(
"fa"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected 'f'"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"fal"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected 'f'"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"fals"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected 'f'"
);
// missing/unexpected end of array
// TODO: Better error messages - "parse error - unexpected '" just ends
CHECK_THROWS_AS
(
json
::
parser
(
"["
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"["
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"[1"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"[1"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"[1,"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"[1,"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"[1,]"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"[1,]"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"]"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"]"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_NAME
(
json
::
parser
(
"["
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '"
);
// unexpected end of object
CHECK_THROWS_NAME
(
json
::
parser
(
"[1"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"[1,"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"[1,]"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected ']'"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"]"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected ']'"
);
// missing/unexpected end of object
// TODO: Better error messages - "parse error - unexpected '" just ends
CHECK_THROWS_AS
(
json
::
parser
(
"{"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"{"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"{
\"
foo
\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"{
\"
foo
\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"{
\"
foo
\"
:"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"{
\"
foo
\"
:"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"{
\"
foo
\"
:}"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"{
\"
foo
\"
:}"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"{
\"
foo
\"
:1,}"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"{
\"
foo
\"
:1,}"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"}"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"}"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_NAME
(
json
::
parser
(
"{"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '"
);
// unexpected end of string
CHECK_THROWS_NAME
(
json
::
parser
(
"{
\"
foo
\"
"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"{
\"
foo
\"
:"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"{
\"
foo
\"
:}"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '}'"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"{
\"
foo
\"
:1,}"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '}' (}); expected string literal"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"}"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '}'"
);
// missing/unexpected end of string
CHECK_THROWS_AS
(
json
::
parser
(
"
\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"
\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"
\"\\\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"
\"\\\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"
\"\\
u
\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"
\"\\
u
\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"
\"\\
u0
\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"
\"\\
u0
\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"
\"\\
u01
\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"
\"\\
u01
\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"
\"\\
u012
\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
"
\"\\
u012
\"
"
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_NAME
(
json
::
parser
(
"
\"
"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '
\"
'"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"
\"\\\"
"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '
\"
'"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"
\"\\
u
\"
"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '
\"
'"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"
\"\\
u0
\"
"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '
\"
'"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"
\"\\
u01
\"
"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '
\"
'"
);
CHECK_THROWS_NAME
(
json
::
parser
(
"
\"\\
u012
\"
"
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '
\"
'"
);
// invalid escapes
// invalid escapes
for
(
int
c
=
1
;
c
<
128
;
++
c
)
for
(
int
c
=
1
;
c
<
128
;
++
c
)
...
@@ -8969,6 +9093,7 @@ TEST_CASE("parser class")
...
@@ -8969,6 +9093,7 @@ TEST_CASE("parser class")
default
:
default
:
{
{
CHECK_THROWS_AS
(
json
::
parser
(
s
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
s
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_NAME
(
json
::
parser
(
s
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '
\"
'"
);
break
;
break
;
}
}
}
}
...
@@ -9037,16 +9162,28 @@ TEST_CASE("parser class")
...
@@ -9037,16 +9162,28 @@ TEST_CASE("parser class")
CHECK_THROWS_AS
(
json
::
parser
(
s2
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
s2
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
s3
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
s3
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
s4
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parser
(
s4
).
parse
(),
std
::
invalid_argument
);
CHECK_THROWS_NAME
(
json
::
parser
(
s1
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '
\"
'"
);
CHECK_THROWS_NAME
(
json
::
parser
(
s2
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '
\"
'"
);
CHECK_THROWS_NAME
(
json
::
parser
(
s3
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '
\"
'"
);
CHECK_THROWS_NAME
(
json
::
parser
(
s4
).
parse
(),
std
::
invalid_argument
,
"parse error - unexpected '
\"
'"
);
}
}
}
}
}
}
// missing part of a surrogate pair
// missing part of a surrogate pair
CHECK_THROWS_AS
(
json
::
parse
(
"
\"\\
uD80C
\"
"
),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parse
(
"
\"\\
uD80C
\"
"
),
std
::
invalid_argument
);
CHECK_THROWS_NAME
(
json
::
parse
(
"
\"\\
uD80C
\"
"
),
std
::
invalid_argument
,
"missing low surrogate"
);
// invalid surrogate pair
// invalid surrogate pair
CHECK_THROWS_AS
(
json
::
parse
(
"
\"\\
uD80C
\\
uD80C
\"
"
),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parse
(
"
\"\\
uD80C
\\
uD80C
\"
"
),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parse
(
"
\"\\
uD80C
\\
u0000
\"
"
),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parse
(
"
\"\\
uD80C
\\
u0000
\"
"
),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parse
(
"
\"\\
uD80C
\\
uFFFF
\"
"
),
std
::
invalid_argument
);
CHECK_THROWS_AS
(
json
::
parse
(
"
\"\\
uD80C
\\
uFFFF
\"
"
),
std
::
invalid_argument
);
CHECK_THROWS_NAME
(
json
::
parse
(
"
\"\\
uD80C
\\
uD80C
\"
"
),
std
::
invalid_argument
,
"missing or wrong low surrogate"
);
CHECK_THROWS_NAME
(
json
::
parse
(
"
\"\\
uD80C
\\
u0000
\"
"
),
std
::
invalid_argument
,
"missing or wrong low surrogate"
);
CHECK_THROWS_NAME
(
json
::
parse
(
"
\"\\
uD80C
\\
uFFFF
\"
"
),
std
::
invalid_argument
,
"missing or wrong low surrogate"
);
}
}
SECTION
(
"callback function"
)
SECTION
(
"callback function"
)
...
@@ -9639,6 +9776,8 @@ TEST_CASE("algorithms")
...
@@ -9639,6 +9776,8 @@ TEST_CASE("algorithms")
{
{
json
j
({{
"one"
,
1
},
{
"two"
,
2
}});
json
j
({{
"one"
,
1
},
{
"two"
,
2
}});
CHECK_THROWS_AS
(
std
::
sort
(
j
.
begin
(),
j
.
end
()),
std
::
domain_error
);
CHECK_THROWS_AS
(
std
::
sort
(
j
.
begin
(),
j
.
end
()),
std
::
domain_error
);
CHECK_THROWS_NAME
(
std
::
sort
(
j
.
begin
(),
j
.
end
()),
std
::
domain_error
,
"cannot use offsets with object iterators"
);
}
}
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment