Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
J
json
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Libraries
json
Commits
28644bad
Commit
28644bad
authored
Jul 01, 2016
by
Niels
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
removed std::out output from test cases
parent
6e1347e6
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
192 additions
and
183 deletions
+192
-183
test/src/unit.cpp
test/src/unit.cpp
+192
-183
No files found.
test/src/unit.cpp
View file @
28644bad
...
...
@@ -10309,252 +10309,261 @@ TEST_CASE("parser class")
TEST_CASE
(
"README"
,
"[hide]"
)
{
{
// create an empty structure (null)
json
j
;
// redirect std::cout for the README file
auto
old_cout_buffer
=
std
::
cout
.
rdbuf
();
std
::
ostringstream
new_stream
;
std
::
cout
.
rdbuf
(
new_stream
.
rdbuf
());
{
// create an empty structure (null)
json
j
;
// add a number that is stored as double (note the implicit conversion of j to an object)
j
[
"pi"
]
=
3.141
;
// add a number that is stored as double (note the implicit conversion of j to an object)
j
[
"pi"
]
=
3.141
;
// add a Boolean that is stored as bool
j
[
"happy"
]
=
true
;
// add a Boolean that is stored as bool
j
[
"happy"
]
=
true
;
// add a string that is stored as std::string
j
[
"name"
]
=
"Niels"
;
// add a string that is stored as std::string
j
[
"name"
]
=
"Niels"
;
// add another null object by passing nullptr
j
[
"nothing"
]
=
nullptr
;
// add another null object by passing nullptr
j
[
"nothing"
]
=
nullptr
;
// add an object inside the object
j
[
"answer"
][
"everything"
]
=
42
;
// add an object inside the object
j
[
"answer"
][
"everything"
]
=
42
;
// add an array that is stored as std::vector (using an initializer list)
j
[
"list"
]
=
{
1
,
0
,
2
};
// add an array that is stored as std::vector (using an initializer list)
j
[
"list"
]
=
{
1
,
0
,
2
};
// add another object (using an initializer list of pairs)
j
[
"object"
]
=
{
{
"currency"
,
"USD"
},
{
"value"
,
42.99
}
};
// add another object (using an initializer list of pairs)
j
[
"object"
]
=
{
{
"currency"
,
"USD"
},
{
"value"
,
42.99
}
};
// instead, you could also write (which looks very similar to the JSON above)
json
j2
=
{
{
"pi"
,
3.141
},
{
"happy"
,
true
},
{
"name"
,
"Niels"
},
{
"nothing"
,
nullptr
},
// instead, you could also write (which looks very similar to the JSON above)
json
j2
=
{
"answer"
,
{
{
"everything"
,
42
}
}
},
{
"list"
,
{
1
,
0
,
2
}},
{
"object"
,
{
{
"currency"
,
"USD"
},
{
"value"
,
42.99
}
{
"pi"
,
3.141
},
{
"happy"
,
true
},
{
"name"
,
"Niels"
},
{
"nothing"
,
nullptr
},
{
"answer"
,
{
{
"everything"
,
42
}
}
},
{
"list"
,
{
1
,
0
,
2
}},
{
"object"
,
{
{
"currency"
,
"USD"
},
{
"value"
,
42.99
}
}
}
}
};
}
};
}
{
// ways to express the empty array []
json
empty_array_implicit
=
{{}};
json
empty_array_explicit
=
json
::
array
();
{
// ways to express the empty array []
json
empty_array_implicit
=
{{}};
json
empty_array_explicit
=
json
::
array
();
// a way to express the empty object {}
json
empty_object_explicit
=
json
::
object
();
// a way to express the empty object {}
json
empty_object_explicit
=
json
::
object
();
// a way to express an _array_ of key/value pairs [["currency", "USD"], ["value", 42.99]]
json
array_not_object
=
{
json
::
array
({
"currency"
,
"USD"
}),
json
::
array
({
"value"
,
42.99
})
};
}
// a way to express an _array_ of key/value pairs [["currency", "USD"], ["value", 42.99]]
json
array_not_object
=
{
json
::
array
({
"currency"
,
"USD"
}),
json
::
array
({
"value"
,
42.99
})
};
}
{
// create object from string literal
json
j
=
"{
\"
happy
\"
: true,
\"
pi
\"
: 3.141 }"
_json
;
{
// create object from string literal
json
j
=
"{
\"
happy
\"
: true,
\"
pi
\"
: 3.141 }"
_json
;
// or even nicer with a raw string literal
auto
j2
=
R"(
// or even nicer with a raw string literal
auto
j2
=
R"(
{
"happy": true,
"pi": 3.141
}
)"
_json
;
// or explicitly
auto
j3
=
json
::
parse
(
"{
\"
happy
\"
: true,
\"
pi
\"
: 3.141 }"
);
// explicit conversion to string
std
::
string
s
=
j
.
dump
();
// {\"happy\":true,\"pi\":3.141}
// serialization with pretty printing
// pass in the amount of spaces to indent
std
::
cout
<<
j
.
dump
(
4
)
<<
std
::
endl
;
// {
// "happy": true,
// "pi": 3.141
// }
// or explicitly
auto
j3
=
json
::
parse
(
"{
\"
happy
\"
: true,
\"
pi
\"
: 3.141 }"
);
std
::
cout
<<
std
::
setw
(
2
)
<<
j
<<
std
::
endl
;
}
// explicit conversion to string
std
::
string
s
=
j
.
dump
();
// {\"happy\":true,\"pi\":3.141
}
{
// create an array using push_back
json
j
;
j
.
push_back
(
"foo"
);
j
.
push_back
(
1
);
j
.
push_back
(
true
);
// serialization with pretty printing
// pass in the amount of spaces to indent
std
::
cout
<<
j
.
dump
(
4
)
<<
std
::
endl
;
// {
// "happy": true,
// "pi": 3.141
// }
// iterate the array
for
(
json
::
iterator
it
=
j
.
begin
();
it
!=
j
.
end
();
++
it
)
{
std
::
cout
<<
*
it
<<
'\n'
;
std
::
cout
<<
std
::
setw
(
2
)
<<
j
<<
std
::
endl
;
}
// range-based for
for
(
auto
element
:
j
)
{
std
::
cout
<<
element
<<
'\n'
;
}
// create an array using push_back
json
j
;
j
.
push_back
(
"foo"
);
j
.
push_back
(
1
);
j
.
push_back
(
true
);
// getter/setter
const
std
::
string
tmp
=
j
[
0
];
j
[
1
]
=
42
;
bool
foo
=
j
.
at
(
2
);
// iterate the array
for
(
json
::
iterator
it
=
j
.
begin
();
it
!=
j
.
end
();
++
it
)
{
std
::
cout
<<
*
it
<<
'\n'
;
}
// other stuff
j
.
size
();
// 3 entries
j
.
empty
();
// false
j
.
type
();
// json::value_t::array
j
.
clear
();
// the array is empty again
// range-based for
for
(
auto
element
:
j
)
{
std
::
cout
<<
element
<<
'\n'
;
}
// comparison
j
==
"[
\"
foo
\"
, 1, true]"
_json
;
// true
// getter/setter
const
std
::
string
tmp
=
j
[
0
];
j
[
1
]
=
42
;
bool
foo
=
j
.
at
(
2
);
// create an object
json
o
;
o
[
"foo"
]
=
23
;
o
[
"bar"
]
=
false
;
o
[
"baz"
]
=
3.141
;
// other stuff
j
.
size
();
// 3 entries
j
.
empty
();
// false
j
.
type
();
// json::value_t::array
j
.
clear
();
// the array is empty again
// find an entry
if
(
o
.
find
(
"foo"
)
!=
o
.
end
())
{
// there is an entry with key "foo"
// comparison
j
==
"[
\"
foo
\"
, 1, true]"
_json
;
// true
// create an object
json
o
;
o
[
"foo"
]
=
23
;
o
[
"bar"
]
=
false
;
o
[
"baz"
]
=
3.141
;
// find an entry
if
(
o
.
find
(
"foo"
)
!=
o
.
end
())
{
// there is an entry with key "foo"
}
}
}
{
std
::
vector
<
int
>
c_vector
{
1
,
2
,
3
,
4
};
json
j_vec
(
c_vector
);
// [1, 2, 3, 4]
{
std
::
vector
<
int
>
c_vector
{
1
,
2
,
3
,
4
};
json
j_vec
(
c_vector
);
// [1, 2, 3, 4]
std
::
deque
<
float
>
c_deque
{
1.2
f
,
2.3
f
,
3.4
f
,
5.6
f
};
json
j_deque
(
c_deque
);
// [1.2, 2.3, 3.4, 5.6]
std
::
deque
<
float
>
c_deque
{
1.2
f
,
2.3
f
,
3.4
f
,
5.6
f
};
json
j_deque
(
c_deque
);
// [1.2, 2.3, 3.4, 5.6]
std
::
list
<
bool
>
c_list
{
true
,
true
,
false
,
true
};
json
j_list
(
c_list
);
// [true, true, false, true]
std
::
list
<
bool
>
c_list
{
true
,
true
,
false
,
true
};
json
j_list
(
c_list
);
// [true, true, false, true]
std
::
forward_list
<
int64_t
>
c_flist
{
12345678909876
,
23456789098765
,
34567890987654
,
45678909876543
};
json
j_flist
(
c_flist
);
// [12345678909876, 23456789098765, 34567890987654, 45678909876543]
std
::
forward_list
<
int64_t
>
c_flist
{
12345678909876
,
23456789098765
,
34567890987654
,
45678909876543
};
json
j_flist
(
c_flist
);
// [12345678909876, 23456789098765, 34567890987654, 45678909876543]
std
::
array
<
unsigned
long
,
4
>
c_array
{{
1
,
2
,
3
,
4
}};
json
j_array
(
c_array
);
// [1, 2, 3, 4]
std
::
array
<
unsigned
long
,
4
>
c_array
{{
1
,
2
,
3
,
4
}};
json
j_array
(
c_array
);
// [1, 2, 3, 4]
std
::
set
<
std
::
string
>
c_set
{
"one"
,
"two"
,
"three"
,
"four"
,
"one"
};
json
j_set
(
c_set
);
// only one entry for "one" is used
// ["four", "one", "three", "two"]
std
::
set
<
std
::
string
>
c_set
{
"one"
,
"two"
,
"three"
,
"four"
,
"one"
};
json
j_set
(
c_set
);
// only one entry for "one" is used
// ["four", "one", "three", "two"]
std
::
unordered_set
<
std
::
string
>
c_uset
{
"one"
,
"two"
,
"three"
,
"four"
,
"one"
};
json
j_uset
(
c_uset
);
// only one entry for "one" is used
// maybe ["two", "three", "four", "one"]
std
::
unordered_set
<
std
::
string
>
c_uset
{
"one"
,
"two"
,
"three"
,
"four"
,
"one"
};
json
j_uset
(
c_uset
);
// only one entry for "one" is used
// maybe ["two", "three", "four", "one"]
std
::
multiset
<
std
::
string
>
c_mset
{
"one"
,
"two"
,
"one"
,
"four"
};
json
j_mset
(
c_mset
);
// only one entry for "one" is used
// maybe ["one", "two", "four"]
std
::
multiset
<
std
::
string
>
c_mset
{
"one"
,
"two"
,
"one"
,
"four"
};
json
j_mset
(
c_mset
);
// only one entry for "one" is used
// maybe ["one", "two", "four"]
std
::
unordered_multiset
<
std
::
string
>
c_umset
{
"one"
,
"two"
,
"one"
,
"four"
};
json
j_umset
(
c_umset
);
// both entries for "one" are used
// maybe ["one", "two", "one", "four"]
}
std
::
unordered_multiset
<
std
::
string
>
c_umset
{
"one"
,
"two"
,
"one"
,
"four"
};
json
j_umset
(
c_umset
);
// both entries for "one" are used
// maybe ["one", "two", "one", "four"]
}
{
std
::
map
<
std
::
string
,
int
>
c_map
{
{
"one"
,
1
},
{
"two"
,
2
},
{
"three"
,
3
}
};
json
j_map
(
c_map
);
// {"one": 1, "two": 2, "three": 3}
{
std
::
map
<
std
::
string
,
int
>
c_map
{
{
"one"
,
1
},
{
"two"
,
2
},
{
"three"
,
3
}
};
json
j_map
(
c_map
);
// {"one": 1, "two": 2, "three": 3}
std
::
unordered_map
<
const
char
*
,
float
>
c_umap
{
{
"one"
,
1.2
f
},
{
"two"
,
2.3
f
},
{
"three"
,
3.4
f
}
};
json
j_umap
(
c_umap
);
// {"one": 1.2, "two": 2.3, "three": 3.4}
std
::
unordered_map
<
const
char
*
,
float
>
c_umap
{
{
"one"
,
1.2
f
},
{
"two"
,
2.3
f
},
{
"three"
,
3.4
f
}
};
json
j_umap
(
c_umap
);
// {"one": 1.2, "two": 2.3, "three": 3.4}
std
::
multimap
<
std
::
string
,
bool
>
c_mmap
{
{
"one"
,
true
},
{
"two"
,
true
},
{
"three"
,
false
},
{
"three"
,
true
}
};
json
j_mmap
(
c_mmap
);
// only one entry for key "three" is used
// maybe {"one": true, "two": true, "three": true}
std
::
multimap
<
std
::
string
,
bool
>
c_mmap
{
{
"one"
,
true
},
{
"two"
,
true
},
{
"three"
,
false
},
{
"three"
,
true
}
};
json
j_mmap
(
c_mmap
);
// only one entry for key "three" is used
// maybe {"one": true, "two": true, "three": true}
std
::
unordered_multimap
<
std
::
string
,
bool
>
c_ummap
{
{
"one"
,
true
},
{
"two"
,
true
},
{
"three"
,
false
},
{
"three"
,
true
}
};
json
j_ummap
(
c_ummap
);
// only one entry for key "three" is used
// maybe {"one": true, "two": true, "three": true}
}
std
::
unordered_multimap
<
std
::
string
,
bool
>
c_ummap
{
{
"one"
,
true
},
{
"two"
,
true
},
{
"three"
,
false
},
{
"three"
,
true
}
};
json
j_ummap
(
c_ummap
);
// only one entry for key "three" is used
// maybe {"one": true, "two": true, "three": true}
}
{
// strings
std
::
string
s1
=
"Hello, world!"
;
json
js
=
s1
;
std
::
string
s2
=
js
;
{
// strings
std
::
string
s1
=
"Hello, world!"
;
json
js
=
s1
;
std
::
string
s2
=
js
;
// Booleans
bool
b1
=
true
;
json
jb
=
b1
;
bool
b2
=
jb
;
// Booleans
bool
b1
=
true
;
json
jb
=
b1
;
bool
b2
=
jb
;
// numbers
int
i
=
42
;
json
jn
=
i
;
double
f
=
jn
;
// numbers
int
i
=
42
;
json
jn
=
i
;
double
f
=
jn
;
// etc.
// etc.
std
::
string
vs
=
js
.
get
<
std
::
string
>
();
bool
vb
=
jb
.
get
<
bool
>
();
int
vi
=
jn
.
get
<
int
>
();
std
::
string
vs
=
js
.
get
<
std
::
string
>
();
bool
vb
=
jb
.
get
<
bool
>
();
int
vi
=
jn
.
get
<
int
>
();
// etc.
}
// etc.
}
{
// a JSON value
json
j_original
=
R"({
{
// a JSON value
json
j_original
=
R"({
"baz": ["one", "two", "three"],
"foo": "bar"
})"
_json
;
// access members with a JSON pointer (RFC 6901)
j_original
[
"/baz/1"
_json_pointer
];
// "two"
// access members with a JSON pointer (RFC 6901)
j_original
[
"/baz/1"
_json_pointer
];
// "two"
// a JSON patch (RFC 6902)
json
j_patch
=
R"([
// a JSON patch (RFC 6902)
json
j_patch
=
R"([
{ "op": "replace", "path": "/baz", "value": "boo" },
{ "op": "add", "path": "/hello", "value": ["world"] },
{ "op": "remove", "path": "/foo"}
])"
_json
;
// apply the patch
json
j_result
=
j_original
.
patch
(
j_patch
);
// {
// "baz": "boo",
// "hello": ["world"]
// }
// calculate a JSON patch from two JSON values
json
::
diff
(
j_result
,
j_original
);
// [
// { "op":" replace", "path": "/baz", "value": ["one", "two", "three"] },
// { "op":"remove","path":"/hello" },
// { "op":"add","path":"/foo","value":"bar" }
// ]
// apply the patch
json
j_result
=
j_original
.
patch
(
j_patch
);
// {
// "baz": "boo",
// "hello": ["world"]
// }
// calculate a JSON patch from two JSON values
json
::
diff
(
j_result
,
j_original
);
// [
// { "op":" replace", "path": "/baz", "value": ["one", "two", "three"] },
// { "op":"remove","path":"/hello" },
// { "op":"add","path":"/foo","value":"bar" }
// ]
}
// restore old std::cout
std
::
cout
.
rdbuf
(
old_cout_buffer
);
}
}
...
...
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