Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(381)

Side by Side Diff: base/values_unittest.cc

Issue 2683203004: Move Storage for ListValue and DictValue in Union (Closed)
Patch Set: Add missing return statements. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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", &copy);
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", &copy);
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, &copy);
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, &copy);
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698