| Index: base/values_unittest.cc
|
| diff --git a/base/values_unittest.cc b/base/values_unittest.cc
|
| index e62b6e579b134f5bd92291b1b796618c689f239a..37759d0bed3e335b011f67867e9d0df641d64ded 100644
|
| --- a/base/values_unittest.cc
|
| +++ b/base/values_unittest.cc
|
| @@ -89,6 +89,16 @@ TEST(ValuesTest, ConstructBinary) {
|
| EXPECT_EQ(std::vector<char>({0xF, 0x0, 0x0, 0xB, 0xA, 0x2}), value.GetBlob());
|
| }
|
|
|
| +TEST(ValuesTest, ConstructDict) {
|
| + DictionaryValue value;
|
| + EXPECT_EQ(Value::Type::DICTIONARY, value.type());
|
| +}
|
| +
|
| +TEST(ValuesTest, ConstructList) {
|
| + ListValue value;
|
| + EXPECT_EQ(Value::Type::LIST, value.type());
|
| +}
|
| +
|
| // Group of tests for the copy constructors and copy-assigmnent. For equality
|
| // checks comparisons of the interesting fields are done instead of relying on
|
| // Equals being correct.
|
| @@ -166,6 +176,50 @@ TEST(ValuesTest, CopyBinary) {
|
| EXPECT_EQ(value.GetBlob(), blank.GetBlob());
|
| }
|
|
|
| +TEST(ValuesTest, CopyDictionary) {
|
| + // TODO(crbug.com/646113): Clean this up once DictionaryValue switched to
|
| + // value semantics.
|
| + int copy;
|
| + DictionaryValue value;
|
| + value.SetInteger("Int", 123);
|
| +
|
| + DictionaryValue copied_value(value);
|
| + copied_value.GetInteger("Int", ©);
|
| +
|
| + EXPECT_EQ(value.type(), copied_value.type());
|
| + EXPECT_EQ(123, copy);
|
| +
|
| + auto blank = MakeUnique<Value>();
|
| +
|
| + *blank = value;
|
| + EXPECT_EQ(Value::Type::DICTIONARY, blank->type());
|
| +
|
| + static_cast<DictionaryValue*>(blank.get())->GetInteger("Int", ©);
|
| + EXPECT_EQ(123, copy);
|
| +}
|
| +
|
| +TEST(ValuesTest, CopyList) {
|
| + // TODO(crbug.com/646113): Clean this up once ListValue switched to
|
| + // value semantics.
|
| + int copy;
|
| + ListValue value;
|
| + value.AppendInteger(123);
|
| +
|
| + ListValue copied_value(value);
|
| + copied_value.GetInteger(0, ©);
|
| +
|
| + EXPECT_EQ(value.type(), copied_value.type());
|
| + EXPECT_EQ(123, copy);
|
| +
|
| + auto blank = MakeUnique<Value>();
|
| +
|
| + *blank = value;
|
| + EXPECT_EQ(Value::Type::LIST, blank->type());
|
| +
|
| + static_cast<ListValue*>(blank.get())->GetInteger(0, ©);
|
| + EXPECT_EQ(123, copy);
|
| +}
|
| +
|
| // Group of tests for the move constructors and move-assigmnent.
|
| TEST(ValuesTest, MoveBool) {
|
| FundamentalValue true_value(true);
|
| @@ -242,6 +296,44 @@ TEST(ValuesTest, MoveBinary) {
|
| EXPECT_EQ(buffer, blank.GetBlob());
|
| }
|
|
|
| +TEST(ValuesTest, MoveDictionary) {
|
| + // TODO(crbug.com/646113): Clean this up once DictionaryValue switched to
|
| + // value semantics.
|
| + int move;
|
| + DictionaryValue value;
|
| + value.SetInteger("Int", 123);
|
| +
|
| + DictionaryValue moved_value(std::move(value));
|
| + moved_value.GetInteger("Int", &move);
|
| +
|
| + EXPECT_EQ(Value::Type::DICTIONARY, moved_value.type());
|
| + EXPECT_EQ(123, move);
|
| +
|
| + Value blank;
|
| +
|
| + blank = DictionaryValue();
|
| + EXPECT_EQ(Value::Type::DICTIONARY, blank.type());
|
| +}
|
| +
|
| +TEST(ValuesTest, MoveList) {
|
| + // TODO(crbug.com/646113): Clean this up once ListValue switched to
|
| + // value semantics.
|
| + int move;
|
| + ListValue value;
|
| + value.AppendInteger(123);
|
| +
|
| + ListValue moved_value(std::move(value));
|
| + moved_value.GetInteger(0, &move);
|
| +
|
| + EXPECT_EQ(Value::Type::LIST, moved_value.type());
|
| + EXPECT_EQ(123, move);
|
| +
|
| + Value blank;
|
| +
|
| + blank = ListValue();
|
| + EXPECT_EQ(Value::Type::LIST, blank.type());
|
| +}
|
| +
|
| TEST(ValuesTest, Basic) {
|
| // Test basic dictionary getting/setting
|
| DictionaryValue settings;
|
| @@ -399,61 +491,20 @@ TEST(ValuesTest, StringValue) {
|
| static_cast<const StringValue**>(NULL)));
|
| }
|
|
|
| -// This is a Value object that allows us to tell if it's been
|
| -// properly deleted by modifying the value of external flag on destruction.
|
| -class DeletionTestValue : public Value {
|
| - public:
|
| - explicit DeletionTestValue(bool* deletion_flag) : Value(Type::NONE) {
|
| - Init(deletion_flag); // Separate function so that we can use ASSERT_*
|
| - }
|
| -
|
| - void Init(bool* deletion_flag) {
|
| - ASSERT_TRUE(deletion_flag);
|
| - deletion_flag_ = deletion_flag;
|
| - *deletion_flag_ = false;
|
| - }
|
| -
|
| - ~DeletionTestValue() override { *deletion_flag_ = true; }
|
| -
|
| - private:
|
| - bool* deletion_flag_;
|
| -};
|
| -
|
| TEST(ValuesTest, ListDeletion) {
|
| - bool deletion_flag = true;
|
| -
|
| - {
|
| - ListValue list;
|
| - list.Append(MakeUnique<DeletionTestValue>(&deletion_flag));
|
| - EXPECT_FALSE(deletion_flag);
|
| - }
|
| - EXPECT_TRUE(deletion_flag);
|
| -
|
| - {
|
| - ListValue list;
|
| - list.Append(MakeUnique<DeletionTestValue>(&deletion_flag));
|
| - EXPECT_FALSE(deletion_flag);
|
| - list.Clear();
|
| - EXPECT_TRUE(deletion_flag);
|
| - }
|
| -
|
| - {
|
| - ListValue list;
|
| - list.Append(MakeUnique<DeletionTestValue>(&deletion_flag));
|
| - EXPECT_FALSE(deletion_flag);
|
| - EXPECT_TRUE(list.Set(0, Value::CreateNullValue()));
|
| - EXPECT_TRUE(deletion_flag);
|
| - }
|
| + ListValue list;
|
| + list.Append(MakeUnique<Value>());
|
| + EXPECT_FALSE(list.empty());
|
| + list.Clear();
|
| + EXPECT_TRUE(list.empty());
|
| }
|
|
|
| TEST(ValuesTest, ListRemoval) {
|
| - bool deletion_flag = true;
|
| std::unique_ptr<Value> removed_item;
|
|
|
| {
|
| ListValue list;
|
| - list.Append(MakeUnique<DeletionTestValue>(&deletion_flag));
|
| - EXPECT_FALSE(deletion_flag);
|
| + list.Append(MakeUnique<Value>());
|
| EXPECT_EQ(1U, list.GetSize());
|
| EXPECT_FALSE(list.Remove(std::numeric_limits<size_t>::max(),
|
| &removed_item));
|
| @@ -462,88 +513,55 @@ TEST(ValuesTest, ListRemoval) {
|
| ASSERT_TRUE(removed_item);
|
| EXPECT_EQ(0U, list.GetSize());
|
| }
|
| - EXPECT_FALSE(deletion_flag);
|
| removed_item.reset();
|
| - EXPECT_TRUE(deletion_flag);
|
|
|
| {
|
| ListValue list;
|
| - list.Append(MakeUnique<DeletionTestValue>(&deletion_flag));
|
| - EXPECT_FALSE(deletion_flag);
|
| + list.Append(MakeUnique<Value>());
|
| EXPECT_TRUE(list.Remove(0, NULL));
|
| - EXPECT_TRUE(deletion_flag);
|
| EXPECT_EQ(0U, list.GetSize());
|
| }
|
|
|
| {
|
| ListValue list;
|
| - std::unique_ptr<DeletionTestValue> value(
|
| - new DeletionTestValue(&deletion_flag));
|
| - DeletionTestValue* original_value = value.get();
|
| + auto value = MakeUnique<Value>();
|
| + Value* original_value = value.get();
|
| list.Append(std::move(value));
|
| - EXPECT_FALSE(deletion_flag);
|
| size_t index = 0;
|
| list.Remove(*original_value, &index);
|
| EXPECT_EQ(0U, index);
|
| - EXPECT_TRUE(deletion_flag);
|
| EXPECT_EQ(0U, list.GetSize());
|
| }
|
| }
|
|
|
| TEST(ValuesTest, DictionaryDeletion) {
|
| std::string key = "test";
|
| - bool deletion_flag = true;
|
| -
|
| - {
|
| - DictionaryValue dict;
|
| - dict.Set(key, MakeUnique<DeletionTestValue>(&deletion_flag));
|
| - EXPECT_FALSE(deletion_flag);
|
| - }
|
| - EXPECT_TRUE(deletion_flag);
|
| -
|
| - {
|
| - DictionaryValue dict;
|
| - dict.Set(key, MakeUnique<DeletionTestValue>(&deletion_flag));
|
| - EXPECT_FALSE(deletion_flag);
|
| - dict.Clear();
|
| - EXPECT_TRUE(deletion_flag);
|
| - }
|
| -
|
| - {
|
| - DictionaryValue dict;
|
| - dict.Set(key, MakeUnique<DeletionTestValue>(&deletion_flag));
|
| - EXPECT_FALSE(deletion_flag);
|
| - dict.Set(key, Value::CreateNullValue());
|
| - EXPECT_TRUE(deletion_flag);
|
| - }
|
| + DictionaryValue dict;
|
| + dict.Set(key, MakeUnique<Value>());
|
| + EXPECT_FALSE(dict.empty());
|
| + dict.Clear();
|
| + EXPECT_TRUE(dict.empty());
|
| }
|
|
|
| TEST(ValuesTest, DictionaryRemoval) {
|
| std::string key = "test";
|
| - bool deletion_flag = true;
|
| std::unique_ptr<Value> removed_item;
|
|
|
| {
|
| DictionaryValue dict;
|
| - dict.Set(key, MakeUnique<DeletionTestValue>(&deletion_flag));
|
| - EXPECT_FALSE(deletion_flag);
|
| + dict.Set(key, MakeUnique<Value>());
|
| EXPECT_TRUE(dict.HasKey(key));
|
| EXPECT_FALSE(dict.Remove("absent key", &removed_item));
|
| EXPECT_TRUE(dict.Remove(key, &removed_item));
|
| EXPECT_FALSE(dict.HasKey(key));
|
| ASSERT_TRUE(removed_item);
|
| }
|
| - EXPECT_FALSE(deletion_flag);
|
| - removed_item.reset();
|
| - EXPECT_TRUE(deletion_flag);
|
|
|
| {
|
| DictionaryValue dict;
|
| - dict.Set(key, MakeUnique<DeletionTestValue>(&deletion_flag));
|
| - EXPECT_FALSE(deletion_flag);
|
| + dict.Set(key, MakeUnique<Value>());
|
| EXPECT_TRUE(dict.HasKey(key));
|
| EXPECT_TRUE(dict.Remove(key, NULL));
|
| - EXPECT_TRUE(deletion_flag);
|
| EXPECT_FALSE(dict.HasKey(key));
|
| }
|
| }
|
|
|