// Copyright (c) 2012 The Chromium 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 "tools/json_schema_compiler/test/choices.h"

#include <stddef.h>

#include <utility>

#include "base/strings/string_piece.h"
#include "base/values.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "tools/json_schema_compiler/test/test_util.h"

namespace {

namespace choices = test::api::choices;
namespace TakesIntegers = choices::TakesIntegers;
using choices::NestedChoice;
using json_schema_compiler::test_util::Dictionary;
using json_schema_compiler::test_util::List;
using json_schema_compiler::test_util::ReadJson;
using json_schema_compiler::test_util::Vector;

TEST(JsonSchemaCompilerChoicesTest, TakesIntegersParamsCreate) {
  {
    std::unique_ptr<TakesIntegers::Params> params(TakesIntegers::Params::Create(
        List(std::make_unique<base::Value>(true))->GetList()));
    EXPECT_FALSE(params);
  }
  {
    std::unique_ptr<TakesIntegers::Params> params(TakesIntegers::Params::Create(
        List(std::make_unique<base::Value>(6))->GetList()));
    ASSERT_TRUE(params);
    EXPECT_FALSE(params->nums.as_integers);
    EXPECT_EQ(6, *params->nums.as_integer);
  }
  {
    std::unique_ptr<TakesIntegers::Params> params(TakesIntegers::Params::Create(
        List(List(std::make_unique<base::Value>(2),
                  std::make_unique<base::Value>(6),
                  std::make_unique<base::Value>(8)))
            ->GetList()));
    ASSERT_TRUE(params);
    ASSERT_TRUE(params->nums.as_integers);
    EXPECT_EQ(Vector(2, 6, 8), *params->nums.as_integers);
  }
}

TEST(JsonSchemaCompilerChoicesTest, ObjectWithChoicesParamsCreate) {
  {
    std::unique_ptr<choices::ObjectWithChoices::Params> params(
        choices::ObjectWithChoices::Params::Create(
            List(Dictionary("strings", std::make_unique<base::Value>("asdf")))
                ->GetList()));
    ASSERT_TRUE(params);
    EXPECT_FALSE(params->string_info.strings.as_strings);
    EXPECT_EQ("asdf", *params->string_info.strings.as_string);
    EXPECT_FALSE(params->string_info.integers);
  }
  {
    std::unique_ptr<choices::ObjectWithChoices::Params> params(
        choices::ObjectWithChoices::Params::Create(
            List(Dictionary("strings", std::make_unique<base::Value>("asdf"),
                            "integers", std::make_unique<base::Value>(6)))
                ->GetList()));
    ASSERT_TRUE(params);
    EXPECT_FALSE(params->string_info.strings.as_strings);
    EXPECT_EQ("asdf", *params->string_info.strings.as_string);
    ASSERT_TRUE(params->string_info.integers);
    EXPECT_FALSE(params->string_info.integers->as_integers);
    EXPECT_EQ(6, *params->string_info.integers->as_integer);
  }
}

// TODO(kalman): Clean up the rest of these tests to use the
// Vector/List/Dictionary helpers.

TEST(JsonSchemaCompilerChoicesTest, ObjectWithChoicesParamsCreateFail) {
  {
    base::Value::Dict object_param;
    object_param.Set("strings", 5);
    base::Value::List params_value;
    params_value.Append(std::move(object_param));
    std::unique_ptr<choices::ObjectWithChoices::Params> params(
        choices::ObjectWithChoices::Params::Create(
            base::Value(std::move(params_value)).GetList()));
    EXPECT_FALSE(params.get());
  }
  {
    base::Value::Dict object_param;
    object_param.Set("strings", "asdf");
    object_param.Set("integers", "asdf");
    base::Value::List params_value;
    params_value.Append(std::move(object_param));
    std::unique_ptr<choices::ObjectWithChoices::Params> params(
        choices::ObjectWithChoices::Params::Create(
            base::Value(std::move(params_value)).GetList()));
    EXPECT_FALSE(params.get());
  }
  {
    base::Value::Dict object_param;
    object_param.Set("integers", 6);
    base::Value::List params_value;
    params_value.Append(std::move(object_param));
    std::unique_ptr<choices::ObjectWithChoices::Params> params(
        choices::ObjectWithChoices::Params::Create(
            base::Value(std::move(params_value)).GetList()));
    EXPECT_FALSE(params.get());
  }
}

TEST(JsonSchemaCompilerChoicesTest, PopulateChoiceType) {
  std::vector<std::string> strings = Vector(std::string("list"),
                                            std::string("of"),
                                            std::string("strings"));

  base::Value strings_value(base::Value::Type::LIST);
  for (const auto& string : strings)
    strings_value.Append(string);

  base::DictionaryValue value;
  value.SetInteger("integers", 4);
  value.SetKey("strings", std::move(strings_value));

  choices::ChoiceType out;
  ASSERT_TRUE(choices::ChoiceType::Populate(value, &out));
  ASSERT_TRUE(out.integers.as_integer.get());
  EXPECT_FALSE(out.integers.as_integers.get());
  EXPECT_EQ(4, *out.integers.as_integer);

  EXPECT_FALSE(out.strings->as_string.get());
  ASSERT_TRUE(out.strings->as_strings.get());
  EXPECT_EQ(strings, *out.strings->as_strings);
}

TEST(JsonSchemaCompilerChoicesTest, ChoiceTypeToValue) {
  base::Value strings_value(base::Value::Type::LIST);
  strings_value.Append("list");
  strings_value.Append("of");
  strings_value.Append("strings");

  base::DictionaryValue value;
  value.SetInteger("integers", 5);
  value.SetKey("strings", std::move(strings_value));

  choices::ChoiceType out;
  ASSERT_TRUE(choices::ChoiceType::Populate(value, &out));

  EXPECT_EQ(value, *out.ToValue());
}

TEST(JsonSchemaCompilerChoicesTest, ReturnChoices) {
  {
    choices::ReturnChoices::Results::Result results;
    results.as_integers = std::make_unique<std::vector<int>>(Vector(1, 2));

    std::unique_ptr<base::Value> results_value = results.ToValue();
    ASSERT_TRUE(results_value);

    base::Value expected(base::Value::Type::LIST);
    expected.Append(1);
    expected.Append(2);

    EXPECT_EQ(expected, *results_value);
  }
  {
    choices::ReturnChoices::Results::Result results;
    results.as_integer = std::make_unique<int>(5);

    std::unique_ptr<base::Value> results_value = results.ToValue();
    ASSERT_TRUE(results_value);

    base::Value expected(5);

    EXPECT_EQ(expected, *results_value);
  }
}

TEST(JsonSchemaCompilerChoicesTest, NestedChoices) {
  // These test both ToValue and FromValue for every legitimate configuration of
  // NestedChoices.
  {
    // The plain integer choice.
    base::Value value = ReadJson("42");
    std::unique_ptr<NestedChoice> obj = NestedChoice::FromValue(value);

    ASSERT_TRUE(obj);
    ASSERT_TRUE(obj->as_integer);
    EXPECT_FALSE(obj->as_choice1);
    EXPECT_FALSE(obj->as_choice2);
    EXPECT_EQ(42, *obj->as_integer);

    EXPECT_EQ(value, *obj->ToValue());
  }

  {
    // The string choice within the first choice.
    base::Value value = ReadJson("\"foo\"");
    std::unique_ptr<NestedChoice> obj = NestedChoice::FromValue(value);

    ASSERT_TRUE(obj);
    EXPECT_FALSE(obj->as_integer);
    ASSERT_TRUE(obj->as_choice1);
    EXPECT_FALSE(obj->as_choice2);
    ASSERT_TRUE(obj->as_choice1->as_string);
    EXPECT_FALSE(obj->as_choice1->as_boolean);
    EXPECT_EQ("foo", *obj->as_choice1->as_string);

    EXPECT_EQ(value, *obj->ToValue());
  }

  {
    // The boolean choice within the first choice.
    base::Value value = ReadJson("true");
    std::unique_ptr<NestedChoice> obj = NestedChoice::FromValue(value);

    ASSERT_TRUE(obj);
    EXPECT_FALSE(obj->as_integer);
    ASSERT_TRUE(obj->as_choice1);
    EXPECT_FALSE(obj->as_choice2);
    EXPECT_FALSE(obj->as_choice1->as_string);
    ASSERT_TRUE(obj->as_choice1->as_boolean);
    EXPECT_TRUE(*obj->as_choice1->as_boolean);

    EXPECT_EQ(value, *obj->ToValue());
  }

  {
    // The double choice within the second choice.
    base::Value value = ReadJson("42.0");
    std::unique_ptr<NestedChoice> obj = NestedChoice::FromValue(value);

    ASSERT_TRUE(obj);
    EXPECT_FALSE(obj->as_integer);
    EXPECT_FALSE(obj->as_choice1);
    ASSERT_TRUE(obj->as_choice2);
    ASSERT_TRUE(obj->as_choice2->as_double_);
    EXPECT_FALSE(obj->as_choice2->as_choice_type);
    EXPECT_FALSE(obj->as_choice2->as_choice_types);
    EXPECT_EQ(42.0, *obj->as_choice2->as_double_);

    EXPECT_EQ(value, *obj->ToValue());
  }

  {
    // The ChoiceType choice within the second choice.
    base::Value value =
        ReadJson("{\"integers\": [1, 2], \"strings\": \"foo\"}");
    std::unique_ptr<NestedChoice> obj = NestedChoice::FromValue(value);

    ASSERT_TRUE(obj);
    EXPECT_FALSE(obj->as_integer);
    EXPECT_FALSE(obj->as_choice1);
    ASSERT_TRUE(obj->as_choice2);
    EXPECT_FALSE(obj->as_choice2->as_double_);
    ASSERT_TRUE(obj->as_choice2->as_choice_type);
    EXPECT_FALSE(obj->as_choice2->as_choice_types);
    {
      choices::ChoiceType* choice_type = obj->as_choice2->as_choice_type.get();
      ASSERT_TRUE(choice_type->integers.as_integers);
      EXPECT_FALSE(choice_type->integers.as_integer);
      EXPECT_EQ(Vector(1, 2), *choice_type->integers.as_integers);
      ASSERT_TRUE(choice_type->strings);
      EXPECT_FALSE(choice_type->strings->as_strings);
      ASSERT_TRUE(choice_type->strings->as_string);
      EXPECT_EQ("foo", *choice_type->strings->as_string);
    }

    EXPECT_EQ(value, *obj->ToValue());
  }

  {
    // The array of ChoiceTypes within the second choice.
    base::Value value = ReadJson(
        "["
        "  {\"integers\": [1, 2], \"strings\": \"foo\"},"
        "  {\"integers\": 3, \"strings\": [\"bar\", \"baz\"]}"
        "]");
    std::unique_ptr<NestedChoice> obj = NestedChoice::FromValue(value);

    ASSERT_TRUE(obj);
    EXPECT_FALSE(obj->as_integer);
    EXPECT_FALSE(obj->as_choice1);
    ASSERT_TRUE(obj->as_choice2);
    EXPECT_FALSE(obj->as_choice2->as_double_);
    EXPECT_FALSE(obj->as_choice2->as_choice_type);
    ASSERT_TRUE(obj->as_choice2->as_choice_types);
    // Bleh too much effort to test everything.
    ASSERT_EQ(2u, obj->as_choice2->as_choice_types->size());

    EXPECT_EQ(value, *obj->ToValue());
  }
}

}  // namespace
