@@ -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+
183237TEST_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+
542647TEST_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+
579709TEST_CASE (" [Dictionary] Iteration" ) {
580710 Dictionary a1 = { { 1 , 2 }, { 3 , 4 }, { 5 , 6 } };
581711 Dictionary a2 = { { 1 , 2 }, { 3 , 4 }, { 5 , 6 } };
0 commit comments