@@ -155,6 +155,100 @@ class CreatePolicyRecordingContext {
155
155
mutable CreatePolicy last_create_policy;
156
156
};
157
157
158
+ TEST_CASE (" object with flexible schema" ) {
159
+ using namespace std ::string_literals;
160
+ _impl::RealmCoordinator::assert_no_open_realms ();
161
+
162
+ InMemoryTestFile config;
163
+ config.automatic_change_notifications = false ;
164
+ config.schema_mode = SchemaMode::AdditiveExplicit;
165
+ config.flexible_schema = true ;
166
+ config.schema = Schema{{
167
+ " table" ,
168
+ {
169
+ {" _id" , PropertyType::Int, Property::IsPrimary{true }},
170
+ },
171
+ }};
172
+
173
+ config.schema_version = 0 ;
174
+ auto r = Realm::get_shared_realm (config);
175
+
176
+ TestContext d (r);
177
+ auto create = [&](std::any&& value, CreatePolicy policy = CreatePolicy::ForceCreate) {
178
+ r->begin_transaction ();
179
+ auto obj = Object::create (d, r, *r->schema ().find (" table" ), value, policy);
180
+ r->commit_transaction ();
181
+ return obj;
182
+ };
183
+
184
+ SECTION (" create object" ) {
185
+ auto object = create (AnyDict{
186
+ {" _id" , INT64_C (1 )},
187
+ {" bool" , true },
188
+ {" int" , INT64_C (5 )},
189
+ {" float" , 2 .2f },
190
+ {" double" , 3.3 },
191
+ {" string" , " hello" s},
192
+ {" date" , Timestamp (10 , 20 )},
193
+ {" object id" , ObjectId (" 000000000000000000000001" )},
194
+ {" decimal" , Decimal128 (" 1.23e45" )},
195
+ {" uuid" , UUID (" 3b241101-abba-baba-caca-4136c566a962" )},
196
+ {" mixed" , " mixed" s},
197
+
198
+ {" bool array" , AnyVec{true , false }},
199
+ {" int array" , AnyVec{INT64_C (5 ), INT64_C (6 )}},
200
+ {" float array" , AnyVec{1 .1f , 2 .2f }},
201
+ {" double array" , AnyVec{3.3 , 4.4 }},
202
+ {" string array" , AnyVec{" a" s, " b" s, " c" s}},
203
+ {" date array" , AnyVec{Timestamp (10 , 20 ), Timestamp (30 , 40 )}},
204
+ {" object id array" , AnyVec{ObjectId (" AAAAAAAAAAAAAAAAAAAAAAAA" ), ObjectId (" BBBBBBBBBBBBBBBBBBBBBBBB" )}},
205
+ {" decimal array" , AnyVec{Decimal128 (" 1.23e45" ), Decimal128 (" 6.78e9" )}},
206
+ {" uuid array" , AnyVec{UUID (), UUID (" 3b241101-e2bb-4255-8caf-4136c566a962" )}},
207
+ {" mixed array" ,
208
+ AnyVec{25 , " b" s, 1.45 , util::none, Timestamp (30 , 40 ), Decimal128 (" 1.23e45" ),
209
+ ObjectId (" AAAAAAAAAAAAAAAAAAAAAAAA" ), UUID (" 3b241101-e2bb-4255-8caf-4136c566a962" )}},
210
+ {" dictionary" , AnyDict{{" key" , " value" s}}},
211
+ });
212
+
213
+ Obj obj = object.get_obj ();
214
+ REQUIRE (obj.get <Int>(" _id" ) == 1 );
215
+ REQUIRE (obj.get <Bool>(" bool" ) == true );
216
+ REQUIRE (obj.get <Int>(" int" ) == 5 );
217
+ REQUIRE (obj.get <float >(" float" ) == 2 .2f );
218
+ REQUIRE (obj.get <double >(" double" ) == 3.3 );
219
+ REQUIRE (obj.get <String>(" string" ) == " hello" );
220
+ REQUIRE (obj.get <Timestamp>(" date" ) == Timestamp (10 , 20 ));
221
+ REQUIRE (obj.get <ObjectId>(" object id" ) == ObjectId (" 000000000000000000000001" ));
222
+ REQUIRE (obj.get <Decimal128>(" decimal" ) == Decimal128 (" 1.23e45" ));
223
+ REQUIRE (obj.get <UUID>(" uuid" ) == UUID (" 3b241101-abba-baba-caca-4136c566a962" ));
224
+ REQUIRE (obj.get <Mixed>(" mixed" ) == Mixed (" mixed" ));
225
+
226
+ auto check_array = [&](StringData prop, auto ... values) {
227
+ auto vec = get_vector ({values...});
228
+ using U = typename decltype (vec)::value_type;
229
+ auto list = obj.get_list_ptr <Mixed>(prop);
230
+ size_t i = 0 ;
231
+ for (auto value : vec) {
232
+ CAPTURE (i);
233
+ REQUIRE (i < list->size ());
234
+ REQUIRE (value == list->get (i).get <U>());
235
+ ++i;
236
+ }
237
+ };
238
+ check_array (" bool array" , true , false );
239
+ check_array (" int array" , INT64_C (5 ), INT64_C (6 ));
240
+ check_array (" float array" , 1 .1f , 2 .2f );
241
+ check_array (" double array" , 3.3 , 4.4 );
242
+ check_array (" string array" , StringData (" a" ), StringData (" b" ), StringData (" c" ));
243
+ check_array (" date array" , Timestamp (10 , 20 ), Timestamp (30 , 40 ));
244
+ check_array (" object id array" , ObjectId (" AAAAAAAAAAAAAAAAAAAAAAAA" ), ObjectId (" BBBBBBBBBBBBBBBBBBBBBBBB" ));
245
+ check_array (" decimal array" , Decimal128 (" 1.23e45" ), Decimal128 (" 6.78e9" ));
246
+ check_array (" uuid array" , UUID (), UUID (" 3b241101-e2bb-4255-8caf-4136c566a962" ));
247
+
248
+ REQUIRE (obj.get_dictionary_ptr (" dictionary" )->get (" key" ) == Mixed (" value" ));
249
+ }
250
+ }
251
+
158
252
TEST_CASE (" object" ) {
159
253
using namespace std ::string_literals;
160
254
_impl::RealmCoordinator::assert_no_open_realms ();
0 commit comments