Skip to content

Commit dbcd533

Browse files
committed
Merge pull request #112259 from aaronp64/dictionary_tests
Add more `Dictionary` tests
2 parents 1aef8d5 + fd85c5b commit dbcd533

File tree

1 file changed

+133
-3
lines changed

1 file changed

+133
-3
lines changed

tests/core/variant/test_dictionary.h

Lines changed: 133 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,14 +136,36 @@ TEST_CASE("[Dictionary] get_valid()") {
136136
Variant val = map.get_valid(1);
137137
CHECK(int(val) == 3);
138138
}
139-
TEST_CASE("[Dictionary] get()") {
139+
140+
TEST_CASE("[Dictionary] set(), get(), and get_or_add()") {
140141
Dictionary map;
141-
map[1] = 3;
142+
143+
map.set(1, 3);
142144
Variant val = map.get(1, -1);
143145
CHECK(int(val) == 3);
146+
147+
map.set(1, 5);
148+
val = map.get(1, -1);
149+
CHECK(int(val) == 5);
150+
151+
CHECK(int(map.get_or_add(1, 7)) == 5);
152+
CHECK(int(map.get_or_add(2, 7)) == 7);
153+
}
154+
155+
TEST_CASE("[Dictionary] make_read_only() and is_read_only()") {
156+
Dictionary map;
157+
CHECK_FALSE(map.is_read_only());
158+
CHECK(map.set(1, 1));
159+
160+
map.make_read_only();
161+
CHECK(map.is_read_only());
162+
163+
ERR_PRINT_OFF;
164+
CHECK_FALSE(map.set(1, 2));
165+
ERR_PRINT_ON;
144166
}
145167

146-
TEST_CASE("[Dictionary] size(), empty() and clear()") {
168+
TEST_CASE("[Dictionary] size(), is_empty() and clear()") {
147169
Dictionary map;
148170
CHECK(map.size() == 0);
149171
CHECK(map.is_empty());
@@ -180,6 +202,38 @@ TEST_CASE("[Dictionary] keys() and values()") {
180202
CHECK(int(values[0]) == 3);
181203
}
182204

205+
TEST_CASE("[Dictionary] merge() and merged()") {
206+
Dictionary d1 = {
207+
{ "key1", 1 },
208+
{ "key2", 2 },
209+
};
210+
Dictionary d2 = {
211+
{ "key2", 200 },
212+
{ "key3", 300 },
213+
};
214+
Dictionary expected_no_overwrite = {
215+
{ "key1", 1 },
216+
{ "key2", 2 },
217+
{ "key3", 300 },
218+
};
219+
Dictionary expected_overwrite = {
220+
{ "key1", 1 },
221+
{ "key2", 200 },
222+
{ "key3", 300 },
223+
};
224+
225+
Dictionary d_test = d1.duplicate();
226+
d_test.merge(d2, false);
227+
CHECK_EQ(d_test, expected_no_overwrite);
228+
229+
d_test = d1.duplicate();
230+
d_test.merge(d2, true);
231+
CHECK_EQ(d_test, expected_overwrite);
232+
233+
CHECK_EQ(d1.merged(d2, false), expected_no_overwrite);
234+
CHECK_EQ(d1.merged(d2, true), expected_overwrite);
235+
}
236+
183237
TEST_CASE("[Dictionary] Duplicate dictionary") {
184238
// d = {1: {1: 1}, {2: 2}: [2], [3]: 3}
185239
Dictionary k2 = { { 2, 2 } };
@@ -196,6 +250,11 @@ TEST_CASE("[Dictionary] Duplicate dictionary") {
196250
CHECK_MESSAGE(Dictionary(deep_d[1]).id() != Dictionary(d[1]).id(), "Should clone nested dictionary");
197251
CHECK_MESSAGE(Array(deep_d[k2]).id() != Array(d[k2]).id(), "Should clone nested array");
198252
CHECK_EQ(deep_d, d);
253+
254+
// Check that duplicate_deep matches duplicate(true)
255+
Dictionary deep_d2 = d.duplicate_deep();
256+
CHECK_EQ(deep_d, deep_d2);
257+
199258
deep_d[0] = 0;
200259
CHECK_NE(deep_d, d);
201260
deep_d.erase(0);
@@ -539,6 +598,52 @@ TEST_CASE("[Dictionary] Order and find") {
539598
CHECK_EQ(d.find_key("does not exist"), Variant());
540599
}
541600

601+
TEST_CASE("[Dictionary] sort()") {
602+
Dictionary d;
603+
d[3] = 3;
604+
d[2] = 2;
605+
d[4] = 4;
606+
d[1] = 1;
607+
608+
Array expected_unsorted = { 3, 2, 4, 1 };
609+
CHECK_EQ(d.keys(), expected_unsorted);
610+
611+
d.sort();
612+
Array expected_sorted = { 1, 2, 3, 4 };
613+
CHECK_EQ(d.keys(), expected_sorted);
614+
615+
Dictionary d_str;
616+
d_str["b"] = 2;
617+
d_str["c"] = 3;
618+
d_str["a"] = 1;
619+
620+
d_str.sort();
621+
Array expected_str_sorted = { "a", "b", "c" };
622+
CHECK_EQ(d_str.keys(), expected_str_sorted);
623+
}
624+
625+
TEST_CASE("[Dictionary] assign()") {
626+
Dictionary untyped;
627+
untyped["key1"] = "value";
628+
CHECK(untyped.size() == 1);
629+
630+
Dictionary typed;
631+
typed.set_typed(Variant::STRING, StringName(), Variant(), Variant::STRING, StringName(), Variant());
632+
typed.assign(untyped);
633+
CHECK(typed.size() == 1);
634+
typed["key2"] = "value";
635+
636+
untyped.assign(typed);
637+
CHECK(untyped.size() == 2);
638+
untyped["key3"] = 5;
639+
CHECK(untyped.size() == 3);
640+
641+
ERR_PRINT_OFF;
642+
typed.assign(untyped);
643+
ERR_PRINT_ON;
644+
CHECK(typed.size() == 2);
645+
}
646+
542647
TEST_CASE("[Dictionary] Typed copying") {
543648
TypedDictionary<int, int> d1;
544649
d1[0] = 1;
@@ -576,6 +681,31 @@ TEST_CASE("[Dictionary] Typed copying") {
576681
d6.clear();
577682
}
578683

684+
TEST_CASE("[Dictionary] Type checks/comparisons") {
685+
Dictionary d1;
686+
CHECK_FALSE(d1.is_typed());
687+
CHECK_FALSE(d1.is_typed_key());
688+
CHECK_FALSE(d1.is_typed_value());
689+
690+
d1.set_typed(Variant::STRING, StringName(), Variant(), Variant::OBJECT, "Node", Variant());
691+
CHECK(d1.is_typed());
692+
CHECK(d1.is_typed_key());
693+
CHECK(d1.is_typed_value());
694+
CHECK_EQ(d1.get_typed_key_builtin(), Variant::STRING);
695+
CHECK_EQ(d1.get_typed_value_builtin(), Variant::OBJECT);
696+
CHECK_EQ(d1.get_typed_value_class_name(), "Node");
697+
698+
Dictionary d2;
699+
CHECK_FALSE(d1.is_same_typed(d2));
700+
CHECK_FALSE(d1.is_same_typed_key(d2));
701+
CHECK_FALSE(d1.is_same_typed_value(d2));
702+
703+
d2.set_typed(Variant::STRING, StringName(), Variant(), Variant::STRING, StringName(), Variant());
704+
CHECK_FALSE(d1.is_same_typed(d2));
705+
CHECK(d1.is_same_typed_key(d2));
706+
CHECK_FALSE(d1.is_same_typed_value(d2));
707+
}
708+
579709
TEST_CASE("[Dictionary] Iteration") {
580710
Dictionary a1 = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
581711
Dictionary a2 = { { 1, 2 }, { 3, 4 }, { 5, 6 } };

0 commit comments

Comments
 (0)