// Copyright 2019 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/inspect/contrib/cpp/archive_reader.h>

#include <rapidjson/document.h>
#include <zxtest/zxtest.h>

namespace {

using inspect::contrib::DiagnosticsData;

TEST(DiagnosticsDataTest, ComponentNameExtraction) {
  {
    rapidjson::Document doc;
    doc.Parse(R"({"moniker": "root/hub/my_component.cmx"})");
    DiagnosticsData data(std::move(doc));
    EXPECT_EQ("my_component.cmx", data.component_name());
  }
  {
    rapidjson::Document doc;
    doc.Parse(R"({"moniker": "abcd"})");
    DiagnosticsData data(std::move(doc));
    EXPECT_EQ("abcd", data.component_name());
  }
  {
    // Can't find path, empty return.
    rapidjson::Document doc;
    doc.Parse(R"({"not_moniker": "abcd"})");
    DiagnosticsData data(std::move(doc));
    EXPECT_EQ("", data.component_name());
  }
}

TEST(DiagnosticsDataTest, ContentExtraction) {
  {
    rapidjson::Document doc;
    doc.Parse(R"({"payload": {"value": "hello", "count": 10}})");
    DiagnosticsData data(std::move(doc));
    EXPECT_EQ(rapidjson::Value("hello"), data.GetByPath({"value"}));
    EXPECT_EQ(rapidjson::Value(10), data.GetByPath({"count"}));
    EXPECT_EQ(rapidjson::Value(), data.GetByPath({"value", "1234"}));
  }
  {
    rapidjson::Document doc;
    doc.Parse(R"({"payload": {"name/with/slashes": "hello"}})");
    DiagnosticsData data(std::move(doc));
    EXPECT_EQ(rapidjson::Value("hello"), data.GetByPath({"name/with/slashes"}));
  }
  {
    // Content is missing, return nullptr.
    rapidjson::Document doc;
    doc.Parse(R"({"moniker": "root/hub/my_component.cmx"})");
    DiagnosticsData data(std::move(doc));
    EXPECT_EQ(rapidjson::Value(), data.GetByPath({"value"}));
  }
}

}  // namespace
