// 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 "base/values.h"
#include "tools/json_schema_compiler/test/idl_basics.h"
#include "tools/json_schema_compiler/test/idl_object_types.h"

#include "testing/gtest/include/gtest/gtest.h"

using test::api::idl_basics::MyType1;
using test::api::idl_object_types::BarType;
using test::api::idl_object_types::FooType;

namespace Function2 = test::api::idl_basics::Function2;
namespace Function3 = test::api::idl_basics::Function3;
namespace Function4 = test::api::idl_basics::Function4;
namespace Function5 = test::api::idl_basics::Function5;
namespace Function6 = test::api::idl_basics::Function6;
namespace Function7 = test::api::idl_basics::Function7;
namespace Function8 = test::api::idl_basics::Function8;
namespace Function9 = test::api::idl_basics::Function9;
namespace Function10 = test::api::idl_basics::Function10;
namespace Function11 = test::api::idl_basics::Function11;
namespace ObjectFunction1 = test::api::idl_object_types::ObjectFunction1;

TEST(IdlCompiler, Basics) {
  // Test MyType1.
  MyType1 a;
  a.x = 5;
  a.y = std::string("foo");
  scoped_ptr<base::DictionaryValue> serialized = a.ToValue();
  MyType1 b;
  EXPECT_TRUE(MyType1::Populate(*serialized.get(), &b));
  EXPECT_EQ(a.x, b.x);
  EXPECT_EQ(a.y, b.y);

  // Test Function2, which takes an integer parameter.
  base::ListValue list;
  list.Append(new base::FundamentalValue(5));
  scoped_ptr<Function2::Params> f2_params = Function2::Params::Create(list);
  EXPECT_EQ(5, f2_params->x);

  // Test Function3, which takes a MyType1 parameter.
  list.Clear();
  base::DictionaryValue* tmp = new base::DictionaryValue();
  tmp->SetInteger("x", 17);
  tmp->SetString("y", "hello");
  tmp->SetString("z", "zstring");
  tmp->SetString("a", "astring");
  tmp->SetString("b", "bstring");
  tmp->SetString("c", "cstring");
  list.Append(tmp);
  scoped_ptr<Function3::Params> f3_params = Function3::Params::Create(list);
  EXPECT_EQ(17, f3_params->arg.x);
  EXPECT_EQ("hello", f3_params->arg.y);

  // Test functions that take a callback function as a parameter, with varying
  // callback signatures.
  scoped_ptr<base::ListValue> f4_results = Function4::Results::Create();
  base::ListValue expected;
  EXPECT_TRUE(f4_results->Equals(&expected));

  scoped_ptr<base::ListValue> f5_results(Function5::Results::Create(13));
  base::Value* f5_result_int = NULL;
  ASSERT_TRUE(f5_results->Get(0, &f5_result_int));
  EXPECT_TRUE(f5_result_int->IsType(base::Value::TYPE_INTEGER));

  scoped_ptr<base::ListValue> f6_results(Function6::Results::Create(a));
  base::Value* f6_result_dict = NULL;
  ASSERT_TRUE(f6_results->Get(0, &f6_result_dict));
  MyType1 c;
  EXPECT_TRUE(MyType1::Populate(*f6_result_dict, &c));
  EXPECT_EQ(a.x, c.x);
  EXPECT_EQ(a.y, c.y);
}

TEST(IdlCompiler, OptionalArguments) {
  // Test a function that takes one optional argument, both without and with
  // that argument.
  base::ListValue list;
  scoped_ptr<Function7::Params> f7_params = Function7::Params::Create(list);
  EXPECT_EQ(NULL, f7_params->arg.get());
  list.Append(new base::FundamentalValue(7));
  f7_params = Function7::Params::Create(list);
  EXPECT_EQ(7, *(f7_params->arg));

  // Similar to above, but a function with one required and one optional
  // argument.
  list.Clear();
  list.Append(new base::FundamentalValue(8));
  scoped_ptr<Function8::Params> f8_params = Function8::Params::Create(list);
  EXPECT_EQ(8, f8_params->arg1);
  EXPECT_EQ(NULL, f8_params->arg2.get());
  list.Append(base::Value::CreateStringValue("foo"));
  f8_params = Function8::Params::Create(list);
  EXPECT_EQ(8, f8_params->arg1);
  EXPECT_EQ("foo", *(f8_params->arg2));

  // Test a function with an optional argument of custom type.
  list.Clear();
  scoped_ptr<Function9::Params> f9_params = Function9::Params::Create(list);
  EXPECT_EQ(NULL, f9_params->arg.get());
  list.Clear();
  base::DictionaryValue* tmp = new base::DictionaryValue();
  tmp->SetInteger("x", 17);
  tmp->SetString("y", "hello");
  tmp->SetString("z", "zstring");
  tmp->SetString("a", "astring");
  tmp->SetString("b", "bstring");
  tmp->SetString("c", "cstring");
  list.Append(tmp);
  f9_params = Function9::Params::Create(list);
  ASSERT_TRUE(f9_params->arg.get() != NULL);
  MyType1* t1 = f9_params->arg.get();
  EXPECT_EQ(17, t1->x);
  EXPECT_EQ("hello", t1->y);
}

