root/tools/json_schema_compiler/test/idl_schemas_unittest.cc

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. TEST
  2. TEST
  3. TEST
  4. TEST

// 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(base::Value::CreateIntegerValue(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(base::Value::CreateIntegerValue(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(base::Value::CreateIntegerValue(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(base::Value::CreateIntegerValue(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(base::Value::CreateIntegerValue(33));
  base::ListValue* sublist = new base::ListValue;
  sublist->Append(base::Value::CreateIntegerValue(34));
  sublist->Append(base::Value::CreateIntegerValue(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);
}

/* [<][>][^][v][top][bottom][index][help] */