// // json_binder_collection.t.h // json // // Created by Sam Jaffe on 2/27/17. // #include "json/json_binder.hpp" #include using namespace json::binder; using namespace json::parser; TEST(JsonBinderArrayTest, ParsesSuccessfully) { char data[] = "[ 0, 1, 2 ]"; using collect = std::vector; collect out; value_binder binder{}; EXPECT_NO_THROW(parse(json::binder::bind(out, binder), data, allow_all)); EXPECT_THAT(out, collect({0, 1, 2})); } TEST(JsonBinderArrayTest, ThrowsOnMissingEndToken) { char data[] = "[ 0, 1"; using collect = std::vector; collect out; value_binder binder{}; EXPECT_THROW(parse(json::binder::bind(out, binder), data, allow_all), json::unterminated_json_exception); } TEST(JsonBinderArrayTest, ThrowsOnMissingStartToken) { char data[] = "0, 1"; using collect = std::vector; collect out; value_binder binder{}; EXPECT_THROW(parse(json::binder::bind(out, binder), data, allow_all), json::malformed_json_exception); } TEST(JsonBinderMapTest, ParsesSuccessfully) { char data[] = "{ \"a\" : 1 , \"b\" : 2 }"; using collect = std::map; collect out; value_binder binder{}; EXPECT_NO_THROW(parse(json::binder::bind(out, binder), data, allow_all)); EXPECT_THAT(out, collect({{"a", 1}, {"b", 2}})); } TEST(JsonBinderMapTest, ThrowsOnMissingEndToken) { char data[] = "{ \"a\" : 1 , \"b\" : 2"; using collect = std::map; collect out; value_binder binder{}; EXPECT_THROW(parse(json::binder::bind(out, binder), data, allow_all), json::unterminated_json_exception); } TEST(JsonBinderMapTest, ThrowsOnMissingValueForKey) { char data[] = "{ \"a\" : 1 , \"b\" }"; using collect = std::map; collect out; value_binder binder{}; EXPECT_THROW(parse(json::binder::bind(out, binder), data, allow_all), json::malformed_json_exception); } TEST(JsonBinderMapTest, ThrowsOnMissingStartToken) { char data[] = "\"a\" : 1 , \"b\" : 2"; using collect = std::map; collect out; value_binder binder{}; EXPECT_THROW(parse(json::binder::bind(out, binder), data, allow_all), json::malformed_json_exception); } TEST(JsonBinderArrayTest, WritesDataWithoutWhitespace) { std::string const expected = "[5,4,7]"; std::stringstream ss; using collect = std::vector; collect const in{5, 4, 7}; value_binder binder{}; EXPECT_NO_THROW(write(json::binder::bind(in, binder), ss)); EXPECT_THAT(ss.str(), expected); } TEST(JsonBinderMapTest, WritesDataWithoutWhitespace) { std::string const expected = "{\"a\":1,\"b\":2}"; std::stringstream ss; using collect = std::map; collect const in{{"a", 1}, {"b", 2}}; value_binder binder{}; EXPECT_NO_THROW(write(json::binder::bind(in, binder), ss)); EXPECT_THAT(ss.str(), expected); }