Skip to content

Commit a48e7fd

Browse files
committed
[stdlib] Test that dictionaries can be passed to merge/merging
1 parent b2e9d74 commit a48e7fd

File tree

1 file changed

+129
-1
lines changed

1 file changed

+129
-1
lines changed

validation-test/stdlib/Dictionary.swift

Lines changed: 129 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,7 @@ DictionaryTestSuite.test("COW.Slow.AddDoesNotReallocate") {
478478
}
479479
}
480480

481-
DictionaryTestSuite.test("COW.Fast.MergeDoesNotReallocate") {
481+
DictionaryTestSuite.test("COW.Fast.MergeSequenceDoesNotReallocate") {
482482
do {
483483
var d1 = getCOWFastDictionary()
484484
var identity1 = d1._rawIdentifier()
@@ -502,6 +502,13 @@ DictionaryTestSuite.test("COW.Fast.MergeDoesNotReallocate") {
502502
assert(d1.count == 7)
503503
assert(d1[30]! == 1030)
504504
assert(d1[70]! == 2070)
505+
506+
let d2 = d1.merging([(40, 3040), (80, 3080)]) { _, y in y }
507+
assert(identity1 == d1._rawIdentifier())
508+
assert(identity1 != d2._rawIdentifier())
509+
assert(d2.count == 8)
510+
assert(d2[40]! == 3040)
511+
assert(d2[80]! == 3080)
505512
}
506513

507514
do {
@@ -592,6 +599,127 @@ DictionaryTestSuite.test("COW.Fast.MergeDoesNotReallocate") {
592599
}
593600
}
594601

602+
DictionaryTestSuite.test("COW.Fast.MergeDictionaryDoesNotReallocate") {
603+
do {
604+
var d1 = getCOWFastDictionary()
605+
var identity1 = d1._rawIdentifier()
606+
607+
// Merge some new values.
608+
d1.merge([40: 2040, 50: 2050]) { _, y in y }
609+
assert(identity1 == d1._rawIdentifier())
610+
assert(d1.count == 5)
611+
assert(d1[50]! == 2050)
612+
613+
// Merge and overwrite some existing values.
614+
d1.merge([10: 2010, 60: 2060]) { _, y in y }
615+
assert(identity1 == d1._rawIdentifier())
616+
assert(d1.count == 6)
617+
assert(d1[10]! == 2010)
618+
assert(d1[60]! == 2060)
619+
620+
// Merge, keeping existing values.
621+
d1.merge([30: 2030, 70: 2070]) { x, _ in x }
622+
assert(identity1 == d1._rawIdentifier())
623+
assert(d1.count == 7)
624+
assert(d1[30]! == 1030)
625+
assert(d1[70]! == 2070)
626+
627+
let d2 = d1.merging([40: 3040, 80: 3080]) { _, y in y }
628+
assert(identity1 == d1._rawIdentifier())
629+
assert(identity1 != d2._rawIdentifier())
630+
assert(d2.count == 8)
631+
assert(d2[40]! == 3040)
632+
assert(d2[80]! == 3080)
633+
}
634+
635+
do {
636+
var d1 = getCOWFastDictionary()
637+
var identity1 = d1._rawIdentifier()
638+
639+
var d2 = d1
640+
assert(identity1 == d1._rawIdentifier())
641+
assert(identity1 == d2._rawIdentifier())
642+
643+
// Merge some new values.
644+
d2.merge([40: 2040, 50: 2050]) { _, y in y }
645+
assert(identity1 == d1._rawIdentifier())
646+
assert(identity1 != d2._rawIdentifier())
647+
648+
assert(d1.count == 3)
649+
assert(d1[10]! == 1010)
650+
assert(d1[20]! == 1020)
651+
assert(d1[30]! == 1030)
652+
assert(d1[40] == nil)
653+
654+
assert(d2.count == 5)
655+
assert(d2[10]! == 1010)
656+
assert(d2[20]! == 1020)
657+
assert(d2[30]! == 1030)
658+
assert(d2[40]! == 2040)
659+
assert(d2[50]! == 2050)
660+
661+
// Keep variables alive.
662+
_fixLifetime(d1)
663+
_fixLifetime(d2)
664+
}
665+
666+
do {
667+
var d1 = getCOWFastDictionary()
668+
var identity1 = d1._rawIdentifier()
669+
670+
var d2 = d1
671+
assert(identity1 == d1._rawIdentifier())
672+
assert(identity1 == d2._rawIdentifier())
673+
674+
// Merge and overwrite some existing values.
675+
d2.merge([10: 2010]) { _, y in y }
676+
assert(identity1 == d1._rawIdentifier())
677+
assert(identity1 != d2._rawIdentifier())
678+
679+
assert(d1.count == 3)
680+
assert(d1[10]! == 1010)
681+
assert(d1[20]! == 1020)
682+
assert(d1[30]! == 1030)
683+
684+
assert(d2.count == 3)
685+
assert(d2[10]! == 2010)
686+
assert(d2[20]! == 1020)
687+
assert(d2[30]! == 1030)
688+
689+
// Keep variables alive.
690+
_fixLifetime(d1)
691+
_fixLifetime(d2)
692+
}
693+
694+
do {
695+
var d1 = getCOWFastDictionary()
696+
var identity1 = d1._rawIdentifier()
697+
698+
var d2 = d1
699+
assert(identity1 == d1._rawIdentifier())
700+
assert(identity1 == d2._rawIdentifier())
701+
702+
// Merge, keeping existing values.
703+
d2.merge([10: 2010]) { x, _ in x }
704+
assert(identity1 == d1._rawIdentifier())
705+
assert(identity1 != d2._rawIdentifier())
706+
707+
assert(d1.count == 3)
708+
assert(d1[10]! == 1010)
709+
assert(d1[20]! == 1020)
710+
assert(d1[30]! == 1030)
711+
712+
assert(d2.count == 3)
713+
assert(d2[10]! == 1010)
714+
assert(d2[20]! == 1020)
715+
assert(d2[30]! == 1030)
716+
717+
// Keep variables alive.
718+
_fixLifetime(d1)
719+
_fixLifetime(d2)
720+
}
721+
}
722+
595723
DictionaryTestSuite.test("COW.Fast.DefaultedSubscriptDoesNotReallocate") {
596724
do {
597725
var d1 = getCOWFastDictionary()

0 commit comments

Comments
 (0)