// Copyright 2013 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/test_util.h"

#include <string>
#include <utility>

#include "base/json/json_reader.h"
#include "base/logging.h"

namespace json_schema_compiler {
namespace test_util {

std::unique_ptr<base::Value> ReadJson(const base::StringPiece& json) {
  int error_code;
  std::string error_msg;
  std::unique_ptr<base::Value> result(
      base::JSONReader::ReadAndReturnErrorDeprecated(
          json, base::JSON_ALLOW_TRAILING_COMMAS, &error_code, &error_msg));
  // CHECK not ASSERT since passing invalid |json| is a test error.
  CHECK(result) << error_msg;
  return result;
}

std::unique_ptr<base::ListValue> List(std::unique_ptr<base::Value> a) {
  auto list = std::make_unique<base::ListValue>();
  list->Append(std::move(a));
  return list;
}
std::unique_ptr<base::ListValue> List(std::unique_ptr<base::Value> a,
                                      std::unique_ptr<base::Value> b) {
  auto list = std::make_unique<base::ListValue>();
  list->Append(std::move(a));
  list->Append(std::move(b));
  return list;
}
std::unique_ptr<base::ListValue> List(std::unique_ptr<base::Value> a,
                                      std::unique_ptr<base::Value> b,
                                      std::unique_ptr<base::Value> c) {
  auto list = std::make_unique<base::ListValue>();
  list->Append(std::move(a));
  list->Append(std::move(b));
  list->Append(std::move(c));
  return list;
}

std::unique_ptr<base::DictionaryValue> Dictionary(
    const std::string& ak,
    std::unique_ptr<base::Value> av) {
  auto dict = std::make_unique<base::DictionaryValue>();
  dict->SetWithoutPathExpansion(ak, std::move(av));
  return dict;
}
std::unique_ptr<base::DictionaryValue> Dictionary(
    const std::string& ak,
    std::unique_ptr<base::Value> av,
    const std::string& bk,
    std::unique_ptr<base::Value> bv) {
  auto dict = std::make_unique<base::DictionaryValue>();
  dict->SetWithoutPathExpansion(ak, std::move(av));
  dict->SetWithoutPathExpansion(bk, std::move(bv));
  return dict;
}
std::unique_ptr<base::DictionaryValue> Dictionary(
    const std::string& ak,
    std::unique_ptr<base::Value> av,
    const std::string& bk,
    std::unique_ptr<base::Value> bv,
    const std::string& ck,
    std::unique_ptr<base::Value> cv) {
  auto dict = std::make_unique<base::DictionaryValue>();
  dict->SetWithoutPathExpansion(ak, std::move(av));
  dict->SetWithoutPathExpansion(bk, std::move(bv));
  dict->SetWithoutPathExpansion(ck, std::move(cv));
  return dict;
}

}  // namespace test_util
}  // namespace json_schema_compiler
