values_unittest.cc revision 3240926e260ce088908e02ac07a6cf7b0c0cbf44
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"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/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;
2063240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  scoped_ptr<Value> removed_item;
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);
2213240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  removed_item.reset();
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(deletion_flag);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue list;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list.Append(new DeletionTestValue(&deletion_flag));
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(deletion_flag);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(list.Remove(0, NULL));
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(deletion_flag);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0U, list.GetSize());
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue list;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeletionTestValue* value = new DeletionTestValue(&deletion_flag);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list.Append(value);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(deletion_flag);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t index = 0;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list.Remove(*value, &index);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0U, index);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(deletion_flag);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0U, list.GetSize());
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, DictionaryDeletion) {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string key = "test";
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool deletion_flag = true;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue dict;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict.Set(key, new DeletionTestValue(&deletion_flag));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(deletion_flag);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(deletion_flag);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue dict;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict.Set(key, new DeletionTestValue(&deletion_flag));
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(deletion_flag);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict.Clear();
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(deletion_flag);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue dict;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict.Set(key, new DeletionTestValue(&deletion_flag));
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(deletion_flag);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict.Set(key, Value::CreateNullValue());
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(deletion_flag);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, DictionaryRemoval) {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string key = "test";
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool deletion_flag = true;
2773240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  scoped_ptr<Value> removed_item;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue dict;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict.Set(key, new DeletionTestValue(&deletion_flag));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(deletion_flag);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(dict.HasKey(key));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(dict.Remove("absent key", &removed_item));
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(dict.Remove(key, &removed_item));
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(dict.HasKey(key));
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(removed_item);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(deletion_flag);
2903240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  removed_item.reset();
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(deletion_flag);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue dict;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict.Set(key, new DeletionTestValue(&deletion_flag));
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(deletion_flag);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(dict.HasKey(key));
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(dict.Remove(key, NULL));
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(deletion_flag);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(dict.HasKey(key));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, DictionaryWithoutPathExpansion) {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.Set("this.is.expanded", Value::CreateNullValue());
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetWithoutPathExpansion("this.isnt.expanded", Value::CreateNullValue());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dict.HasKey("this.is.expanded"));
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dict.HasKey("this"));
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* value1;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dict.Get("this", &value1));
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* value2;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(dict.GetDictionaryWithoutPathExpansion("this", &value2));
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(value1, value2);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, value2->size());
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dict.HasKey("this.isnt.expanded"));
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* value3;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dict.Get("this.isnt.expanded", &value3));
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* value4;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(dict.GetWithoutPathExpansion("this.isnt.expanded", &value4));
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Value::TYPE_NULL, value4->GetType());
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, DeepCopy) {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue original_dict;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* original_null = Value::CreateNullValue();
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("null", original_null);
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FundamentalValue* original_bool = new FundamentalValue(true);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("bool", original_bool);
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FundamentalValue* original_int = new FundamentalValue(42);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("int", original_int);
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FundamentalValue* original_double = new FundamentalValue(3.14);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("double", original_double);
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StringValue* original_string = new StringValue("hello");
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("string", original_string);
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StringValue* original_string16 = new StringValue(ASCIIToUTF16("hello16"));
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("string16", original_string16);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<char[]> original_buffer(new char[42]);
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  memset(original_buffer.get(), '!', 42);
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BinaryValue* original_binary = new BinaryValue(original_buffer.Pass(), 42);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("binary", original_binary);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* original_list = new ListValue();
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FundamentalValue* original_list_element_0 = new FundamentalValue(0);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_list->Append(original_list_element_0);
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FundamentalValue* original_list_element_1 = new FundamentalValue(1);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_list->Append(original_list_element_1);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("list", original_list);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* original_nested_dictionary = new DictionaryValue();
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  original_nested_dictionary->Set("key", new StringValue("value"));
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("dictionary", original_nested_dictionary);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> copy_dict(original_dict.DeepCopy());
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_dict.get());
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_dict.get(), &original_dict);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* copy_null = NULL;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_dict->Get("null", &copy_null));
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_null);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_null, original_null);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_null->IsType(Value::TYPE_NULL));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* copy_bool = NULL;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_dict->Get("bool", &copy_bool));
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_bool);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_bool, original_bool);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_bool->IsType(Value::TYPE_BOOLEAN));
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool copy_bool_value = false;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_bool->GetAsBoolean(&copy_bool_value));
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_bool_value);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* copy_int = NULL;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_dict->Get("int", &copy_int));
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_int);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_int, original_int);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_int->IsType(Value::TYPE_INTEGER));
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int copy_int_value = 0;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_int->GetAsInteger(&copy_int_value));
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(42, copy_int_value);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* copy_double = NULL;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_dict->Get("double", &copy_double));
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_double);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_double, original_double);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_double->IsType(Value::TYPE_DOUBLE));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double copy_double_value = 0;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_double->GetAsDouble(&copy_double_value));
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3.14, copy_double_value);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* copy_string = NULL;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_dict->Get("string", &copy_string));
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_string);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_string, original_string);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_string->IsType(Value::TYPE_STRING));
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string copy_string_value;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 copy_string16_value;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_string->GetAsString(&copy_string_value));
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_string->GetAsString(&copy_string16_value));
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(std::string("hello"), copy_string_value);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ASCIIToUTF16("hello"), copy_string16_value);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* copy_string16 = NULL;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_dict->Get("string16", &copy_string16));
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_string16);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_string16, original_string16);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_string16->IsType(Value::TYPE_STRING));
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_string16->GetAsString(&copy_string_value));
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_string16->GetAsString(&copy_string16_value));
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(std::string("hello16"), copy_string_value);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ASCIIToUTF16("hello16"), copy_string16_value);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* copy_binary = NULL;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_dict->Get("binary", &copy_binary));
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_binary);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_binary, original_binary);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_binary->IsType(Value::TYPE_BINARY));
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(original_binary->GetBuffer(),
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static_cast<BinaryValue*>(copy_binary)->GetBuffer());
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(original_binary->GetSize(),
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static_cast<BinaryValue*>(copy_binary)->GetSize());
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, memcmp(original_binary->GetBuffer(),
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               static_cast<BinaryValue*>(copy_binary)->GetBuffer(),
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               original_binary->GetSize()));
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* copy_value = NULL;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_dict->Get("list", &copy_value));
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_value);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_value, original_list);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_value->IsType(Value::TYPE_LIST));
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* copy_list = NULL;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_value->GetAsList(&copy_list));
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_list);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, copy_list->GetSize());
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* copy_list_element_0;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_list->Get(0, &copy_list_element_0));
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_list_element_0);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_list_element_0, original_list_element_0);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int copy_list_element_0_value;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_list_element_0->GetAsInteger(&copy_list_element_0_value));
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, copy_list_element_0_value);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* copy_list_element_1;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_list->Get(1, &copy_list_element_1));
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_list_element_1);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_list_element_1, original_list_element_1);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int copy_list_element_1_value;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_list_element_1->GetAsInteger(&copy_list_element_1_value));
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, copy_list_element_1_value);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  copy_value = NULL;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_dict->Get("dictionary", &copy_value));
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_value);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(copy_value, original_nested_dictionary);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_value->IsType(Value::TYPE_DICTIONARY));
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* copy_nested_dictionary = NULL;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_value->GetAsDictionary(&copy_nested_dictionary));
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(copy_nested_dictionary);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(copy_nested_dictionary->HasKey("key"));
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, Equals) {
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* null1 = Value::CreateNullValue();
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* null2 = Value::CreateNullValue();
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(null1, null2);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(null1->Equals(null2));
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Value* boolean = new FundamentalValue(false);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(null1->Equals(boolean));
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete null1;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete null2;
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete boolean;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dv;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dv.SetBoolean("a", false);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dv.SetInteger("b", 2);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dv.SetDouble("c", 2.5);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dv.SetString("d1", "string");
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dv.SetString("d2", ASCIIToUTF16("http://google.com"));
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dv.Set("e", Value::CreateNullValue());
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> copy;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  copy.reset(dv.DeepCopy());
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dv.Equals(copy.get()));
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* list = new ListValue;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list->Append(Value::CreateNullValue());
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list->Append(new DictionaryValue);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dv.Set("f", list);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dv.Equals(copy.get()));
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  copy->Set("f", list->DeepCopy());
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dv.Equals(copy.get()));
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  list->Append(new FundamentalValue(true));
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dv.Equals(copy.get()));
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if Equals detects differences in only the keys.
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  copy.reset(dv.DeepCopy());
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(dv.Equals(copy.get()));
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  copy->Remove("a", NULL);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  copy->SetBoolean("aa", false);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(dv.Equals(copy.get()));
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, StaticEquals) {
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> null1(Value::CreateNullValue());
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> null2(Value::CreateNullValue());
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Value::Equals(null1.get(), null2.get()));
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Value::Equals(NULL, NULL));
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<Value> i42(new FundamentalValue(42));
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<Value> j42(new FundamentalValue(42));
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<Value> i17(new FundamentalValue(17));
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Value::Equals(i42.get(), i42.get()));
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Value::Equals(j42.get(), i42.get()));
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Value::Equals(i42.get(), j42.get()));
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Value::Equals(i42.get(), i17.get()));
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Value::Equals(i42.get(), NULL));
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Value::Equals(NULL, i42.get()));
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NULL and Value::CreateNullValue() are intentionally different: We need
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // support for NULL as a return value for "undefined" without caring for
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ownership of the pointer.
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Value::Equals(null1.get(), NULL));
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Value::Equals(NULL, null1.get()));
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, DeepCopyCovariantReturnTypes) {
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue original_dict;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* original_null = Value::CreateNullValue();
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("null", original_null);
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FundamentalValue* original_bool = new FundamentalValue(true);
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("bool", original_bool);
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FundamentalValue* original_int = new FundamentalValue(42);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("int", original_int);
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FundamentalValue* original_double = new FundamentalValue(3.14);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("double", original_double);
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StringValue* original_string = new StringValue("hello");
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("string", original_string);
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StringValue* original_string16 = new StringValue(ASCIIToUTF16("hello16"));
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("string16", original_string16);
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<char[]> original_buffer(new char[42]);
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  memset(original_buffer.get(), '!', 42);
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BinaryValue* original_binary = new BinaryValue(original_buffer.Pass(), 42);
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("binary", original_binary);
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue* original_list = new ListValue();
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FundamentalValue* original_list_element_0 = new FundamentalValue(0);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_list->Append(original_list_element_0);
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FundamentalValue* original_list_element_1 = new FundamentalValue(1);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_list->Append(original_list_element_1);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_dict.Set("list", original_list);
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* original_dict_value = &original_dict;
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* original_bool_value = original_bool;
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* original_int_value = original_int;
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* original_double_value = original_double;
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* original_string_value = original_string;
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* original_string16_value = original_string16;
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* original_binary_value = original_binary;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value* original_list_value = original_list;
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> copy_dict_value(original_dict_value->DeepCopy());
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> copy_bool_value(original_bool_value->DeepCopy());
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> copy_int_value(original_int_value->DeepCopy());
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> copy_double_value(original_double_value->DeepCopy());
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> copy_string_value(original_string_value->DeepCopy());
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> copy_string16_value(original_string16_value->DeepCopy());
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> copy_binary_value(original_binary_value->DeepCopy());
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Value> copy_list_value(original_list_value->DeepCopy());
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(original_dict_value->Equals(copy_dict_value.get()));
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(original_bool_value->Equals(copy_bool_value.get()));
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(original_int_value->Equals(copy_int_value.get()));
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(original_double_value->Equals(copy_double_value.get()));
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(original_string_value->Equals(copy_string_value.get()));
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(original_string16_value->Equals(copy_string16_value.get()));
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(original_binary_value->Equals(copy_binary_value.get()));
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(original_list_value->Equals(copy_list_value.get()));
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, RemoveEmptyChildren) {
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> root(new DictionaryValue);
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove empty lists and dictionaries.
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root->Set("empty_dict", new DictionaryValue);
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root->Set("empty_list", new ListValue);
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root->SetWithoutPathExpansion("a.b.c.d.e", new DictionaryValue);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root.reset(root->DeepCopyWithoutEmptyChildren());
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(root->empty());
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we don't prune too much.
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root->SetBoolean("bool", true);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root->Set("empty_dict", new DictionaryValue);
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  root->SetString("empty_string", std::string());
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root.reset(root->DeepCopyWithoutEmptyChildren());
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, root->size());
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should do nothing.
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root.reset(root->DeepCopyWithoutEmptyChildren());
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, root->size());
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nested test cases.  These should all reduce back to the bool and string
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // set above.
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root->Set("a.b.c.d.e", new DictionaryValue);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root.reset(root->DeepCopyWithoutEmptyChildren());
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2U, root->size());
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* inner = new DictionaryValue;
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root->Set("dict_with_emtpy_children", inner);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inner->Set("empty_dict", new DictionaryValue);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inner->Set("empty_list", new ListValue);
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root.reset(root->DeepCopyWithoutEmptyChildren());
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2U, root->size());
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue* inner = new ListValue;
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root->Set("list_with_empty_children", inner);
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inner->Append(new DictionaryValue);
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inner->Append(new ListValue);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root.reset(root->DeepCopyWithoutEmptyChildren());
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2U, root->size());
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nested with siblings.
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue* inner = new ListValue;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root->Set("list_with_empty_children", inner);
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inner->Append(new DictionaryValue);
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inner->Append(new ListValue);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* inner2 = new DictionaryValue;
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root->Set("dict_with_empty_children", inner2);
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inner2->Set("empty_dict", new DictionaryValue);
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inner2->Set("empty_list", new ListValue);
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root.reset(root->DeepCopyWithoutEmptyChildren());
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2U, root->size());
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure nested values don't get pruned.
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue* inner = new ListValue;
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root->Set("list_with_empty_children", inner);
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue* inner2 = new ListValue;
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inner->Append(new DictionaryValue);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inner->Append(inner2);
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    inner2->Append(new StringValue("hello"));
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root.reset(root->DeepCopyWithoutEmptyChildren());
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(3U, root->size());
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(root->GetList("list_with_empty_children", &inner));
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1U, inner->GetSize());  // Dictionary was pruned.
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(inner->GetList(0, &inner2));
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1U, inner2->GetSize());
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, MergeDictionary) {
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> base(new DictionaryValue);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base->SetString("base_key", "base_key_value_base");
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base->SetString("collide_key", "collide_key_value_base");
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* base_sub_dict = new DictionaryValue;
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base_sub_dict->SetString("sub_base_key", "sub_base_key_value_base");
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base_sub_dict->SetString("sub_collide_key", "sub_collide_key_value_base");
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base->Set("sub_dict_key", base_sub_dict);
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> merge(new DictionaryValue);
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  merge->SetString("merge_key", "merge_key_value_merge");
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  merge->SetString("collide_key", "collide_key_value_merge");
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* merge_sub_dict = new DictionaryValue;
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  merge_sub_dict->SetString("sub_merge_key", "sub_merge_key_value_merge");
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  merge_sub_dict->SetString("sub_collide_key", "sub_collide_key_value_merge");
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  merge->Set("sub_dict_key", merge_sub_dict);
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base->MergeDictionary(merge.get());
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4U, base->size());
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string base_key_value;
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base->GetString("base_key", &base_key_value));
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("base_key_value_base", base_key_value); // Base value preserved.
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string collide_key_value;
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base->GetString("collide_key", &collide_key_value));
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("collide_key_value_merge", collide_key_value); // Replaced.
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string merge_key_value;
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base->GetString("merge_key", &merge_key_value));
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("merge_key_value_merge", merge_key_value); // Merged in.
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* res_sub_dict;
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base->GetDictionary("sub_dict_key", &res_sub_dict));
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, res_sub_dict->size());
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string sub_base_key_value;
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(res_sub_dict->GetString("sub_base_key", &sub_base_key_value));
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("sub_base_key_value_base", sub_base_key_value); // Preserved.
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string sub_collide_key_value;
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(res_sub_dict->GetString("sub_collide_key",
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      &sub_collide_key_value));
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("sub_collide_key_value_merge", sub_collide_key_value); // Replaced.
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string sub_merge_key_value;
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(res_sub_dict->GetString("sub_merge_key", &sub_merge_key_value));
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("sub_merge_key_value_merge", sub_merge_key_value); // Merged in.
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, MergeDictionaryDeepCopy) {
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* child = new DictionaryValue;
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  child->SetString("test", "value");
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, child->size());
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string value;
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(child->GetString("test", &value));
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("value", value);
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> base(new DictionaryValue);
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base->Set("dict", child);
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, base->size());
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue* ptr;
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base->GetDictionary("dict", &ptr));
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(child, ptr);
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> merged(new DictionaryValue);
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  merged->MergeDictionary(base.get());
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, merged->size());
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(merged->GetDictionary("dict", &ptr));
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(child, ptr);
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ptr->GetString("test", &value));
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("value", value);
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  child->SetString("test", "overwrite");
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base.reset();
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ptr->GetString("test", &value));
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("value", value);
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ValuesTest, DictionaryIterator) {
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue dict;
741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (DictionaryValue::Iterator it(dict); !it.IsAtEnd(); it.Advance()) {
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ADD_FAILURE();
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StringValue value1("value1");
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.Set("key1", value1.DeepCopy());
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool seen1 = false;
748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (DictionaryValue::Iterator it(dict); !it.IsAtEnd(); it.Advance()) {
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(seen1);
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("key1", it.key());
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(value1.Equals(&it.value()));
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    seen1 = true;
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(seen1);
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StringValue value2("value2");
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.Set("key2", value2.DeepCopy());
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool seen2 = seen1 = false;
759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (DictionaryValue::Iterator it(dict); !it.IsAtEnd(); it.Advance()) {
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (it.key() == "key1") {
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(seen1);
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(value1.Equals(&it.value()));
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      seen1 = true;
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (it.key() == "key2") {
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(seen2);
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(value2.Equals(&it.value()));
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      seen2 = true;
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ADD_FAILURE();
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(seen1);
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(seen2);
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
777