// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <lib/entity/cpp/json.h>

#include <string>

#include "gtest/gtest.h"
#include "rapidjson/document.h"

namespace modular {

TEST(EntityJsonTest, EntityReferenceToJson) {
  auto ret = EntityReferenceToJson("reference");
  EXPECT_EQ(R"({"@entityRef":"reference"})", ret);
}

TEST(EntityJsonTest, EntityReferenceToJsonDoc) {
  auto ret = EntityReferenceToJsonDoc("reference");
  EXPECT_TRUE(ret.IsObject());
  EXPECT_TRUE(ret.HasMember("@entityRef"));
  EXPECT_EQ("reference", std::string(ret["@entityRef"].GetString()));
}

TEST(EntityJsonTest, EntityReferenceFromJson) {
  std::string ret;
  EXPECT_FALSE(EntityReferenceFromJson("invalid", &ret));
  EXPECT_FALSE(EntityReferenceFromJson("1", &ret));
  EXPECT_FALSE(EntityReferenceFromJson(R"({"@entityRoof":"reference"})", &ret));
  EXPECT_FALSE(EntityReferenceFromJson(R"({"@entityRef":12345})", &ret));
  EXPECT_FALSE(
      EntityReferenceFromJson(R"({"@entityRef":["reference"]})", &ret));

  EXPECT_TRUE(EntityReferenceFromJson(R"({"@entityRef":"reference"})", &ret));
  EXPECT_EQ("reference", ret);

  // EntityReferenceFromJson(rapidjson::Value) is tested implicitly with the
  // above.
}

TEST(EntityJsonTest, ExtractEntityTypesFromJson) {
  std::vector<std::string> types;

  // Unknown type cases.
  types = {"com.google.fuchsia.unknown"};
  EXPECT_TRUE(ExtractEntityTypesFromJson("1", &types));
  EXPECT_TRUE(ExtractEntityTypesFromJson("[1,2,3]", &types));
  EXPECT_TRUE(ExtractEntityTypesFromJson("{}", &types));
  EXPECT_TRUE(ExtractEntityTypesFromJson(R"({"type": "foo"})", &types));
  types.clear();

  // Types that have a bad format.
  EXPECT_FALSE(ExtractEntityTypesFromJson(R"({"@type": 1})", &types));
  EXPECT_FALSE(ExtractEntityTypesFromJson(R"({"@type": {}})", &types));
  EXPECT_FALSE(ExtractEntityTypesFromJson(R"({"@type": [1,"foo"]})", &types));
  types.clear();

  // JSON string case.
  EXPECT_TRUE(ExtractEntityTypesFromJson(R"("hello")", &types));
  EXPECT_EQ(1lu, types.size());
  EXPECT_EQ("com.google.fuchsia.string", types[0]);
  types.clear();

  // Explicit "@type" case.
  EXPECT_TRUE(ExtractEntityTypesFromJson(R"({"@type": "foo"})", &types));
  EXPECT_EQ(1lu, types.size());
  EXPECT_EQ("foo", types[0]);
  types.clear();

  EXPECT_TRUE(ExtractEntityTypesFromJson(R"({"@type":["foo","bar"]})", &types));
  EXPECT_EQ(2lu, types.size());
  EXPECT_EQ("foo", types[0]);
  EXPECT_EQ("bar", types[1]);
  types.clear();
}

}  // namespace modular