TEST(IdlCompiler, ArrayTypes) {
  // Tests of a function that takes an integer and an array of integers. First
  // use an empty array.
  base::ListValue list;
  list.Append(new base::FundamentalValue(33));
  list.Append(new base::ListValue);
  scoped_ptr<Function10::Params> f10_params = Function10::Params::Create(list);
  ASSERT_TRUE(f10_params != NULL);
  EXPECT_EQ(33, f10_params->x);
  EXPECT_TRUE(f10_params->y.empty());

  // Same function, but this time with 2 values in the array.
  list.Clear();
  list.Append(new base::FundamentalValue(33));
  base::ListValue* sublist = new base::ListValue;
  sublist->Append(new base::FundamentalValue(34));
  sublist->Append(new base::FundamentalValue(35));
  list.Append(sublist);
  f10_params = Function10::Params::Create(list);
  ASSERT_TRUE(f10_params != NULL);
  EXPECT_EQ(33, f10_params->x);
  ASSERT_EQ(2u, f10_params->y.size());
  EXPECT_EQ(34, f10_params->y[0]);
  EXPECT_EQ(35, f10_params->y[1]);

  // Now test a function which takes an array of a defined type.
  list.Clear();
  MyType1 a;
  MyType1 b;
  a.x = 5;
  b.x = 6;
  a.y = std::string("foo");
  b.y = std::string("bar");
  base::ListValue* sublist2 = new base::ListValue;
  sublist2->Append(a.ToValue().release());
  sublist2->Append(b.ToValue().release());
  list.Append(sublist2);
  scoped_ptr<Function11::Params> f11_params = Function11::Params::Create(list);
  ASSERT_TRUE(f11_params != NULL);
  ASSERT_EQ(2u, f11_params->arg.size());
  EXPECT_EQ(5, f11_params->arg[0]->x);
  EXPECT_EQ("foo", f11_params->arg[0]->y);
  EXPECT_EQ(6, f11_params->arg[1]->x);
  EXPECT_EQ("bar", f11_params->arg[1]->y);
}

TEST(IdlCompiler, ObjectTypes) {
  // Test the FooType type.
  FooType f1;
  f1.x = 3;
  scoped_ptr<base::DictionaryValue> serialized_foo = f1.ToValue();
  FooType f2;
  EXPECT_TRUE(FooType::Populate(*serialized_foo.get(), &f2));
  EXPECT_EQ(f1.x, f2.x);

  // Test the BarType type.
  BarType b1;
  b1.x.reset(new base::FundamentalValue(7));
  scoped_ptr<base::DictionaryValue> serialized_bar = b1.ToValue();
  BarType b2;
  EXPECT_TRUE(BarType::Populate(*serialized_bar.get(), &b2));
  int tmp_int = 0;
  EXPECT_TRUE(b2.x->GetAsInteger(&tmp_int));
  EXPECT_EQ(7, tmp_int);

  // Test the params to the ObjectFunction1 function.
  scoped_ptr<base::DictionaryValue> icon_props(new base::DictionaryValue());
  icon_props->SetString("hello", "world");
  ObjectFunction1::Params::Icon icon;
  EXPECT_TRUE(ObjectFunction1::Params::Icon::Populate(*(icon_props.get()),
                                                      &icon));
  base::ListValue list;
  list.Append(icon_props.release());
  scoped_ptr<ObjectFunction1::Params> params =
    ObjectFunction1::Params::Create(list);
  ASSERT_TRUE(params.get() != NULL);
  std::string tmp;
  EXPECT_TRUE(params->icon.additional_properties.GetString("hello", &tmp));
  EXPECT_EQ("world", tmp);
}
