values_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <limits>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string16.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, Basic) {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test basic dictionary getting/setting
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue settings;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string homepage = "http://google.com";
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(settings.GetString("global.homepage", &homepage));
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(std::string("http://google.com"), homepage);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(settings.Get("global", NULL));
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.Set("global", new FundamentalValue(true));
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(settings.Get("global", NULL));
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.SetString("global.homepage", "http://scurvy.com");
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(settings.Get("global", NULL));
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  homepage = "http://google.com";
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(settings.GetString("global.homepage", &homepage));
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(std::string("http://scurvy.com"), homepage);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test storing a dictionary in a list.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* toolbar_bookmarks;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings.GetList("global.toolbar.bookmarks", &toolbar_bookmarks));
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  toolbar_bookmarks = new ListValue;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.Set("global.toolbar.bookmarks", toolbar_bookmarks);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(settings.GetList("global.toolbar.bookmarks", &toolbar_bookmarks));
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* new_bookmark = new DictionaryValue;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_bookmark->SetString("name", "Froogle");
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_bookmark->SetString("url", "http://froogle.com");
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  toolbar_bookmarks->Append(new_bookmark);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* bookmark_list;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(settings.GetList("global.toolbar.bookmarks", &bookmark_list));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* bookmark;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, bookmark_list->GetSize());
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(bookmark_list->GetDictionary(0, &bookmark));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string bookmark_name = "Unnamed";
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(bookmark->GetString("name", &bookmark_name));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(std::string("Froogle"), bookmark_name);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string bookmark_url;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(bookmark->GetString("url", &bookmark_url));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(std::string("http://froogle.com"), bookmark_url);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, List) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ListValue> mixed_list(new ListValue());
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mixed_list->Set(0, new FundamentalValue(true));
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mixed_list->Set(1, new FundamentalValue(42));
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mixed_list->Set(2, new FundamentalValue(88.8));
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mixed_list->Set(3, new StringValue("foo"));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(4u, mixed_list->GetSize());
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value *value = NULL;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool bool_value = false;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int int_value = 0;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double double_value = 0.0;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string string_value;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(mixed_list->Get(4, &value));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(mixed_list->GetInteger(0, &int_value));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, int_value);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(mixed_list->GetBoolean(1, &bool_value));
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(bool_value);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(mixed_list->GetString(2, &string_value));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("", string_value);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(mixed_list->GetInteger(2, &int_value));
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, int_value);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(mixed_list->GetBoolean(3, &bool_value));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(bool_value);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(mixed_list->GetBoolean(0, &bool_value));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(bool_value);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(mixed_list->GetInteger(1, &int_value));
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(42, int_value);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // implicit conversion from Integer to Double should be possible.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(mixed_list->GetDouble(1, &double_value));
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(42, double_value);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(mixed_list->GetDouble(2, &double_value));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(88.8, double_value);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(mixed_list->GetString(3, &string_value));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("foo", string_value);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try searching in the mixed list.
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FundamentalValue sought_value(42);
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FundamentalValue not_found_value(false);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_NE(mixed_list->end(), mixed_list->Find(sought_value));
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE((*mixed_list->Find(sought_value))->GetAsInteger(&int_value));
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(42, int_value);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(mixed_list->end(), mixed_list->Find(not_found_value));
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, BinaryValue) {
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Default constructor creates a BinaryValue with a null buffer and size 0.
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<BinaryValue> binary(new BinaryValue());
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(binary.get());
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(NULL, binary->GetBuffer());
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, binary->GetSize());
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test the common case of a non-empty buffer
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  char* buffer = new char[15];
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  binary.reset(new BinaryValue(scoped_ptr<char[]>(buffer), 15));
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(binary.get());
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(binary->GetBuffer());
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(buffer, binary->GetBuffer());
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(15U, binary->GetSize());
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char stack_buffer[42];
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(stack_buffer, '!', 42);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  binary.reset(BinaryValue::CreateWithCopiedBuffer(stack_buffer, 42));
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(binary.get());
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(binary->GetBuffer());
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(stack_buffer, binary->GetBuffer());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(42U, binary->GetSize());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, memcmp(stack_buffer, binary->GetBuffer(), binary->GetSize()));
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, StringValue) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test overloaded CreateStringValue.
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<Value> narrow_value(new StringValue("narrow"));
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(narrow_value.get());
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(narrow_value->IsType(Value::TYPE_STRING));
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<Value> utf16_value(new StringValue(ASCIIToUTF16("utf16")));
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(utf16_value.get());
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(utf16_value->IsType(Value::TYPE_STRING));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test overloaded GetString.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string narrow = "http://google.com";
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 utf16 = ASCIIToUTF16("http://google.com");
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(narrow_value->GetAsString(&narrow));
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(narrow_value->GetAsString(&utf16));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(std::string("narrow"), narrow);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ASCIIToUTF16("narrow"), utf16);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(utf16_value->GetAsString(&narrow));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(utf16_value->GetAsString(&utf16));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(std::string("utf16"), narrow);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ASCIIToUTF16("utf16"), utf16);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is a Value object that allows us to tell if it's been
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// properly deleted by modifying the value of external flag on destruction.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DeletionTestValue : public Value {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit DeletionTestValue(bool* deletion_flag) : Value(TYPE_NULL) {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Init(deletion_flag);  // Separate function so that we can use ASSERT_*
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Init(bool* deletion_flag) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(deletion_flag);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    deletion_flag_ = deletion_flag;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *deletion_flag_ = false;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DeletionTestValue() {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *deletion_flag_ = true;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool* deletion_flag_;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, ListDeletion) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool deletion_flag = true;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue list;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list.Append(new DeletionTestValue(&deletion_flag));
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(deletion_flag);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(deletion_flag);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue list;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list.Append(new DeletionTestValue(&deletion_flag));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(deletion_flag);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list.Clear();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(deletion_flag);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue list;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list.Append(new DeletionTestValue(&deletion_flag));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(deletion_flag);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(list.Set(0, Value::CreateNullValue()));
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(deletion_flag);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, ListRemoval) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool deletion_flag = true;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* removed_item = NULL;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue list;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list.Append(new DeletionTestValue(&deletion_flag));
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(deletion_flag);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1U, list.GetSize());
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(list.Remove(std::numeric_limits<size_t>::max(),
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             &removed_item));
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(list.Remove(1, &removed_item));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(list.Remove(0, &removed_item));
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(removed_item);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0U, list.GetSize());
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(deletion_flag);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete removed_item;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  removed_item = NULL;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(deletion_flag);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue list;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list.Append(new DeletionTestValue(&deletion_flag));
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(deletion_flag);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(list.Remove(0, NULL));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(deletion_flag);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0U, list.GetSize());
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue list;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeletionTestValue* value = new DeletionTestValue(&deletion_flag);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list.Append(value);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(deletion_flag);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t index = 0;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list.Remove(*value, &index);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0U, index);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(deletion_flag);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0U, list.GetSize());
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, DictionaryDeletion) {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string key = "test";
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool deletion_flag = true;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue dict;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict.Set(key, new DeletionTestValue(&deletion_flag));
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(deletion_flag);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(deletion_flag);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue dict;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict.Set(key, new DeletionTestValue(&deletion_flag));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(deletion_flag);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict.Clear();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(deletion_flag);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue dict;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict.Set(key, new DeletionTestValue(&deletion_flag));
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(deletion_flag);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict.Set(key, Value::CreateNullValue());
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(deletion_flag);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, DictionaryRemoval) {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string key = "test";
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool deletion_flag = true;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* removed_item = NULL;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue dict;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict.Set(key, new DeletionTestValue(&deletion_flag));
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(deletion_flag);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(dict.HasKey(key));
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(dict.Remove("absent key", &removed_item));
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(dict.Remove(key, &removed_item));
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(dict.HasKey(key));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(removed_item);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(deletion_flag);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete removed_item;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  removed_item = NULL;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(deletion_flag);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue dict;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict.Set(key, new DeletionTestValue(&deletion_flag));
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(deletion_flag);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(dict.HasKey(key));
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(dict.Remove(key, NULL));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(deletion_flag);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(dict.HasKey(key));
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, DictionaryWithoutPathExpansion) {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.Set("this.is.expanded", Value::CreateNullValue());
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetWithoutPathExpansion("this.isnt.expanded", Value::CreateNullValue());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dict.HasKey("this.is.expanded"));
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dict.HasKey("this"));
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* value1;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dict.Get("this", &value1));
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* value2;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(dict.GetDictionaryWithoutPathExpansion("this", &value2));
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(value1, value2);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, value2->size());
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dict.HasKey("this.isnt.expanded"));
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* value3;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dict.Get("this.isnt.expanded", &value3));
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* value4;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(dict.GetWithoutPathExpansion("this.isnt.expanded", &value4));
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Value::TYPE_NULL, value4->GetType());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, DeepCopy) {
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue original_dict;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* original_null = Value::CreateNullValue();
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("null", original_null);
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FundamentalValue* original_bool = new FundamentalValue(true);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("bool", original_bool);
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FundamentalValue* original_int = new FundamentalValue(42);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("int", original_int);
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FundamentalValue* original_double = new FundamentalValue(3.14);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("double", original_double);
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StringValue* original_string = new StringValue("hello");
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("string", original_string);
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StringValue* original_string16 = new StringValue(ASCIIToUTF16("hello16"));
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("string16", original_string16);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<char[]> original_buffer(new char[42]);
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  memset(original_buffer.get(), '!', 42);
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BinaryValue* original_binary = new BinaryValue(original_buffer.Pass(), 42);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("binary", original_binary);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* original_list = new ListValue();
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FundamentalValue* original_list_element_0 = new FundamentalValue(0);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_list->Append(original_list_element_0);
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FundamentalValue* original_list_element_1 = new FundamentalValue(1);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_list->Append(original_list_element_1);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("list", original_list);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* original_nested_dictionary = new DictionaryValue();
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  original_nested_dictionary->Set("key", new StringValue("value"));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("dictionary", original_nested_dictionary);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> copy_dict(original_dict.DeepCopy());
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_dict.get());
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_dict.get(), &original_dict);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* copy_null = NULL;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_dict->Get("null", &copy_null));
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_null);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_null, original_null);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_null->IsType(Value::TYPE_NULL));
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* copy_bool = NULL;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_dict->Get("bool", &copy_bool));
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_bool);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_bool, original_bool);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_bool->IsType(Value::TYPE_BOOLEAN));
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool copy_bool_value = false;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_bool->GetAsBoolean(&copy_bool_value));
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_bool_value);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* copy_int = NULL;
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_dict->Get("int", &copy_int));
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_int);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_int, original_int);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_int->IsType(Value::TYPE_INTEGER));
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int copy_int_value = 0;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_int->GetAsInteger(&copy_int_value));
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(42, copy_int_value);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* copy_double = NULL;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_dict->Get("double", &copy_double));
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_double);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_double, original_double);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_double->IsType(Value::TYPE_DOUBLE));
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double copy_double_value = 0;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_double->GetAsDouble(&copy_double_value));
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3.14, copy_double_value);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* copy_string = NULL;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_dict->Get("string", &copy_string));
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_string);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_string, original_string);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_string->IsType(Value::TYPE_STRING));
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string copy_string_value;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 copy_string16_value;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_string->GetAsString(&copy_string_value));
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_string->GetAsString(&copy_string16_value));
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(std::string("hello"), copy_string_value);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ASCIIToUTF16("hello"), copy_string16_value);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* copy_string16 = NULL;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_dict->Get("string16", &copy_string16));
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_string16);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_string16, original_string16);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_string16->IsType(Value::TYPE_STRING));
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_string16->GetAsString(&copy_string_value));
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_string16->GetAsString(&copy_string16_value));
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(std::string("hello16"), copy_string_value);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ASCIIToUTF16("hello16"), copy_string16_value);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* copy_binary = NULL;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_dict->Get("binary", &copy_binary));
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_binary);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_binary, original_binary);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_binary->IsType(Value::TYPE_BINARY));
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(original_binary->GetBuffer(),
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static_cast<BinaryValue*>(copy_binary)->GetBuffer());
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(original_binary->GetSize(),
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static_cast<BinaryValue*>(copy_binary)->GetSize());
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, memcmp(original_binary->GetBuffer(),
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               static_cast<BinaryValue*>(copy_binary)->GetBuffer(),
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               original_binary->GetSize()));
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* copy_value = NULL;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_dict->Get("list", &copy_value));
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_value);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_value, original_list);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_value->IsType(Value::TYPE_LIST));
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* copy_list = NULL;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_value->GetAsList(&copy_list));
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_list);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, copy_list->GetSize());
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* copy_list_element_0;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_list->Get(0, &copy_list_element_0));
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_list_element_0);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_list_element_0, original_list_element_0);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int copy_list_element_0_value;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_list_element_0->GetAsInteger(&copy_list_element_0_value));
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, copy_list_element_0_value);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* copy_list_element_1;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_list->Get(1, &copy_list_element_1));
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_list_element_1);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_list_element_1, original_list_element_1);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int copy_list_element_1_value;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_list_element_1->GetAsInteger(&copy_list_element_1_value));
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, copy_list_element_1_value);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  copy_value = NULL;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_dict->Get("dictionary", &copy_value));
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_value);
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_value, original_nested_dictionary);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_value->IsType(Value::TYPE_DICTIONARY));
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* copy_nested_dictionary = NULL;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_value->GetAsDictionary(&copy_nested_dictionary));
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_nested_dictionary);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(copy_nested_dictionary->HasKey("key"));
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, Equals) {
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* null1 = Value::CreateNullValue();
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* null2 = Value::CreateNullValue();
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(null1, null2);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(null1->Equals(null2));
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Value* boolean = new FundamentalValue(false);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(null1->Equals(boolean));
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete null1;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete null2;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete boolean;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dv;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dv.SetBoolean("a", false);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dv.SetInteger("b", 2);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dv.SetDouble("c", 2.5);
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dv.SetString("d1", "string");
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dv.SetString("d2", ASCIIToUTF16("http://google.com"));
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dv.Set("e", Value::CreateNullValue());
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> copy;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  copy.reset(dv.DeepCopy());
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dv.Equals(copy.get()));
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* list = new ListValue;
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list->Append(Value::CreateNullValue());
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list->Append(new DictionaryValue);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dv.Set("f", list);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dv.Equals(copy.get()));
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  copy->Set("f", list->DeepCopy());
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dv.Equals(copy.get()));
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  list->Append(new FundamentalValue(true));
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dv.Equals(copy.get()));
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if Equals detects differences in only the keys.
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  copy.reset(dv.DeepCopy());
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dv.Equals(copy.get()));
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  copy->Remove("a", NULL);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  copy->SetBoolean("aa", false);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dv.Equals(copy.get()));
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, StaticEquals) {
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> null1(Value::CreateNullValue());
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> null2(Value::CreateNullValue());
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Value::Equals(null1.get(), null2.get()));
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Value::Equals(NULL, NULL));
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<Value> i42(new FundamentalValue(42));
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<Value> j42(new FundamentalValue(42));
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<Value> i17(new FundamentalValue(17));
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Value::Equals(i42.get(), i42.get()));
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Value::Equals(j42.get(), i42.get()));
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Value::Equals(i42.get(), j42.get()));
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Value::Equals(i42.get(), i17.get()));
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Value::Equals(i42.get(), NULL));
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Value::Equals(NULL, i42.get()));
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NULL and Value::CreateNullValue() are intentionally different: We need
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // support for NULL as a return value for "undefined" without caring for
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ownership of the pointer.
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Value::Equals(null1.get(), NULL));
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Value::Equals(NULL, null1.get()));
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, DeepCopyCovariantReturnTypes) {
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue original_dict;
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* original_null = Value::CreateNullValue();
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("null", original_null);
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FundamentalValue* original_bool = new FundamentalValue(true);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("bool", original_bool);
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FundamentalValue* original_int = new FundamentalValue(42);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("int", original_int);
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FundamentalValue* original_double = new FundamentalValue(3.14);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("double", original_double);
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StringValue* original_string = new StringValue("hello");
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("string", original_string);
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StringValue* original_string16 = new StringValue(ASCIIToUTF16("hello16"));
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("string16", original_string16);
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<char[]> original_buffer(new char[42]);
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  memset(original_buffer.get(), '!', 42);
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BinaryValue* original_binary = new BinaryValue(original_buffer.Pass(), 42);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("binary", original_binary);
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* original_list = new ListValue();
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FundamentalValue* original_list_element_0 = new FundamentalValue(0);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_list->Append(original_list_element_0);
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FundamentalValue* original_list_element_1 = new FundamentalValue(1);
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_list->Append(original_list_element_1);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("list", original_list);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* original_dict_value = &original_dict;
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* original_bool_value = original_bool;
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* original_int_value = original_int;
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* original_double_value = original_double;
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* original_string_value = original_string;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* original_string16_value = original_string16;
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* original_binary_value = original_binary;
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* original_list_value = original_list;
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> copy_dict_value(original_dict_value->DeepCopy());
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> copy_bool_value(original_bool_value->DeepCopy());
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> copy_int_value(original_int_value->DeepCopy());
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> copy_double_value(original_double_value->DeepCopy());
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> copy_string_value(original_string_value->DeepCopy());
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> copy_string16_value(original_string16_value->DeepCopy());
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> copy_binary_value(original_binary_value->DeepCopy());
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> copy_list_value(original_list_value->DeepCopy());
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(original_dict_value->Equals(copy_dict_value.get()));
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(original_bool_value->Equals(copy_bool_value.get()));
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(original_int_value->Equals(copy_int_value.get()));
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(original_double_value->Equals(copy_double_value.get()));
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(original_string_value->Equals(copy_string_value.get()));
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(original_string16_value->Equals(copy_string16_value.get()));
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(original_binary_value->Equals(copy_binary_value.get()));
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(original_list_value->Equals(copy_list_value.get()));
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, RemoveEmptyChildren) {
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> root(new DictionaryValue);
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove empty lists and dictionaries.
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root->Set("empty_dict", new DictionaryValue);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root->Set("empty_list", new ListValue);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root->SetWithoutPathExpansion("a.b.c.d.e", new DictionaryValue);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root.reset(root->DeepCopyWithoutEmptyChildren());
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(root->empty());
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we don't prune too much.
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root->SetBoolean("bool", true);
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root->Set("empty_dict", new DictionaryValue);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root->SetString("empty_string", "");
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root.reset(root->DeepCopyWithoutEmptyChildren());
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, root->size());
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should do nothing.
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root.reset(root->DeepCopyWithoutEmptyChildren());
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, root->size());
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nested test cases.  These should all reduce back to the bool and string
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // set above.
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root->Set("a.b.c.d.e", new DictionaryValue);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root.reset(root->DeepCopyWithoutEmptyChildren());
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2U, root->size());
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* inner = new DictionaryValue;
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root->Set("dict_with_emtpy_children", inner);
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inner->Set("empty_dict", new DictionaryValue);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inner->Set("empty_list", new ListValue);
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root.reset(root->DeepCopyWithoutEmptyChildren());
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2U, root->size());
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue* inner = new ListValue;
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root->Set("list_with_empty_children", inner);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inner->Append(new DictionaryValue);
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inner->Append(new ListValue);
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root.reset(root->DeepCopyWithoutEmptyChildren());
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2U, root->size());
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nested with siblings.
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue* inner = new ListValue;
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root->Set("list_with_empty_children", inner);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inner->Append(new DictionaryValue);
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inner->Append(new ListValue);
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* inner2 = new DictionaryValue;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root->Set("dict_with_empty_children", inner2);
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inner2->Set("empty_dict", new DictionaryValue);
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inner2->Set("empty_list", new ListValue);
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root.reset(root->DeepCopyWithoutEmptyChildren());
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2U, root->size());
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure nested values don't get pruned.
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue* inner = new ListValue;
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root->Set("list_with_empty_children", inner);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue* inner2 = new ListValue;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inner->Append(new DictionaryValue);
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inner->Append(inner2);
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    inner2->Append(new StringValue("hello"));
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root.reset(root->DeepCopyWithoutEmptyChildren());
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(3U, root->size());
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(root->GetList("list_with_empty_children", &inner));
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1U, inner->GetSize());  // Dictionary was pruned.
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(inner->GetList(0, &inner2));
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1U, inner2->GetSize());
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, MergeDictionary) {
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> base(new DictionaryValue);
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base->SetString("base_key", "base_key_value_base");
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base->SetString("collide_key", "collide_key_value_base");
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* base_sub_dict = new DictionaryValue;
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base_sub_dict->SetString("sub_base_key", "sub_base_key_value_base");
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base_sub_dict->SetString("sub_collide_key", "sub_collide_key_value_base");
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base->Set("sub_dict_key", base_sub_dict);
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> merge(new DictionaryValue);
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  merge->SetString("merge_key", "merge_key_value_merge");
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  merge->SetString("collide_key", "collide_key_value_merge");
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* merge_sub_dict = new DictionaryValue;
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  merge_sub_dict->SetString("sub_merge_key", "sub_merge_key_value_merge");
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  merge_sub_dict->SetString("sub_collide_key", "sub_collide_key_value_merge");
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  merge->Set("sub_dict_key", merge_sub_dict);
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base->MergeDictionary(merge.get());
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4U, base->size());
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string base_key_value;
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base->GetString("base_key", &base_key_value));
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("base_key_value_base", base_key_value); // Base value preserved.
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string collide_key_value;
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base->GetString("collide_key", &collide_key_value));
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("collide_key_value_merge", collide_key_value); // Replaced.
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string merge_key_value;
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base->GetString("merge_key", &merge_key_value));
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("merge_key_value_merge", merge_key_value); // Merged in.
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* res_sub_dict;
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base->GetDictionary("sub_dict_key", &res_sub_dict));
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, res_sub_dict->size());
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string sub_base_key_value;
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(res_sub_dict->GetString("sub_base_key", &sub_base_key_value));
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("sub_base_key_value_base", sub_base_key_value); // Preserved.
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string sub_collide_key_value;
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(res_sub_dict->GetString("sub_collide_key",
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      &sub_collide_key_value));
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("sub_collide_key_value_merge", sub_collide_key_value); // Replaced.
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string sub_merge_key_value;
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(res_sub_dict->GetString("sub_merge_key", &sub_merge_key_value));
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("sub_merge_key_value_merge", sub_merge_key_value); // Merged in.
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, MergeDictionaryDeepCopy) {
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* child = new DictionaryValue;
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  child->SetString("test", "value");
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, child->size());
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string value;
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(child->GetString("test", &value));
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("value", value);
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> base(new DictionaryValue);
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base->Set("dict", child);
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, base->size());
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* ptr;
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base->GetDictionary("dict", &ptr));
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(child, ptr);
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> merged(new DictionaryValue);
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  merged->MergeDictionary(base.get());
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, merged->size());
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(merged->GetDictionary("dict", &ptr));
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(child, ptr);
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ptr->GetString("test", &value));
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("value", value);
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  child->SetString("test", "overwrite");
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base.reset();
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ptr->GetString("test", &value));
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("value", value);
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, DictionaryIterator) {
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (DictionaryValue::Iterator it(dict); it.HasNext(); it.Advance()) {
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ADD_FAILURE();
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StringValue value1("value1");
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.Set("key1", value1.DeepCopy());
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool seen1 = false;
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (DictionaryValue::Iterator it(dict); it.HasNext(); it.Advance()) {
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(seen1);
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("key1", it.key());
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(value1.Equals(&it.value()));
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    seen1 = true;
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(seen1);
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StringValue value2("value2");
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.Set("key2", value2.DeepCopy());
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool seen2 = seen1 = false;
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (DictionaryValue::Iterator it(dict); it.HasNext(); it.Advance()) {
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (it.key() == "key1") {
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(seen1);
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(value1.Equals(&it.value()));
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      seen1 = true;
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (it.key() == "key2") {
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(seen2);
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(value2.Equals(&it.value()));
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      seen2 = true;
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ADD_FAILURE();
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(seen1);
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(seen2);
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
779