// 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 <sdk/lib/inspect/testing/cpp/inspect.h>

using inspect::NodeValue;
using inspect::PropertyValue;

namespace {}  // namespace

namespace inspect {

void PrintTo(const PropertyValue& property, std::ostream* os) {
  if (property.format() == PropertyFormat::kInt)
    *os << "Int";
  if (property.format() == PropertyFormat::kUint)
    *os << "Uint";
  if (property.format() == PropertyFormat::kDouble)
    *os << "Double";
  if (property.format() == PropertyFormat::kBool)
    *os << "Bool";
  if (property.format() == PropertyFormat::kIntArray)
    *os << "IntArray";
  if (property.format() == PropertyFormat::kUintArray)
    *os << "UintArray";
  if (property.format() == PropertyFormat::kDoubleArray)
    *os << "DoubleArray";
  if (property.format() == PropertyFormat::kString)
    *os << "String";
  if (property.format() == PropertyFormat::kBytes)
    *os << "ByteVector";
  *os << "Property(" << ::testing::PrintToString(property.name()) << ", ";
  if (property.format() == PropertyFormat::kInt)
    *os << ::testing::PrintToString(property.Get<IntPropertyValue>().value());
  if (property.format() == PropertyFormat::kUint)
    *os << ::testing::PrintToString(property.Get<UintPropertyValue>().value());
  if (property.format() == PropertyFormat::kDouble)
    *os << ::testing::PrintToString(property.Get<DoublePropertyValue>().value());
  if (property.format() == PropertyFormat::kBool)
    *os << ::testing::PrintToString(property.Get<BoolPropertyValue>().value());
  if (property.format() == PropertyFormat::kIntArray)
    *os << ::testing::PrintToString(property.Get<IntArrayValue>().value());
  if (property.format() == PropertyFormat::kUintArray)
    *os << ::testing::PrintToString(property.Get<UintArrayValue>().value());
  if (property.format() == PropertyFormat::kDoubleArray)
    *os << ::testing::PrintToString(property.Get<DoubleArrayValue>().value());
  if (property.format() == PropertyFormat::kString)
    *os << ::testing::PrintToString(property.Get<StringPropertyValue>().value());
  if (property.format() == PropertyFormat::kBytes)
    *os << ::testing::PrintToString(property.Get<ByteVectorPropertyValue>().value());
  *os << ")";
}

void PrintTo(const NodeValue& node, std::ostream* os) {
  *os << "Node(" << ::testing::PrintToString(node.name()) << ", "
      << ::testing::PrintToString(node.properties().size()) << " properties)";
}

void PrintTo(const ::inspect::Hierarchy& hierarchy, std::ostream* os) {
  *os << "Hierarchy(" << ::testing::PrintToString(hierarchy.node()) << ", "
      << ::testing::PrintToString(hierarchy.children().size()) << " children)";
}

namespace testing {

internal::NameMatchesMatcher::NameMatchesMatcher(std::string name) : name_(std::move(name)) {}

bool internal::NameMatchesMatcher::MatchAndExplain(const NodeValue& node,
                                                   ::testing::MatchResultListener* listener) const {
  if (node.name() != name_) {
    *listener << "expected name \"" << name_ << "\" but found \"" << node.name() << "\"";
    return false;
  }
  return true;
}

void internal::NameMatchesMatcher::DescribeTo(::std::ostream* os) const {
  *os << "name matches \"" << name_ << "\"";
}

void internal::NameMatchesMatcher::DescribeNegationTo(::std::ostream* os) const {
  *os << "name does not match \"" << name_ << "\"";
}

internal::PropertyListMatcher::PropertyListMatcher(PropertiesMatcher matcher)
    : matcher_(std::move(matcher)) {}

bool internal::PropertyListMatcher::MatchAndExplain(
    const NodeValue& node, ::testing::MatchResultListener* listener) const {
  return ::testing::ExplainMatchResult(matcher_, node.properties(), listener);
}

void internal::PropertyListMatcher::DescribeTo(::std::ostream* os) const {
  *os << "property list ";
  matcher_.DescribeTo(os);
}

void internal::PropertyListMatcher::DescribeNegationTo(::std::ostream* os) const {
  *os << "property list ";
  matcher_.DescribeNegationTo(os);
}

::testing::Matcher<const NodeValue&> NameMatches(std::string name) {
  return ::testing::MakeMatcher(new internal::NameMatchesMatcher(std::move(name)));
}

::testing::Matcher<const NodeValue&> PropertyList(PropertiesMatcher matcher) {
  return ::testing::MakeMatcher(new internal::PropertyListMatcher(std::move(matcher)));
}

::testing::Matcher<const PropertyValue&> StringIs(const std::string& name,
                                                  ::testing::Matcher<std::string> matcher) {
  return ::testing::AllOf(
      ::testing::Property(&PropertyValue::name, ::testing::StrEq(name)),
      ::testing::Property(&PropertyValue::format, PropertyFormat::kString),
      ::testing::Property(&PropertyValue::Get<StringPropertyValue>,
                          ::testing::Property(&StringPropertyValue::value, std::move(matcher))));
}

::testing::Matcher<const PropertyValue&> ByteVectorIs(
    const std::string& name, ::testing::Matcher<std::vector<uint8_t>> matcher) {
  return ::testing::AllOf(::testing::Property(&PropertyValue::name, ::testing::StrEq(name)),
                          ::testing::Property(&PropertyValue::format, PropertyFormat::kBytes),
                          ::testing::Property(&PropertyValue::Get<ByteVectorPropertyValue>,
                                              ::testing::Property(&ByteVectorPropertyValue::value,
                                                                  std::move(matcher))));
}

::testing::Matcher<const PropertyValue&> IntIs(const std::string& name,
                                               ::testing::Matcher<int64_t> matcher) {
  return ::testing::AllOf(
      ::testing::Property(&PropertyValue::name, ::testing::StrEq(name)),
      ::testing::Property(&PropertyValue::format, PropertyFormat::kInt),
      ::testing::Property(&PropertyValue::Get<IntPropertyValue>,
                          ::testing::Property(&IntPropertyValue::value, std::move(matcher))));
}

::testing::Matcher<const PropertyValue&> UintIs(const std::string& name,
                                                ::testing::Matcher<uint64_t> matcher) {
  return ::testing::AllOf(
      ::testing::Property(&PropertyValue::name, ::testing::StrEq(name)),
      ::testing::Property(&PropertyValue::format, PropertyFormat::kUint),
      ::testing::Property(&PropertyValue::Get<UintPropertyValue>,
                          ::testing::Property(&UintPropertyValue::value, std::move(matcher))));
}

::testing::Matcher<const PropertyValue&> DoubleIs(const std::string& name,
                                                  ::testing::Matcher<double> matcher) {
  return ::testing::AllOf(
      ::testing::Property(&PropertyValue::name, ::testing::StrEq(name)),
      ::testing::Property(&PropertyValue::format, PropertyFormat::kDouble),
      ::testing::Property(&PropertyValue::Get<DoublePropertyValue>,
                          ::testing::Property(&DoublePropertyValue::value, std::move(matcher))));
}

::testing::Matcher<const PropertyValue&> BoolIs(const std::string& name,
                                               ::testing::Matcher<bool> matcher) {
  return ::testing::AllOf(
      ::testing::Property(&PropertyValue::name, ::testing::StrEq(name)),
      ::testing::Property(&PropertyValue::format, PropertyFormat::kBool),
      ::testing::Property(&PropertyValue::Get<BoolPropertyValue>,
                          ::testing::Property(&BoolPropertyValue::value, std::move(matcher))));
}

::testing::Matcher<const PropertyValue&> IntArrayIs(
    const std::string& name, ::testing::Matcher<std::vector<int64_t>> matcher) {
  return ::testing::AllOf(
      ::testing::Property(&PropertyValue::name, ::testing::StrEq(name)),
      ::testing::Property(&PropertyValue::format, PropertyFormat::kIntArray),
      ::testing::Property(&PropertyValue::Get<IntArrayValue>,
                          ::testing::Property(&IntArrayValue::value, std::move(matcher))));
}

::testing::Matcher<const PropertyValue&> UintArrayIs(
    const std::string& name, ::testing::Matcher<std::vector<uint64_t>> matcher) {
  return ::testing::AllOf(
      ::testing::Property(&PropertyValue::name, ::testing::StrEq(name)),
      ::testing::Property(&PropertyValue::format, PropertyFormat::kUintArray),
      ::testing::Property(&PropertyValue::Get<UintArrayValue>,
                          ::testing::Property(&UintArrayValue::value, std::move(matcher))));
}

::testing::Matcher<const PropertyValue&> DoubleArrayIs(
    const std::string& name, ::testing::Matcher<std::vector<double>> matcher) {
  return ::testing::AllOf(
      ::testing::Property(&PropertyValue::name, ::testing::StrEq(name)),
      ::testing::Property(&PropertyValue::format, PropertyFormat::kDoubleArray),
      ::testing::Property(&PropertyValue::Get<DoubleArrayValue>,
                          ::testing::Property(&DoubleArrayValue::value, std::move(matcher))));
}

::testing::Matcher<const PropertyValue&> ArrayDisplayFormatIs(ArrayDisplayFormat format) {
  return ::testing::AnyOf(
      ::testing::AllOf(
          ::testing::Property(&PropertyValue::format, PropertyFormat::kIntArray),
          ::testing::Property(&PropertyValue::Get<IntArrayValue>,
                              ::testing::Property(&IntArrayValue::GetDisplayFormat, format))),
      ::testing::AllOf(
          ::testing::Property(&PropertyValue::format, PropertyFormat::kUintArray),
          ::testing::Property(&PropertyValue::Get<UintArrayValue>,
                              ::testing::Property(&UintArrayValue::GetDisplayFormat, format))),
      ::testing::AllOf(
          ::testing::Property(&PropertyValue::format, PropertyFormat::kDoubleArray),
          ::testing::Property(&PropertyValue::Get<DoubleArrayValue>,
                              ::testing::Property(&DoubleArrayValue::GetDisplayFormat, format))));
}

::testing::Matcher<const Hierarchy&> NodeMatches(NodeMatcher matcher) {
  return ::testing::Property(&Hierarchy::node, std::move(matcher));
}

::testing::Matcher<const Hierarchy&> ObjectMatches(NodeMatcher matcher) {
  return NodeMatches(std::move(matcher));
}

::testing::Matcher<const Hierarchy&> ChildrenMatch(ChildrenMatcher matcher) {
  return ::testing::Property(&Hierarchy::children, std::move(matcher));
}

}  // namespace testing
}  // namespace inspect
