🔀 merge branch 'release/2.1.0'
This commit is contained in:
commit
1e99a0273f
108 changed files with 5155 additions and 2630 deletions
15
.travis.yml
15
.travis.yml
|
@ -71,6 +71,21 @@ matrix:
|
||||||
after_success:
|
after_success:
|
||||||
- make cppcheck
|
- make cppcheck
|
||||||
|
|
||||||
|
# no exceptions
|
||||||
|
|
||||||
|
- os: linux
|
||||||
|
compiler: gcc
|
||||||
|
env:
|
||||||
|
- COMPILER=g++-4.9
|
||||||
|
- SPECIAL=no_exceptions
|
||||||
|
- TEST_PATTERN=-e \"*\"
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
sources: ['ubuntu-toolchain-r-test']
|
||||||
|
packages: [g++-4.9, cppcheck]
|
||||||
|
before_script:
|
||||||
|
- CPPFLAGS="-DJSON_NOEXCEPTION" make
|
||||||
|
|
||||||
# Coveralls (http://gronlier.fr/blog/2015/01/adding-code-coverage-to-your-c-project/)
|
# Coveralls (http://gronlier.fr/blog/2015/01/adding-code-coverage-to-your-c-project/)
|
||||||
|
|
||||||
- os: linux
|
- os: linux
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
cmake_minimum_required(VERSION 3.0)
|
cmake_minimum_required(VERSION 3.0)
|
||||||
|
|
||||||
# define the project
|
# define the project
|
||||||
project(nlohmann_json VERSION 2.0.10 LANGUAGES CXX)
|
project(nlohmann_json VERSION 2.1.0 LANGUAGES CXX)
|
||||||
|
|
||||||
enable_testing()
|
enable_testing()
|
||||||
|
|
||||||
|
|
37
ChangeLog.md
37
ChangeLog.md
|
@ -1,6 +1,43 @@
|
||||||
# Change Log
|
# Change Log
|
||||||
All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/).
|
All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
|
## [v2.1.0](https://github.com/nlohmann/json/releases/tag/v2.1.0) (2017-01-28)
|
||||||
|
[Full Changelog](https://github.com/nlohmann/json/compare/v2.0.10...v2.1.0)
|
||||||
|
|
||||||
|
- Parsing multiple JSON objects from a string or stream [\#438](https://github.com/nlohmann/json/issues/438)
|
||||||
|
- Use-of-uninitialized-value \(OSS-Fuzz issue 477\) [\#437](https://github.com/nlohmann/json/issues/437)
|
||||||
|
- add `reserve` function for array to reserve memory before adding json values into it [\#436](https://github.com/nlohmann/json/issues/436)
|
||||||
|
- Typo in examples page [\#434](https://github.com/nlohmann/json/issues/434)
|
||||||
|
- avoid malformed json [\#433](https://github.com/nlohmann/json/issues/433)
|
||||||
|
- How to add json objects to a map? [\#432](https://github.com/nlohmann/json/issues/432)
|
||||||
|
- create json instance from raw json \(unsigned char\*\) [\#431](https://github.com/nlohmann/json/issues/431)
|
||||||
|
- Getting std::invalid\_argument: stream error when following example [\#429](https://github.com/nlohmann/json/issues/429)
|
||||||
|
- Forward declare-only header? [\#427](https://github.com/nlohmann/json/issues/427)
|
||||||
|
- Implicit conversion from array to object [\#425](https://github.com/nlohmann/json/issues/425)
|
||||||
|
- Automatic ordered JSON [\#424](https://github.com/nlohmann/json/issues/424)
|
||||||
|
- error C4996: 'strerror' when reading file [\#422](https://github.com/nlohmann/json/issues/422)
|
||||||
|
- Get an error - JSON pointer must be empty or begin with '/' [\#421](https://github.com/nlohmann/json/issues/421)
|
||||||
|
- size parameter for parse\(\) [\#419](https://github.com/nlohmann/json/issues/419)
|
||||||
|
- json.hpp forcibly defines GCC\_VERSION [\#417](https://github.com/nlohmann/json/issues/417)
|
||||||
|
- Use-of-uninitialized-value \(OSS-Fuzz issue 377\) [\#416](https://github.com/nlohmann/json/issues/416)
|
||||||
|
- Single char converted to ASCII code instead of string [\#413](https://github.com/nlohmann/json/issues/413)
|
||||||
|
- How to know if a string was parsed as utf-8? [\#406](https://github.com/nlohmann/json/issues/406)
|
||||||
|
- Overloaded += to add objects to an array makes no sense? [\#404](https://github.com/nlohmann/json/issues/404)
|
||||||
|
- Finding a value in an array [\#399](https://github.com/nlohmann/json/issues/399)
|
||||||
|
- add release information in static function [\#397](https://github.com/nlohmann/json/issues/397)
|
||||||
|
- Optimize memory usage of json objects in combination with binary serialization [\#373](https://github.com/nlohmann/json/issues/373)
|
||||||
|
- Conversion operators not considered [\#369](https://github.com/nlohmann/json/issues/369)
|
||||||
|
- Append ".0" to serialized floating\_point values that are digits-only. [\#362](https://github.com/nlohmann/json/issues/362)
|
||||||
|
- Add a customization point for user-defined types [\#328](https://github.com/nlohmann/json/issues/328)
|
||||||
|
- Conformance report for reference [\#307](https://github.com/nlohmann/json/issues/307)
|
||||||
|
- Document the best way to serialize/deserialize user defined types to json [\#298](https://github.com/nlohmann/json/issues/298)
|
||||||
|
- Add StringView template typename to basic\_json [\#297](https://github.com/nlohmann/json/issues/297)
|
||||||
|
- \[Improvement\] Add option to remove exceptions [\#296](https://github.com/nlohmann/json/issues/296)
|
||||||
|
- Performance in miloyip/nativejson-benchmark [\#202](https://github.com/nlohmann/json/issues/202)
|
||||||
|
|
||||||
|
- conversion from/to user-defined types [\#435](https://github.com/nlohmann/json/pull/435) ([nlohmann](https://github.com/nlohmann))
|
||||||
|
- Fix documentation error [\#430](https://github.com/nlohmann/json/pull/430) ([vjon](https://github.com/vjon))
|
||||||
|
|
||||||
## [v2.0.10](https://github.com/nlohmann/json/releases/tag/v2.0.10) (2017-01-02)
|
## [v2.0.10](https://github.com/nlohmann/json/releases/tag/v2.0.10) (2017-01-02)
|
||||||
[Full Changelog](https://github.com/nlohmann/json/compare/v2.0.9...v2.0.10)
|
[Full Changelog](https://github.com/nlohmann/json/compare/v2.0.9...v2.0.10)
|
||||||
|
|
||||||
|
|
15
LICENSE.MIT
15
LICENSE.MIT
|
@ -1,14 +1,13 @@
|
||||||
JSON for Modern C++ is licensed under the MIT License
|
MIT License
|
||||||
<http://opensource.org/licenses/MIT>:
|
|
||||||
|
|
||||||
Copyright (c) 2013-2017 Niels Lohmann
|
Copyright (c) 2013-2017 Niels Lohmann
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
the Software without restriction, including without limitation the rights to
|
in the Software without restriction, including without limitation the rights
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
so, subject to the following conditions:
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
|
|
248
README.md
248
README.md
|
@ -5,7 +5,7 @@
|
||||||
[![Build status](https://doozer.io/badge/nlohmann/json/buildstatus/develop)](https://doozer.io/user/nlohmann/json)
|
[![Build status](https://doozer.io/badge/nlohmann/json/buildstatus/develop)](https://doozer.io/user/nlohmann/json)
|
||||||
[![Coverage Status](https://img.shields.io/coveralls/nlohmann/json.svg)](https://coveralls.io/r/nlohmann/json)
|
[![Coverage Status](https://img.shields.io/coveralls/nlohmann/json.svg)](https://coveralls.io/r/nlohmann/json)
|
||||||
[![Coverity Scan Build Status](https://scan.coverity.com/projects/5550/badge.svg)](https://scan.coverity.com/projects/nlohmann-json)
|
[![Coverity Scan Build Status](https://scan.coverity.com/projects/5550/badge.svg)](https://scan.coverity.com/projects/nlohmann-json)
|
||||||
[![Try online](https://img.shields.io/badge/try-online-blue.svg)](http://melpon.org/wandbox/permlink/IoZNMHqubixQx2dN)
|
[![Try online](https://img.shields.io/badge/try-online-blue.svg)](http://melpon.org/wandbox/permlink/4NEU6ZZMoM9lpIex)
|
||||||
[![Documentation](https://img.shields.io/badge/docs-doxygen-blue.svg)](http://nlohmann.github.io/json)
|
[![Documentation](https://img.shields.io/badge/docs-doxygen-blue.svg)](http://nlohmann.github.io/json)
|
||||||
[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/nlohmann/json/master/LICENSE.MIT)
|
[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/nlohmann/json/master/LICENSE.MIT)
|
||||||
[![Github Releases](https://img.shields.io/github/release/nlohmann/json.svg)](https://github.com/nlohmann/json/releases)
|
[![Github Releases](https://img.shields.io/github/release/nlohmann/json.svg)](https://github.com/nlohmann/json/releases)
|
||||||
|
@ -21,6 +21,7 @@
|
||||||
- [Conversion from STL containers](#conversion-from-stl-containers)
|
- [Conversion from STL containers](#conversion-from-stl-containers)
|
||||||
- [JSON Pointer and JSON Patch](#json-pointer-and-json-patch)
|
- [JSON Pointer and JSON Patch](#json-pointer-and-json-patch)
|
||||||
- [Implicit conversions](#implicit-conversions)
|
- [Implicit conversions](#implicit-conversions)
|
||||||
|
- [Conversions to/from arbitrary types](#arbitrary-types-conversions)
|
||||||
- [Binary formats (CBOR and MessagePack)](#binary-formats-cbor-and-messagepack)
|
- [Binary formats (CBOR and MessagePack)](#binary-formats-cbor-and-messagepack)
|
||||||
- [Supported compilers](#supported-compilers)
|
- [Supported compilers](#supported-compilers)
|
||||||
- [License](#license)
|
- [License](#license)
|
||||||
|
@ -263,6 +264,9 @@ const std::string tmp = j[0];
|
||||||
j[1] = 42;
|
j[1] = 42;
|
||||||
bool foo = j.at(2);
|
bool foo = j.at(2);
|
||||||
|
|
||||||
|
// comparison
|
||||||
|
j == "[\"foo\", 1, true]"_json; // true
|
||||||
|
|
||||||
// other stuff
|
// other stuff
|
||||||
j.size(); // 3 entries
|
j.size(); // 3 entries
|
||||||
j.empty(); // false
|
j.empty(); // false
|
||||||
|
@ -277,9 +281,6 @@ j.is_object();
|
||||||
j.is_array();
|
j.is_array();
|
||||||
j.is_string();
|
j.is_string();
|
||||||
|
|
||||||
// comparison
|
|
||||||
j == "[\"foo\", 1, true]"_json; // true
|
|
||||||
|
|
||||||
// create an object
|
// create an object
|
||||||
json o;
|
json o;
|
||||||
o["foo"] = 23;
|
o["foo"] = 23;
|
||||||
|
@ -442,6 +443,224 @@ int vi = jn.get<int>();
|
||||||
// etc.
|
// etc.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Arbitrary types conversions
|
||||||
|
|
||||||
|
Every type can be serialized in JSON, not just STL-containers and scalar types. Usually, you would do something along those lines:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
namespace ns {
|
||||||
|
// a simple struct to model a person
|
||||||
|
struct person {
|
||||||
|
std::string name;
|
||||||
|
std::string address;
|
||||||
|
int age;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
ns::person p = {"Ned Flanders", "744 Evergreen Terrace", 60};
|
||||||
|
|
||||||
|
// convert to JSON: copy each value into the JSON object
|
||||||
|
json j;
|
||||||
|
j["name"] = p.name;
|
||||||
|
j["address"] = p.address;
|
||||||
|
j["age"] = p.age;
|
||||||
|
|
||||||
|
// ...
|
||||||
|
|
||||||
|
// convert from JSON: copy each value from the JSON object
|
||||||
|
ns::person p {
|
||||||
|
j["name"].get<std::string>(),
|
||||||
|
j["address"].get<std::string>(),
|
||||||
|
j["age"].get<int>()
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
It works, but that's quite a lot of boilerplate... Fortunately, there's a better way:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
// create a person
|
||||||
|
ns::person p {"Ned Flanders", "744 Evergreen Terrace", 60};
|
||||||
|
|
||||||
|
// conversion: person -> json
|
||||||
|
json j = p;
|
||||||
|
|
||||||
|
std::cout << j << std::endl;
|
||||||
|
// {"address":"744 Evergreen Terrace","age":60,"name":"Ned Flanders"}
|
||||||
|
|
||||||
|
// conversion: json -> person
|
||||||
|
ns::person p2 = j;
|
||||||
|
|
||||||
|
// that's it
|
||||||
|
assert(p == p2);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Basic usage
|
||||||
|
|
||||||
|
To make this work with one of your types, you only need to provide two functions:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
using nlohmann::json;
|
||||||
|
|
||||||
|
namespace ns {
|
||||||
|
void to_json(json& j, const person& p) {
|
||||||
|
j = json{{"name", p.name}, {"address", p.address}, {"age", p.age}};
|
||||||
|
}
|
||||||
|
|
||||||
|
void from_json(const json& j, person& p) {
|
||||||
|
p.name = j["name"].get<std::string>();
|
||||||
|
p.address = j["address"].get<std::string>();
|
||||||
|
p.age = j["age"].get<int>();
|
||||||
|
}
|
||||||
|
} // namespace ns
|
||||||
|
```
|
||||||
|
|
||||||
|
That's all! When calling the `json` constructor with your type, your custom `to_json` method will be automatically called.
|
||||||
|
Likewise, when calling `get<your_type>()`, the `from_json` method will be called.
|
||||||
|
|
||||||
|
Some important things:
|
||||||
|
|
||||||
|
* Those methods **MUST** be in your type's namespace (which can be the global namespace), or the library will not be able to locate them (in this example, they are in namespace `ns`, where `person` is defined).
|
||||||
|
* When using `get<your_type>()`, `your_type` **MUST** be [DefaultConstructible](http://en.cppreference.com/w/cpp/concept/DefaultConstructible). (There is a way to bypass this requirement described later.)
|
||||||
|
|
||||||
|
#### How do I convert third-party types?
|
||||||
|
|
||||||
|
This requires a bit more advanced technique. But first, let's see how this conversion mechanism works:
|
||||||
|
|
||||||
|
The library uses **JSON Serializers** to convert types to json.
|
||||||
|
The default serializer for `nlohmann::json` is `nlohmann::adl_serializer` (ADL means [Argument-Dependent Lookup](http://en.cppreference.com/w/cpp/language/adl)).
|
||||||
|
|
||||||
|
It is implemented like this (simplified):
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
template <typename T>
|
||||||
|
struct adl_serializer {
|
||||||
|
static void to_json(json& j, const T& value) {
|
||||||
|
// calls the "to_json" method in T's namespace
|
||||||
|
}
|
||||||
|
|
||||||
|
static void from_json(const json& j, T& value) {
|
||||||
|
// same thing, but with the "from_json" method
|
||||||
|
}
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
This serializer works fine when you have control over the type's namespace. However, what about `boost::optional`, or `std::filesystem::path` (C++17)? Hijacking the `boost` namespace is pretty bad, and it's illegal to add something other than template specializations to `std`...
|
||||||
|
|
||||||
|
To solve this, you need to add a specialization of `adl_serializer` to the `nlohmann` namespace, here's an example:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
// partial specialization (full specialization works too)
|
||||||
|
namespace nlohmann {
|
||||||
|
template <typename T>
|
||||||
|
struct adl_serializer<boost::optional<T>> {
|
||||||
|
static void to_json(json& j, const boost::optional<T>& opt) {
|
||||||
|
if (opt == boost::none) {
|
||||||
|
j = nullptr;
|
||||||
|
} else {
|
||||||
|
j = *opt; // this will call adl_serializer<T>::to_json which will
|
||||||
|
// find the free function to_json in T's namespace!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void from_json(const json& j, boost::optional<T>& opt) {
|
||||||
|
if (!j.is_null()) {
|
||||||
|
opt = j.get<T>(); // same as above, but with
|
||||||
|
// adl_serializer<T>::from_json
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### How can I use `get()` for non-default constructible/non-copyable types?
|
||||||
|
|
||||||
|
There is a way, if your type is [MoveConstructible](http://en.cppreference.com/w/cpp/concept/MoveConstructible). You will need to specialize the `adl_serializer` as well, but with a special `from_json` overload:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
struct move_only_type {
|
||||||
|
move_only_type() = delete;
|
||||||
|
move_only_type(int ii): i(ii) {}
|
||||||
|
move_only_type(const move_only_type&) = delete;
|
||||||
|
move_only_type(move_only_type&&) = default;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace nlohmann {
|
||||||
|
template <>
|
||||||
|
struct adl_serializer<move_only_type> {
|
||||||
|
// note: the return type is no longer 'void', and the method only takes
|
||||||
|
// one argument
|
||||||
|
static move_only_type from_json(const json& j) {
|
||||||
|
return {j.get<int>()};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Here's the catch! You must provide a to_json method! Otherwise you
|
||||||
|
// will not be able to convert move_only_type to json, since you fully
|
||||||
|
// specialized adl_serializer on that type
|
||||||
|
static void to_json(json& j, move_only_type t) {
|
||||||
|
j = t.i;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Can I write my own serializer? (Advanced use)
|
||||||
|
|
||||||
|
Yes. You might want to take a look at [`unit-udt.cpp`](https://github.com/nlohmann/json/blob/develop/test/src/unit-udt.cpp) in the test suite, to see a few examples.
|
||||||
|
|
||||||
|
If you write your own serializer, you'll need to do a few things:
|
||||||
|
|
||||||
|
* use a different `basic_json` alias than `nlohmann::json` (the last template parameter of `basic_json` is the `JSONSerializer`)
|
||||||
|
* use your `basic_json` alias (or a template parameter) in all your `to_json`/`from_json` methods
|
||||||
|
* use `nlohmann::to_json` and `nlohmann::from_json` when you need ADL
|
||||||
|
|
||||||
|
Here is an example, without simplifications, that only accepts types with a size <= 32, and uses ADL.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
// You should use void as a second template argument
|
||||||
|
// if you don't need compile-time checks on T
|
||||||
|
template<typename T, typename SFINAE = typename std::enable_if<sizeof(T) <= 32>::type>
|
||||||
|
struct less_than_32_serializer {
|
||||||
|
template <typename BasicJsonType>
|
||||||
|
static void to_json(BasicJsonType& j, T value) {
|
||||||
|
// we want to use ADL, and call the correct to_json overload
|
||||||
|
using nlohmann::to_json; // this method is called by adl_serializer,
|
||||||
|
// this is where the magic happens
|
||||||
|
to_json(j, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename BasicJsonType>
|
||||||
|
static void from_json(const BasicJsonType& j, T& value) {
|
||||||
|
// same thing here
|
||||||
|
using nlohmann::from_json;
|
||||||
|
from_json(j, value);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
Be **very** careful when reimplementing your serializer, you can stack overflow if you don't pay attention:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
template <typename T, void>
|
||||||
|
struct bad_serializer
|
||||||
|
{
|
||||||
|
template <typename BasicJsonType>
|
||||||
|
static void to_json(BasicJsonType& j, const T& value) {
|
||||||
|
// this calls BasicJsonType::json_serializer<T>::to_json(j, value);
|
||||||
|
// if BasicJsonType::json_serializer == bad_serializer ... oops!
|
||||||
|
j = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename BasicJsonType>
|
||||||
|
static void to_json(const BasicJsonType& j, T& value) {
|
||||||
|
// this calls BasicJsonType::json_serializer<T>::from_json(j, value);
|
||||||
|
// if BasicJsonType::json_serializer == bad_serializer ... oops!
|
||||||
|
value = j.template get<T>(); // oops!
|
||||||
|
}
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
### Binary formats (CBOR and MessagePack)
|
### Binary formats (CBOR and MessagePack)
|
||||||
|
|
||||||
Though JSON is a ubiquitous data format, it is not a very compact format suitable for data exchange, for instance over a network. Hence, the library supports [CBOR](http://cbor.io) (Concise Binary Object Representation) and [MessagePack](http://msgpack.org) to efficiently encode JSON values to byte vectors and to decode such vectors.
|
Though JSON is a ubiquitous data format, it is not a very compact format suitable for data exchange, for instance over a network. Hence, the library supports [CBOR](http://cbor.io) (Concise Binary Object Representation) and [MessagePack](http://msgpack.org) to efficiently encode JSON values to byte vectors and to decode such vectors.
|
||||||
|
@ -521,7 +740,7 @@ The following compilers are currently used in continuous integration at [Travis]
|
||||||
|
|
||||||
The class is licensed under the [MIT License](http://opensource.org/licenses/MIT):
|
The class is licensed under the [MIT License](http://opensource.org/licenses/MIT):
|
||||||
|
|
||||||
Copyright © 2013-2016 [Niels Lohmann](http://nlohmann.me)
|
Copyright © 2013-2017 [Niels Lohmann](http://nlohmann.me)
|
||||||
|
|
||||||
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:
|
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:
|
||||||
|
|
||||||
|
@ -546,7 +765,7 @@ I deeply appreciate the help of the following people.
|
||||||
- [Eric Cornelius](https://github.com/EricMCornelius) pointed out a bug in the handling with NaN and infinity values. He also improved the performance of the string escaping.
|
- [Eric Cornelius](https://github.com/EricMCornelius) pointed out a bug in the handling with NaN and infinity values. He also improved the performance of the string escaping.
|
||||||
- [易思龙](https://github.com/likebeta) implemented a conversion from anonymous enums.
|
- [易思龙](https://github.com/likebeta) implemented a conversion from anonymous enums.
|
||||||
- [kepkin](https://github.com/kepkin) patiently pushed forward the support for Microsoft Visual studio.
|
- [kepkin](https://github.com/kepkin) patiently pushed forward the support for Microsoft Visual studio.
|
||||||
- [gregmarr](https://github.com/gregmarr) simplified the implementation of reverse iterators and helped with numerous hints and improvements.
|
- [gregmarr](https://github.com/gregmarr) simplified the implementation of reverse iterators and helped with numerous hints and improvements. In particular, he pushed forward the implementation of user-defined types.
|
||||||
- [Caio Luppi](https://github.com/caiovlp) fixed a bug in the Unicode handling.
|
- [Caio Luppi](https://github.com/caiovlp) fixed a bug in the Unicode handling.
|
||||||
- [dariomt](https://github.com/dariomt) fixed some typos in the examples.
|
- [dariomt](https://github.com/dariomt) fixed some typos in the examples.
|
||||||
- [Daniel Frey](https://github.com/d-frey) cleaned up some pointers and implemented exception-safe memory allocation.
|
- [Daniel Frey](https://github.com/d-frey) cleaned up some pointers and implemented exception-safe memory allocation.
|
||||||
|
@ -574,7 +793,7 @@ I deeply appreciate the help of the following people.
|
||||||
- [duncanwerner](https://github.com/duncanwerner) found a really embarrassing performance regression in the 2.0.0 release.
|
- [duncanwerner](https://github.com/duncanwerner) found a really embarrassing performance regression in the 2.0.0 release.
|
||||||
- [Damien](https://github.com/dtoma) fixed one of the last conversion warnings.
|
- [Damien](https://github.com/dtoma) fixed one of the last conversion warnings.
|
||||||
- [Thomas Braun](https://github.com/t-b) fixed a warning in a test case.
|
- [Thomas Braun](https://github.com/t-b) fixed a warning in a test case.
|
||||||
- [Théo DELRIEU](https://github.com/theodelrieu) patiently and constructively oversaw the long way toward [iterator-range parsing](https://github.com/nlohmann/json/issues/290).
|
- [Théo DELRIEU](https://github.com/theodelrieu) patiently and constructively oversaw the long way toward [iterator-range parsing](https://github.com/nlohmann/json/issues/290). He also implemented the magic behind the serialization/deserialization of user-defined types.
|
||||||
- [Stefan](https://github.com/5tefan) fixed a minor issue in the documentation.
|
- [Stefan](https://github.com/5tefan) fixed a minor issue in the documentation.
|
||||||
- [Vasil Dimov](https://github.com/vasild) fixed the documentation regarding conversions from `std::multiset`.
|
- [Vasil Dimov](https://github.com/vasild) fixed the documentation regarding conversions from `std::multiset`.
|
||||||
- [ChristophJud](https://github.com/ChristophJud) overworked the CMake files to ease project inclusion.
|
- [ChristophJud](https://github.com/ChristophJud) overworked the CMake files to ease project inclusion.
|
||||||
|
@ -587,8 +806,13 @@ I deeply appreciate the help of the following people.
|
||||||
- [Yixin Zhang](https://github.com/qwename) fixed an integer overflow check.
|
- [Yixin Zhang](https://github.com/qwename) fixed an integer overflow check.
|
||||||
- [Bosswestfalen](https://github.com/Bosswestfalen) merged two iterator classes into a smaller one.
|
- [Bosswestfalen](https://github.com/Bosswestfalen) merged two iterator classes into a smaller one.
|
||||||
- [Daniel599](https://github.com/Daniel599) helped to get Travis execute the tests with Clang's sanitizers.
|
- [Daniel599](https://github.com/Daniel599) helped to get Travis execute the tests with Clang's sanitizers.
|
||||||
|
- [Jonathan Lee](https://github.com/vjon) fixed an example in the README file.
|
||||||
|
- [gnzlbg](https://github.com/gnzlbg) supported the implementation of user-defined types.
|
||||||
|
- [Alexej Harm](https://github.com/qis) helped to get the user-defined types working with Visual Studio.
|
||||||
|
- [Jared Grubb](https://github.com/jaredgrubb) supported the implementation of user-defined types.
|
||||||
|
- [EnricoBilla](https://github.com/EnricoBilla) noted a typo in an example.
|
||||||
|
|
||||||
Thanks a lot for helping out!
|
Thanks a lot for helping out! Please [let me know](mailto:mail@nlohmann.me) if I forgot someone.
|
||||||
|
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
@ -600,6 +824,9 @@ Thanks a lot for helping out!
|
||||||
- Other encodings such as Latin-1, UTF-16, or UTF-32 are not supported and will yield parse errors.
|
- Other encodings such as Latin-1, UTF-16, or UTF-32 are not supported and will yield parse errors.
|
||||||
- [Unicode noncharacters](http://www.unicode.org/faq/private_use.html#nonchar1) will not be replaced by the library.
|
- [Unicode noncharacters](http://www.unicode.org/faq/private_use.html#nonchar1) will not be replaced by the library.
|
||||||
- Invalid surrogates (e.g., incomplete pairs such as `\uDEAD`) will yield parse errors.
|
- Invalid surrogates (e.g., incomplete pairs such as `\uDEAD`) will yield parse errors.
|
||||||
|
- The strings stored in the library are UTF-8 encoded. When using the default string type (`std::string`), note that its length/size functions return the number of stored bytes rather than the number of characters or glyphs.
|
||||||
|
- The code can be compiled without C++ **runtime type identification** features; that is, you can use the `-fno-rtti` compiler flag.
|
||||||
|
- **Exceptions** are used widly within the library. They can, however, be switched off with either using the compiler flag `-fno-exceptions` or by defining the symbol `JSON_NOEXCEPTION`. In this case, exceptions are replaced by an `abort()` call.
|
||||||
|
|
||||||
|
|
||||||
## Execute unit tests
|
## Execute unit tests
|
||||||
|
@ -607,10 +834,11 @@ Thanks a lot for helping out!
|
||||||
To compile and run the tests, you need to execute
|
To compile and run the tests, you need to execute
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ make check
|
$ make json_unit -Ctest
|
||||||
|
$ ./test/json_unit "*""
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
All tests passed (11202040 assertions in 44 test cases)
|
All tests passed (11202052 assertions in 47 test cases)
|
||||||
```
|
```
|
||||||
|
|
||||||
Alternatively, you can use [CMake](https://cmake.org) and run
|
Alternatively, you can use [CMake](https://cmake.org) and run
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
DOXYFILE_ENCODING = UTF-8
|
DOXYFILE_ENCODING = UTF-8
|
||||||
PROJECT_NAME = "JSON for Modern C++"
|
PROJECT_NAME = "JSON for Modern C++"
|
||||||
PROJECT_NUMBER = 2.0.10
|
PROJECT_NUMBER = 2.1.0
|
||||||
PROJECT_BRIEF =
|
PROJECT_BRIEF =
|
||||||
PROJECT_LOGO =
|
PROJECT_LOGO =
|
||||||
OUTPUT_DIRECTORY = .
|
OUTPUT_DIRECTORY = .
|
||||||
|
@ -109,7 +109,7 @@ RECURSIVE = NO
|
||||||
EXCLUDE =
|
EXCLUDE =
|
||||||
EXCLUDE_SYMLINKS = NO
|
EXCLUDE_SYMLINKS = NO
|
||||||
EXCLUDE_PATTERNS =
|
EXCLUDE_PATTERNS =
|
||||||
EXCLUDE_SYMBOLS = nlohmann::anonymous_namespace
|
EXCLUDE_SYMBOLS = nlohmann::detail
|
||||||
EXAMPLE_PATH = examples
|
EXAMPLE_PATH = examples
|
||||||
EXAMPLE_PATTERNS =
|
EXAMPLE_PATTERNS =
|
||||||
EXAMPLE_RECURSIVE = NO
|
EXAMPLE_RECURSIVE = NO
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
<a target="_blank" href="http://melpon.org/wandbox/permlink/IoZNMHqubixQx2dN"><b>online</b></a>
|
<a target="_blank" href="http://melpon.org/wandbox/permlink/4NEU6ZZMoM9lpIex"><b>online</b></a>
|
|
@ -8,7 +8,7 @@ int main()
|
||||||
json object =
|
json object =
|
||||||
{
|
{
|
||||||
{"the good", "il buono"},
|
{"the good", "il buono"},
|
||||||
{"the bad", "il cativo"},
|
{"the bad", "il cattivo"},
|
||||||
{"the ugly", "il brutto"}
|
{"the ugly", "il brutto"}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
<a target="_blank" href="http://melpon.org/wandbox/permlink/rsnwWxpDjmtRRSzb"><b>online</b></a>
|
<a target="_blank" href="http://melpon.org/wandbox/permlink/tb5CaFfsMWpAvi7m"><b>online</b></a>
|
|
@ -8,7 +8,7 @@ int main()
|
||||||
json object =
|
json object =
|
||||||
{
|
{
|
||||||
{"the good", "il buono"},
|
{"the good", "il buono"},
|
||||||
{"the bad", "il cativo"},
|
{"the bad", "il cattivo"},
|
||||||
{"the ugly", "il brutto"}
|
{"the ugly", "il brutto"}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
<a target="_blank" href="http://melpon.org/wandbox/permlink/aeoZrnhnb3HKClCY"><b>online</b></a>
|
<a target="_blank" href="http://melpon.org/wandbox/permlink/NFG86H5khRUePc1s"><b>online</b></a>
|
|
@ -1,58 +0,0 @@
|
||||||
#include <json.hpp>
|
|
||||||
#include <deque>
|
|
||||||
#include <list>
|
|
||||||
#include <forward_list>
|
|
||||||
#include <set>
|
|
||||||
#include <unordered_set>
|
|
||||||
|
|
||||||
using json = nlohmann::json;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
// create an array from std::vector
|
|
||||||
std::vector<int> c_vector {1, 2, 3, 4};
|
|
||||||
json j_vec(c_vector);
|
|
||||||
|
|
||||||
// create an array from std::deque
|
|
||||||
std::deque<double> c_deque {1.2, 2.3, 3.4, 5.6};
|
|
||||||
json j_deque(c_deque);
|
|
||||||
|
|
||||||
// create an array from std::list
|
|
||||||
std::list<bool> c_list {true, true, false, true};
|
|
||||||
json j_list(c_list);
|
|
||||||
|
|
||||||
// create an array from std::forward_list
|
|
||||||
std::forward_list<int64_t> c_flist {12345678909876, 23456789098765, 34567890987654, 45678909876543};
|
|
||||||
json j_flist(c_flist);
|
|
||||||
|
|
||||||
// create an array from std::array
|
|
||||||
std::array<unsigned long, 4> c_array {{1, 2, 3, 4}};
|
|
||||||
json j_array(c_array);
|
|
||||||
|
|
||||||
// create an array from std::set
|
|
||||||
std::set<std::string> c_set {"one", "two", "three", "four", "one"};
|
|
||||||
json j_set(c_set); // only one entry for "one" is used
|
|
||||||
|
|
||||||
// create an array from std::unordered_set
|
|
||||||
std::unordered_set<std::string> c_uset {"one", "two", "three", "four", "one"};
|
|
||||||
json j_uset(c_uset); // only one entry for "one" is used
|
|
||||||
|
|
||||||
// create an array from std::multiset
|
|
||||||
std::multiset<std::string> c_mset {"one", "two", "one", "four"};
|
|
||||||
json j_mset(c_mset); // both entries for "one" are used
|
|
||||||
|
|
||||||
// create an array from std::unordered_multiset
|
|
||||||
std::unordered_multiset<std::string> c_umset {"one", "two", "one", "four"};
|
|
||||||
json j_umset(c_umset); // both entries for "one" are used
|
|
||||||
|
|
||||||
// serialize the JSON arrays
|
|
||||||
std::cout << j_vec << '\n';
|
|
||||||
std::cout << j_deque << '\n';
|
|
||||||
std::cout << j_list << '\n';
|
|
||||||
std::cout << j_flist << '\n';
|
|
||||||
std::cout << j_array << '\n';
|
|
||||||
std::cout << j_set << '\n';
|
|
||||||
std::cout << j_uset << '\n';
|
|
||||||
std::cout << j_mset << '\n';
|
|
||||||
std::cout << j_umset << '\n';
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
<a target="_blank" href="http://melpon.org/wandbox/permlink/3BIhBw91FUVuHE1D"><b>online</b></a>
|
|
|
@ -1,9 +0,0 @@
|
||||||
[1,2,3,4]
|
|
||||||
[1.2,2.3,3.4,5.6]
|
|
||||||
[true,true,false,true]
|
|
||||||
[12345678909876,23456789098765,34567890987654,45678909876543]
|
|
||||||
[1,2,3,4]
|
|
||||||
["four","one","three","two"]
|
|
||||||
["four","three","two","one"]
|
|
||||||
["four","one","one","two"]
|
|
||||||
["four","two","one","one"]
|
|
|
@ -1,27 +0,0 @@
|
||||||
#include <json.hpp>
|
|
||||||
|
|
||||||
using json = nlohmann::json;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
// create values of different integer types
|
|
||||||
short n42 = 42;
|
|
||||||
int n23 = 23;
|
|
||||||
long n1024 = 1024;
|
|
||||||
int_least32_t n17 = 17;
|
|
||||||
uint8_t n8 = 8;
|
|
||||||
|
|
||||||
// create JSON numbers
|
|
||||||
json j42(n42);
|
|
||||||
json j23(n23);
|
|
||||||
json j1024(n1024);
|
|
||||||
json j17(n17);
|
|
||||||
json j8(n8);
|
|
||||||
|
|
||||||
// serialize the JSON numbers
|
|
||||||
std::cout << j42 << '\n';
|
|
||||||
std::cout << j23 << '\n';
|
|
||||||
std::cout << j1024 << '\n';
|
|
||||||
std::cout << j17 << '\n';
|
|
||||||
std::cout << j8 << '\n';
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
<a target="_blank" href="http://melpon.org/wandbox/permlink/PcMzhcu2RpD7KSwr"><b>online</b></a>
|
|
|
@ -1,5 +0,0 @@
|
||||||
42
|
|
||||||
23
|
|
||||||
1024
|
|
||||||
17
|
|
||||||
8
|
|
|
@ -1,21 +0,0 @@
|
||||||
#include <json.hpp>
|
|
||||||
|
|
||||||
using json = nlohmann::json;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
// create values of different floating-point types
|
|
||||||
float f42 = 42.23;
|
|
||||||
float f_nan = 1.0f / 0.0f;
|
|
||||||
double f23 = 23.42;
|
|
||||||
|
|
||||||
// create JSON numbers
|
|
||||||
json j42(f42);
|
|
||||||
json j_nan(f_nan);
|
|
||||||
json j23(f23);
|
|
||||||
|
|
||||||
// serialize the JSON numbers
|
|
||||||
std::cout << j42 << '\n';
|
|
||||||
std::cout << j_nan << '\n';
|
|
||||||
std::cout << j23 << '\n';
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
<a target="_blank" href="http://melpon.org/wandbox/permlink/2TCYWSrOxnR05AZI"><b>online</b></a>
|
|
|
@ -1,3 +0,0 @@
|
||||||
42.2299995422363
|
|
||||||
null
|
|
||||||
23.42
|
|
|
@ -1,41 +0,0 @@
|
||||||
#include <json.hpp>
|
|
||||||
#include <unordered_map>
|
|
||||||
|
|
||||||
using json = nlohmann::json;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
// create an object from std::map
|
|
||||||
std::map<std::string, int> c_map
|
|
||||||
{
|
|
||||||
{"one", 1}, {"two", 2}, {"three", 3}
|
|
||||||
};
|
|
||||||
json j_map(c_map);
|
|
||||||
|
|
||||||
// create an object from std::unordered_map
|
|
||||||
std::unordered_map<const char*, double> c_umap
|
|
||||||
{
|
|
||||||
{"one", 1.2}, {"two", 2.3}, {"three", 3.4}
|
|
||||||
};
|
|
||||||
json j_umap(c_umap);
|
|
||||||
|
|
||||||
// create an object from std::multimap
|
|
||||||
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
|
|
||||||
|
|
||||||
// create an object from std::unordered_multimap
|
|
||||||
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
|
|
||||||
|
|
||||||
// serialize the JSON objects
|
|
||||||
std::cout << j_map << '\n';
|
|
||||||
std::cout << j_umap << '\n';
|
|
||||||
std::cout << j_mmap << '\n';
|
|
||||||
std::cout << j_ummap << '\n';
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
<a target="_blank" href="http://melpon.org/wandbox/permlink/JzLCMcSXNsh4uVWa"><b>online</b></a>
|
|
|
@ -1,4 +0,0 @@
|
||||||
{"one":1,"three":3,"two":2}
|
|
||||||
{"one":1.2,"three":3.4,"two":2.3}
|
|
||||||
{"one":true,"three":false,"two":true}
|
|
||||||
{"one":true,"three":false,"two":true}
|
|
|
@ -1,15 +0,0 @@
|
||||||
#include <json.hpp>
|
|
||||||
|
|
||||||
using json = nlohmann::json;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
// create a string value
|
|
||||||
std::string s = "The quick brown fox jumps over the lazy dog.";
|
|
||||||
|
|
||||||
// create a JSON string value
|
|
||||||
json j = s;
|
|
||||||
|
|
||||||
// serialize the JSON string
|
|
||||||
std::cout << j << '\n';
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
<a target="_blank" href="http://melpon.org/wandbox/permlink/b9hbCY8zfOiTOuoK"><b>online</b></a>
|
|
|
@ -1 +0,0 @@
|
||||||
"The quick brown fox jumps over the lazy dog."
|
|
211
doc/examples/basic_json__CompatibleType.cpp
Normal file
211
doc/examples/basic_json__CompatibleType.cpp
Normal file
|
@ -0,0 +1,211 @@
|
||||||
|
#include <json.hpp>
|
||||||
|
#include <deque>
|
||||||
|
#include <list>
|
||||||
|
#include <forward_list>
|
||||||
|
#include <set>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <unordered_set>
|
||||||
|
|
||||||
|
using json = nlohmann::json;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// ============
|
||||||
|
// object types
|
||||||
|
// ============
|
||||||
|
|
||||||
|
// create an object from an object_t value
|
||||||
|
json::object_t object_value = { {"one", 1}, {"two", 2} };
|
||||||
|
json j_object_t(object_value);
|
||||||
|
|
||||||
|
// create an object from std::map
|
||||||
|
std::map<std::string, int> c_map
|
||||||
|
{
|
||||||
|
{"one", 1}, {"two", 2}, {"three", 3}
|
||||||
|
};
|
||||||
|
json j_map(c_map);
|
||||||
|
|
||||||
|
// create an object from std::unordered_map
|
||||||
|
std::unordered_map<const char*, double> c_umap
|
||||||
|
{
|
||||||
|
{"one", 1.2}, {"two", 2.3}, {"three", 3.4}
|
||||||
|
};
|
||||||
|
json j_umap(c_umap);
|
||||||
|
|
||||||
|
// create an object from std::multimap
|
||||||
|
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
|
||||||
|
|
||||||
|
// create an object from std::unordered_multimap
|
||||||
|
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
|
||||||
|
|
||||||
|
// serialize the JSON objects
|
||||||
|
std::cout << j_object_t << '\n';
|
||||||
|
std::cout << j_map << '\n';
|
||||||
|
std::cout << j_umap << '\n';
|
||||||
|
std::cout << j_mmap << '\n';
|
||||||
|
std::cout << j_ummap << "\n\n";
|
||||||
|
|
||||||
|
|
||||||
|
// ===========
|
||||||
|
// array types
|
||||||
|
// ===========
|
||||||
|
|
||||||
|
// create an array from an array_t value
|
||||||
|
json::array_t array_value = {"one", "two", 3, 4.5, false};
|
||||||
|
json j_array_t(array_value);
|
||||||
|
|
||||||
|
// create an array from std::vector
|
||||||
|
std::vector<int> c_vector {1, 2, 3, 4};
|
||||||
|
json j_vec(c_vector);
|
||||||
|
|
||||||
|
// create an array from std::deque
|
||||||
|
std::deque<double> c_deque {1.2, 2.3, 3.4, 5.6};
|
||||||
|
json j_deque(c_deque);
|
||||||
|
|
||||||
|
// create an array from std::list
|
||||||
|
std::list<bool> c_list {true, true, false, true};
|
||||||
|
json j_list(c_list);
|
||||||
|
|
||||||
|
// create an array from std::forward_list
|
||||||
|
std::forward_list<int64_t> c_flist {12345678909876, 23456789098765, 34567890987654, 45678909876543};
|
||||||
|
json j_flist(c_flist);
|
||||||
|
|
||||||
|
// create an array from std::array
|
||||||
|
std::array<unsigned long, 4> c_array {{1, 2, 3, 4}};
|
||||||
|
json j_array(c_array);
|
||||||
|
|
||||||
|
// create an array from std::set
|
||||||
|
std::set<std::string> c_set {"one", "two", "three", "four", "one"};
|
||||||
|
json j_set(c_set); // only one entry for "one" is used
|
||||||
|
|
||||||
|
// create an array from std::unordered_set
|
||||||
|
std::unordered_set<std::string> c_uset {"one", "two", "three", "four", "one"};
|
||||||
|
json j_uset(c_uset); // only one entry for "one" is used
|
||||||
|
|
||||||
|
// create an array from std::multiset
|
||||||
|
std::multiset<std::string> c_mset {"one", "two", "one", "four"};
|
||||||
|
json j_mset(c_mset); // both entries for "one" are used
|
||||||
|
|
||||||
|
// create an array from std::unordered_multiset
|
||||||
|
std::unordered_multiset<std::string> c_umset {"one", "two", "one", "four"};
|
||||||
|
json j_umset(c_umset); // both entries for "one" are used
|
||||||
|
|
||||||
|
// serialize the JSON arrays
|
||||||
|
std::cout << j_array_t << '\n';
|
||||||
|
std::cout << j_vec << '\n';
|
||||||
|
std::cout << j_deque << '\n';
|
||||||
|
std::cout << j_list << '\n';
|
||||||
|
std::cout << j_flist << '\n';
|
||||||
|
std::cout << j_array << '\n';
|
||||||
|
std::cout << j_set << '\n';
|
||||||
|
std::cout << j_uset << '\n';
|
||||||
|
std::cout << j_mset << '\n';
|
||||||
|
std::cout << j_umset << "\n\n";
|
||||||
|
|
||||||
|
|
||||||
|
// ============
|
||||||
|
// string types
|
||||||
|
// ============
|
||||||
|
|
||||||
|
// create string from a string_t value
|
||||||
|
json::string_t string_value = "The quick brown fox jumps over the lazy dog.";
|
||||||
|
json j_string_t(string_value);
|
||||||
|
|
||||||
|
// create a JSON string directly from a string literal
|
||||||
|
json j_string_literal("The quick brown fox jumps over the lazy dog.");
|
||||||
|
|
||||||
|
// create string from std::string
|
||||||
|
std::string s_stdstring = "The quick brown fox jumps over the lazy dog.";
|
||||||
|
json j_stdstring(s_stdstring);
|
||||||
|
|
||||||
|
// serialize the JSON strings
|
||||||
|
std::cout << j_string_t << '\n';
|
||||||
|
std::cout << j_string_literal << '\n';
|
||||||
|
std::cout << j_stdstring << "\n\n";
|
||||||
|
|
||||||
|
|
||||||
|
// ============
|
||||||
|
// number types
|
||||||
|
// ============
|
||||||
|
|
||||||
|
// create a JSON number from number_integer_t
|
||||||
|
json::number_integer_t value_integer_t = -42;
|
||||||
|
json j_integer_t(value_integer_t);
|
||||||
|
|
||||||
|
// create a JSON number from number_unsigned_t
|
||||||
|
json::number_integer_t value_unsigned_t = 17;
|
||||||
|
json j_unsigned_t(value_unsigned_t);
|
||||||
|
|
||||||
|
// create a JSON number from an anonymous enum
|
||||||
|
enum { enum_value = 17 };
|
||||||
|
json j_enum(enum_value);
|
||||||
|
|
||||||
|
// create values of different integer types
|
||||||
|
short n_short = 42;
|
||||||
|
int n_int = -23;
|
||||||
|
long n_long = 1024;
|
||||||
|
int_least32_t n_int_least32_t = -17;
|
||||||
|
uint8_t n_uint8_t = 8;
|
||||||
|
|
||||||
|
// create (integer) JSON numbers
|
||||||
|
json j_short(n_short);
|
||||||
|
json j_int(n_int);
|
||||||
|
json j_long(n_long);
|
||||||
|
json j_int_least32_t(n_int_least32_t);
|
||||||
|
json j_uint8_t(n_uint8_t);
|
||||||
|
|
||||||
|
// create values of different floating-point types
|
||||||
|
json::number_float_t v_ok = 3.141592653589793;
|
||||||
|
json::number_float_t v_nan = NAN;
|
||||||
|
json::number_float_t v_infinity = INFINITY;
|
||||||
|
|
||||||
|
// create values of different floating-point types
|
||||||
|
float n_float = 42.23;
|
||||||
|
float n_float_nan = 1.0f / 0.0f;
|
||||||
|
double n_double = 23.42;
|
||||||
|
|
||||||
|
// create (floating point) JSON numbers
|
||||||
|
json j_ok(v_ok);
|
||||||
|
json j_nan(v_nan);
|
||||||
|
json j_infinity(v_infinity);
|
||||||
|
json j_float(n_float);
|
||||||
|
json j_float_nan(n_float_nan);
|
||||||
|
json j_double(n_double);
|
||||||
|
|
||||||
|
// serialize the JSON numbers
|
||||||
|
std::cout << j_integer_t << '\n';
|
||||||
|
std::cout << j_unsigned_t << '\n';
|
||||||
|
std::cout << j_enum << '\n';
|
||||||
|
std::cout << j_short << '\n';
|
||||||
|
std::cout << j_int << '\n';
|
||||||
|
std::cout << j_long << '\n';
|
||||||
|
std::cout << j_int_least32_t << '\n';
|
||||||
|
std::cout << j_uint8_t << '\n';
|
||||||
|
std::cout << j_ok << '\n';
|
||||||
|
std::cout << j_nan << '\n';
|
||||||
|
std::cout << j_infinity << '\n';
|
||||||
|
std::cout << j_float << '\n';
|
||||||
|
std::cout << j_float_nan << '\n';
|
||||||
|
std::cout << j_double << "\n\n";
|
||||||
|
|
||||||
|
|
||||||
|
// =============
|
||||||
|
// boolean types
|
||||||
|
// =============
|
||||||
|
|
||||||
|
// create boolean values
|
||||||
|
json j_truth = true;
|
||||||
|
json j_falsity = false;
|
||||||
|
|
||||||
|
// serialize the JSON booleans
|
||||||
|
std::cout << j_truth << '\n';
|
||||||
|
std::cout << j_falsity << '\n';
|
||||||
|
}
|
1
doc/examples/basic_json__CompatibleType.link
Normal file
1
doc/examples/basic_json__CompatibleType.link
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<a target="_blank" href="http://melpon.org/wandbox/permlink/VM7W2kpE7sIYJ5DW"><b>online</b></a>
|
38
doc/examples/basic_json__CompatibleType.output
Normal file
38
doc/examples/basic_json__CompatibleType.output
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
{"one":1,"two":2}
|
||||||
|
{"one":1,"three":3,"two":2}
|
||||||
|
{"one":1.2,"three":3.4,"two":2.3}
|
||||||
|
{"one":true,"three":false,"two":true}
|
||||||
|
{"one":true,"three":false,"two":true}
|
||||||
|
|
||||||
|
["one","two",3,4.5,false]
|
||||||
|
[1,2,3,4]
|
||||||
|
[1.2,2.3,3.4,5.6]
|
||||||
|
[true,true,false,true]
|
||||||
|
[12345678909876,23456789098765,34567890987654,45678909876543]
|
||||||
|
[1,2,3,4]
|
||||||
|
["four","one","three","two"]
|
||||||
|
["four","three","two","one"]
|
||||||
|
["four","one","one","two"]
|
||||||
|
["four","two","one","one"]
|
||||||
|
|
||||||
|
"The quick brown fox jumps over the lazy dog."
|
||||||
|
"The quick brown fox jumps over the lazy dog."
|
||||||
|
"The quick brown fox jumps over the lazy dog."
|
||||||
|
|
||||||
|
-42
|
||||||
|
17
|
||||||
|
17
|
||||||
|
42
|
||||||
|
-23
|
||||||
|
1024
|
||||||
|
-17
|
||||||
|
8
|
||||||
|
3.14159265358979
|
||||||
|
null
|
||||||
|
null
|
||||||
|
42.2299995422363
|
||||||
|
null
|
||||||
|
23.42
|
||||||
|
|
||||||
|
true
|
||||||
|
false
|
|
@ -1,15 +0,0 @@
|
||||||
#include <json.hpp>
|
|
||||||
|
|
||||||
using json = nlohmann::json;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
// create an array_t value
|
|
||||||
json::array_t value = {"one", "two", 3, 4.5, false};
|
|
||||||
|
|
||||||
// create a JSON array from the value
|
|
||||||
json j(value);
|
|
||||||
|
|
||||||
// serialize the JSON array
|
|
||||||
std::cout << j << '\n';
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
<a target="_blank" href="http://melpon.org/wandbox/permlink/dTbSNAvl6TqrMEAn"><b>online</b></a>
|
|
|
@ -1 +0,0 @@
|
||||||
["one","two",3,4.5,false]
|
|
|
@ -1,14 +0,0 @@
|
||||||
#include <json.hpp>
|
|
||||||
|
|
||||||
using json = nlohmann::json;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
// create boolean values
|
|
||||||
json j_truth = true;
|
|
||||||
json j_falsity = false;
|
|
||||||
|
|
||||||
// serialize the JSON booleans
|
|
||||||
std::cout << j_truth << '\n';
|
|
||||||
std::cout << j_falsity << '\n';
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
<a target="_blank" href="http://melpon.org/wandbox/permlink/VmVl9pyrQp8LyOnU"><b>online</b></a>
|
|
|
@ -1,2 +0,0 @@
|
||||||
true
|
|
||||||
false
|
|
|
@ -1,15 +0,0 @@
|
||||||
#include <json.hpp>
|
|
||||||
|
|
||||||
using json = nlohmann::json;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
// an anonymous enum
|
|
||||||
enum { t = 17 };
|
|
||||||
|
|
||||||
// create a JSON number from the enum
|
|
||||||
json j(t);
|
|
||||||
|
|
||||||
// serialize the JSON numbers
|
|
||||||
std::cout << j << '\n';
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
<a target="_blank" href="http://melpon.org/wandbox/permlink/3xQ1qy7BT9OrSSCo"><b>online</b></a>
|
|
|
@ -1 +0,0 @@
|
||||||
17
|
|
|
@ -1,21 +0,0 @@
|
||||||
#include <json.hpp>
|
|
||||||
|
|
||||||
using json = nlohmann::json;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
// create values of different floating-point types
|
|
||||||
json::number_float_t v_ok = 3.141592653589793;
|
|
||||||
json::number_float_t v_nan = NAN;
|
|
||||||
json::number_float_t v_infinity = INFINITY;
|
|
||||||
|
|
||||||
// create JSON numbers
|
|
||||||
json j_ok(v_ok);
|
|
||||||
json j_nan(v_nan);
|
|
||||||
json j_infinity(v_infinity);
|
|
||||||
|
|
||||||
// serialize the JSON numbers
|
|
||||||
std::cout << j_ok << '\n';
|
|
||||||
std::cout << j_nan << '\n';
|
|
||||||
std::cout << j_infinity << '\n';
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
<a target="_blank" href="http://melpon.org/wandbox/permlink/OTgOxjIAKFvxpFdm"><b>online</b></a>
|
|
|
@ -1,3 +0,0 @@
|
||||||
3.14159265358979
|
|
||||||
null
|
|
||||||
null
|
|
|
@ -1,14 +0,0 @@
|
||||||
#include <json.hpp>
|
|
||||||
|
|
||||||
using json = nlohmann::json;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
// create a JSON number from number_integer_t
|
|
||||||
json::number_integer_t value = 42;
|
|
||||||
|
|
||||||
json j(value);
|
|
||||||
|
|
||||||
// serialize the JSON numbers
|
|
||||||
std::cout << j << '\n';
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
<a target="_blank" href="http://melpon.org/wandbox/permlink/cCQRCvjXdRM9YpT5"><b>online</b></a>
|
|
|
@ -1 +0,0 @@
|
||||||
42
|
|
|
@ -1,15 +0,0 @@
|
||||||
#include <json.hpp>
|
|
||||||
|
|
||||||
using json = nlohmann::json;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
// create an object_t value
|
|
||||||
json::object_t value = { {"one", 1}, {"two", 2} };
|
|
||||||
|
|
||||||
// create a JSON object from the value
|
|
||||||
json j(value);
|
|
||||||
|
|
||||||
// serialize the JSON object
|
|
||||||
std::cout << j << '\n';
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
<a target="_blank" href="http://melpon.org/wandbox/permlink/DgtHcz5L6JphTOGJ"><b>online</b></a>
|
|
|
@ -1 +0,0 @@
|
||||||
{"one":1,"two":2}
|
|
|
@ -1,15 +0,0 @@
|
||||||
#include <json.hpp>
|
|
||||||
|
|
||||||
using json = nlohmann::json;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
// create an string_t value
|
|
||||||
json::string_t value = "The quick brown fox jumps over the lazy doc";
|
|
||||||
|
|
||||||
// create a JSON string from the value
|
|
||||||
json j(value);
|
|
||||||
|
|
||||||
// serialize the JSON array
|
|
||||||
std::cout << j << '\n';
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
<a target="_blank" href="http://melpon.org/wandbox/permlink/cwNYP1q2mT8CFLTk"><b>online</b></a>
|
|
|
@ -1 +0,0 @@
|
||||||
"The quick brown fox jumps over the lazy doc"
|
|
|
@ -1,12 +0,0 @@
|
||||||
#include <json.hpp>
|
|
||||||
|
|
||||||
using json = nlohmann::json;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
// create a JSON string directly from a string literal
|
|
||||||
json j("The quick brown fox jumps over the lazy doc");
|
|
||||||
|
|
||||||
// serialize the JSON array
|
|
||||||
std::cout << j << '\n';
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
<a target="_blank" href="http://melpon.org/wandbox/permlink/AtV4zVErfLwkileg"><b>online</b></a>
|
|
|
@ -1 +0,0 @@
|
||||||
"The quick brown fox jumps over the lazy doc"
|
|
9
doc/examples/meta.cpp
Normal file
9
doc/examples/meta.cpp
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#include <json.hpp>
|
||||||
|
|
||||||
|
using json = nlohmann::json;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// call meta()
|
||||||
|
std::cout << std::setw(4) << json::meta() << '\n';
|
||||||
|
}
|
1
doc/examples/meta.link
Normal file
1
doc/examples/meta.link
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<a target="_blank" href="http://melpon.org/wandbox/permlink/3hERJociqLo3vdod"><b>online</b></a>
|
17
doc/examples/meta.output
Normal file
17
doc/examples/meta.output
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"compiler": {
|
||||||
|
"c++": "201103",
|
||||||
|
"family": "clang",
|
||||||
|
"version": "8.0.0 (clang-800.0.42.1)"
|
||||||
|
},
|
||||||
|
"copyright": "(C) 2013-2017 Niels Lohmann",
|
||||||
|
"name": "JSON for Modern C++",
|
||||||
|
"platform": "apple",
|
||||||
|
"url": "https://github.com/nlohmann/json",
|
||||||
|
"version": {
|
||||||
|
"major": 2,
|
||||||
|
"minor": 1,
|
||||||
|
"patch": 0,
|
||||||
|
"string": "2.1.0"
|
||||||
|
}
|
||||||
|
}
|
24
doc/examples/type_name.cpp
Normal file
24
doc/examples/type_name.cpp
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
#include <json.hpp>
|
||||||
|
|
||||||
|
using json = nlohmann::json;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// create JSON values
|
||||||
|
json j_null;
|
||||||
|
json j_boolean = true;
|
||||||
|
json j_number_integer = 17;
|
||||||
|
json j_number_float = 23.42;
|
||||||
|
json j_object = {{"one", 1}, {"two", 2}};
|
||||||
|
json j_array = {1, 2, 4, 8, 16};
|
||||||
|
json j_string = "Hello, world";
|
||||||
|
|
||||||
|
// call type_name()
|
||||||
|
std::cout << j_null.type_name() << '\n';
|
||||||
|
std::cout << j_boolean.type_name() << '\n';
|
||||||
|
std::cout << j_number_integer.type_name() << '\n';
|
||||||
|
std::cout << j_number_float.type_name() << '\n';
|
||||||
|
std::cout << j_object.type_name() << '\n';
|
||||||
|
std::cout << j_array.type_name() << '\n';
|
||||||
|
std::cout << j_string.type_name() << '\n';
|
||||||
|
}
|
1
doc/examples/type_name.link
Normal file
1
doc/examples/type_name.link
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<a target="_blank" href="http://melpon.org/wandbox/permlink/V6imubWo6Lkp8gk1"><b>online</b></a>
|
7
doc/examples/type_name.output
Normal file
7
doc/examples/type_name.output
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
null
|
||||||
|
boolean
|
||||||
|
number
|
||||||
|
number
|
||||||
|
object
|
||||||
|
array
|
||||||
|
string
|
|
@ -277,4 +277,4 @@ The container functions known from STL have been extended to support the differe
|
||||||
@author [Niels Lohmann](http://nlohmann.me)
|
@author [Niels Lohmann](http://nlohmann.me)
|
||||||
@see https://github.com/nlohmann/json to download the source code
|
@see https://github.com/nlohmann/json to download the source code
|
||||||
|
|
||||||
@version 2.0.10
|
@version 2.1.0
|
||||||
|
|
BIN
doc/json.gif
BIN
doc/json.gif
Binary file not shown.
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.4 MiB |
2358
src/json.hpp
2358
src/json.hpp
File diff suppressed because it is too large
Load diff
2358
src/json.hpp.re2c
2358
src/json.hpp.re2c
File diff suppressed because it is too large
Load diff
|
@ -26,14 +26,17 @@ add_executable(${JSON_UNITTEST_TARGET_NAME}
|
||||||
"src/unit-iterators2.cpp"
|
"src/unit-iterators2.cpp"
|
||||||
"src/unit-json_patch.cpp"
|
"src/unit-json_patch.cpp"
|
||||||
"src/unit-json_pointer.cpp"
|
"src/unit-json_pointer.cpp"
|
||||||
|
"src/unit-meta.cpp"
|
||||||
"src/unit-modifiers.cpp"
|
"src/unit-modifiers.cpp"
|
||||||
"src/unit-msgpack.cpp"
|
"src/unit-msgpack.cpp"
|
||||||
|
"src/unit-noexcept.cpp"
|
||||||
"src/unit-pointer_access.cpp"
|
"src/unit-pointer_access.cpp"
|
||||||
"src/unit-readme.cpp"
|
"src/unit-readme.cpp"
|
||||||
"src/unit-reference_access.cpp"
|
"src/unit-reference_access.cpp"
|
||||||
"src/unit-regression.cpp"
|
"src/unit-regression.cpp"
|
||||||
"src/unit-serialization.cpp"
|
"src/unit-serialization.cpp"
|
||||||
"src/unit-testsuites.cpp"
|
"src/unit-testsuites.cpp"
|
||||||
|
"src/unit-udt.cpp"
|
||||||
"src/unit-unicode.cpp"
|
"src/unit-unicode.cpp"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ SOURCES = src/unit.cpp \
|
||||||
src/unit-iterators2.cpp \
|
src/unit-iterators2.cpp \
|
||||||
src/unit-json_patch.cpp \
|
src/unit-json_patch.cpp \
|
||||||
src/unit-json_pointer.cpp \
|
src/unit-json_pointer.cpp \
|
||||||
|
src/unit-meta.cpp \
|
||||||
src/unit-modifiers.cpp \
|
src/unit-modifiers.cpp \
|
||||||
src/unit-msgpack.cpp \
|
src/unit-msgpack.cpp \
|
||||||
src/unit-pointer_access.cpp \
|
src/unit-pointer_access.cpp \
|
||||||
|
@ -37,8 +38,8 @@ SOURCES = src/unit.cpp \
|
||||||
src/unit-reference_access.cpp \
|
src/unit-reference_access.cpp \
|
||||||
src/unit-regression.cpp \
|
src/unit-regression.cpp \
|
||||||
src/unit-serialization.cpp \
|
src/unit-serialization.cpp \
|
||||||
src/unit-unicode.cpp \
|
src/unit-testsuites.cpp \
|
||||||
src/unit-testsuites.cpp
|
src/unit-unicode.cpp
|
||||||
|
|
||||||
OBJECTS = $(SOURCES:.cpp=.o)
|
OBJECTS = $(SOURCES:.cpp=.o)
|
||||||
|
|
||||||
|
@ -51,7 +52,7 @@ TESTCASES = $(patsubst src/unit-%.cpp,test-%,$(wildcard src/unit-*.cpp))
|
||||||
all: $(TESTCASES)
|
all: $(TESTCASES)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -fr json_unit $(OBJECTS) $(SOURCES:.cpp=.gcno) $(SOURCES:.cpp=.gcda) $(TESTCASES)
|
rm -fr json_unit $(OBJECTS) $(SOURCES:.cpp=.gcno) $(SOURCES:.cpp=.gcda) $(TESTCASES) parse_afl_fuzzer parse_cbor_fuzzer parse_msgpack_fuzzer
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# single test file
|
# single test file
|
||||||
|
@ -74,7 +75,7 @@ test-%: src/unit-%.cpp ../src/json.hpp thirdparty/catch/catch.hpp
|
||||||
@echo "[CXXLD] $@"
|
@echo "[CXXLD] $@"
|
||||||
@$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) -DCATCH_CONFIG_MAIN $< -o $@
|
@$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) -DCATCH_CONFIG_MAIN $< -o $@
|
||||||
|
|
||||||
TEST_PATTERN = "*"
|
TEST_PATTERN ?= "*"
|
||||||
TEST_PREFIX = ""
|
TEST_PREFIX = ""
|
||||||
check: $(TESTCASES)
|
check: $(TESTCASES)
|
||||||
@cd .. ; for testcase in $(TESTCASES); do echo "Executing $$testcase..."; $(TEST_PREFIX)test/$$testcase $(TEST_PATTERN) || exit 1; done
|
@cd .. ; for testcase in $(TESTCASES); do echo "Executing $$testcase..."; $(TEST_PREFIX)test/$$testcase $(TEST_PATTERN) || exit 1; done
|
||||||
|
@ -84,13 +85,14 @@ check: $(TESTCASES)
|
||||||
# fuzzer
|
# fuzzer
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
FUZZER_ENGINE = src/fuzzer-driver_afl.cpp
|
||||||
fuzzers: parse_afl_fuzzer parse_cbor_fuzzer parse_msgpack_fuzzer
|
fuzzers: parse_afl_fuzzer parse_cbor_fuzzer parse_msgpack_fuzzer
|
||||||
|
|
||||||
parse_afl_fuzzer:
|
parse_afl_fuzzer:
|
||||||
$(CXX) $(CXXFLAGS) $(CPPFLAGS) src/fuzzer-driver_afl.cpp src/fuzzer-parse_json.cpp -o $@
|
$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(FUZZER_ENGINE) src/fuzzer-parse_json.cpp -o $@
|
||||||
|
|
||||||
parse_cbor_fuzzer:
|
parse_cbor_fuzzer:
|
||||||
$(CXX) $(CXXFLAGS) $(CPPFLAGS) src/fuzzer-driver_afl.cpp src/fuzzer-parse_cbor.cpp -o $@
|
$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(FUZZER_ENGINE) src/fuzzer-parse_cbor.cpp -o $@
|
||||||
|
|
||||||
parse_msgpack_fuzzer:
|
parse_msgpack_fuzzer:
|
||||||
$(CXX) $(CXXFLAGS) $(CPPFLAGS) src/fuzzer-driver_afl.cpp src/fuzzer-parse_msgpack.cpp -o $@
|
$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(FUZZER_ENGINE) src/fuzzer-parse_msgpack.cpp -o $@
|
||||||
|
|
22
test/data/big-list-of-naughty-strings/LICENSE
Normal file
22
test/data/big-list-of-naughty-strings/LICENSE
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2015 Max Woolf
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
496
test/data/big-list-of-naughty-strings/blns.json
Normal file
496
test/data/big-list-of-naughty-strings/blns.json
Normal file
|
@ -0,0 +1,496 @@
|
||||||
|
[
|
||||||
|
"",
|
||||||
|
"undefined",
|
||||||
|
"undef",
|
||||||
|
"null",
|
||||||
|
"NULL",
|
||||||
|
"(null)",
|
||||||
|
"nil",
|
||||||
|
"NIL",
|
||||||
|
"true",
|
||||||
|
"false",
|
||||||
|
"True",
|
||||||
|
"False",
|
||||||
|
"TRUE",
|
||||||
|
"FALSE",
|
||||||
|
"None",
|
||||||
|
"hasOwnProperty",
|
||||||
|
"\\",
|
||||||
|
"\\\\",
|
||||||
|
"0",
|
||||||
|
"1",
|
||||||
|
"1.00",
|
||||||
|
"$1.00",
|
||||||
|
"1/2",
|
||||||
|
"1E2",
|
||||||
|
"1E02",
|
||||||
|
"1E+02",
|
||||||
|
"-1",
|
||||||
|
"-1.00",
|
||||||
|
"-$1.00",
|
||||||
|
"-1/2",
|
||||||
|
"-1E2",
|
||||||
|
"-1E02",
|
||||||
|
"-1E+02",
|
||||||
|
"1/0",
|
||||||
|
"0/0",
|
||||||
|
"-2147483648/-1",
|
||||||
|
"-9223372036854775808/-1",
|
||||||
|
"0.00",
|
||||||
|
"0..0",
|
||||||
|
".",
|
||||||
|
"0.0.0",
|
||||||
|
"0,00",
|
||||||
|
"0,,0",
|
||||||
|
",",
|
||||||
|
"0,0,0",
|
||||||
|
"0.0/0",
|
||||||
|
"1.0/0.0",
|
||||||
|
"0.0/0.0",
|
||||||
|
"1,0/0,0",
|
||||||
|
"0,0/0,0",
|
||||||
|
"--1",
|
||||||
|
"-",
|
||||||
|
"-.",
|
||||||
|
"-,",
|
||||||
|
"999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999",
|
||||||
|
"NaN",
|
||||||
|
"Infinity",
|
||||||
|
"-Infinity",
|
||||||
|
"INF",
|
||||||
|
"1#INF",
|
||||||
|
"-1#IND",
|
||||||
|
"1#QNAN",
|
||||||
|
"1#SNAN",
|
||||||
|
"1#IND",
|
||||||
|
"0x0",
|
||||||
|
"0xffffffff",
|
||||||
|
"0xffffffffffffffff",
|
||||||
|
"0xabad1dea",
|
||||||
|
"123456789012345678901234567890123456789",
|
||||||
|
"1,000.00",
|
||||||
|
"1 000.00",
|
||||||
|
"1'000.00",
|
||||||
|
"1,000,000.00",
|
||||||
|
"1 000 000.00",
|
||||||
|
"1'000'000.00",
|
||||||
|
"1.000,00",
|
||||||
|
"1 000,00",
|
||||||
|
"1'000,00",
|
||||||
|
"1.000.000,00",
|
||||||
|
"1 000 000,00",
|
||||||
|
"1'000'000,00",
|
||||||
|
"01000",
|
||||||
|
"08",
|
||||||
|
"09",
|
||||||
|
"2.2250738585072011e-308",
|
||||||
|
",./;'[]\\-=",
|
||||||
|
"<>?:\"{}|_+",
|
||||||
|
"!@#$%^&*()`~",
|
||||||
|
"Ω≈ç√∫˜µ≤≥÷",
|
||||||
|
"åß∂ƒ©˙∆˚¬…æ",
|
||||||
|
"œ∑´®†¥¨ˆøπ“‘",
|
||||||
|
"¡™£¢∞§¶•ªº–≠",
|
||||||
|
"¸˛Ç◊ı˜Â¯˘¿",
|
||||||
|
"ÅÍÎÏ˝ÓÔÒÚÆ☃",
|
||||||
|
"Œ„´‰ˇÁ¨ˆØ∏”’",
|
||||||
|
"`⁄€‹›fifl‡°·‚—±",
|
||||||
|
"⅛⅜⅝⅞",
|
||||||
|
"ЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя",
|
||||||
|
"٠١٢٣٤٥٦٧٨٩",
|
||||||
|
"⁰⁴⁵",
|
||||||
|
"₀₁₂",
|
||||||
|
"⁰⁴⁵₀₁₂",
|
||||||
|
"ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็ ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็ ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็",
|
||||||
|
"'",
|
||||||
|
"\"",
|
||||||
|
"''",
|
||||||
|
"\"\"",
|
||||||
|
"'\"'",
|
||||||
|
"\"''''\"'\"",
|
||||||
|
"\"'\"'\"''''\"",
|
||||||
|
"<foo val=“bar” />",
|
||||||
|
"<foo val=“bar” />",
|
||||||
|
"<foo val=”bar“ />",
|
||||||
|
"<foo val=`bar' />",
|
||||||
|
"田中さんにあげて下さい",
|
||||||
|
"パーティーへ行かないか",
|
||||||
|
"和製漢語",
|
||||||
|
"部落格",
|
||||||
|
"사회과학원 어학연구소",
|
||||||
|
"찦차를 타고 온 펲시맨과 쑛다리 똠방각하",
|
||||||
|
"社會科學院語學研究所",
|
||||||
|
"울란바토르",
|
||||||
|
"𠜎𠜱𠝹𠱓𠱸𠲖𠳏",
|
||||||
|
"ヽ༼ຈل͜ຈ༽ノ ヽ༼ຈل͜ຈ༽ノ ",
|
||||||
|
"(。◕ ∀ ◕。)",
|
||||||
|
"`ィ(´∀`∩",
|
||||||
|
"__ロ(,_,*)",
|
||||||
|
"・( ̄∀ ̄)・:*:",
|
||||||
|
"゚・✿ヾ╲(。◕‿◕。)╱✿・゚",
|
||||||
|
",。・:*:・゜’( ☻ ω ☻ )。・:*:・゜’",
|
||||||
|
"(╯°□°)╯︵ ┻━┻) ",
|
||||||
|
"(ノಥ益ಥ)ノ ┻━┻",
|
||||||
|
"┬─┬ノ( º _ ºノ)",
|
||||||
|
"( ͡° ͜ʖ ͡°)",
|
||||||
|
"😍",
|
||||||
|
"👩🏽",
|
||||||
|
"👾 🙇 💁 🙅 🙆 🙋 🙎 🙍 ",
|
||||||
|
"🐵 🙈 🙉 🙊",
|
||||||
|
"❤️ 💔 💌 💕 💞 💓 💗 💖 💘 💝 💟 💜 💛 💚 💙",
|
||||||
|
"✋🏿 💪🏿 👐🏿 🙌🏿 👏🏿 🙏🏿",
|
||||||
|
"🚾 🆒 🆓 🆕 🆖 🆗 🆙 🏧",
|
||||||
|
"0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟",
|
||||||
|
"🇺🇸🇷🇺🇸 🇦🇫🇦🇲🇸 ",
|
||||||
|
"🇺🇸🇷🇺🇸🇦🇫🇦🇲",
|
||||||
|
"🇺🇸🇷🇺🇸🇦",
|
||||||
|
"123",
|
||||||
|
"١٢٣",
|
||||||
|
"ثم نفس سقطت وبالتحديد،, جزيرتي باستخدام أن دنو. إذ هنا؟ الستار وتنصيب كان. أهّل ايطاليا، بريطانيا-فرنسا قد أخذ. سليمان، إتفاقية بين ما, يذكر الحدود أي بعد, معاملة بولندا، الإطلاق عل إيو.",
|
||||||
|
"בְּרֵאשִׁית, בָּרָא אֱלֹהִים, אֵת הַשָּׁמַיִם, וְאֵת הָאָרֶץ",
|
||||||
|
"הָיְתָהtestالصفحات التّحول",
|
||||||
|
"﷽",
|
||||||
|
"ﷺ",
|
||||||
|
"مُنَاقَشَةُ سُبُلِ اِسْتِخْدَامِ اللُّغَةِ فِي النُّظُمِ الْقَائِمَةِ وَفِيم يَخُصَّ التَّطْبِيقَاتُ الْحاسُوبِيَّةُ، ",
|
||||||
|
"",
|
||||||
|
" ",
|
||||||
|
"",
|
||||||
|
" ",
|
||||||
|
"",
|
||||||
|
"␣",
|
||||||
|
"␢",
|
||||||
|
"␡",
|
||||||
|
"test",
|
||||||
|
"test",
|
||||||
|
"
test
",
|
||||||
|
"testtest",
|
||||||
|
"test",
|
||||||
|
"Ṱ̺̺̕o͞ ̷i̲̬͇̪͙n̝̗͕v̟̜̘̦͟o̶̙̰̠kè͚̮̺̪̹̱̤ ̖t̝͕̳̣̻̪͞h̼͓̲̦̳̘̲e͇̣̰̦̬͎ ̢̼̻̱̘h͚͎͙̜̣̲ͅi̦̲̣̰̤v̻͍e̺̭̳̪̰-m̢iͅn̖̺̞̲̯̰d̵̼̟͙̩̼̘̳ ̞̥̱̳̭r̛̗̘e͙p͠r̼̞̻̭̗e̺̠̣͟s̘͇̳͍̝͉e͉̥̯̞̲͚̬͜ǹ̬͎͎̟̖͇̤t͍̬̤͓̼̭͘ͅi̪̱n͠g̴͉ ͏͉ͅc̬̟h͡a̫̻̯͘o̫̟̖͍̙̝͉s̗̦̲.̨̹͈̣",
|
||||||
|
"̡͓̞ͅI̗̘̦͝n͇͇͙v̮̫ok̲̫̙͈i̖͙̭̹̠̞n̡̻̮̣̺g̲͈͙̭͙̬͎ ̰t͔̦h̞̲e̢̤ ͍̬̲͖f̴̘͕̣è͖ẹ̥̩l͖͔͚i͓͚̦͠n͖͍̗͓̳̮g͍ ̨o͚̪͡f̘̣̬ ̖̘͖̟͙̮c҉͔̫͖͓͇͖ͅh̵̤̣͚͔á̗̼͕ͅo̼̣̥s̱͈̺̖̦̻͢.̛̖̞̠̫̰",
|
||||||
|
"̗̺͖̹̯͓Ṯ̤͍̥͇͈h̲́e͏͓̼̗̙̼̣͔ ͇̜̱̠͓͍ͅN͕͠e̗̱z̘̝̜̺͙p̤̺̹͍̯͚e̠̻̠͜r̨̤͍̺̖͔̖̖d̠̟̭̬̝͟i̦͖̩͓͔̤a̠̗̬͉̙n͚͜ ̻̞̰͚ͅh̵͉i̳̞v̢͇ḙ͎͟-҉̭̩̼͔m̤̭̫i͕͇̝̦n̗͙ḍ̟ ̯̲͕͞ǫ̟̯̰̲͙̻̝f ̪̰̰̗̖̭̘͘c̦͍̲̞͍̩̙ḥ͚a̮͎̟̙͜ơ̩̹͎s̤.̝̝ ҉Z̡̖̜͖̰̣͉̜a͖̰͙̬͡l̲̫̳͍̩g̡̟̼̱͚̞̬ͅo̗͜.̟",
|
||||||
|
"̦H̬̤̗̤͝e͜ ̜̥̝̻͍̟́w̕h̖̯͓o̝͙̖͎̱̮ ҉̺̙̞̟͈W̷̼̭a̺̪͍į͈͕̭͙̯̜t̶̼̮s̘͙͖̕ ̠̫̠B̻͍͙͉̳ͅe̵h̵̬͇̫͙i̹͓̳̳̮͎̫̕n͟d̴̪̜̖ ̰͉̩͇͙̲͞ͅT͖̼͓̪͢h͏͓̮̻e̬̝̟ͅ ̤̹̝W͙̞̝͔͇͝ͅa͏͓͔̹̼̣l̴͔̰̤̟͔ḽ̫.͕",
|
||||||
|
"Z̮̞̠͙͔ͅḀ̗̞͈̻̗Ḷ͙͎̯̹̞͓G̻O̭̗̮",
|
||||||
|
"˙ɐnbᴉlɐ ɐuƃɐɯ ǝɹolop ʇǝ ǝɹoqɐl ʇn ʇunpᴉpᴉɔuᴉ ɹodɯǝʇ poɯsnᴉǝ op pǝs 'ʇᴉlǝ ƃuᴉɔsᴉdᴉpɐ ɹnʇǝʇɔǝsuoɔ 'ʇǝɯɐ ʇᴉs ɹolop ɯnsdᴉ ɯǝɹo˥",
|
||||||
|
"00˙Ɩ$-",
|
||||||
|
"The quick brown fox jumps over the lazy dog",
|
||||||
|
"𝐓𝐡𝐞 𝐪𝐮𝐢𝐜𝐤 𝐛𝐫𝐨𝐰𝐧 𝐟𝐨𝐱 𝐣𝐮𝐦𝐩𝐬 𝐨𝐯𝐞𝐫 𝐭𝐡𝐞 𝐥𝐚𝐳𝐲 𝐝𝐨𝐠",
|
||||||
|
"𝕿𝖍𝖊 𝖖𝖚𝖎𝖈𝖐 𝖇𝖗𝖔𝖜𝖓 𝖋𝖔𝖝 𝖏𝖚𝖒𝖕𝖘 𝖔𝖛𝖊𝖗 𝖙𝖍𝖊 𝖑𝖆𝖟𝖞 𝖉𝖔𝖌",
|
||||||
|
"𝑻𝒉𝒆 𝒒𝒖𝒊𝒄𝒌 𝒃𝒓𝒐𝒘𝒏 𝒇𝒐𝒙 𝒋𝒖𝒎𝒑𝒔 𝒐𝒗𝒆𝒓 𝒕𝒉𝒆 𝒍𝒂𝒛𝒚 𝒅𝒐𝒈",
|
||||||
|
"𝓣𝓱𝓮 𝓺𝓾𝓲𝓬𝓴 𝓫𝓻𝓸𝔀𝓷 𝓯𝓸𝔁 𝓳𝓾𝓶𝓹𝓼 𝓸𝓿𝓮𝓻 𝓽𝓱𝓮 𝓵𝓪𝔃𝔂 𝓭𝓸𝓰",
|
||||||
|
"𝕋𝕙𝕖 𝕢𝕦𝕚𝕔𝕜 𝕓𝕣𝕠𝕨𝕟 𝕗𝕠𝕩 𝕛𝕦𝕞𝕡𝕤 𝕠𝕧𝕖𝕣 𝕥𝕙𝕖 𝕝𝕒𝕫𝕪 𝕕𝕠𝕘",
|
||||||
|
"𝚃𝚑𝚎 𝚚𝚞𝚒𝚌𝚔 𝚋𝚛𝚘𝚠𝚗 𝚏𝚘𝚡 𝚓𝚞𝚖𝚙𝚜 𝚘𝚟𝚎𝚛 𝚝𝚑𝚎 𝚕𝚊𝚣𝚢 𝚍𝚘𝚐",
|
||||||
|
"⒯⒣⒠ ⒬⒰⒤⒞⒦ ⒝⒭⒪⒲⒩ ⒡⒪⒳ ⒥⒰⒨⒫⒮ ⒪⒱⒠⒭ ⒯⒣⒠ ⒧⒜⒵⒴ ⒟⒪⒢",
|
||||||
|
"<script>alert(123)</script>",
|
||||||
|
"<script>alert('123');</script>",
|
||||||
|
"<img src=x onerror=alert(123) />",
|
||||||
|
"<svg><script>123<1>alert(123)</script> ",
|
||||||
|
"\"><script>alert(123)</script>",
|
||||||
|
"'><script>alert(123)</script>",
|
||||||
|
"><script>alert(123)</script>",
|
||||||
|
"</script><script>alert(123)</script>",
|
||||||
|
"< / script >< script >alert(123)< / script >",
|
||||||
|
" onfocus=JaVaSCript:alert(123) autofocus ",
|
||||||
|
"\" onfocus=JaVaSCript:alert(123) autofocus ",
|
||||||
|
"' onfocus=JaVaSCript:alert(123) autofocus ",
|
||||||
|
"<script>alert(123)</script>",
|
||||||
|
"<sc<script>ript>alert(123)</sc</script>ript>",
|
||||||
|
"--><script>alert(123)</script>",
|
||||||
|
"\";alert(123);t=\"",
|
||||||
|
"';alert(123);t='",
|
||||||
|
"JavaSCript:alert(123)",
|
||||||
|
";alert(123);",
|
||||||
|
"src=JaVaSCript:prompt(132)",
|
||||||
|
"\"><script>alert(123);</script x=\"",
|
||||||
|
"'><script>alert(123);</script x='",
|
||||||
|
"><script>alert(123);</script x=",
|
||||||
|
"\" autofocus onkeyup=\"javascript:alert(123)",
|
||||||
|
"' autofocus onkeyup='javascript:alert(123)",
|
||||||
|
"<script\\x20type=\"text/javascript\">javascript:alert(1);</script>",
|
||||||
|
"<script\\x3Etype=\"text/javascript\">javascript:alert(1);</script>",
|
||||||
|
"<script\\x0Dtype=\"text/javascript\">javascript:alert(1);</script>",
|
||||||
|
"<script\\x09type=\"text/javascript\">javascript:alert(1);</script>",
|
||||||
|
"<script\\x0Ctype=\"text/javascript\">javascript:alert(1);</script>",
|
||||||
|
"<script\\x2Ftype=\"text/javascript\">javascript:alert(1);</script>",
|
||||||
|
"<script\\x0Atype=\"text/javascript\">javascript:alert(1);</script>",
|
||||||
|
"'`\"><\\x3Cscript>javascript:alert(1)</script> ",
|
||||||
|
"'`\"><\\x00script>javascript:alert(1)</script>",
|
||||||
|
"ABC<div style=\"x\\x3Aexpression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:expression\\x5C(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:expression\\x00(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:exp\\x00ression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:exp\\x5Cression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\x0Aexpression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\x09expression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\xE3\\x80\\x80expression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\xE2\\x80\\x84expression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\xC2\\xA0expression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\xE2\\x80\\x80expression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\xE2\\x80\\x8Aexpression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\x0Dexpression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\x0Cexpression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\xE2\\x80\\x87expression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\xEF\\xBB\\xBFexpression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\x20expression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\xE2\\x80\\x88expression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\x00expression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\xE2\\x80\\x8Bexpression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\xE2\\x80\\x86expression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\xE2\\x80\\x85expression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\xE2\\x80\\x82expression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\x0Bexpression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\xE2\\x80\\x81expression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\xE2\\x80\\x83expression(javascript:alert(1)\">DEF",
|
||||||
|
"ABC<div style=\"x:\\xE2\\x80\\x89expression(javascript:alert(1)\">DEF",
|
||||||
|
"<a href=\"\\x0Bjavascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x0Fjavascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\xC2\\xA0javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x05javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\xE1\\xA0\\x8Ejavascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x18javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x11javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\xE2\\x80\\x88javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\xE2\\x80\\x89javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\xE2\\x80\\x80javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x17javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x03javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x0Ejavascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x1Ajavascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x00javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x10javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\xE2\\x80\\x82javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x20javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x13javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x09javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\xE2\\x80\\x8Ajavascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x14javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x19javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\xE2\\x80\\xAFjavascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x1Fjavascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\xE2\\x80\\x81javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x1Djavascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\xE2\\x80\\x87javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x07javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\xE1\\x9A\\x80javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\xE2\\x80\\x83javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x04javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x01javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x08javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\xE2\\x80\\x84javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\xE2\\x80\\x86javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\xE3\\x80\\x80javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x12javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x0Djavascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x0Ajavascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x0Cjavascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x15javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\xE2\\x80\\xA8javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x16javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x02javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x1Bjavascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x06javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\xE2\\x80\\xA9javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\xE2\\x80\\x85javascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x1Ejavascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\xE2\\x81\\x9Fjavascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"\\x1Cjavascript:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"javascript\\x00:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"javascript\\x3A:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"javascript\\x09:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"javascript\\x0D:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"<a href=\"javascript\\x0A:javascript:alert(1)\" id=\"fuzzelement1\">test</a>",
|
||||||
|
"`\"'><img src=xxx:x \\x0Aonerror=javascript:alert(1)>",
|
||||||
|
"`\"'><img src=xxx:x \\x22onerror=javascript:alert(1)>",
|
||||||
|
"`\"'><img src=xxx:x \\x0Bonerror=javascript:alert(1)>",
|
||||||
|
"`\"'><img src=xxx:x \\x0Donerror=javascript:alert(1)>",
|
||||||
|
"`\"'><img src=xxx:x \\x2Fonerror=javascript:alert(1)>",
|
||||||
|
"`\"'><img src=xxx:x \\x09onerror=javascript:alert(1)>",
|
||||||
|
"`\"'><img src=xxx:x \\x0Conerror=javascript:alert(1)>",
|
||||||
|
"`\"'><img src=xxx:x \\x00onerror=javascript:alert(1)>",
|
||||||
|
"`\"'><img src=xxx:x \\x27onerror=javascript:alert(1)>",
|
||||||
|
"`\"'><img src=xxx:x \\x20onerror=javascript:alert(1)>",
|
||||||
|
"\"`'><script>\\x3Bjavascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\x0Djavascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xEF\\xBB\\xBFjavascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xE2\\x80\\x81javascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xE2\\x80\\x84javascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xE3\\x80\\x80javascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\x09javascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xE2\\x80\\x89javascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xE2\\x80\\x85javascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xE2\\x80\\x88javascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\x00javascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xE2\\x80\\xA8javascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xE2\\x80\\x8Ajavascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xE1\\x9A\\x80javascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\x0Cjavascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\x2Bjavascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xF0\\x90\\x96\\x9Ajavascript:alert(1)</script>",
|
||||||
|
"\"`'><script>-javascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\x0Ajavascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xE2\\x80\\xAFjavascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\x7Ejavascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xE2\\x80\\x87javascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xE2\\x81\\x9Fjavascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xE2\\x80\\xA9javascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xC2\\x85javascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xEF\\xBF\\xAEjavascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xE2\\x80\\x83javascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xE2\\x80\\x8Bjavascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xEF\\xBF\\xBEjavascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xE2\\x80\\x80javascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\x21javascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xE2\\x80\\x82javascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xE2\\x80\\x86javascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xE1\\xA0\\x8Ejavascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\x0Bjavascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\x20javascript:alert(1)</script>",
|
||||||
|
"\"`'><script>\\xC2\\xA0javascript:alert(1)</script>",
|
||||||
|
"<img \\x00src=x onerror=\"alert(1)\">",
|
||||||
|
"<img \\x47src=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img \\x11src=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img \\x12src=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img\\x47src=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img\\x10src=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img\\x13src=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img\\x32src=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img\\x47src=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img\\x11src=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img \\x47src=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img \\x34src=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img \\x39src=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img \\x00src=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img src\\x09=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img src\\x10=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img src\\x13=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img src\\x32=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img src\\x12=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img src\\x11=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img src\\x00=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img src\\x47=x onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img src=x\\x09onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img src=x\\x10onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img src=x\\x11onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img src=x\\x12onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img src=x\\x13onerror=\"javascript:alert(1)\">",
|
||||||
|
"<img[a][b][c]src[d]=x[e]onerror=[f]\"alert(1)\">",
|
||||||
|
"<img src=x onerror=\\x09\"javascript:alert(1)\">",
|
||||||
|
"<img src=x onerror=\\x10\"javascript:alert(1)\">",
|
||||||
|
"<img src=x onerror=\\x11\"javascript:alert(1)\">",
|
||||||
|
"<img src=x onerror=\\x12\"javascript:alert(1)\">",
|
||||||
|
"<img src=x onerror=\\x32\"javascript:alert(1)\">",
|
||||||
|
"<img src=x onerror=\\x00\"javascript:alert(1)\">",
|
||||||
|
"<a href=javascript:javascript:alert(1)>XXX</a>",
|
||||||
|
"<img src=\"x` `<script>javascript:alert(1)</script>\"` `>",
|
||||||
|
"<img src onerror /\" '\"= alt=javascript:alert(1)//\">",
|
||||||
|
"<title onpropertychange=javascript:alert(1)></title><title title=>",
|
||||||
|
"<a href=http://foo.bar/#x=`y></a><img alt=\"`><img src=x:x onerror=javascript:alert(1)></a>\">",
|
||||||
|
"<!--[if]><script>javascript:alert(1)</script -->",
|
||||||
|
"<!--[if<img src=x onerror=javascript:alert(1)//]> -->",
|
||||||
|
"<script src=\"/\\%(jscript)s\"></script>",
|
||||||
|
"<script src=\"\\\\%(jscript)s\"></script>",
|
||||||
|
"<IMG \"\"\"><SCRIPT>alert(\"XSS\")</SCRIPT>\">",
|
||||||
|
"<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>",
|
||||||
|
"<IMG SRC=# onmouseover=\"alert('xxs')\">",
|
||||||
|
"<IMG SRC= onmouseover=\"alert('xxs')\">",
|
||||||
|
"<IMG onmouseover=\"alert('xxs')\">",
|
||||||
|
"<IMG SRC=javascript:alert('XSS')>",
|
||||||
|
"<IMG SRC=javascript:alert('XSS')>",
|
||||||
|
"<IMG SRC=javascript:alert('XSS')>",
|
||||||
|
"<IMG SRC=\"jav ascript:alert('XSS');\">",
|
||||||
|
"<IMG SRC=\"jav	ascript:alert('XSS');\">",
|
||||||
|
"<IMG SRC=\"jav
ascript:alert('XSS');\">",
|
||||||
|
"<IMG SRC=\"jav
ascript:alert('XSS');\">",
|
||||||
|
"perl -e 'print \"<IMG SRC=java\\0script:alert(\\\"XSS\\\")>\";' > out",
|
||||||
|
"<IMG SRC=\"  javascript:alert('XSS');\">",
|
||||||
|
"<SCRIPT/XSS SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT>",
|
||||||
|
"<BODY onload!#$%&()*~+-_.,:;?@[/|\\]^`=alert(\"XSS\")>",
|
||||||
|
"<SCRIPT/SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT>",
|
||||||
|
"<<SCRIPT>alert(\"XSS\");//<</SCRIPT>",
|
||||||
|
"<SCRIPT SRC=http://ha.ckers.org/xss.js?< B >",
|
||||||
|
"<SCRIPT SRC=//ha.ckers.org/.j>",
|
||||||
|
"<IMG SRC=\"javascript:alert('XSS')\"",
|
||||||
|
"<iframe src=http://ha.ckers.org/scriptlet.html <",
|
||||||
|
"\\\";alert('XSS');//",
|
||||||
|
"<u oncopy=alert()> Copy me</u>",
|
||||||
|
"<i onwheel=alert(1)> Scroll over me </i>",
|
||||||
|
"<plaintext>",
|
||||||
|
"http://a/%%30%30",
|
||||||
|
"</textarea><script>alert(123)</script>",
|
||||||
|
"1;DROP TABLE users",
|
||||||
|
"1'; DROP TABLE users-- 1",
|
||||||
|
"' OR 1=1 -- 1",
|
||||||
|
"' OR '1'='1",
|
||||||
|
" ",
|
||||||
|
"%",
|
||||||
|
"_",
|
||||||
|
"-",
|
||||||
|
"--",
|
||||||
|
"--version",
|
||||||
|
"--help",
|
||||||
|
"$USER",
|
||||||
|
"/dev/null; touch /tmp/blns.fail ; echo",
|
||||||
|
"`touch /tmp/blns.fail`",
|
||||||
|
"$(touch /tmp/blns.fail)",
|
||||||
|
"@{[system \"touch /tmp/blns.fail\"]}",
|
||||||
|
"eval(\"puts 'hello world'\")",
|
||||||
|
"System(\"ls -al /\")",
|
||||||
|
"`ls -al /`",
|
||||||
|
"Kernel.exec(\"ls -al /\")",
|
||||||
|
"Kernel.exit(1)",
|
||||||
|
"%x('ls -al /')",
|
||||||
|
"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><!DOCTYPE foo [ <!ELEMENT foo ANY ><!ENTITY xxe SYSTEM \"file:///etc/passwd\" >]><foo>&xxe;</foo>",
|
||||||
|
"$HOME",
|
||||||
|
"$ENV{'HOME'}",
|
||||||
|
"%d",
|
||||||
|
"%s",
|
||||||
|
"{0}",
|
||||||
|
"%*.*s",
|
||||||
|
"../../../../../../../../../../../etc/passwd%00",
|
||||||
|
"../../../../../../../../../../../etc/hosts",
|
||||||
|
"() { 0; }; touch /tmp/blns.shellshock1.fail;",
|
||||||
|
"() { _; } >_[$($())] { touch /tmp/blns.shellshock2.fail; }",
|
||||||
|
"+++ATH0",
|
||||||
|
"<<< %s(un='%s') = %u",
|
||||||
|
"CON",
|
||||||
|
"PRN",
|
||||||
|
"AUX",
|
||||||
|
"CLOCK$",
|
||||||
|
"NUL",
|
||||||
|
"A:",
|
||||||
|
"ZZ:",
|
||||||
|
"COM1",
|
||||||
|
"LPT1",
|
||||||
|
"LPT2",
|
||||||
|
"LPT3",
|
||||||
|
"COM2",
|
||||||
|
"COM3",
|
||||||
|
"COM4",
|
||||||
|
"DCC SEND STARTKEYLOGGER 0 0 0",
|
||||||
|
"Scunthorpe General Hospital",
|
||||||
|
"Penistone Community Church",
|
||||||
|
"Lightwater Country Park",
|
||||||
|
"Jimmy Clitheroe",
|
||||||
|
"Horniman Museum",
|
||||||
|
"shitake mushrooms",
|
||||||
|
"RomansInSussex.co.uk",
|
||||||
|
"http://www.cum.qc.ca/",
|
||||||
|
"Craig Cockburn, Software Specialist",
|
||||||
|
"Linda Callahan",
|
||||||
|
"Dr. Herman I. Libshitz",
|
||||||
|
"magna cum laude",
|
||||||
|
"Super Bowl XXX",
|
||||||
|
"medieval erection of parapets",
|
||||||
|
"evaluate",
|
||||||
|
"mocha",
|
||||||
|
"expression",
|
||||||
|
"Arsenal canal",
|
||||||
|
"classic",
|
||||||
|
"Tyson Gay",
|
||||||
|
"Dick Van Dyke",
|
||||||
|
"basement",
|
||||||
|
"If you're reading this, you've been in a coma for almost 20 years now. We're trying a new technique. We don't know where this message will end up in your dream, but we hope it works. Please wake up, we miss you.",
|
||||||
|
"Roses are \u001b[0;31mred\u001b[0m, violets are \u001b[0;34mblue. Hope you enjoy terminal hue",
|
||||||
|
"But now...\u001b[20Cfor my greatest trick...\u001b[8m",
|
||||||
|
"The quic\b\b\b\b\b\bk brown fo\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007x... [Beeeep]",
|
||||||
|
"Powerلُلُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ冗"
|
||||||
|
]
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (fuzz test support)
|
__| | __| | | | JSON for Modern C++ (fuzz test support)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
This file implements a driver for American Fuzzy Lop (afl-fuzz). It relies on
|
This file implements a driver for American Fuzzy Lop (afl-fuzz). It relies on
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (fuzz test support)
|
__| | __| | | | JSON for Modern C++ (fuzz test support)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
This file implements a parser test suitable for fuzz testing. Given a byte
|
This file implements a parser test suitable for fuzz testing. Given a byte
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (fuzz test support)
|
__| | __| | | | JSON for Modern C++ (fuzz test support)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
This file implements a parser test suitable for fuzz testing. Given a byte
|
This file implements a parser test suitable for fuzz testing. Given a byte
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (fuzz test support)
|
__| | __| | | | JSON for Modern C++ (fuzz test support)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
This file implements a parser test suitable for fuzz testing. Given a byte
|
This file implements a parser test suitable for fuzz testing. Given a byte
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
@ -80,7 +80,7 @@ struct my_allocator : std::allocator<T>
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
::new(reinterpret_cast<void*>(p)) T(std::forward<Args>(args)...);
|
::new (reinterpret_cast<void*>(p)) T(std::forward<Args>(args)...);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
@ -1187,7 +1187,7 @@ TEST_CASE("single CBOR roundtrip")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("CBOR regressions")
|
TEST_CASE("CBOR regressions", "[!throws]")
|
||||||
{
|
{
|
||||||
SECTION("fuzz test results")
|
SECTION("fuzz test results")
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
@ -91,7 +91,7 @@ TEST_CASE("const_iterator class")
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::const_iterator it(&j);
|
json::const_iterator it(&j);
|
||||||
it.set_begin();
|
it.set_begin();
|
||||||
CHECK(it == j.cbegin());
|
CHECK((it == j.cbegin()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
|
@ -99,7 +99,7 @@ TEST_CASE("const_iterator class")
|
||||||
json j(json::value_t::object);
|
json j(json::value_t::object);
|
||||||
json::const_iterator it(&j);
|
json::const_iterator it(&j);
|
||||||
it.set_begin();
|
it.set_begin();
|
||||||
CHECK(it == j.cbegin());
|
CHECK((it == j.cbegin()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
|
@ -107,7 +107,7 @@ TEST_CASE("const_iterator class")
|
||||||
json j(json::value_t::array);
|
json j(json::value_t::array);
|
||||||
json::const_iterator it(&j);
|
json::const_iterator it(&j);
|
||||||
it.set_begin();
|
it.set_begin();
|
||||||
CHECK(it == j.cbegin());
|
CHECK((it == j.cbegin()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,7 +118,7 @@ TEST_CASE("const_iterator class")
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::const_iterator it(&j);
|
json::const_iterator it(&j);
|
||||||
it.set_end();
|
it.set_end();
|
||||||
CHECK(it == j.cend());
|
CHECK((it == j.cend()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
|
@ -126,7 +126,7 @@ TEST_CASE("const_iterator class")
|
||||||
json j(json::value_t::object);
|
json j(json::value_t::object);
|
||||||
json::const_iterator it(&j);
|
json::const_iterator it(&j);
|
||||||
it.set_end();
|
it.set_end();
|
||||||
CHECK(it == j.cend());
|
CHECK((it == j.cend()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
|
@ -134,7 +134,7 @@ TEST_CASE("const_iterator class")
|
||||||
json j(json::value_t::array);
|
json j(json::value_t::array);
|
||||||
json::const_iterator it(&j);
|
json::const_iterator it(&j);
|
||||||
it.set_end();
|
it.set_end();
|
||||||
CHECK(it == j.cend());
|
CHECK((it == j.cend()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -220,48 +220,48 @@ 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(it.m_it.primitive_iterator == 1);
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
it++;
|
it++;
|
||||||
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
CHECK((it.m_it.primitive_iterator.m_it != 0 and it.m_it.primitive_iterator.m_it != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json j(17);
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator it = j.cbegin();
|
||||||
CHECK(it.m_it.primitive_iterator == 0);
|
CHECK((it.m_it.primitive_iterator.m_it == 0));
|
||||||
it++;
|
it++;
|
||||||
CHECK(it.m_it.primitive_iterator == 1);
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
it++;
|
it++;
|
||||||
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
CHECK((it.m_it.primitive_iterator.m_it != 0 and it.m_it.primitive_iterator.m_it != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j({{"foo", "bar"}});
|
json j({{"foo", "bar"}});
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator it = j.cbegin();
|
||||||
CHECK(it.m_it.object_iterator == it.m_object->m_value.object->begin());
|
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin()));
|
||||||
it++;
|
it++;
|
||||||
CHECK(it.m_it.object_iterator == it.m_object->m_value.object->end());
|
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j({1, 2, 3, 4});
|
json j({1, 2, 3, 4});
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator it = j.cbegin();
|
||||||
CHECK(it.m_it.array_iterator == it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin()));
|
||||||
it++;
|
it++;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
it++;
|
it++;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
it++;
|
it++;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
it++;
|
it++;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator == it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,48 +271,48 @@ 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(it.m_it.primitive_iterator == 1);
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
++it;
|
++it;
|
||||||
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
CHECK((it.m_it.primitive_iterator.m_it != 0 and it.m_it.primitive_iterator.m_it != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json j(17);
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator it = j.cbegin();
|
||||||
CHECK(it.m_it.primitive_iterator == 0);
|
CHECK((it.m_it.primitive_iterator.m_it == 0));
|
||||||
++it;
|
++it;
|
||||||
CHECK(it.m_it.primitive_iterator == 1);
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
++it;
|
++it;
|
||||||
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
CHECK((it.m_it.primitive_iterator.m_it != 0 and it.m_it.primitive_iterator.m_it != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j({{"foo", "bar"}});
|
json j({{"foo", "bar"}});
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator it = j.cbegin();
|
||||||
CHECK(it.m_it.object_iterator == it.m_object->m_value.object->begin());
|
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin()));
|
||||||
++it;
|
++it;
|
||||||
CHECK(it.m_it.object_iterator == it.m_object->m_value.object->end());
|
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j({1, 2, 3, 4});
|
json j({1, 2, 3, 4});
|
||||||
json::const_iterator it = j.cbegin();
|
json::const_iterator it = j.cbegin();
|
||||||
CHECK(it.m_it.array_iterator == it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin()));
|
||||||
++it;
|
++it;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
++it;
|
++it;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
++it;
|
++it;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
++it;
|
++it;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator == it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -322,46 +322,46 @@ TEST_CASE("const_iterator class")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::const_iterator it = j.cend();
|
json::const_iterator it = j.cend();
|
||||||
CHECK(it.m_it.primitive_iterator == 1);
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json j(17);
|
||||||
json::const_iterator it = j.cend();
|
json::const_iterator it = j.cend();
|
||||||
CHECK(it.m_it.primitive_iterator == 1);
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
it--;
|
it--;
|
||||||
CHECK(it.m_it.primitive_iterator == 0);
|
CHECK((it.m_it.primitive_iterator.m_it == 0));
|
||||||
it--;
|
it--;
|
||||||
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
CHECK((it.m_it.primitive_iterator.m_it != 0 and it.m_it.primitive_iterator.m_it != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j({{"foo", "bar"}});
|
json j({{"foo", "bar"}});
|
||||||
json::const_iterator it = j.cend();
|
json::const_iterator it = j.cend();
|
||||||
CHECK(it.m_it.object_iterator == it.m_object->m_value.object->end());
|
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end()));
|
||||||
it--;
|
it--;
|
||||||
CHECK(it.m_it.object_iterator == it.m_object->m_value.object->begin());
|
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j({1, 2, 3, 4});
|
json j({1, 2, 3, 4});
|
||||||
json::const_iterator it = j.cend();
|
json::const_iterator it = j.cend();
|
||||||
CHECK(it.m_it.array_iterator == it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end()));
|
||||||
it--;
|
it--;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
it--;
|
it--;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
it--;
|
it--;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
it--;
|
it--;
|
||||||
CHECK(it.m_it.array_iterator == it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -371,46 +371,46 @@ TEST_CASE("const_iterator class")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::const_iterator it = j.cend();
|
json::const_iterator it = j.cend();
|
||||||
CHECK(it.m_it.primitive_iterator == 1);
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json j(17);
|
||||||
json::const_iterator it = j.cend();
|
json::const_iterator it = j.cend();
|
||||||
CHECK(it.m_it.primitive_iterator == 1);
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
--it;
|
--it;
|
||||||
CHECK(it.m_it.primitive_iterator == 0);
|
CHECK((it.m_it.primitive_iterator.m_it == 0));
|
||||||
--it;
|
--it;
|
||||||
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
CHECK((it.m_it.primitive_iterator.m_it != 0 and it.m_it.primitive_iterator.m_it != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j({{"foo", "bar"}});
|
json j({{"foo", "bar"}});
|
||||||
json::const_iterator it = j.cend();
|
json::const_iterator it = j.cend();
|
||||||
CHECK(it.m_it.object_iterator == it.m_object->m_value.object->end());
|
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end()));
|
||||||
--it;
|
--it;
|
||||||
CHECK(it.m_it.object_iterator == it.m_object->m_value.object->begin());
|
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j({1, 2, 3, 4});
|
json j({1, 2, 3, 4});
|
||||||
json::const_iterator it = j.cend();
|
json::const_iterator it = j.cend();
|
||||||
CHECK(it.m_it.array_iterator == it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end()));
|
||||||
--it;
|
--it;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
--it;
|
--it;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
--it;
|
--it;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
--it;
|
--it;
|
||||||
CHECK(it.m_it.array_iterator == it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
@ -75,7 +75,7 @@ TEST_CASE("iterator class")
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::iterator it(&j);
|
json::iterator it(&j);
|
||||||
it.set_begin();
|
it.set_begin();
|
||||||
CHECK(it == j.begin());
|
CHECK((it == j.begin()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
|
@ -83,7 +83,7 @@ TEST_CASE("iterator class")
|
||||||
json j(json::value_t::object);
|
json j(json::value_t::object);
|
||||||
json::iterator it(&j);
|
json::iterator it(&j);
|
||||||
it.set_begin();
|
it.set_begin();
|
||||||
CHECK(it == j.begin());
|
CHECK((it == j.begin()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
|
@ -91,7 +91,7 @@ TEST_CASE("iterator class")
|
||||||
json j(json::value_t::array);
|
json j(json::value_t::array);
|
||||||
json::iterator it(&j);
|
json::iterator it(&j);
|
||||||
it.set_begin();
|
it.set_begin();
|
||||||
CHECK(it == j.begin());
|
CHECK((it == j.begin()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ TEST_CASE("iterator class")
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::iterator it(&j);
|
json::iterator it(&j);
|
||||||
it.set_end();
|
it.set_end();
|
||||||
CHECK(it == j.end());
|
CHECK((it == j.end()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
|
@ -110,7 +110,7 @@ TEST_CASE("iterator class")
|
||||||
json j(json::value_t::object);
|
json j(json::value_t::object);
|
||||||
json::iterator it(&j);
|
json::iterator it(&j);
|
||||||
it.set_end();
|
it.set_end();
|
||||||
CHECK(it == j.end());
|
CHECK((it == j.end()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
|
@ -118,7 +118,7 @@ TEST_CASE("iterator class")
|
||||||
json j(json::value_t::array);
|
json j(json::value_t::array);
|
||||||
json::iterator it(&j);
|
json::iterator it(&j);
|
||||||
it.set_end();
|
it.set_end();
|
||||||
CHECK(it == j.end());
|
CHECK((it == j.end()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -204,48 +204,48 @@ 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(it.m_it.primitive_iterator == 1);
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
it++;
|
it++;
|
||||||
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
CHECK((it.m_it.primitive_iterator.m_it != 0 and it.m_it.primitive_iterator.m_it != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json j(17);
|
||||||
json::iterator it = j.begin();
|
json::iterator it = j.begin();
|
||||||
CHECK(it.m_it.primitive_iterator == 0);
|
CHECK((it.m_it.primitive_iterator.m_it == 0));
|
||||||
it++;
|
it++;
|
||||||
CHECK(it.m_it.primitive_iterator == 1);
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
it++;
|
it++;
|
||||||
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
CHECK((it.m_it.primitive_iterator.m_it != 0 and it.m_it.primitive_iterator.m_it != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j({{"foo", "bar"}});
|
json j({{"foo", "bar"}});
|
||||||
json::iterator it = j.begin();
|
json::iterator it = j.begin();
|
||||||
CHECK(it.m_it.object_iterator == it.m_object->m_value.object->begin());
|
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin()));
|
||||||
it++;
|
it++;
|
||||||
CHECK(it.m_it.object_iterator == it.m_object->m_value.object->end());
|
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j({1, 2, 3, 4});
|
json j({1, 2, 3, 4});
|
||||||
json::iterator it = j.begin();
|
json::iterator it = j.begin();
|
||||||
CHECK(it.m_it.array_iterator == it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin()));
|
||||||
it++;
|
it++;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
it++;
|
it++;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
it++;
|
it++;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
it++;
|
it++;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator == it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -255,48 +255,48 @@ 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(it.m_it.primitive_iterator == 1);
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
++it;
|
++it;
|
||||||
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
CHECK((it.m_it.primitive_iterator.m_it != 0 and it.m_it.primitive_iterator.m_it != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json j(17);
|
||||||
json::iterator it = j.begin();
|
json::iterator it = j.begin();
|
||||||
CHECK(it.m_it.primitive_iterator == 0);
|
CHECK((it.m_it.primitive_iterator.m_it == 0));
|
||||||
++it;
|
++it;
|
||||||
CHECK(it.m_it.primitive_iterator == 1);
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
++it;
|
++it;
|
||||||
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
CHECK((it.m_it.primitive_iterator.m_it != 0 and it.m_it.primitive_iterator.m_it != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j({{"foo", "bar"}});
|
json j({{"foo", "bar"}});
|
||||||
json::iterator it = j.begin();
|
json::iterator it = j.begin();
|
||||||
CHECK(it.m_it.object_iterator == it.m_object->m_value.object->begin());
|
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin()));
|
||||||
++it;
|
++it;
|
||||||
CHECK(it.m_it.object_iterator == it.m_object->m_value.object->end());
|
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j({1, 2, 3, 4});
|
json j({1, 2, 3, 4});
|
||||||
json::iterator it = j.begin();
|
json::iterator it = j.begin();
|
||||||
CHECK(it.m_it.array_iterator == it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin()));
|
||||||
++it;
|
++it;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
++it;
|
++it;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
++it;
|
++it;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
++it;
|
++it;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator == it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -306,46 +306,46 @@ TEST_CASE("iterator class")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::iterator it = j.end();
|
json::iterator it = j.end();
|
||||||
CHECK(it.m_it.primitive_iterator == 1);
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json j(17);
|
||||||
json::iterator it = j.end();
|
json::iterator it = j.end();
|
||||||
CHECK(it.m_it.primitive_iterator == 1);
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
it--;
|
it--;
|
||||||
CHECK(it.m_it.primitive_iterator == 0);
|
CHECK((it.m_it.primitive_iterator.m_it == 0));
|
||||||
it--;
|
it--;
|
||||||
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
CHECK((it.m_it.primitive_iterator.m_it != 0 and it.m_it.primitive_iterator.m_it != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j({{"foo", "bar"}});
|
json j({{"foo", "bar"}});
|
||||||
json::iterator it = j.end();
|
json::iterator it = j.end();
|
||||||
CHECK(it.m_it.object_iterator == it.m_object->m_value.object->end());
|
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end()));
|
||||||
it--;
|
it--;
|
||||||
CHECK(it.m_it.object_iterator == it.m_object->m_value.object->begin());
|
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j({1, 2, 3, 4});
|
json j({1, 2, 3, 4});
|
||||||
json::iterator it = j.end();
|
json::iterator it = j.end();
|
||||||
CHECK(it.m_it.array_iterator == it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end()));
|
||||||
it--;
|
it--;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
it--;
|
it--;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
it--;
|
it--;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
it--;
|
it--;
|
||||||
CHECK(it.m_it.array_iterator == it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -355,46 +355,46 @@ TEST_CASE("iterator class")
|
||||||
{
|
{
|
||||||
json j(json::value_t::null);
|
json j(json::value_t::null);
|
||||||
json::iterator it = j.end();
|
json::iterator it = j.end();
|
||||||
CHECK(it.m_it.primitive_iterator == 1);
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("number")
|
SECTION("number")
|
||||||
{
|
{
|
||||||
json j(17);
|
json j(17);
|
||||||
json::iterator it = j.end();
|
json::iterator it = j.end();
|
||||||
CHECK(it.m_it.primitive_iterator == 1);
|
CHECK((it.m_it.primitive_iterator.m_it == 1));
|
||||||
--it;
|
--it;
|
||||||
CHECK(it.m_it.primitive_iterator == 0);
|
CHECK((it.m_it.primitive_iterator.m_it == 0));
|
||||||
--it;
|
--it;
|
||||||
CHECK((it.m_it.primitive_iterator != 0 and it.m_it.primitive_iterator != 1));
|
CHECK((it.m_it.primitive_iterator.m_it != 0 and it.m_it.primitive_iterator.m_it != 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("object")
|
SECTION("object")
|
||||||
{
|
{
|
||||||
json j({{"foo", "bar"}});
|
json j({{"foo", "bar"}});
|
||||||
json::iterator it = j.end();
|
json::iterator it = j.end();
|
||||||
CHECK(it.m_it.object_iterator == it.m_object->m_value.object->end());
|
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->end()));
|
||||||
--it;
|
--it;
|
||||||
CHECK(it.m_it.object_iterator == it.m_object->m_value.object->begin());
|
CHECK((it.m_it.object_iterator == it.m_object->m_value.object->begin()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j({1, 2, 3, 4});
|
json j({1, 2, 3, 4});
|
||||||
json::iterator it = j.end();
|
json::iterator it = j.end();
|
||||||
CHECK(it.m_it.array_iterator == it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->end()));
|
||||||
--it;
|
--it;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
--it;
|
--it;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
--it;
|
--it;
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
--it;
|
--it;
|
||||||
CHECK(it.m_it.array_iterator == it.m_object->m_value.array->begin());
|
CHECK((it.m_it.array_iterator == it.m_object->m_value.array->begin()));
|
||||||
CHECK(it.m_it.array_iterator != it.m_object->m_value.array->end());
|
CHECK((it.m_it.array_iterator != it.m_object->m_value.array->end()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
@ -38,86 +38,86 @@ TEST_CASE("lexer class")
|
||||||
{
|
{
|
||||||
SECTION("structural characters")
|
SECTION("structural characters")
|
||||||
{
|
{
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("["),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("["),
|
||||||
1).scan() == json::lexer::token_type::begin_array);
|
1).scan() == json::lexer::token_type::begin_array));
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("]"),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("]"),
|
||||||
1).scan() == json::lexer::token_type::end_array);
|
1).scan() == json::lexer::token_type::end_array));
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("{"),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("{"),
|
||||||
1).scan() == json::lexer::token_type::begin_object);
|
1).scan() == json::lexer::token_type::begin_object));
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("}"),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("}"),
|
||||||
1).scan() == json::lexer::token_type::end_object);
|
1).scan() == json::lexer::token_type::end_object));
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>(","),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>(","),
|
||||||
1).scan() == json::lexer::token_type::value_separator);
|
1).scan() == json::lexer::token_type::value_separator));
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>(":"),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>(":"),
|
||||||
1).scan() == json::lexer::token_type::name_separator);
|
1).scan() == json::lexer::token_type::name_separator));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("literal names")
|
SECTION("literal names")
|
||||||
{
|
{
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("null"),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("null"),
|
||||||
4).scan() == json::lexer::token_type::literal_null);
|
4).scan() == json::lexer::token_type::literal_null));
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("true"),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("true"),
|
||||||
4).scan() == json::lexer::token_type::literal_true);
|
4).scan() == json::lexer::token_type::literal_true));
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("false"),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("false"),
|
||||||
5).scan() == json::lexer::token_type::literal_false);
|
5).scan() == json::lexer::token_type::literal_false));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("numbers")
|
SECTION("numbers")
|
||||||
{
|
{
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("0"),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("0"),
|
||||||
1).scan() == json::lexer::token_type::value_number);
|
1).scan() == json::lexer::token_type::value_number));
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("1"),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("1"),
|
||||||
1).scan() == json::lexer::token_type::value_number);
|
1).scan() == json::lexer::token_type::value_number));
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("2"),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("2"),
|
||||||
1).scan() == json::lexer::token_type::value_number);
|
1).scan() == json::lexer::token_type::value_number));
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("3"),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("3"),
|
||||||
1).scan() == json::lexer::token_type::value_number);
|
1).scan() == json::lexer::token_type::value_number));
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("4"),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("4"),
|
||||||
1).scan() == json::lexer::token_type::value_number);
|
1).scan() == json::lexer::token_type::value_number));
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("5"),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("5"),
|
||||||
1).scan() == json::lexer::token_type::value_number);
|
1).scan() == json::lexer::token_type::value_number));
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("6"),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("6"),
|
||||||
1).scan() == json::lexer::token_type::value_number);
|
1).scan() == json::lexer::token_type::value_number));
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("7"),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("7"),
|
||||||
1).scan() == json::lexer::token_type::value_number);
|
1).scan() == json::lexer::token_type::value_number));
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("8"),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("8"),
|
||||||
1).scan() == json::lexer::token_type::value_number);
|
1).scan() == json::lexer::token_type::value_number));
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("9"),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("9"),
|
||||||
1).scan() == json::lexer::token_type::value_number);
|
1).scan() == json::lexer::token_type::value_number));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("whitespace")
|
SECTION("whitespace")
|
||||||
{
|
{
|
||||||
// result is end_of_input, because not token is following
|
// result is end_of_input, because not token is following
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>(" "),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>(" "),
|
||||||
1).scan() == json::lexer::token_type::end_of_input);
|
1).scan() == json::lexer::token_type::end_of_input));
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("\t"),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("\t"),
|
||||||
1).scan() == json::lexer::token_type::end_of_input);
|
1).scan() == json::lexer::token_type::end_of_input));
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("\n"),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("\n"),
|
||||||
1).scan() == json::lexer::token_type::end_of_input);
|
1).scan() == json::lexer::token_type::end_of_input));
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("\r"),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>("\r"),
|
||||||
1).scan() == json::lexer::token_type::end_of_input);
|
1).scan() == json::lexer::token_type::end_of_input));
|
||||||
CHECK(json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>(" \t\n\r\n\t "),
|
CHECK((json::lexer(reinterpret_cast<const json::lexer::lexer_char_t*>(" \t\n\r\n\t "),
|
||||||
7).scan() == json::lexer::token_type::end_of_input);
|
7).scan() == json::lexer::token_type::end_of_input));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("token_type_name")
|
SECTION("token_type_name")
|
||||||
{
|
{
|
||||||
CHECK(json::lexer::token_type_name(json::lexer::token_type::uninitialized) == "<uninitialized>");
|
CHECK((json::lexer::token_type_name(json::lexer::token_type::uninitialized) == "<uninitialized>"));
|
||||||
CHECK(json::lexer::token_type_name(json::lexer::token_type::literal_true) == "true literal");
|
CHECK((json::lexer::token_type_name(json::lexer::token_type::literal_true) == "true literal"));
|
||||||
CHECK(json::lexer::token_type_name(json::lexer::token_type::literal_false) == "false literal");
|
CHECK((json::lexer::token_type_name(json::lexer::token_type::literal_false) == "false literal"));
|
||||||
CHECK(json::lexer::token_type_name(json::lexer::token_type::literal_null) == "null literal");
|
CHECK((json::lexer::token_type_name(json::lexer::token_type::literal_null) == "null literal"));
|
||||||
CHECK(json::lexer::token_type_name(json::lexer::token_type::value_string) == "string literal");
|
CHECK((json::lexer::token_type_name(json::lexer::token_type::value_string) == "string literal"));
|
||||||
CHECK(json::lexer::token_type_name(json::lexer::token_type::value_number) == "number literal");
|
CHECK((json::lexer::token_type_name(json::lexer::token_type::value_number) == "number literal"));
|
||||||
CHECK(json::lexer::token_type_name(json::lexer::token_type::begin_array) == "'['");
|
CHECK((json::lexer::token_type_name(json::lexer::token_type::begin_array) == "'['"));
|
||||||
CHECK(json::lexer::token_type_name(json::lexer::token_type::begin_object) == "'{'");
|
CHECK((json::lexer::token_type_name(json::lexer::token_type::begin_object) == "'{'"));
|
||||||
CHECK(json::lexer::token_type_name(json::lexer::token_type::end_array) == "']'");
|
CHECK((json::lexer::token_type_name(json::lexer::token_type::end_array) == "']'"));
|
||||||
CHECK(json::lexer::token_type_name(json::lexer::token_type::end_object) == "'}'");
|
CHECK((json::lexer::token_type_name(json::lexer::token_type::end_object) == "'}'"));
|
||||||
CHECK(json::lexer::token_type_name(json::lexer::token_type::name_separator) == "':'");
|
CHECK((json::lexer::token_type_name(json::lexer::token_type::name_separator) == "':'"));
|
||||||
CHECK(json::lexer::token_type_name(json::lexer::token_type::value_separator) == "','");
|
CHECK((json::lexer::token_type_name(json::lexer::token_type::value_separator) == "','"));
|
||||||
CHECK(json::lexer::token_type_name(json::lexer::token_type::parse_error) == "<parse error>");
|
CHECK((json::lexer::token_type_name(json::lexer::token_type::parse_error) == "<parse error>"));
|
||||||
CHECK(json::lexer::token_type_name(json::lexer::token_type::end_of_input) == "end of input");
|
CHECK((json::lexer::token_type_name(json::lexer::token_type::end_of_input) == "end of input"));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("parse errors on first character")
|
SECTION("parse errors on first character")
|
||||||
|
@ -150,7 +150,7 @@ TEST_CASE("lexer class")
|
||||||
case ('8'):
|
case ('8'):
|
||||||
case ('9'):
|
case ('9'):
|
||||||
{
|
{
|
||||||
CHECK(res != json::lexer::token_type::parse_error);
|
CHECK((res != json::lexer::token_type::parse_error));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -160,14 +160,14 @@ TEST_CASE("lexer class")
|
||||||
case ('\n'):
|
case ('\n'):
|
||||||
case ('\r'):
|
case ('\r'):
|
||||||
{
|
{
|
||||||
CHECK(res == json::lexer::token_type::end_of_input);
|
CHECK((res == json::lexer::token_type::end_of_input));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// anything else is not expected
|
// anything else is not expected
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
CHECK(res == json::lexer::token_type::parse_error);
|
CHECK((res == json::lexer::token_type::parse_error));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
@ -912,7 +912,7 @@ TEST_CASE("constructors")
|
||||||
|
|
||||||
SECTION("array")
|
SECTION("array")
|
||||||
{
|
{
|
||||||
json j { {"one", 1}, {"two", 1u}, {"three", 2.2}, {"four", false} , 13 };
|
json j { {"one", 1}, {"two", 1u}, {"three", 2.2}, {"four", false}, 13 };
|
||||||
CHECK(j.type() == json::value_t::array);
|
CHECK(j.type() == json::value_t::array);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
@ -160,12 +160,30 @@ TEST_CASE("value conversion")
|
||||||
{
|
{
|
||||||
std::forward_list<json> a = j.get<std::forward_list<json>>();
|
std::forward_list<json> a = j.get<std::forward_list<json>>();
|
||||||
CHECK(json(a) == j);
|
CHECK(json(a) == j);
|
||||||
|
|
||||||
|
CHECK_THROWS_AS(json(json::value_t::null).get<std::forward_list<json>>(), std::logic_error);
|
||||||
|
CHECK_THROWS_WITH(json(json::value_t::null).get<std::forward_list<json>>(),
|
||||||
|
"type must be array, but is null");
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::vector<json>")
|
SECTION("std::vector<json>")
|
||||||
{
|
{
|
||||||
std::vector<json> a = j.get<std::vector<json>>();
|
std::vector<json> a = j.get<std::vector<json>>();
|
||||||
CHECK(json(a) == j);
|
CHECK(json(a) == j);
|
||||||
|
|
||||||
|
CHECK_THROWS_AS(json(json::value_t::null).get<std::vector<json>>(), std::logic_error);
|
||||||
|
CHECK_THROWS_WITH(json(json::value_t::null).get<std::vector<json>>(),
|
||||||
|
"type must be array, but is null");
|
||||||
|
|
||||||
|
#if not defined(JSON_NOEXCEPTION)
|
||||||
|
SECTION("reserve is called on containers that supports it")
|
||||||
|
{
|
||||||
|
// making the call to from_json throw in order to check capacity
|
||||||
|
std::vector<float> v;
|
||||||
|
CHECK_THROWS_AS(nlohmann::from_json(j, v), std::logic_error);
|
||||||
|
CHECK(v.capacity() == j.size());
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("std::deque<json>")
|
SECTION("std::deque<json>")
|
||||||
|
@ -184,6 +202,8 @@ TEST_CASE("value conversion")
|
||||||
CHECK_THROWS_AS(json(json::value_t::number_unsigned).get<json::array_t>(), std::logic_error);
|
CHECK_THROWS_AS(json(json::value_t::number_unsigned).get<json::array_t>(), std::logic_error);
|
||||||
CHECK_THROWS_AS(json(json::value_t::number_float).get<json::array_t>(), std::logic_error);
|
CHECK_THROWS_AS(json(json::value_t::number_float).get<json::array_t>(), std::logic_error);
|
||||||
|
|
||||||
|
CHECK_THROWS_WITH(json(json::value_t::object).get<std::vector<int>>(),
|
||||||
|
"type must be array, but is object");
|
||||||
CHECK_THROWS_WITH(json(json::value_t::null).get<json::array_t>(),
|
CHECK_THROWS_WITH(json(json::value_t::null).get<json::array_t>(),
|
||||||
"type must be array, but is null");
|
"type must be array, but is null");
|
||||||
CHECK_THROWS_WITH(json(json::value_t::object).get<json::array_t>(),
|
CHECK_THROWS_WITH(json(json::value_t::object).get<json::array_t>(),
|
||||||
|
@ -1004,6 +1024,8 @@ TEST_CASE("value conversion")
|
||||||
CHECK_THROWS_AS((json().get<std::vector<json>>()), std::logic_error);
|
CHECK_THROWS_AS((json().get<std::vector<json>>()), std::logic_error);
|
||||||
CHECK_THROWS_AS((json().get<std::list<json>>()), std::logic_error);
|
CHECK_THROWS_AS((json().get<std::list<json>>()), std::logic_error);
|
||||||
|
|
||||||
|
// does type really must be an array? or it rather must not be null?
|
||||||
|
// that's what I thought when other test like this one broke
|
||||||
CHECK_THROWS_WITH((json().get<std::list<int>>()), "type must be array, but is null");
|
CHECK_THROWS_WITH((json().get<std::list<int>>()), "type must be array, but is null");
|
||||||
CHECK_THROWS_WITH((json().get<std::vector<int>>()), "type must be array, but is null");
|
CHECK_THROWS_WITH((json().get<std::vector<int>>()), "type must be array, but is null");
|
||||||
CHECK_THROWS_WITH((json().get<std::vector<json>>()), "type must be array, but is null");
|
CHECK_THROWS_WITH((json().get<std::vector<json>>()), "type must be array, but is null");
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
@ -298,25 +298,6 @@ TEST_CASE("element access 2")
|
||||||
CHECK(j_const.value("/array"_json_pointer, json({10, 100})) == json({1, 2, 3}));
|
CHECK(j_const.value("/array"_json_pointer, json({10, 100})) == json({1, 2, 3}));
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("access non-existing value")
|
|
||||||
{
|
|
||||||
CHECK(j.value("/not/existing"_json_pointer, 2) == 2);
|
|
||||||
CHECK(j.value("/not/existing"_json_pointer, 2u) == 2u);
|
|
||||||
CHECK(j.value("/not/existing"_json_pointer, false) == false);
|
|
||||||
CHECK(j.value("/not/existing"_json_pointer, "bar") == "bar");
|
|
||||||
CHECK(j.value("/not/existing"_json_pointer, 12.34) == Approx(12.34));
|
|
||||||
CHECK(j.value("/not/existing"_json_pointer, json({{"foo", "bar"}})) == json({{"foo", "bar"}}));
|
|
||||||
CHECK(j.value("/not/existing"_json_pointer, json({10, 100})) == json({10, 100}));
|
|
||||||
|
|
||||||
CHECK(j_const.value("/not/existing"_json_pointer, 2) == 2);
|
|
||||||
CHECK(j_const.value("/not/existing"_json_pointer, 2u) == 2u);
|
|
||||||
CHECK(j_const.value("/not/existing"_json_pointer, false) == false);
|
|
||||||
CHECK(j_const.value("/not/existing"_json_pointer, "bar") == "bar");
|
|
||||||
CHECK(j_const.value("/not/existing"_json_pointer, 12.34) == Approx(12.34));
|
|
||||||
CHECK(j_const.value("/not/existing"_json_pointer, json({{"foo", "bar"}})) == json({{"foo", "bar"}}));
|
|
||||||
CHECK(j_const.value("/not/existing"_json_pointer, json({10, 100})) == json({10, 100}));
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("access on non-object type")
|
SECTION("access on non-object type")
|
||||||
{
|
{
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
|
@ -957,3 +938,37 @@ TEST_CASE("element access 2")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("element access 2 (throwing tests)", "[!throws]")
|
||||||
|
{
|
||||||
|
SECTION("object")
|
||||||
|
{
|
||||||
|
json j = {{"integer", 1}, {"unsigned", 1u}, {"floating", 42.23}, {"null", nullptr}, {"string", "hello world"}, {"boolean", true}, {"object", json::object()}, {"array", {1, 2, 3}}};
|
||||||
|
const json j_const = j;
|
||||||
|
|
||||||
|
SECTION("access specified element with default value")
|
||||||
|
{
|
||||||
|
SECTION("given a JSON pointer")
|
||||||
|
{
|
||||||
|
SECTION("access non-existing value")
|
||||||
|
{
|
||||||
|
CHECK(j.value("/not/existing"_json_pointer, 2) == 2);
|
||||||
|
CHECK(j.value("/not/existing"_json_pointer, 2u) == 2u);
|
||||||
|
CHECK(j.value("/not/existing"_json_pointer, false) == false);
|
||||||
|
CHECK(j.value("/not/existing"_json_pointer, "bar") == "bar");
|
||||||
|
CHECK(j.value("/not/existing"_json_pointer, 12.34) == Approx(12.34));
|
||||||
|
CHECK(j.value("/not/existing"_json_pointer, json({{"foo", "bar"}})) == json({{"foo", "bar"}}));
|
||||||
|
CHECK(j.value("/not/existing"_json_pointer, json({10, 100})) == json({10, 100}));
|
||||||
|
|
||||||
|
CHECK(j_const.value("/not/existing"_json_pointer, 2) == 2);
|
||||||
|
CHECK(j_const.value("/not/existing"_json_pointer, 2u) == 2u);
|
||||||
|
CHECK(j_const.value("/not/existing"_json_pointer, false) == false);
|
||||||
|
CHECK(j_const.value("/not/existing"_json_pointer, "bar") == "bar");
|
||||||
|
CHECK(j_const.value("/not/existing"_json_pointer, 12.34) == Approx(12.34));
|
||||||
|
CHECK(j_const.value("/not/existing"_json_pointer, json({{"foo", "bar"}})) == json({{"foo", "bar"}}));
|
||||||
|
CHECK(j_const.value("/not/existing"_json_pointer, json({10, 100})) == json({10, 100}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
|
40
test/src/unit-meta.cpp
Normal file
40
test/src/unit-meta.cpp
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
__ _____ _____ _____
|
||||||
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
|
| | |__ | | | | | | version 2.1.0
|
||||||
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
Copyright (c) 2013-2016 Niels Lohmann <http://nlohmann.me>.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "catch.hpp"
|
||||||
|
|
||||||
|
#include "json.hpp"
|
||||||
|
using nlohmann::json;
|
||||||
|
|
||||||
|
TEST_CASE("version information")
|
||||||
|
{
|
||||||
|
SECTION("version()")
|
||||||
|
{
|
||||||
|
CHECK(json::meta()["name"] == "JSON for Modern C++");
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
|
59
test/src/unit-noexcept.cpp
Normal file
59
test/src/unit-noexcept.cpp
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
__ _____ _____ _____
|
||||||
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
|
| | |__ | | | | | | version 2.1.0
|
||||||
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
Copyright (c) 2013-2017 Niels Lohmann <http://nlohmann.me>.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "catch.hpp"
|
||||||
|
#include "json.hpp"
|
||||||
|
|
||||||
|
using nlohmann::json;
|
||||||
|
|
||||||
|
enum test
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
struct pod {};
|
||||||
|
struct pod_bis {};
|
||||||
|
|
||||||
|
void to_json(json&, pod) noexcept;
|
||||||
|
void to_json(json&, pod_bis);
|
||||||
|
void from_json(const json&, pod) noexcept;
|
||||||
|
void from_json(const json&, pod_bis);
|
||||||
|
static json j;
|
||||||
|
|
||||||
|
static_assert(noexcept(json{}), "");
|
||||||
|
static_assert(noexcept(nlohmann::to_json(j, 2)), "");
|
||||||
|
static_assert(noexcept(nlohmann::to_json(j, 2.5)), "");
|
||||||
|
static_assert(noexcept(nlohmann::to_json(j, true)), "");
|
||||||
|
static_assert(noexcept(nlohmann::to_json(j, test{})), "");
|
||||||
|
static_assert(noexcept(nlohmann::to_json(j, pod{})), "");
|
||||||
|
static_assert(not noexcept(nlohmann::to_json(j, pod_bis{})), "");
|
||||||
|
static_assert(noexcept(json(2)), "");
|
||||||
|
static_assert(noexcept(json(test{})), "");
|
||||||
|
static_assert(noexcept(json(pod{})), "");
|
||||||
|
static_assert(noexcept(j.get<pod>()), "");
|
||||||
|
static_assert(not noexcept(j.get<pod_bis>()), "");
|
||||||
|
static_assert(noexcept(json(pod{})), "");
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
__ _____ _____ _____
|
__ _____ _____ _____
|
||||||
__| | __| | | | JSON for Modern C++ (test suite)
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
| | |__ | | | | | | version 2.0.10
|
| | |__ | | | | | | version 2.1.0
|
||||||
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue