Home | History | Annotate | Download | only in base
      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 <limits>
      6 
      7 #include "base/memory/scoped_ptr.h"
      8 #include "base/strings/string16.h"
      9 #include "base/strings/utf_string_conversions.h"
     10 #include "base/values.h"
     11 #include "testing/gtest/include/gtest/gtest.h"
     12 
     13 namespace base {
     14 
     15 TEST(ValuesTest, Basic) {
     16   // Test basic dictionary getting/setting
     17   DictionaryValue settings;
     18   std::string homepage = "http://google.com";
     19   ASSERT_FALSE(settings.GetString("global.homepage", &homepage));
     20   ASSERT_EQ(std::string("http://google.com"), homepage);
     21 
     22   ASSERT_FALSE(settings.Get("global", NULL));
     23   settings.Set("global", new FundamentalValue(true));
     24   ASSERT_TRUE(settings.Get("global", NULL));
     25   settings.SetString("global.homepage", "http://scurvy.com");
     26   ASSERT_TRUE(settings.Get("global", NULL));
     27   homepage = "http://google.com";
     28   ASSERT_TRUE(settings.GetString("global.homepage", &homepage));
     29   ASSERT_EQ(std::string("http://scurvy.com"), homepage);
     30 
     31   // Test storing a dictionary in a list.
     32   ListValue* toolbar_bookmarks;
     33   ASSERT_FALSE(
     34     settings.GetList("global.toolbar.bookmarks", &toolbar_bookmarks));
     35 
     36   toolbar_bookmarks = new ListValue;
     37   settings.Set("global.toolbar.bookmarks", toolbar_bookmarks);
     38   ASSERT_TRUE(settings.GetList("global.toolbar.bookmarks", &toolbar_bookmarks));
     39 
     40   DictionaryValue* new_bookmark = new DictionaryValue;
     41   new_bookmark->SetString("name", "Froogle");
     42   new_bookmark->SetString("url", "http://froogle.com");
     43   toolbar_bookmarks->Append(new_bookmark);
     44 
     45   ListValue* bookmark_list;
     46   ASSERT_TRUE(settings.GetList("global.toolbar.bookmarks", &bookmark_list));
     47   DictionaryValue* bookmark;
     48   ASSERT_EQ(1U, bookmark_list->GetSize());
     49   ASSERT_TRUE(bookmark_list->GetDictionary(0, &bookmark));
     50   std::string bookmark_name = "Unnamed";
     51   ASSERT_TRUE(bookmark->GetString("name", &bookmark_name));
     52   ASSERT_EQ(std::string("Froogle"), bookmark_name);
     53   std::string bookmark_url;
     54   ASSERT_TRUE(bookmark->GetString("url", &bookmark_url));
     55   ASSERT_EQ(std::string("http://froogle.com"), bookmark_url);
     56 }
     57 
     58 TEST(ValuesTest, List) {
     59   scoped_ptr<ListValue> mixed_list(new ListValue());
     60   mixed_list->Set(0, new FundamentalValue(true));
     61   mixed_list->Set(1, new FundamentalValue(42));
     62   mixed_list->Set(2, new FundamentalValue(88.8));
     63   mixed_list->Set(3, new StringValue("foo"));
     64   ASSERT_EQ(4u, mixed_list->GetSize());
     65 
     66   Value *value = NULL;
     67   bool bool_value = false;
     68   int int_value = 0;
     69   double double_value = 0.0;
     70   std::string string_value;
     71 
     72   ASSERT_FALSE(mixed_list->Get(4, &value));
     73 
     74   ASSERT_FALSE(mixed_list->GetInteger(0, &int_value));
     75   ASSERT_EQ(0, int_value);
     76   ASSERT_FALSE(mixed_list->GetBoolean(1, &bool_value));
     77   ASSERT_FALSE(bool_value);
     78   ASSERT_FALSE(mixed_list->GetString(2, &string_value));
     79   ASSERT_EQ("", string_value);
     80   ASSERT_FALSE(mixed_list->GetInteger(2, &int_value));
     81   ASSERT_EQ(0, int_value);
     82   ASSERT_FALSE(mixed_list->GetBoolean(3, &bool_value));
     83   ASSERT_FALSE(bool_value);
     84 
     85   ASSERT_TRUE(mixed_list->GetBoolean(0, &bool_value));
     86   ASSERT_TRUE(bool_value);
     87   ASSERT_TRUE(mixed_list->GetInteger(1, &int_value));
     88   ASSERT_EQ(42, int_value);
     89   // implicit conversion from Integer to Double should be possible.
     90   ASSERT_TRUE(mixed_list->GetDouble(1, &double_value));
     91   ASSERT_EQ(42, double_value);
     92   ASSERT_TRUE(mixed_list->GetDouble(2, &double_value));
     93   ASSERT_EQ(88.8, double_value);
     94   ASSERT_TRUE(mixed_list->GetString(3, &string_value));
     95   ASSERT_EQ("foo", string_value);
     96 
     97   // Try searching in the mixed list.
     98   base::FundamentalValue sought_value(42);
     99   base::FundamentalValue not_found_value(false);
    100 
    101   ASSERT_NE(mixed_list->end(), mixed_list->Find(sought_value));
    102   ASSERT_TRUE((*mixed_list->Find(sought_value))->GetAsInteger(&int_value));
    103   ASSERT_EQ(42, int_value);
    104   ASSERT_EQ(mixed_list->end(), mixed_list->Find(not_found_value));
    105 }
    106 
    107 TEST(ValuesTest, BinaryValue) {
    108   // Default constructor creates a BinaryValue with a null buffer and size 0.
    109   scoped_ptr<BinaryValue> binary(new BinaryValue());
    110   ASSERT_TRUE(binary.get());
    111   ASSERT_EQ(NULL, binary->GetBuffer());
    112   ASSERT_EQ(0U, binary->GetSize());
    113 
    114   // Test the common case of a non-empty buffer
    115   char* buffer = new char[15];
    116   binary.reset(new BinaryValue(scoped_ptr<char[]>(buffer), 15));
    117   ASSERT_TRUE(binary.get());
    118   ASSERT_TRUE(binary->GetBuffer());
    119   ASSERT_EQ(buffer, binary->GetBuffer());
    120   ASSERT_EQ(15U, binary->GetSize());
    121 
    122   char stack_buffer[42];
    123   memset(stack_buffer, '!', 42);
    124   binary.reset(BinaryValue::CreateWithCopiedBuffer(stack_buffer, 42));
    125   ASSERT_TRUE(binary.get());
    126   ASSERT_TRUE(binary->GetBuffer());
    127   ASSERT_NE(stack_buffer, binary->GetBuffer());
    128   ASSERT_EQ(42U, binary->GetSize());
    129   ASSERT_EQ(0, memcmp(stack_buffer, binary->GetBuffer(), binary->GetSize()));
    130 }
    131 
    132 TEST(ValuesTest, StringValue) {
    133   // Test overloaded StringValue constructor.
    134   scoped_ptr<Value> narrow_value(new StringValue("narrow"));
    135   ASSERT_TRUE(narrow_value.get());
    136   ASSERT_TRUE(narrow_value->IsType(Value::TYPE_STRING));
    137   scoped_ptr<Value> utf16_value(new StringValue(ASCIIToUTF16("utf16")));
    138   ASSERT_TRUE(utf16_value.get());
    139   ASSERT_TRUE(utf16_value->IsType(Value::TYPE_STRING));
    140 
    141   // Test overloaded GetAsString.
    142   std::string narrow = "http://google.com";
    143   string16 utf16 = ASCIIToUTF16("http://google.com");
    144   const StringValue* string_value = NULL;
    145   ASSERT_TRUE(narrow_value->GetAsString(&narrow));
    146   ASSERT_TRUE(narrow_value->GetAsString(&utf16));
    147   ASSERT_TRUE(narrow_value->GetAsString(&string_value));
    148   ASSERT_EQ(std::string("narrow"), narrow);
    149   ASSERT_EQ(ASCIIToUTF16("narrow"), utf16);
    150   ASSERT_EQ(string_value->GetString(), narrow);
    151 
    152   ASSERT_TRUE(utf16_value->GetAsString(&narrow));
    153   ASSERT_TRUE(utf16_value->GetAsString(&utf16));
    154   ASSERT_TRUE(utf16_value->GetAsString(&string_value));
    155   ASSERT_EQ(std::string("utf16"), narrow);
    156   ASSERT_EQ(ASCIIToUTF16("utf16"), utf16);
    157   ASSERT_EQ(string_value->GetString(), narrow);
    158 
    159   // Don't choke on NULL values.
    160   ASSERT_TRUE(narrow_value->GetAsString(static_cast<string16*>(NULL)));
    161   ASSERT_TRUE(narrow_value->GetAsString(static_cast<std::string*>(NULL)));
    162   ASSERT_TRUE(narrow_value->GetAsString(
    163                   static_cast<const StringValue**>(NULL)));
    164 }
    165 
    166 // This is a Value object that allows us to tell if it's been
    167 // properly deleted by modifying the value of external flag on destruction.
    168 class DeletionTestValue : public Value {
    169  public:
    170   explicit DeletionTestValue(bool* deletion_flag) : Value(TYPE_NULL) {
    171     Init(deletion_flag);  // Separate function so that we can use ASSERT_*
    172   }
    173 
    174   void Init(bool* deletion_flag) {
    175     ASSERT_TRUE(deletion_flag);
    176     deletion_flag_ = deletion_flag;
    177     *deletion_flag_ = false;
    178   }
    179 
    180   virtual ~DeletionTestValue() {
    181     *deletion_flag_ = true;
    182   }
    183 
    184  private:
    185   bool* deletion_flag_;
    186 };
    187 
    188 TEST(ValuesTest, ListDeletion) {
    189   bool deletion_flag = true;
    190 
    191   {
    192     ListValue list;
    193     list.Append(new DeletionTestValue(&deletion_flag));
    194     EXPECT_FALSE(deletion_flag);
    195   }
    196   EXPECT_TRUE(deletion_flag);
    197 
    198   {
    199     ListValue list;
    200     list.Append(new DeletionTestValue(&deletion_flag));
    201     EXPECT_FALSE(deletion_flag);
    202     list.Clear();
    203     EXPECT_TRUE(deletion_flag);
    204   }
    205 
    206   {
    207     ListValue list;
    208     list.Append(new DeletionTestValue(&deletion_flag));
    209     EXPECT_FALSE(deletion_flag);
    210     EXPECT_TRUE(list.Set(0, Value::CreateNullValue()));
    211     EXPECT_TRUE(deletion_flag);
    212   }
    213 }
    214 
    215 TEST(ValuesTest, ListRemoval) {
    216   bool deletion_flag = true;
    217   scoped_ptr<Value> removed_item;
    218 
    219   {
    220     ListValue list;
    221     list.Append(new DeletionTestValue(&deletion_flag));
    222     EXPECT_FALSE(deletion_flag);
    223     EXPECT_EQ(1U, list.GetSize());
    224     EXPECT_FALSE(list.Remove(std::numeric_limits<size_t>::max(),
    225                              &removed_item));
    226     EXPECT_FALSE(list.Remove(1, &removed_item));
    227     EXPECT_TRUE(list.Remove(0, &removed_item));
    228     ASSERT_TRUE(removed_item);
    229     EXPECT_EQ(0U, list.GetSize());
    230   }
    231   EXPECT_FALSE(deletion_flag);
    232   removed_item.reset();
    233   EXPECT_TRUE(deletion_flag);
    234 
    235   {
    236     ListValue list;
    237     list.Append(new DeletionTestValue(&deletion_flag));
    238     EXPECT_FALSE(deletion_flag);
    239     EXPECT_TRUE(list.Remove(0, NULL));
    240     EXPECT_TRUE(deletion_flag);
    241     EXPECT_EQ(0U, list.GetSize());
    242   }
    243 
    244   {
    245     ListValue list;
    246     DeletionTestValue* value = new DeletionTestValue(&deletion_flag);
    247     list.Append(value);
    248     EXPECT_FALSE(deletion_flag);
    249     size_t index = 0;
    250     list.Remove(*value, &index);
    251     EXPECT_EQ(0U, index);
    252     EXPECT_TRUE(deletion_flag);
    253     EXPECT_EQ(0U, list.GetSize());
    254   }
    255 }
    256 
    257 TEST(ValuesTest, DictionaryDeletion) {
    258   std::string key = "test";
    259   bool deletion_flag = true;
    260 
    261   {
    262     DictionaryValue dict;
    263     dict.Set(key, new DeletionTestValue(&deletion_flag));
    264     EXPECT_FALSE(deletion_flag);
    265   }
    266   EXPECT_TRUE(deletion_flag);
    267 
    268   {
    269     DictionaryValue dict;
    270     dict.Set(key, new DeletionTestValue(&deletion_flag));
    271     EXPECT_FALSE(deletion_flag);
    272     dict.Clear();
    273     EXPECT_TRUE(deletion_flag);
    274   }
    275 
    276   {
    277     DictionaryValue dict;
    278     dict.Set(key, new DeletionTestValue(&deletion_flag));
    279     EXPECT_FALSE(deletion_flag);
    280     dict.Set(key, Value::CreateNullValue());
    281     EXPECT_TRUE(deletion_flag);
    282   }
    283 }
    284 
    285 TEST(ValuesTest, DictionaryRemoval) {
    286   std::string key = "test";
    287   bool deletion_flag = true;
    288   scoped_ptr<Value> removed_item;
    289 
    290   {
    291     DictionaryValue dict;
    292     dict.Set(key, new DeletionTestValue(&deletion_flag));
    293     EXPECT_FALSE(deletion_flag);
    294     EXPECT_TRUE(dict.HasKey(key));
    295     EXPECT_FALSE(dict.Remove("absent key", &removed_item));
    296     EXPECT_TRUE(dict.Remove(key, &removed_item));
    297     EXPECT_FALSE(dict.HasKey(key));
    298     ASSERT_TRUE(removed_item);
    299   }
    300   EXPECT_FALSE(deletion_flag);
    301   removed_item.reset();
    302   EXPECT_TRUE(deletion_flag);
    303 
    304   {
    305     DictionaryValue dict;
    306     dict.Set(key, new DeletionTestValue(&deletion_flag));
    307     EXPECT_FALSE(deletion_flag);
    308     EXPECT_TRUE(dict.HasKey(key));
    309     EXPECT_TRUE(dict.Remove(key, NULL));
    310     EXPECT_TRUE(deletion_flag);
    311     EXPECT_FALSE(dict.HasKey(key));
    312   }
    313 }
    314 
    315 TEST(ValuesTest, DictionaryWithoutPathExpansion) {
    316   DictionaryValue dict;
    317   dict.Set("this.is.expanded", Value::CreateNullValue());
    318   dict.SetWithoutPathExpansion("this.isnt.expanded", Value::CreateNullValue());
    319 
    320   EXPECT_FALSE(dict.HasKey("this.is.expanded"));
    321   EXPECT_TRUE(dict.HasKey("this"));
    322   Value* value1;
    323   EXPECT_TRUE(dict.Get("this", &value1));
    324   DictionaryValue* value2;
    325   ASSERT_TRUE(dict.GetDictionaryWithoutPathExpansion("this", &value2));
    326   EXPECT_EQ(value1, value2);
    327   EXPECT_EQ(1U, value2->size());
    328 
    329   EXPECT_TRUE(dict.HasKey("this.isnt.expanded"));
    330   Value* value3;
    331   EXPECT_FALSE(dict.Get("this.isnt.expanded", &value3));
    332   Value* value4;
    333   ASSERT_TRUE(dict.GetWithoutPathExpansion("this.isnt.expanded", &value4));
    334   EXPECT_EQ(Value::TYPE_NULL, value4->GetType());
    335 }
    336 
    337 TEST(ValuesTest, DictionaryRemovePath) {
    338   DictionaryValue dict;
    339   dict.Set("a.long.way.down", new FundamentalValue(1));
    340   dict.Set("a.long.key.path", new FundamentalValue(true));
    341 
    342   scoped_ptr<Value> removed_item;
    343   EXPECT_TRUE(dict.RemovePath("a.long.way.down", &removed_item));
    344   ASSERT_TRUE(removed_item);
    345   EXPECT_TRUE(removed_item->IsType(base::Value::TYPE_INTEGER));
    346   EXPECT_FALSE(dict.HasKey("a.long.way.down"));
    347   EXPECT_FALSE(dict.HasKey("a.long.way"));
    348   EXPECT_TRUE(dict.Get("a.long.key.path", NULL));
    349 
    350   removed_item.reset();
    351   EXPECT_FALSE(dict.RemovePath("a.long.way.down", &removed_item));
    352   EXPECT_FALSE(removed_item);
    353   EXPECT_TRUE(dict.Get("a.long.key.path", NULL));
    354 
    355   removed_item.reset();
    356   EXPECT_TRUE(dict.RemovePath("a.long.key.path", &removed_item));
    357   ASSERT_TRUE(removed_item);
    358   EXPECT_TRUE(removed_item->IsType(base::Value::TYPE_BOOLEAN));
    359   EXPECT_TRUE(dict.empty());
    360 }
    361 
    362 TEST(ValuesTest, DeepCopy) {
    363   DictionaryValue original_dict;
    364   Value* original_null = Value::CreateNullValue();
    365   original_dict.Set("null", original_null);
    366   FundamentalValue* original_bool = new FundamentalValue(true);
    367   original_dict.Set("bool", original_bool);
    368   FundamentalValue* original_int = new FundamentalValue(42);
    369   original_dict.Set("int", original_int);
    370   FundamentalValue* original_double = new FundamentalValue(3.14);
    371   original_dict.Set("double", original_double);
    372   StringValue* original_string = new StringValue("hello");
    373   original_dict.Set("string", original_string);
    374   StringValue* original_string16 = new StringValue(ASCIIToUTF16("hello16"));
    375   original_dict.Set("string16", original_string16);
    376 
    377   scoped_ptr<char[]> original_buffer(new char[42]);
    378   memset(original_buffer.get(), '!', 42);
    379   BinaryValue* original_binary = new BinaryValue(original_buffer.Pass(), 42);
    380   original_dict.Set("binary", original_binary);
    381 
    382   ListValue* original_list = new ListValue();
    383   FundamentalValue* original_list_element_0 = new FundamentalValue(0);
    384   original_list->Append(original_list_element_0);
    385   FundamentalValue* original_list_element_1 = new FundamentalValue(1);
    386   original_list->Append(original_list_element_1);
    387   original_dict.Set("list", original_list);
    388 
    389   DictionaryValue* original_nested_dictionary = new DictionaryValue();
    390   original_nested_dictionary->Set("key", new StringValue("value"));
    391   original_dict.Set("dictionary", original_nested_dictionary);
    392 
    393   scoped_ptr<DictionaryValue> copy_dict(original_dict.DeepCopy());
    394   ASSERT_TRUE(copy_dict.get());
    395   ASSERT_NE(copy_dict.get(), &original_dict);
    396 
    397   Value* copy_null = NULL;
    398   ASSERT_TRUE(copy_dict->Get("null", &copy_null));
    399   ASSERT_TRUE(copy_null);
    400   ASSERT_NE(copy_null, original_null);
    401   ASSERT_TRUE(copy_null->IsType(Value::TYPE_NULL));
    402 
    403   Value* copy_bool = NULL;
    404   ASSERT_TRUE(copy_dict->Get("bool", &copy_bool));
    405   ASSERT_TRUE(copy_bool);
    406   ASSERT_NE(copy_bool, original_bool);
    407   ASSERT_TRUE(copy_bool->IsType(Value::TYPE_BOOLEAN));
    408   bool copy_bool_value = false;
    409   ASSERT_TRUE(copy_bool->GetAsBoolean(&copy_bool_value));
    410   ASSERT_TRUE(copy_bool_value);
    411 
    412   Value* copy_int = NULL;
    413   ASSERT_TRUE(copy_dict->Get("int", &copy_int));
    414   ASSERT_TRUE(copy_int);
    415   ASSERT_NE(copy_int, original_int);
    416   ASSERT_TRUE(copy_int->IsType(Value::TYPE_INTEGER));
    417   int copy_int_value = 0;
    418   ASSERT_TRUE(copy_int->GetAsInteger(&copy_int_value));
    419   ASSERT_EQ(42, copy_int_value);
    420 
    421   Value* copy_double = NULL;
    422   ASSERT_TRUE(copy_dict->Get("double", &copy_double));
    423   ASSERT_TRUE(copy_double);
    424   ASSERT_NE(copy_double, original_double);
    425   ASSERT_TRUE(copy_double->IsType(Value::TYPE_DOUBLE));
    426   double copy_double_value = 0;
    427   ASSERT_TRUE(copy_double->GetAsDouble(&copy_double_value));
    428   ASSERT_EQ(3.14, copy_double_value);
    429 
    430   Value* copy_string = NULL;
    431   ASSERT_TRUE(copy_dict->Get("string", &copy_string));
    432   ASSERT_TRUE(copy_string);
    433   ASSERT_NE(copy_string, original_string);
    434   ASSERT_TRUE(copy_string->IsType(Value::TYPE_STRING));
    435   std::string copy_string_value;
    436   string16 copy_string16_value;
    437   ASSERT_TRUE(copy_string->GetAsString(&copy_string_value));
    438   ASSERT_TRUE(copy_string->GetAsString(&copy_string16_value));
    439   ASSERT_EQ(std::string("hello"), copy_string_value);
    440   ASSERT_EQ(ASCIIToUTF16("hello"), copy_string16_value);
    441 
    442   Value* copy_string16 = NULL;
    443   ASSERT_TRUE(copy_dict->Get("string16", &copy_string16));
    444   ASSERT_TRUE(copy_string16);
    445   ASSERT_NE(copy_string16, original_string16);
    446   ASSERT_TRUE(copy_string16->IsType(Value::TYPE_STRING));
    447   ASSERT_TRUE(copy_string16->GetAsString(&copy_string_value));
    448   ASSERT_TRUE(copy_string16->GetAsString(&copy_string16_value));
    449   ASSERT_EQ(std::string("hello16"), copy_string_value);
    450   ASSERT_EQ(ASCIIToUTF16("hello16"), copy_string16_value);
    451 
    452   Value* copy_binary = NULL;
    453   ASSERT_TRUE(copy_dict->Get("binary", &copy_binary));
    454   ASSERT_TRUE(copy_binary);
    455   ASSERT_NE(copy_binary, original_binary);
    456   ASSERT_TRUE(copy_binary->IsType(Value::TYPE_BINARY));
    457   ASSERT_NE(original_binary->GetBuffer(),
    458     static_cast<BinaryValue*>(copy_binary)->GetBuffer());
    459   ASSERT_EQ(original_binary->GetSize(),
    460     static_cast<BinaryValue*>(copy_binary)->GetSize());
    461   ASSERT_EQ(0, memcmp(original_binary->GetBuffer(),
    462                static_cast<BinaryValue*>(copy_binary)->GetBuffer(),
    463                original_binary->GetSize()));
    464 
    465   Value* copy_value = NULL;
    466   ASSERT_TRUE(copy_dict->Get("list", &copy_value));
    467   ASSERT_TRUE(copy_value);
    468   ASSERT_NE(copy_value, original_list);
    469   ASSERT_TRUE(copy_value->IsType(Value::TYPE_LIST));
    470   ListValue* copy_list = NULL;
    471   ASSERT_TRUE(copy_value->GetAsList(&copy_list));
    472   ASSERT_TRUE(copy_list);
    473   ASSERT_EQ(2U, copy_list->GetSize());
    474 
    475   Value* copy_list_element_0;
    476   ASSERT_TRUE(copy_list->Get(0, &copy_list_element_0));
    477   ASSERT_TRUE(copy_list_element_0);
    478   ASSERT_NE(copy_list_element_0, original_list_element_0);
    479   int copy_list_element_0_value;
    480   ASSERT_TRUE(copy_list_element_0->GetAsInteger(&copy_list_element_0_value));
    481   ASSERT_EQ(0, copy_list_element_0_value);
    482 
    483   Value* copy_list_element_1;
    484   ASSERT_TRUE(copy_list->Get(1, &copy_list_element_1));
    485   ASSERT_TRUE(copy_list_element_1);
    486   ASSERT_NE(copy_list_element_1, original_list_element_1);
    487   int copy_list_element_1_value;
    488   ASSERT_TRUE(copy_list_element_1->GetAsInteger(&copy_list_element_1_value));
    489   ASSERT_EQ(1, copy_list_element_1_value);
    490 
    491   copy_value = NULL;
    492   ASSERT_TRUE(copy_dict->Get("dictionary", &copy_value));
    493   ASSERT_TRUE(copy_value);
    494   ASSERT_NE(copy_value, original_nested_dictionary);
    495   ASSERT_TRUE(copy_value->IsType(Value::TYPE_DICTIONARY));
    496   DictionaryValue* copy_nested_dictionary = NULL;
    497   ASSERT_TRUE(copy_value->GetAsDictionary(&copy_nested_dictionary));
    498   ASSERT_TRUE(copy_nested_dictionary);
    499   EXPECT_TRUE(copy_nested_dictionary->HasKey("key"));
    500 }
    501 
    502 TEST(ValuesTest, Equals) {
    503   Value* null1 = Value::CreateNullValue();
    504   Value* null2 = Value::CreateNullValue();
    505   EXPECT_NE(null1, null2);
    506   EXPECT_TRUE(null1->Equals(null2));
    507 
    508   Value* boolean = new FundamentalValue(false);
    509   EXPECT_FALSE(null1->Equals(boolean));
    510   delete null1;
    511   delete null2;
    512   delete boolean;
    513 
    514   DictionaryValue dv;
    515   dv.SetBoolean("a", false);
    516   dv.SetInteger("b", 2);
    517   dv.SetDouble("c", 2.5);
    518   dv.SetString("d1", "string");
    519   dv.SetString("d2", ASCIIToUTF16("http://google.com"));
    520   dv.Set("e", Value::CreateNullValue());
    521 
    522   scoped_ptr<DictionaryValue> copy;
    523   copy.reset(dv.DeepCopy());
    524   EXPECT_TRUE(dv.Equals(copy.get()));
    525 
    526   ListValue* list = new ListValue;
    527   list->Append(Value::CreateNullValue());
    528   list->Append(new DictionaryValue);
    529   dv.Set("f", list);
    530 
    531   EXPECT_FALSE(dv.Equals(copy.get()));
    532   copy->Set("f", list->DeepCopy());
    533   EXPECT_TRUE(dv.Equals(copy.get()));
    534 
    535   list->Append(new FundamentalValue(true));
    536   EXPECT_FALSE(dv.Equals(copy.get()));
    537 
    538   // Check if Equals detects differences in only the keys.
    539   copy.reset(dv.DeepCopy());
    540   EXPECT_TRUE(dv.Equals(copy.get()));
    541   copy->Remove("a", NULL);
    542   copy->SetBoolean("aa", false);
    543   EXPECT_FALSE(dv.Equals(copy.get()));
    544 }
    545 
    546 TEST(ValuesTest, StaticEquals) {
    547   scoped_ptr<Value> null1(Value::CreateNullValue());
    548   scoped_ptr<Value> null2(Value::CreateNullValue());
    549   EXPECT_TRUE(Value::Equals(null1.get(), null2.get()));
    550   EXPECT_TRUE(Value::Equals(NULL, NULL));
    551 
    552   scoped_ptr<Value> i42(new FundamentalValue(42));
    553   scoped_ptr<Value> j42(new FundamentalValue(42));
    554   scoped_ptr<Value> i17(new FundamentalValue(17));
    555   EXPECT_TRUE(Value::Equals(i42.get(), i42.get()));
    556   EXPECT_TRUE(Value::Equals(j42.get(), i42.get()));
    557   EXPECT_TRUE(Value::Equals(i42.get(), j42.get()));
    558   EXPECT_FALSE(Value::Equals(i42.get(), i17.get()));
    559   EXPECT_FALSE(Value::Equals(i42.get(), NULL));
    560   EXPECT_FALSE(Value::Equals(NULL, i42.get()));
    561 
    562   // NULL and Value::CreateNullValue() are intentionally different: We need
    563   // support for NULL as a return value for "undefined" without caring for
    564   // ownership of the pointer.
    565   EXPECT_FALSE(Value::Equals(null1.get(), NULL));
    566   EXPECT_FALSE(Value::Equals(NULL, null1.get()));
    567 }
    568 
    569 TEST(ValuesTest, DeepCopyCovariantReturnTypes) {
    570   DictionaryValue original_dict;
    571   Value* original_null = Value::CreateNullValue();
    572   original_dict.Set("null", original_null);
    573   FundamentalValue* original_bool = new FundamentalValue(true);
    574   original_dict.Set("bool", original_bool);
    575   FundamentalValue* original_int = new FundamentalValue(42);
    576   original_dict.Set("int", original_int);
    577   FundamentalValue* original_double = new FundamentalValue(3.14);
    578   original_dict.Set("double", original_double);
    579   StringValue* original_string = new StringValue("hello");
    580   original_dict.Set("string", original_string);
    581   StringValue* original_string16 = new StringValue(ASCIIToUTF16("hello16"));
    582   original_dict.Set("string16", original_string16);
    583 
    584   scoped_ptr<char[]> original_buffer(new char[42]);
    585   memset(original_buffer.get(), '!', 42);
    586   BinaryValue* original_binary = new BinaryValue(original_buffer.Pass(), 42);
    587   original_dict.Set("binary", original_binary);
    588 
    589   ListValue* original_list = new ListValue();
    590   FundamentalValue* original_list_element_0 = new FundamentalValue(0);
    591   original_list->Append(original_list_element_0);
    592   FundamentalValue* original_list_element_1 = new FundamentalValue(1);
    593   original_list->Append(original_list_element_1);
    594   original_dict.Set("list", original_list);
    595 
    596   Value* original_dict_value = &original_dict;
    597   Value* original_bool_value = original_bool;
    598   Value* original_int_value = original_int;
    599   Value* original_double_value = original_double;
    600   Value* original_string_value = original_string;
    601   Value* original_string16_value = original_string16;
    602   Value* original_binary_value = original_binary;
    603   Value* original_list_value = original_list;
    604 
    605   scoped_ptr<Value> copy_dict_value(original_dict_value->DeepCopy());
    606   scoped_ptr<Value> copy_bool_value(original_bool_value->DeepCopy());
    607   scoped_ptr<Value> copy_int_value(original_int_value->DeepCopy());
    608   scoped_ptr<Value> copy_double_value(original_double_value->DeepCopy());
    609   scoped_ptr<Value> copy_string_value(original_string_value->DeepCopy());
    610   scoped_ptr<Value> copy_string16_value(original_string16_value->DeepCopy());
    611   scoped_ptr<Value> copy_binary_value(original_binary_value->DeepCopy());
    612   scoped_ptr<Value> copy_list_value(original_list_value->DeepCopy());
    613 
    614   EXPECT_TRUE(original_dict_value->Equals(copy_dict_value.get()));
    615   EXPECT_TRUE(original_bool_value->Equals(copy_bool_value.get()));
    616   EXPECT_TRUE(original_int_value->Equals(copy_int_value.get()));
    617   EXPECT_TRUE(original_double_value->Equals(copy_double_value.get()));
    618   EXPECT_TRUE(original_string_value->Equals(copy_string_value.get()));
    619   EXPECT_TRUE(original_string16_value->Equals(copy_string16_value.get()));
    620   EXPECT_TRUE(original_binary_value->Equals(copy_binary_value.get()));
    621   EXPECT_TRUE(original_list_value->Equals(copy_list_value.get()));
    622 }
    623 
    624 TEST(ValuesTest, RemoveEmptyChildren) {
    625   scoped_ptr<DictionaryValue> root(new DictionaryValue);
    626   // Remove empty lists and dictionaries.
    627   root->Set("empty_dict", new DictionaryValue);
    628   root->Set("empty_list", new ListValue);
    629   root->SetWithoutPathExpansion("a.b.c.d.e", new DictionaryValue);
    630   root.reset(root->DeepCopyWithoutEmptyChildren());
    631   EXPECT_TRUE(root->empty());
    632 
    633   // Make sure we don't prune too much.
    634   root->SetBoolean("bool", true);
    635   root->Set("empty_dict", new DictionaryValue);
    636   root->SetString("empty_string", std::string());
    637   root.reset(root->DeepCopyWithoutEmptyChildren());
    638   EXPECT_EQ(2U, root->size());
    639 
    640   // Should do nothing.
    641   root.reset(root->DeepCopyWithoutEmptyChildren());
    642   EXPECT_EQ(2U, root->size());
    643 
    644   // Nested test cases.  These should all reduce back to the bool and string
    645   // set above.
    646   {
    647     root->Set("a.b.c.d.e", new DictionaryValue);
    648     root.reset(root->DeepCopyWithoutEmptyChildren());
    649     EXPECT_EQ(2U, root->size());
    650   }
    651   {
    652     DictionaryValue* inner = new DictionaryValue;
    653     root->Set("dict_with_emtpy_children", inner);
    654     inner->Set("empty_dict", new DictionaryValue);
    655     inner->Set("empty_list", new ListValue);
    656     root.reset(root->DeepCopyWithoutEmptyChildren());
    657     EXPECT_EQ(2U, root->size());
    658   }
    659   {
    660     ListValue* inner = new ListValue;
    661     root->Set("list_with_empty_children", inner);
    662     inner->Append(new DictionaryValue);
    663     inner->Append(new ListValue);
    664     root.reset(root->DeepCopyWithoutEmptyChildren());
    665     EXPECT_EQ(2U, root->size());
    666   }
    667 
    668   // Nested with siblings.
    669   {
    670     ListValue* inner = new ListValue;
    671     root->Set("list_with_empty_children", inner);
    672     inner->Append(new DictionaryValue);
    673     inner->Append(new ListValue);
    674     DictionaryValue* inner2 = new DictionaryValue;
    675     root->Set("dict_with_empty_children", inner2);
    676     inner2->Set("empty_dict", new DictionaryValue);
    677     inner2->Set("empty_list", new ListValue);
    678     root.reset(root->DeepCopyWithoutEmptyChildren());
    679     EXPECT_EQ(2U, root->size());
    680   }
    681 
    682   // Make sure nested values don't get pruned.
    683   {
    684     ListValue* inner = new ListValue;
    685     root->Set("list_with_empty_children", inner);
    686     ListValue* inner2 = new ListValue;
    687     inner->Append(new DictionaryValue);
    688     inner->Append(inner2);
    689     inner2->Append(new StringValue("hello"));
    690     root.reset(root->DeepCopyWithoutEmptyChildren());
    691     EXPECT_EQ(3U, root->size());
    692     EXPECT_TRUE(root->GetList("list_with_empty_children", &inner));
    693     EXPECT_EQ(1U, inner->GetSize());  // Dictionary was pruned.
    694     EXPECT_TRUE(inner->GetList(0, &inner2));
    695     EXPECT_EQ(1U, inner2->GetSize());
    696   }
    697 }
    698 
    699 TEST(ValuesTest, MergeDictionary) {
    700   scoped_ptr<DictionaryValue> base(new DictionaryValue);
    701   base->SetString("base_key", "base_key_value_base");
    702   base->SetString("collide_key", "collide_key_value_base");
    703   DictionaryValue* base_sub_dict = new DictionaryValue;
    704   base_sub_dict->SetString("sub_base_key", "sub_base_key_value_base");
    705   base_sub_dict->SetString("sub_collide_key", "sub_collide_key_value_base");
    706   base->Set("sub_dict_key", base_sub_dict);
    707 
    708   scoped_ptr<DictionaryValue> merge(new DictionaryValue);
    709   merge->SetString("merge_key", "merge_key_value_merge");
    710   merge->SetString("collide_key", "collide_key_value_merge");
    711   DictionaryValue* merge_sub_dict = new DictionaryValue;
    712   merge_sub_dict->SetString("sub_merge_key", "sub_merge_key_value_merge");
    713   merge_sub_dict->SetString("sub_collide_key", "sub_collide_key_value_merge");
    714   merge->Set("sub_dict_key", merge_sub_dict);
    715 
    716   base->MergeDictionary(merge.get());
    717 
    718   EXPECT_EQ(4U, base->size());
    719   std::string base_key_value;
    720   EXPECT_TRUE(base->GetString("base_key", &base_key_value));
    721   EXPECT_EQ("base_key_value_base", base_key_value); // Base value preserved.
    722   std::string collide_key_value;
    723   EXPECT_TRUE(base->GetString("collide_key", &collide_key_value));
    724   EXPECT_EQ("collide_key_value_merge", collide_key_value); // Replaced.
    725   std::string merge_key_value;
    726   EXPECT_TRUE(base->GetString("merge_key", &merge_key_value));
    727   EXPECT_EQ("merge_key_value_merge", merge_key_value); // Merged in.
    728 
    729   DictionaryValue* res_sub_dict;
    730   EXPECT_TRUE(base->GetDictionary("sub_dict_key", &res_sub_dict));
    731   EXPECT_EQ(3U, res_sub_dict->size());
    732   std::string sub_base_key_value;
    733   EXPECT_TRUE(res_sub_dict->GetString("sub_base_key", &sub_base_key_value));
    734   EXPECT_EQ("sub_base_key_value_base", sub_base_key_value); // Preserved.
    735   std::string sub_collide_key_value;
    736   EXPECT_TRUE(res_sub_dict->GetString("sub_collide_key",
    737                                       &sub_collide_key_value));
    738   EXPECT_EQ("sub_collide_key_value_merge", sub_collide_key_value); // Replaced.
    739   std::string sub_merge_key_value;
    740   EXPECT_TRUE(res_sub_dict->GetString("sub_merge_key", &sub_merge_key_value));
    741   EXPECT_EQ("sub_merge_key_value_merge", sub_merge_key_value); // Merged in.
    742 }
    743 
    744 TEST(ValuesTest, MergeDictionaryDeepCopy) {
    745   DictionaryValue* child = new DictionaryValue;
    746   child->SetString("test", "value");
    747   EXPECT_EQ(1U, child->size());
    748 
    749   std::string value;
    750   EXPECT_TRUE(child->GetString("test", &value));
    751   EXPECT_EQ("value", value);
    752 
    753   scoped_ptr<DictionaryValue> base(new DictionaryValue);
    754   base->Set("dict", child);
    755   EXPECT_EQ(1U, base->size());
    756 
    757   DictionaryValue* ptr;
    758   EXPECT_TRUE(base->GetDictionary("dict", &ptr));
    759   EXPECT_EQ(child, ptr);
    760 
    761   scoped_ptr<DictionaryValue> merged(new DictionaryValue);
    762   merged->MergeDictionary(base.get());
    763   EXPECT_EQ(1U, merged->size());
    764   EXPECT_TRUE(merged->GetDictionary("dict", &ptr));
    765   EXPECT_NE(child, ptr);
    766   EXPECT_TRUE(ptr->GetString("test", &value));
    767   EXPECT_EQ("value", value);
    768 
    769   child->SetString("test", "overwrite");
    770   base.reset();
    771   EXPECT_TRUE(ptr->GetString("test", &value));
    772   EXPECT_EQ("value", value);
    773 }
    774 
    775 TEST(ValuesTest, DictionaryIterator) {
    776   DictionaryValue dict;
    777   for (DictionaryValue::Iterator it(dict); !it.IsAtEnd(); it.Advance()) {
    778     ADD_FAILURE();
    779   }
    780 
    781   StringValue value1("value1");
    782   dict.Set("key1", value1.DeepCopy());
    783   bool seen1 = false;
    784   for (DictionaryValue::Iterator it(dict); !it.IsAtEnd(); it.Advance()) {
    785     EXPECT_FALSE(seen1);
    786     EXPECT_EQ("key1", it.key());
    787     EXPECT_TRUE(value1.Equals(&it.value()));
    788     seen1 = true;
    789   }
    790   EXPECT_TRUE(seen1);
    791 
    792   StringValue value2("value2");
    793   dict.Set("key2", value2.DeepCopy());
    794   bool seen2 = seen1 = false;
    795   for (DictionaryValue::Iterator it(dict); !it.IsAtEnd(); it.Advance()) {
    796     if (it.key() == "key1") {
    797       EXPECT_FALSE(seen1);
    798       EXPECT_TRUE(value1.Equals(&it.value()));
    799       seen1 = true;
    800     } else if (it.key() == "key2") {
    801       EXPECT_FALSE(seen2);
    802       EXPECT_TRUE(value2.Equals(&it.value()));
    803       seen2 = true;
    804     } else {
    805       ADD_FAILURE();
    806     }
    807   }
    808   EXPECT_TRUE(seen1);
    809   EXPECT_TRUE(seen2);
    810 }
    811 
    812 // DictionaryValue/ListValue's Get*() methods should accept NULL as an out-value
    813 // and still return true/false based on success.
    814 TEST(ValuesTest, GetWithNullOutValue) {
    815   DictionaryValue main_dict;
    816   ListValue main_list;
    817 
    818   FundamentalValue bool_value(false);
    819   FundamentalValue int_value(1234);
    820   FundamentalValue double_value(12.34567);
    821   StringValue string_value("foo");
    822   BinaryValue binary_value;
    823   DictionaryValue dict_value;
    824   ListValue list_value;
    825 
    826   main_dict.Set("bool", bool_value.DeepCopy());
    827   main_dict.Set("int", int_value.DeepCopy());
    828   main_dict.Set("double", double_value.DeepCopy());
    829   main_dict.Set("string", string_value.DeepCopy());
    830   main_dict.Set("binary", binary_value.DeepCopy());
    831   main_dict.Set("dict", dict_value.DeepCopy());
    832   main_dict.Set("list", list_value.DeepCopy());
    833 
    834   main_list.Append(bool_value.DeepCopy());
    835   main_list.Append(int_value.DeepCopy());
    836   main_list.Append(double_value.DeepCopy());
    837   main_list.Append(string_value.DeepCopy());
    838   main_list.Append(binary_value.DeepCopy());
    839   main_list.Append(dict_value.DeepCopy());
    840   main_list.Append(list_value.DeepCopy());
    841 
    842   EXPECT_TRUE(main_dict.Get("bool", NULL));
    843   EXPECT_TRUE(main_dict.Get("int", NULL));
    844   EXPECT_TRUE(main_dict.Get("double", NULL));
    845   EXPECT_TRUE(main_dict.Get("string", NULL));
    846   EXPECT_TRUE(main_dict.Get("binary", NULL));
    847   EXPECT_TRUE(main_dict.Get("dict", NULL));
    848   EXPECT_TRUE(main_dict.Get("list", NULL));
    849   EXPECT_FALSE(main_dict.Get("DNE", NULL));
    850 
    851   EXPECT_TRUE(main_dict.GetBoolean("bool", NULL));
    852   EXPECT_FALSE(main_dict.GetBoolean("int", NULL));
    853   EXPECT_FALSE(main_dict.GetBoolean("double", NULL));
    854   EXPECT_FALSE(main_dict.GetBoolean("string", NULL));
    855   EXPECT_FALSE(main_dict.GetBoolean("binary", NULL));
    856   EXPECT_FALSE(main_dict.GetBoolean("dict", NULL));
    857   EXPECT_FALSE(main_dict.GetBoolean("list", NULL));
    858   EXPECT_FALSE(main_dict.GetBoolean("DNE", NULL));
    859 
    860   EXPECT_FALSE(main_dict.GetInteger("bool", NULL));
    861   EXPECT_TRUE(main_dict.GetInteger("int", NULL));
    862   EXPECT_FALSE(main_dict.GetInteger("double", NULL));
    863   EXPECT_FALSE(main_dict.GetInteger("string", NULL));
    864   EXPECT_FALSE(main_dict.GetInteger("binary", NULL));
    865   EXPECT_FALSE(main_dict.GetInteger("dict", NULL));
    866   EXPECT_FALSE(main_dict.GetInteger("list", NULL));
    867   EXPECT_FALSE(main_dict.GetInteger("DNE", NULL));
    868 
    869   // Both int and double values can be obtained from GetDouble.
    870   EXPECT_FALSE(main_dict.GetDouble("bool", NULL));
    871   EXPECT_TRUE(main_dict.GetDouble("int", NULL));
    872   EXPECT_TRUE(main_dict.GetDouble("double", NULL));
    873   EXPECT_FALSE(main_dict.GetDouble("string", NULL));
    874   EXPECT_FALSE(main_dict.GetDouble("binary", NULL));
    875   EXPECT_FALSE(main_dict.GetDouble("dict", NULL));
    876   EXPECT_FALSE(main_dict.GetDouble("list", NULL));
    877   EXPECT_FALSE(main_dict.GetDouble("DNE", NULL));
    878 
    879   EXPECT_FALSE(main_dict.GetString("bool", static_cast<std::string*>(NULL)));
    880   EXPECT_FALSE(main_dict.GetString("int", static_cast<std::string*>(NULL)));
    881   EXPECT_FALSE(main_dict.GetString("double", static_cast<std::string*>(NULL)));
    882   EXPECT_TRUE(main_dict.GetString("string", static_cast<std::string*>(NULL)));
    883   EXPECT_FALSE(main_dict.GetString("binary", static_cast<std::string*>(NULL)));
    884   EXPECT_FALSE(main_dict.GetString("dict", static_cast<std::string*>(NULL)));
    885   EXPECT_FALSE(main_dict.GetString("list", static_cast<std::string*>(NULL)));
    886   EXPECT_FALSE(main_dict.GetString("DNE", static_cast<std::string*>(NULL)));
    887 
    888   EXPECT_FALSE(main_dict.GetString("bool", static_cast<string16*>(NULL)));
    889   EXPECT_FALSE(main_dict.GetString("int", static_cast<string16*>(NULL)));
    890   EXPECT_FALSE(main_dict.GetString("double", static_cast<string16*>(NULL)));
    891   EXPECT_TRUE(main_dict.GetString("string", static_cast<string16*>(NULL)));
    892   EXPECT_FALSE(main_dict.GetString("binary", static_cast<string16*>(NULL)));
    893   EXPECT_FALSE(main_dict.GetString("dict", static_cast<string16*>(NULL)));
    894   EXPECT_FALSE(main_dict.GetString("list", static_cast<string16*>(NULL)));
    895   EXPECT_FALSE(main_dict.GetString("DNE", static_cast<string16*>(NULL)));
    896 
    897   EXPECT_FALSE(main_dict.GetBinary("bool", NULL));
    898   EXPECT_FALSE(main_dict.GetBinary("int", NULL));
    899   EXPECT_FALSE(main_dict.GetBinary("double", NULL));
    900   EXPECT_FALSE(main_dict.GetBinary("string", NULL));
    901   EXPECT_TRUE(main_dict.GetBinary("binary", NULL));
    902   EXPECT_FALSE(main_dict.GetBinary("dict", NULL));
    903   EXPECT_FALSE(main_dict.GetBinary("list", NULL));
    904   EXPECT_FALSE(main_dict.GetBinary("DNE", NULL));
    905 
    906   EXPECT_FALSE(main_dict.GetDictionary("bool", NULL));
    907   EXPECT_FALSE(main_dict.GetDictionary("int", NULL));
    908   EXPECT_FALSE(main_dict.GetDictionary("double", NULL));
    909   EXPECT_FALSE(main_dict.GetDictionary("string", NULL));
    910   EXPECT_FALSE(main_dict.GetDictionary("binary", NULL));
    911   EXPECT_TRUE(main_dict.GetDictionary("dict", NULL));
    912   EXPECT_FALSE(main_dict.GetDictionary("list", NULL));
    913   EXPECT_FALSE(main_dict.GetDictionary("DNE", NULL));
    914 
    915   EXPECT_FALSE(main_dict.GetList("bool", NULL));
    916   EXPECT_FALSE(main_dict.GetList("int", NULL));
    917   EXPECT_FALSE(main_dict.GetList("double", NULL));
    918   EXPECT_FALSE(main_dict.GetList("string", NULL));
    919   EXPECT_FALSE(main_dict.GetList("binary", NULL));
    920   EXPECT_FALSE(main_dict.GetList("dict", NULL));
    921   EXPECT_TRUE(main_dict.GetList("list", NULL));
    922   EXPECT_FALSE(main_dict.GetList("DNE", NULL));
    923 
    924   EXPECT_TRUE(main_dict.GetWithoutPathExpansion("bool", NULL));
    925   EXPECT_TRUE(main_dict.GetWithoutPathExpansion("int", NULL));
    926   EXPECT_TRUE(main_dict.GetWithoutPathExpansion("double", NULL));
    927   EXPECT_TRUE(main_dict.GetWithoutPathExpansion("string", NULL));
    928   EXPECT_TRUE(main_dict.GetWithoutPathExpansion("binary", NULL));
    929   EXPECT_TRUE(main_dict.GetWithoutPathExpansion("dict", NULL));
    930   EXPECT_TRUE(main_dict.GetWithoutPathExpansion("list", NULL));
    931   EXPECT_FALSE(main_dict.GetWithoutPathExpansion("DNE", NULL));
    932 
    933   EXPECT_TRUE(main_dict.GetBooleanWithoutPathExpansion("bool", NULL));
    934   EXPECT_FALSE(main_dict.GetBooleanWithoutPathExpansion("int", NULL));
    935   EXPECT_FALSE(main_dict.GetBooleanWithoutPathExpansion("double", NULL));
    936   EXPECT_FALSE(main_dict.GetBooleanWithoutPathExpansion("string", NULL));
    937   EXPECT_FALSE(main_dict.GetBooleanWithoutPathExpansion("binary", NULL));
    938   EXPECT_FALSE(main_dict.GetBooleanWithoutPathExpansion("dict", NULL));
    939   EXPECT_FALSE(main_dict.GetBooleanWithoutPathExpansion("list", NULL));
    940   EXPECT_FALSE(main_dict.GetBooleanWithoutPathExpansion("DNE", NULL));
    941 
    942   EXPECT_FALSE(main_dict.GetIntegerWithoutPathExpansion("bool", NULL));
    943   EXPECT_TRUE(main_dict.GetIntegerWithoutPathExpansion("int", NULL));
    944   EXPECT_FALSE(main_dict.GetIntegerWithoutPathExpansion("double", NULL));
    945   EXPECT_FALSE(main_dict.GetIntegerWithoutPathExpansion("string", NULL));
    946   EXPECT_FALSE(main_dict.GetIntegerWithoutPathExpansion("binary", NULL));
    947   EXPECT_FALSE(main_dict.GetIntegerWithoutPathExpansion("dict", NULL));
    948   EXPECT_FALSE(main_dict.GetIntegerWithoutPathExpansion("list", NULL));
    949   EXPECT_FALSE(main_dict.GetIntegerWithoutPathExpansion("DNE", NULL));
    950 
    951   EXPECT_FALSE(main_dict.GetDoubleWithoutPathExpansion("bool", NULL));
    952   EXPECT_TRUE(main_dict.GetDoubleWithoutPathExpansion("int", NULL));
    953   EXPECT_TRUE(main_dict.GetDoubleWithoutPathExpansion("double", NULL));
    954   EXPECT_FALSE(main_dict.GetDoubleWithoutPathExpansion("string", NULL));
    955   EXPECT_FALSE(main_dict.GetDoubleWithoutPathExpansion("binary", NULL));
    956   EXPECT_FALSE(main_dict.GetDoubleWithoutPathExpansion("dict", NULL));
    957   EXPECT_FALSE(main_dict.GetDoubleWithoutPathExpansion("list", NULL));
    958   EXPECT_FALSE(main_dict.GetDoubleWithoutPathExpansion("DNE", NULL));
    959 
    960   EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
    961       "bool", static_cast<std::string*>(NULL)));
    962   EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
    963       "int", static_cast<std::string*>(NULL)));
    964   EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
    965       "double", static_cast<std::string*>(NULL)));
    966   EXPECT_TRUE(main_dict.GetStringWithoutPathExpansion(
    967       "string", static_cast<std::string*>(NULL)));
    968   EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
    969       "binary", static_cast<std::string*>(NULL)));
    970   EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
    971       "dict", static_cast<std::string*>(NULL)));
    972   EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
    973       "list", static_cast<std::string*>(NULL)));
    974   EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
    975       "DNE", static_cast<std::string*>(NULL)));
    976 
    977   EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
    978       "bool", static_cast<string16*>(NULL)));
    979   EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
    980       "int", static_cast<string16*>(NULL)));
    981   EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
    982       "double", static_cast<string16*>(NULL)));
    983   EXPECT_TRUE(main_dict.GetStringWithoutPathExpansion(
    984       "string", static_cast<string16*>(NULL)));
    985   EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
    986       "binary", static_cast<string16*>(NULL)));
    987   EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
    988       "dict", static_cast<string16*>(NULL)));
    989   EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
    990       "list", static_cast<string16*>(NULL)));
    991   EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
    992       "DNE", static_cast<string16*>(NULL)));
    993 
    994   // There is no GetBinaryWithoutPathExpansion for some reason, but if there
    995   // were it should be tested here...
    996 
    997   EXPECT_FALSE(main_dict.GetDictionaryWithoutPathExpansion("bool", NULL));
    998   EXPECT_FALSE(main_dict.GetDictionaryWithoutPathExpansion("int", NULL));
    999   EXPECT_FALSE(main_dict.GetDictionaryWithoutPathExpansion("double", NULL));
   1000   EXPECT_FALSE(main_dict.GetDictionaryWithoutPathExpansion("string", NULL));
   1001   EXPECT_FALSE(main_dict.GetDictionaryWithoutPathExpansion("binary", NULL));
   1002   EXPECT_TRUE(main_dict.GetDictionaryWithoutPathExpansion("dict", NULL));
   1003   EXPECT_FALSE(main_dict.GetDictionaryWithoutPathExpansion("list", NULL));
   1004   EXPECT_FALSE(main_dict.GetDictionaryWithoutPathExpansion("DNE", NULL));
   1005 
   1006   EXPECT_FALSE(main_dict.GetListWithoutPathExpansion("bool", NULL));
   1007   EXPECT_FALSE(main_dict.GetListWithoutPathExpansion("int", NULL));
   1008   EXPECT_FALSE(main_dict.GetListWithoutPathExpansion("double", NULL));
   1009   EXPECT_FALSE(main_dict.GetListWithoutPathExpansion("string", NULL));
   1010   EXPECT_FALSE(main_dict.GetListWithoutPathExpansion("binary", NULL));
   1011   EXPECT_FALSE(main_dict.GetListWithoutPathExpansion("dict", NULL));
   1012   EXPECT_TRUE(main_dict.GetListWithoutPathExpansion("list", NULL));
   1013   EXPECT_FALSE(main_dict.GetListWithoutPathExpansion("DNE", NULL));
   1014 
   1015   EXPECT_TRUE(main_list.Get(0, NULL));
   1016   EXPECT_TRUE(main_list.Get(1, NULL));
   1017   EXPECT_TRUE(main_list.Get(2, NULL));
   1018   EXPECT_TRUE(main_list.Get(3, NULL));
   1019   EXPECT_TRUE(main_list.Get(4, NULL));
   1020   EXPECT_TRUE(main_list.Get(5, NULL));
   1021   EXPECT_TRUE(main_list.Get(6, NULL));
   1022   EXPECT_FALSE(main_list.Get(7, NULL));
   1023 
   1024   EXPECT_TRUE(main_list.GetBoolean(0, NULL));
   1025   EXPECT_FALSE(main_list.GetBoolean(1, NULL));
   1026   EXPECT_FALSE(main_list.GetBoolean(2, NULL));
   1027   EXPECT_FALSE(main_list.GetBoolean(3, NULL));
   1028   EXPECT_FALSE(main_list.GetBoolean(4, NULL));
   1029   EXPECT_FALSE(main_list.GetBoolean(5, NULL));
   1030   EXPECT_FALSE(main_list.GetBoolean(6, NULL));
   1031   EXPECT_FALSE(main_list.GetBoolean(7, NULL));
   1032 
   1033   EXPECT_FALSE(main_list.GetInteger(0, NULL));
   1034   EXPECT_TRUE(main_list.GetInteger(1, NULL));
   1035   EXPECT_FALSE(main_list.GetInteger(2, NULL));
   1036   EXPECT_FALSE(main_list.GetInteger(3, NULL));
   1037   EXPECT_FALSE(main_list.GetInteger(4, NULL));
   1038   EXPECT_FALSE(main_list.GetInteger(5, NULL));
   1039   EXPECT_FALSE(main_list.GetInteger(6, NULL));
   1040   EXPECT_FALSE(main_list.GetInteger(7, NULL));
   1041 
   1042   EXPECT_FALSE(main_list.GetDouble(0, NULL));
   1043   EXPECT_TRUE(main_list.GetDouble(1, NULL));
   1044   EXPECT_TRUE(main_list.GetDouble(2, NULL));
   1045   EXPECT_FALSE(main_list.GetDouble(3, NULL));
   1046   EXPECT_FALSE(main_list.GetDouble(4, NULL));
   1047   EXPECT_FALSE(main_list.GetDouble(5, NULL));
   1048   EXPECT_FALSE(main_list.GetDouble(6, NULL));
   1049   EXPECT_FALSE(main_list.GetDouble(7, NULL));
   1050 
   1051   EXPECT_FALSE(main_list.GetString(0, static_cast<std::string*>(NULL)));
   1052   EXPECT_FALSE(main_list.GetString(1, static_cast<std::string*>(NULL)));
   1053   EXPECT_FALSE(main_list.GetString(2, static_cast<std::string*>(NULL)));
   1054   EXPECT_TRUE(main_list.GetString(3, static_cast<std::string*>(NULL)));
   1055   EXPECT_FALSE(main_list.GetString(4, static_cast<std::string*>(NULL)));
   1056   EXPECT_FALSE(main_list.GetString(5, static_cast<std::string*>(NULL)));
   1057   EXPECT_FALSE(main_list.GetString(6, static_cast<std::string*>(NULL)));
   1058   EXPECT_FALSE(main_list.GetString(7, static_cast<std::string*>(NULL)));
   1059 
   1060   EXPECT_FALSE(main_list.GetString(0, static_cast<string16*>(NULL)));
   1061   EXPECT_FALSE(main_list.GetString(1, static_cast<string16*>(NULL)));
   1062   EXPECT_FALSE(main_list.GetString(2, static_cast<string16*>(NULL)));
   1063   EXPECT_TRUE(main_list.GetString(3, static_cast<string16*>(NULL)));
   1064   EXPECT_FALSE(main_list.GetString(4, static_cast<string16*>(NULL)));
   1065   EXPECT_FALSE(main_list.GetString(5, static_cast<string16*>(NULL)));
   1066   EXPECT_FALSE(main_list.GetString(6, static_cast<string16*>(NULL)));
   1067   EXPECT_FALSE(main_list.GetString(7, static_cast<string16*>(NULL)));
   1068 
   1069   EXPECT_FALSE(main_list.GetBinary(0, NULL));
   1070   EXPECT_FALSE(main_list.GetBinary(1, NULL));
   1071   EXPECT_FALSE(main_list.GetBinary(2, NULL));
   1072   EXPECT_FALSE(main_list.GetBinary(3, NULL));
   1073   EXPECT_TRUE(main_list.GetBinary(4, NULL));
   1074   EXPECT_FALSE(main_list.GetBinary(5, NULL));
   1075   EXPECT_FALSE(main_list.GetBinary(6, NULL));
   1076   EXPECT_FALSE(main_list.GetBinary(7, NULL));
   1077 
   1078   EXPECT_FALSE(main_list.GetDictionary(0, NULL));
   1079   EXPECT_FALSE(main_list.GetDictionary(1, NULL));
   1080   EXPECT_FALSE(main_list.GetDictionary(2, NULL));
   1081   EXPECT_FALSE(main_list.GetDictionary(3, NULL));
   1082   EXPECT_FALSE(main_list.GetDictionary(4, NULL));
   1083   EXPECT_TRUE(main_list.GetDictionary(5, NULL));
   1084   EXPECT_FALSE(main_list.GetDictionary(6, NULL));
   1085   EXPECT_FALSE(main_list.GetDictionary(7, NULL));
   1086 
   1087   EXPECT_FALSE(main_list.GetList(0, NULL));
   1088   EXPECT_FALSE(main_list.GetList(1, NULL));
   1089   EXPECT_FALSE(main_list.GetList(2, NULL));
   1090   EXPECT_FALSE(main_list.GetList(3, NULL));
   1091   EXPECT_FALSE(main_list.GetList(4, NULL));
   1092   EXPECT_FALSE(main_list.GetList(5, NULL));
   1093   EXPECT_TRUE(main_list.GetList(6, NULL));
   1094   EXPECT_FALSE(main_list.GetList(7, NULL));
   1095 }
   1096 
   1097 }  // namespace base
   1098