1*3f982cf4SFabien Sanglard // Copyright 2019 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard
5*3f982cf4SFabien Sanglard #include "util/json/json_serialization.h"
6*3f982cf4SFabien Sanglard
7*3f982cf4SFabien Sanglard #include <array>
8*3f982cf4SFabien Sanglard #include <string>
9*3f982cf4SFabien Sanglard
10*3f982cf4SFabien Sanglard #include "gtest/gtest.h"
11*3f982cf4SFabien Sanglard #include "platform/base/error.h"
12*3f982cf4SFabien Sanglard
13*3f982cf4SFabien Sanglard namespace openscreen {
14*3f982cf4SFabien Sanglard namespace {
15*3f982cf4SFabien Sanglard template <typename Value>
AssertError(ErrorOr<Value> error_or,Error::Code code)16*3f982cf4SFabien Sanglard void AssertError(ErrorOr<Value> error_or, Error::Code code) {
17*3f982cf4SFabien Sanglard EXPECT_EQ(error_or.error().code(), code);
18*3f982cf4SFabien Sanglard }
19*3f982cf4SFabien Sanglard } // namespace
20*3f982cf4SFabien Sanglard
TEST(JsonSerializationTest,MalformedDocumentReturnsParseError)21*3f982cf4SFabien Sanglard TEST(JsonSerializationTest, MalformedDocumentReturnsParseError) {
22*3f982cf4SFabien Sanglard const std::array<std::string, 4> kMalformedDocuments{
23*3f982cf4SFabien Sanglard {"", "{", "{ foo: bar }", R"({"foo": "bar", "foo": baz})"}};
24*3f982cf4SFabien Sanglard
25*3f982cf4SFabien Sanglard for (auto& document : kMalformedDocuments) {
26*3f982cf4SFabien Sanglard AssertError(json::Parse(document), Error::Code::kJsonParseError);
27*3f982cf4SFabien Sanglard }
28*3f982cf4SFabien Sanglard }
29*3f982cf4SFabien Sanglard
TEST(JsonSerializationTest,ValidEmptyDocumentParsedCorrectly)30*3f982cf4SFabien Sanglard TEST(JsonSerializationTest, ValidEmptyDocumentParsedCorrectly) {
31*3f982cf4SFabien Sanglard const auto actual = json::Parse("{}");
32*3f982cf4SFabien Sanglard
33*3f982cf4SFabien Sanglard EXPECT_TRUE(actual.is_value());
34*3f982cf4SFabien Sanglard EXPECT_EQ(actual.value().getMemberNames().size(), 0u);
35*3f982cf4SFabien Sanglard }
36*3f982cf4SFabien Sanglard
37*3f982cf4SFabien Sanglard // Jsoncpp has its own suite of tests ensure that things are parsed correctly,
38*3f982cf4SFabien Sanglard // so we only do some rudimentary checks here to make sure we didn't mangle
39*3f982cf4SFabien Sanglard // the value.
TEST(JsonSerializationTest,ValidDocumentParsedCorrectly)40*3f982cf4SFabien Sanglard TEST(JsonSerializationTest, ValidDocumentParsedCorrectly) {
41*3f982cf4SFabien Sanglard const auto actual = json::Parse(R"({"foo": "bar", "baz": 1337})");
42*3f982cf4SFabien Sanglard
43*3f982cf4SFabien Sanglard EXPECT_TRUE(actual.is_value());
44*3f982cf4SFabien Sanglard EXPECT_EQ(actual.value().getMemberNames().size(), 2u);
45*3f982cf4SFabien Sanglard }
46*3f982cf4SFabien Sanglard
TEST(JsonSerializationTest,NullValueReturnsError)47*3f982cf4SFabien Sanglard TEST(JsonSerializationTest, NullValueReturnsError) {
48*3f982cf4SFabien Sanglard const auto null_value = Json::Value();
49*3f982cf4SFabien Sanglard const auto actual = json::Stringify(null_value);
50*3f982cf4SFabien Sanglard
51*3f982cf4SFabien Sanglard EXPECT_TRUE(actual.is_error());
52*3f982cf4SFabien Sanglard EXPECT_EQ(actual.error().code(), Error::Code::kJsonWriteError);
53*3f982cf4SFabien Sanglard }
54*3f982cf4SFabien Sanglard
TEST(JsonSerializationTest,ValidValueReturnsString)55*3f982cf4SFabien Sanglard TEST(JsonSerializationTest, ValidValueReturnsString) {
56*3f982cf4SFabien Sanglard const Json::Int64 value = 31337;
57*3f982cf4SFabien Sanglard const auto actual = json::Stringify(value);
58*3f982cf4SFabien Sanglard
59*3f982cf4SFabien Sanglard EXPECT_TRUE(actual.is_value());
60*3f982cf4SFabien Sanglard EXPECT_EQ(actual.value(), "31337");
61*3f982cf4SFabien Sanglard }
62*3f982cf4SFabien Sanglard } // namespace openscreen
63