OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/values.h" | 5 #include "base/values.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <limits> | 9 #include <limits> |
10 #include <memory> | 10 #include <memory> |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 EXPECT_EQ(Value::Type::STRING, value.type()); | 82 EXPECT_EQ(Value::Type::STRING, value.type()); |
83 EXPECT_EQ("foobar", value.GetString()); | 83 EXPECT_EQ("foobar", value.GetString()); |
84 } | 84 } |
85 | 85 |
86 TEST(ValuesTest, ConstructBinary) { | 86 TEST(ValuesTest, ConstructBinary) { |
87 BinaryValue value(std::vector<char>({0xF, 0x0, 0x0, 0xB, 0xA, 0x2})); | 87 BinaryValue value(std::vector<char>({0xF, 0x0, 0x0, 0xB, 0xA, 0x2})); |
88 EXPECT_EQ(Value::Type::BINARY, value.type()); | 88 EXPECT_EQ(Value::Type::BINARY, value.type()); |
89 EXPECT_EQ(std::vector<char>({0xF, 0x0, 0x0, 0xB, 0xA, 0x2}), value.GetBlob()); | 89 EXPECT_EQ(std::vector<char>({0xF, 0x0, 0x0, 0xB, 0xA, 0x2}), value.GetBlob()); |
90 } | 90 } |
91 | 91 |
| 92 TEST(ValuesTest, ConstructDict) { |
| 93 DictionaryValue value; |
| 94 EXPECT_EQ(Value::Type::DICTIONARY, value.type()); |
| 95 } |
| 96 |
| 97 TEST(ValuesTest, ConstructList) { |
| 98 ListValue value; |
| 99 EXPECT_EQ(Value::Type::LIST, value.type()); |
| 100 } |
| 101 |
92 // Group of tests for the copy constructors and copy-assigmnent. For equality | 102 // Group of tests for the copy constructors and copy-assigmnent. For equality |
93 // checks comparisons of the interesting fields are done instead of relying on | 103 // checks comparisons of the interesting fields are done instead of relying on |
94 // Equals being correct. | 104 // Equals being correct. |
95 TEST(ValuesTest, CopyBool) { | 105 TEST(ValuesTest, CopyBool) { |
96 FundamentalValue true_value(true); | 106 FundamentalValue true_value(true); |
97 FundamentalValue copied_true_value(true_value); | 107 FundamentalValue copied_true_value(true_value); |
98 EXPECT_EQ(true_value.type(), copied_true_value.type()); | 108 EXPECT_EQ(true_value.type(), copied_true_value.type()); |
99 EXPECT_EQ(true_value.GetBool(), copied_true_value.GetBool()); | 109 EXPECT_EQ(true_value.GetBool(), copied_true_value.GetBool()); |
100 | 110 |
101 FundamentalValue false_value(false); | 111 FundamentalValue false_value(false); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 EXPECT_EQ(value.type(), copied_value.type()); | 169 EXPECT_EQ(value.type(), copied_value.type()); |
160 EXPECT_EQ(value.GetBlob(), copied_value.GetBlob()); | 170 EXPECT_EQ(value.GetBlob(), copied_value.GetBlob()); |
161 | 171 |
162 Value blank; | 172 Value blank; |
163 | 173 |
164 blank = value; | 174 blank = value; |
165 EXPECT_EQ(value.type(), blank.type()); | 175 EXPECT_EQ(value.type(), blank.type()); |
166 EXPECT_EQ(value.GetBlob(), blank.GetBlob()); | 176 EXPECT_EQ(value.GetBlob(), blank.GetBlob()); |
167 } | 177 } |
168 | 178 |
| 179 TEST(ValuesTest, CopyDictionary) { |
| 180 // TODO(crbug.com/646113): Clean this up once DictionaryValue switched to |
| 181 // value semantics. |
| 182 int copy; |
| 183 DictionaryValue value; |
| 184 value.SetInteger("Int", 123); |
| 185 |
| 186 DictionaryValue copied_value(value); |
| 187 copied_value.GetInteger("Int", ©); |
| 188 |
| 189 EXPECT_EQ(value.type(), copied_value.type()); |
| 190 EXPECT_EQ(123, copy); |
| 191 |
| 192 auto blank = MakeUnique<Value>(); |
| 193 |
| 194 *blank = value; |
| 195 EXPECT_EQ(Value::Type::DICTIONARY, blank->type()); |
| 196 |
| 197 static_cast<DictionaryValue*>(blank.get())->GetInteger("Int", ©); |
| 198 EXPECT_EQ(123, copy); |
| 199 } |
| 200 |
| 201 TEST(ValuesTest, CopyList) { |
| 202 // TODO(crbug.com/646113): Clean this up once ListValue switched to |
| 203 // value semantics. |
| 204 int copy; |
| 205 ListValue value; |
| 206 value.AppendInteger(123); |
| 207 |
| 208 ListValue copied_value(value); |
| 209 copied_value.GetInteger(0, ©); |
| 210 |
| 211 EXPECT_EQ(value.type(), copied_value.type()); |
| 212 EXPECT_EQ(123, copy); |
| 213 |
| 214 auto blank = MakeUnique<Value>(); |
| 215 |
| 216 *blank = value; |
| 217 EXPECT_EQ(Value::Type::LIST, blank->type()); |
| 218 |
| 219 static_cast<ListValue*>(blank.get())->GetInteger(0, ©); |
| 220 EXPECT_EQ(123, copy); |
| 221 } |
| 222 |
169 // Group of tests for the move constructors and move-assigmnent. | 223 // Group of tests for the move constructors and move-assigmnent. |
170 TEST(ValuesTest, MoveBool) { | 224 TEST(ValuesTest, MoveBool) { |
171 FundamentalValue true_value(true); | 225 FundamentalValue true_value(true); |
172 FundamentalValue moved_true_value(std::move(true_value)); | 226 FundamentalValue moved_true_value(std::move(true_value)); |
173 EXPECT_EQ(Value::Type::BOOLEAN, moved_true_value.type()); | 227 EXPECT_EQ(Value::Type::BOOLEAN, moved_true_value.type()); |
174 EXPECT_TRUE(moved_true_value.GetBool()); | 228 EXPECT_TRUE(moved_true_value.GetBool()); |
175 | 229 |
176 FundamentalValue false_value(false); | 230 FundamentalValue false_value(false); |
177 FundamentalValue moved_false_value(std::move(false_value)); | 231 FundamentalValue moved_false_value(std::move(false_value)); |
178 EXPECT_EQ(Value::Type::BOOLEAN, moved_false_value.type()); | 232 EXPECT_EQ(Value::Type::BOOLEAN, moved_false_value.type()); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 EXPECT_EQ(Value::Type::BINARY, moved_value.type()); | 289 EXPECT_EQ(Value::Type::BINARY, moved_value.type()); |
236 EXPECT_EQ(buffer, moved_value.GetBlob()); | 290 EXPECT_EQ(buffer, moved_value.GetBlob()); |
237 | 291 |
238 Value blank; | 292 Value blank; |
239 | 293 |
240 blank = BinaryValue(buffer); | 294 blank = BinaryValue(buffer); |
241 EXPECT_EQ(Value::Type::BINARY, blank.type()); | 295 EXPECT_EQ(Value::Type::BINARY, blank.type()); |
242 EXPECT_EQ(buffer, blank.GetBlob()); | 296 EXPECT_EQ(buffer, blank.GetBlob()); |
243 } | 297 } |
244 | 298 |
| 299 TEST(ValuesTest, MoveDictionary) { |
| 300 // TODO(crbug.com/646113): Clean this up once DictionaryValue switched to |
| 301 // value semantics. |
| 302 int move; |
| 303 DictionaryValue value; |
| 304 value.SetInteger("Int", 123); |
| 305 |
| 306 DictionaryValue moved_value(std::move(value)); |
| 307 moved_value.GetInteger("Int", &move); |
| 308 |
| 309 EXPECT_EQ(Value::Type::DICTIONARY, moved_value.type()); |
| 310 EXPECT_EQ(123, move); |
| 311 |
| 312 Value blank; |
| 313 |
| 314 blank = DictionaryValue(); |
| 315 EXPECT_EQ(Value::Type::DICTIONARY, blank.type()); |
| 316 } |
| 317 |
| 318 TEST(ValuesTest, MoveList) { |
| 319 // TODO(crbug.com/646113): Clean this up once ListValue switched to |
| 320 // value semantics. |
| 321 int move; |
| 322 ListValue value; |
| 323 value.AppendInteger(123); |
| 324 |
| 325 ListValue moved_value(std::move(value)); |
| 326 moved_value.GetInteger(0, &move); |
| 327 |
| 328 EXPECT_EQ(Value::Type::LIST, moved_value.type()); |
| 329 EXPECT_EQ(123, move); |
| 330 |
| 331 Value blank; |
| 332 |
| 333 blank = ListValue(); |
| 334 EXPECT_EQ(Value::Type::LIST, blank.type()); |
| 335 } |
| 336 |
245 TEST(ValuesTest, Basic) { | 337 TEST(ValuesTest, Basic) { |
246 // Test basic dictionary getting/setting | 338 // Test basic dictionary getting/setting |
247 DictionaryValue settings; | 339 DictionaryValue settings; |
248 std::string homepage = "http://google.com"; | 340 std::string homepage = "http://google.com"; |
249 ASSERT_FALSE(settings.GetString("global.homepage", &homepage)); | 341 ASSERT_FALSE(settings.GetString("global.homepage", &homepage)); |
250 ASSERT_EQ(std::string("http://google.com"), homepage); | 342 ASSERT_EQ(std::string("http://google.com"), homepage); |
251 | 343 |
252 ASSERT_FALSE(settings.Get("global", NULL)); | 344 ASSERT_FALSE(settings.Get("global", NULL)); |
253 settings.SetBoolean("global", true); | 345 settings.SetBoolean("global", true); |
254 ASSERT_TRUE(settings.Get("global", NULL)); | 346 ASSERT_TRUE(settings.Get("global", NULL)); |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
392 ASSERT_EQ(ASCIIToUTF16("utf16"), utf16); | 484 ASSERT_EQ(ASCIIToUTF16("utf16"), utf16); |
393 ASSERT_EQ(string_value->GetString(), narrow); | 485 ASSERT_EQ(string_value->GetString(), narrow); |
394 | 486 |
395 // Don't choke on NULL values. | 487 // Don't choke on NULL values. |
396 ASSERT_TRUE(narrow_value->GetAsString(static_cast<string16*>(NULL))); | 488 ASSERT_TRUE(narrow_value->GetAsString(static_cast<string16*>(NULL))); |
397 ASSERT_TRUE(narrow_value->GetAsString(static_cast<std::string*>(NULL))); | 489 ASSERT_TRUE(narrow_value->GetAsString(static_cast<std::string*>(NULL))); |
398 ASSERT_TRUE(narrow_value->GetAsString( | 490 ASSERT_TRUE(narrow_value->GetAsString( |
399 static_cast<const StringValue**>(NULL))); | 491 static_cast<const StringValue**>(NULL))); |
400 } | 492 } |
401 | 493 |
402 // This is a Value object that allows us to tell if it's been | |
403 // properly deleted by modifying the value of external flag on destruction. | |
404 class DeletionTestValue : public Value { | |
405 public: | |
406 explicit DeletionTestValue(bool* deletion_flag) : Value(Type::NONE) { | |
407 Init(deletion_flag); // Separate function so that we can use ASSERT_* | |
408 } | |
409 | |
410 void Init(bool* deletion_flag) { | |
411 ASSERT_TRUE(deletion_flag); | |
412 deletion_flag_ = deletion_flag; | |
413 *deletion_flag_ = false; | |
414 } | |
415 | |
416 ~DeletionTestValue() override { *deletion_flag_ = true; } | |
417 | |
418 private: | |
419 bool* deletion_flag_; | |
420 }; | |
421 | |
422 TEST(ValuesTest, ListDeletion) { | 494 TEST(ValuesTest, ListDeletion) { |
423 bool deletion_flag = true; | 495 ListValue list; |
424 | 496 list.Append(MakeUnique<Value>()); |
425 { | 497 EXPECT_FALSE(list.empty()); |
426 ListValue list; | 498 list.Clear(); |
427 list.Append(MakeUnique<DeletionTestValue>(&deletion_flag)); | 499 EXPECT_TRUE(list.empty()); |
428 EXPECT_FALSE(deletion_flag); | |
429 } | |
430 EXPECT_TRUE(deletion_flag); | |
431 | |
432 { | |
433 ListValue list; | |
434 list.Append(MakeUnique<DeletionTestValue>(&deletion_flag)); | |
435 EXPECT_FALSE(deletion_flag); | |
436 list.Clear(); | |
437 EXPECT_TRUE(deletion_flag); | |
438 } | |
439 | |
440 { | |
441 ListValue list; | |
442 list.Append(MakeUnique<DeletionTestValue>(&deletion_flag)); | |
443 EXPECT_FALSE(deletion_flag); | |
444 EXPECT_TRUE(list.Set(0, Value::CreateNullValue())); | |
445 EXPECT_TRUE(deletion_flag); | |
446 } | |
447 } | 500 } |
448 | 501 |
449 TEST(ValuesTest, ListRemoval) { | 502 TEST(ValuesTest, ListRemoval) { |
450 bool deletion_flag = true; | |
451 std::unique_ptr<Value> removed_item; | 503 std::unique_ptr<Value> removed_item; |
452 | 504 |
453 { | 505 { |
454 ListValue list; | 506 ListValue list; |
455 list.Append(MakeUnique<DeletionTestValue>(&deletion_flag)); | 507 list.Append(MakeUnique<Value>()); |
456 EXPECT_FALSE(deletion_flag); | |
457 EXPECT_EQ(1U, list.GetSize()); | 508 EXPECT_EQ(1U, list.GetSize()); |
458 EXPECT_FALSE(list.Remove(std::numeric_limits<size_t>::max(), | 509 EXPECT_FALSE(list.Remove(std::numeric_limits<size_t>::max(), |
459 &removed_item)); | 510 &removed_item)); |
460 EXPECT_FALSE(list.Remove(1, &removed_item)); | 511 EXPECT_FALSE(list.Remove(1, &removed_item)); |
461 EXPECT_TRUE(list.Remove(0, &removed_item)); | 512 EXPECT_TRUE(list.Remove(0, &removed_item)); |
462 ASSERT_TRUE(removed_item); | 513 ASSERT_TRUE(removed_item); |
463 EXPECT_EQ(0U, list.GetSize()); | 514 EXPECT_EQ(0U, list.GetSize()); |
464 } | 515 } |
465 EXPECT_FALSE(deletion_flag); | |
466 removed_item.reset(); | 516 removed_item.reset(); |
467 EXPECT_TRUE(deletion_flag); | |
468 | 517 |
469 { | 518 { |
470 ListValue list; | 519 ListValue list; |
471 list.Append(MakeUnique<DeletionTestValue>(&deletion_flag)); | 520 list.Append(MakeUnique<Value>()); |
472 EXPECT_FALSE(deletion_flag); | |
473 EXPECT_TRUE(list.Remove(0, NULL)); | 521 EXPECT_TRUE(list.Remove(0, NULL)); |
474 EXPECT_TRUE(deletion_flag); | |
475 EXPECT_EQ(0U, list.GetSize()); | 522 EXPECT_EQ(0U, list.GetSize()); |
476 } | 523 } |
477 | 524 |
478 { | 525 { |
479 ListValue list; | 526 ListValue list; |
480 std::unique_ptr<DeletionTestValue> value( | 527 auto value = MakeUnique<Value>(); |
481 new DeletionTestValue(&deletion_flag)); | 528 Value* original_value = value.get(); |
482 DeletionTestValue* original_value = value.get(); | |
483 list.Append(std::move(value)); | 529 list.Append(std::move(value)); |
484 EXPECT_FALSE(deletion_flag); | |
485 size_t index = 0; | 530 size_t index = 0; |
486 list.Remove(*original_value, &index); | 531 list.Remove(*original_value, &index); |
487 EXPECT_EQ(0U, index); | 532 EXPECT_EQ(0U, index); |
488 EXPECT_TRUE(deletion_flag); | |
489 EXPECT_EQ(0U, list.GetSize()); | 533 EXPECT_EQ(0U, list.GetSize()); |
490 } | 534 } |
491 } | 535 } |
492 | 536 |
493 TEST(ValuesTest, DictionaryDeletion) { | 537 TEST(ValuesTest, DictionaryDeletion) { |
494 std::string key = "test"; | 538 std::string key = "test"; |
495 bool deletion_flag = true; | 539 DictionaryValue dict; |
496 | 540 dict.Set(key, MakeUnique<Value>()); |
497 { | 541 EXPECT_FALSE(dict.empty()); |
498 DictionaryValue dict; | 542 dict.Clear(); |
499 dict.Set(key, MakeUnique<DeletionTestValue>(&deletion_flag)); | 543 EXPECT_TRUE(dict.empty()); |
500 EXPECT_FALSE(deletion_flag); | |
501 } | |
502 EXPECT_TRUE(deletion_flag); | |
503 | |
504 { | |
505 DictionaryValue dict; | |
506 dict.Set(key, MakeUnique<DeletionTestValue>(&deletion_flag)); | |
507 EXPECT_FALSE(deletion_flag); | |
508 dict.Clear(); | |
509 EXPECT_TRUE(deletion_flag); | |
510 } | |
511 | |
512 { | |
513 DictionaryValue dict; | |
514 dict.Set(key, MakeUnique<DeletionTestValue>(&deletion_flag)); | |
515 EXPECT_FALSE(deletion_flag); | |
516 dict.Set(key, Value::CreateNullValue()); | |
517 EXPECT_TRUE(deletion_flag); | |
518 } | |
519 } | 544 } |
520 | 545 |
521 TEST(ValuesTest, DictionaryRemoval) { | 546 TEST(ValuesTest, DictionaryRemoval) { |
522 std::string key = "test"; | 547 std::string key = "test"; |
523 bool deletion_flag = true; | |
524 std::unique_ptr<Value> removed_item; | 548 std::unique_ptr<Value> removed_item; |
525 | 549 |
526 { | 550 { |
527 DictionaryValue dict; | 551 DictionaryValue dict; |
528 dict.Set(key, MakeUnique<DeletionTestValue>(&deletion_flag)); | 552 dict.Set(key, MakeUnique<Value>()); |
529 EXPECT_FALSE(deletion_flag); | |
530 EXPECT_TRUE(dict.HasKey(key)); | 553 EXPECT_TRUE(dict.HasKey(key)); |
531 EXPECT_FALSE(dict.Remove("absent key", &removed_item)); | 554 EXPECT_FALSE(dict.Remove("absent key", &removed_item)); |
532 EXPECT_TRUE(dict.Remove(key, &removed_item)); | 555 EXPECT_TRUE(dict.Remove(key, &removed_item)); |
533 EXPECT_FALSE(dict.HasKey(key)); | 556 EXPECT_FALSE(dict.HasKey(key)); |
534 ASSERT_TRUE(removed_item); | 557 ASSERT_TRUE(removed_item); |
535 } | 558 } |
536 EXPECT_FALSE(deletion_flag); | |
537 removed_item.reset(); | |
538 EXPECT_TRUE(deletion_flag); | |
539 | 559 |
540 { | 560 { |
541 DictionaryValue dict; | 561 DictionaryValue dict; |
542 dict.Set(key, MakeUnique<DeletionTestValue>(&deletion_flag)); | 562 dict.Set(key, MakeUnique<Value>()); |
543 EXPECT_FALSE(deletion_flag); | |
544 EXPECT_TRUE(dict.HasKey(key)); | 563 EXPECT_TRUE(dict.HasKey(key)); |
545 EXPECT_TRUE(dict.Remove(key, NULL)); | 564 EXPECT_TRUE(dict.Remove(key, NULL)); |
546 EXPECT_TRUE(deletion_flag); | |
547 EXPECT_FALSE(dict.HasKey(key)); | 565 EXPECT_FALSE(dict.HasKey(key)); |
548 } | 566 } |
549 } | 567 } |
550 | 568 |
551 TEST(ValuesTest, DictionaryWithoutPathExpansion) { | 569 TEST(ValuesTest, DictionaryWithoutPathExpansion) { |
552 DictionaryValue dict; | 570 DictionaryValue dict; |
553 dict.Set("this.is.expanded", Value::CreateNullValue()); | 571 dict.Set("this.is.expanded", Value::CreateNullValue()); |
554 dict.SetWithoutPathExpansion("this.isnt.expanded", Value::CreateNullValue()); | 572 dict.SetWithoutPathExpansion("this.isnt.expanded", Value::CreateNullValue()); |
555 | 573 |
556 EXPECT_FALSE(dict.HasKey("this.is.expanded")); | 574 EXPECT_FALSE(dict.HasKey("this.is.expanded")); |
(...skipping 809 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1366 EXPECT_FALSE(main_list.GetList(1, NULL)); | 1384 EXPECT_FALSE(main_list.GetList(1, NULL)); |
1367 EXPECT_FALSE(main_list.GetList(2, NULL)); | 1385 EXPECT_FALSE(main_list.GetList(2, NULL)); |
1368 EXPECT_FALSE(main_list.GetList(3, NULL)); | 1386 EXPECT_FALSE(main_list.GetList(3, NULL)); |
1369 EXPECT_FALSE(main_list.GetList(4, NULL)); | 1387 EXPECT_FALSE(main_list.GetList(4, NULL)); |
1370 EXPECT_FALSE(main_list.GetList(5, NULL)); | 1388 EXPECT_FALSE(main_list.GetList(5, NULL)); |
1371 EXPECT_TRUE(main_list.GetList(6, NULL)); | 1389 EXPECT_TRUE(main_list.GetList(6, NULL)); |
1372 EXPECT_FALSE(main_list.GetList(7, NULL)); | 1390 EXPECT_FALSE(main_list.GetList(7, NULL)); |
1373 } | 1391 } |
1374 | 1392 |
1375 } // namespace base | 1393 } // namespace base |
OLD | NEW |