Home | History | Annotate | Download | only in test
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/values.h"
      6 #include "tools/json_schema_compiler/test/idl_basics.h"
      7 #include "tools/json_schema_compiler/test/idl_object_types.h"
      8 
      9 #include "testing/gtest/include/gtest/gtest.h"
     10 
     11 using test::api::idl_basics::MyType1;
     12 using test::api::idl_object_types::BarType;
     13 using test::api::idl_object_types::FooType;
     14 
     15 namespace Function2 = test::api::idl_basics::Function2;
     16 namespace Function3 = test::api::idl_basics::Function3;
     17 namespace Function4 = test::api::idl_basics::Function4;
     18 namespace Function5 = test::api::idl_basics::Function5;
     19 namespace Function6 = test::api::idl_basics::Function6;
     20 namespace Function7 = test::api::idl_basics::Function7;
     21 namespace Function8 = test::api::idl_basics::Function8;
     22 namespace Function9 = test::api::idl_basics::Function9;
     23 namespace Function10 = test::api::idl_basics::Function10;
     24 namespace Function11 = test::api::idl_basics::Function11;
     25 namespace ObjectFunction1 = test::api::idl_object_types::ObjectFunction1;
     26 
     27 TEST(IdlCompiler, Basics) {
     28   // Test MyType1.
     29   MyType1 a;
     30   a.x = 5;
     31   a.y = std::string("foo");
     32   scoped_ptr<base::DictionaryValue> serialized = a.ToValue();
     33   MyType1 b;
     34   EXPECT_TRUE(MyType1::Populate(*serialized.get(), &b));
     35   EXPECT_EQ(a.x, b.x);
     36   EXPECT_EQ(a.y, b.y);
     37 
     38   // Test Function2, which takes an integer parameter.
     39   base::ListValue list;
     40   list.Append(base::Value::CreateIntegerValue(5));
     41   scoped_ptr<Function2::Params> f2_params = Function2::Params::Create(list);
     42   EXPECT_EQ(5, f2_params->x);
     43 
     44   // Test Function3, which takes a MyType1 parameter.
     45   list.Clear();
     46   base::DictionaryValue* tmp = new base::DictionaryValue();
     47   tmp->SetInteger("x", 17);
     48   tmp->SetString("y", "hello");
     49   tmp->SetString("z", "zstring");
     50   tmp->SetString("a", "astring");
     51   tmp->SetString("b", "bstring");
     52   tmp->SetString("c", "cstring");
     53   list.Append(tmp);
     54   scoped_ptr<Function3::Params> f3_params = Function3::Params::Create(list);
     55   EXPECT_EQ(17, f3_params->arg.x);
     56   EXPECT_EQ("hello", f3_params->arg.y);
     57 
     58   // Test functions that take a callback function as a parameter, with varying
     59   // callback signatures.
     60   scoped_ptr<base::ListValue> f4_results = Function4::Results::Create();
     61   base::ListValue expected;
     62   EXPECT_TRUE(f4_results->Equals(&expected));
     63 
     64   scoped_ptr<base::ListValue> f5_results(Function5::Results::Create(13));
     65   base::Value* f5_result_int = NULL;
     66   ASSERT_TRUE(f5_results->Get(0, &f5_result_int));
     67   EXPECT_TRUE(f5_result_int->IsType(base::Value::TYPE_INTEGER));
     68 
     69   scoped_ptr<base::ListValue> f6_results(Function6::Results::Create(a));
     70   base::Value* f6_result_dict = NULL;
     71   ASSERT_TRUE(f6_results->Get(0, &f6_result_dict));
     72   MyType1 c;
     73   EXPECT_TRUE(MyType1::Populate(*f6_result_dict, &c));
     74   EXPECT_EQ(a.x, c.x);
     75   EXPECT_EQ(a.y, c.y);
     76 }
     77 
     78 TEST(IdlCompiler, OptionalArguments) {
     79   // Test a function that takes one optional argument, both without and with
     80   // that argument.
     81   base::ListValue list;
     82   scoped_ptr<Function7::Params> f7_params = Function7::Params::Create(list);
     83   EXPECT_EQ(NULL, f7_params->arg.get());
     84   list.Append(base::Value::CreateIntegerValue(7));
     85   f7_params = Function7::Params::Create(list);
     86   EXPECT_EQ(7, *(f7_params->arg));
     87 
     88   // Similar to above, but a function with one required and one optional
     89   // argument.
     90   list.Clear();
     91   list.Append(base::Value::CreateIntegerValue(8));
     92   scoped_ptr<Function8::Params> f8_params = Function8::Params::Create(list);
     93   EXPECT_EQ(8, f8_params->arg1);
     94   EXPECT_EQ(NULL, f8_params->arg2.get());
     95   list.Append(base::Value::CreateStringValue("foo"));
     96   f8_params = Function8::Params::Create(list);
     97   EXPECT_EQ(8, f8_params->arg1);
     98   EXPECT_EQ("foo", *(f8_params->arg2));
     99 
    100   // Test a function with an optional argument of custom type.
    101   list.Clear();
    102   scoped_ptr<Function9::Params> f9_params = Function9::Params::Create(list);
    103   EXPECT_EQ(NULL, f9_params->arg.get());
    104   list.Clear();
    105   base::DictionaryValue* tmp = new base::DictionaryValue();
    106   tmp->SetInteger("x", 17);
    107   tmp->SetString("y", "hello");
    108   tmp->SetString("z", "zstring");
    109   tmp->SetString("a", "astring");
    110   tmp->SetString("b", "bstring");
    111   tmp->SetString("c", "cstring");
    112   list.Append(tmp);
    113   f9_params = Function9::Params::Create(list);
    114   ASSERT_TRUE(f9_params->arg.get() != NULL);
    115   MyType1* t1 = f9_params->arg.get();
    116   EXPECT_EQ(17, t1->x);
    117   EXPECT_EQ("hello", t1->y);
    118 }
    119 
    120 TEST(IdlCompiler, ArrayTypes) {
    121   // Tests of a function that takes an integer and an array of integers. First
    122   // use an empty array.
    123   base::ListValue list;
    124   list.Append(base::Value::CreateIntegerValue(33));
    125   list.Append(new base::ListValue);
    126   scoped_ptr<Function10::Params> f10_params = Function10::Params::Create(list);
    127   ASSERT_TRUE(f10_params != NULL);
    128   EXPECT_EQ(33, f10_params->x);
    129   EXPECT_TRUE(f10_params->y.empty());
    130 
    131   // Same function, but this time with 2 values in the array.
    132   list.Clear();
    133   list.Append(base::Value::CreateIntegerValue(33));
    134   base::ListValue* sublist = new base::ListValue;
    135   sublist->Append(base::Value::CreateIntegerValue(34));
    136   sublist->Append(base::Value::CreateIntegerValue(35));
    137   list.Append(sublist);
    138   f10_params = Function10::Params::Create(list);
    139   ASSERT_TRUE(f10_params != NULL);
    140   EXPECT_EQ(33, f10_params->x);
    141   ASSERT_EQ(2u, f10_params->y.size());
    142   EXPECT_EQ(34, f10_params->y[0]);
    143   EXPECT_EQ(35, f10_params->y[1]);
    144 
    145   // Now test a function which takes an array of a defined type.
    146   list.Clear();
    147   MyType1 a;
    148   MyType1 b;
    149   a.x = 5;
    150   b.x = 6;
    151   a.y = std::string("foo");
    152   b.y = std::string("bar");
    153   base::ListValue* sublist2 = new base::ListValue;
    154   sublist2->Append(a.ToValue().release());
    155   sublist2->Append(b.ToValue().release());
    156   list.Append(sublist2);
    157   scoped_ptr<Function11::Params> f11_params = Function11::Params::Create(list);
    158   ASSERT_TRUE(f11_params != NULL);
    159   ASSERT_EQ(2u, f11_params->arg.size());
    160   EXPECT_EQ(5, f11_params->arg[0]->x);
    161   EXPECT_EQ("foo", f11_params->arg[0]->y);
    162   EXPECT_EQ(6, f11_params->arg[1]->x);
    163   EXPECT_EQ("bar", f11_params->arg[1]->y);
    164 }
    165 
    166 TEST(IdlCompiler, ObjectTypes) {
    167   // Test the FooType type.
    168   FooType f1;
    169   f1.x = 3;
    170   scoped_ptr<base::DictionaryValue> serialized_foo = f1.ToValue();
    171   FooType f2;
    172   EXPECT_TRUE(FooType::Populate(*serialized_foo.get(), &f2));
    173   EXPECT_EQ(f1.x, f2.x);
    174 
    175   // Test the BarType type.
    176   BarType b1;
    177   b1.x.reset(new base::FundamentalValue(7));
    178   scoped_ptr<base::DictionaryValue> serialized_bar = b1.ToValue();
    179   BarType b2;
    180   EXPECT_TRUE(BarType::Populate(*serialized_bar.get(), &b2));
    181   int tmp_int = 0;
    182   EXPECT_TRUE(b2.x->GetAsInteger(&tmp_int));
    183   EXPECT_EQ(7, tmp_int);
    184 
    185   // Test the params to the ObjectFunction1 function.
    186   scoped_ptr<base::DictionaryValue> icon_props(new base::DictionaryValue());
    187   icon_props->SetString("hello", "world");
    188   ObjectFunction1::Params::Icon icon;
    189   EXPECT_TRUE(ObjectFunction1::Params::Icon::Populate(*(icon_props.get()),
    190                                                       &icon));
    191   base::ListValue list;
    192   list.Append(icon_props.release());
    193   scoped_ptr<ObjectFunction1::Params> params =
    194     ObjectFunction1::Params::Create(list);
    195   ASSERT_TRUE(params.get() != NULL);
    196   std::string tmp;
    197   EXPECT_TRUE(params->icon.additional_properties.GetString("hello", &tmp));
    198   EXPECT_EQ("world", tmp);
    199 }
    200