Unit test showing array assignment problem on gcc 4.9
[folly.git] / folly / test / DynamicTest.cpp
index 97af70be462e6df6b3f7f5561e48191f1b323cb3..83e21cf6a4f810961f2598026359e46640d0aa05 100644 (file)
@@ -107,18 +107,31 @@ TEST(Dynamic, ObjectBasics) {
   dynamic mergeObj2 = folly::dynamic::object
     ("key2", "value3")
     ("key3", "value4");
   dynamic mergeObj2 = folly::dynamic::object
     ("key2", "value3")
     ("key3", "value4");
-  dynamic combinedObj = folly::dynamic::object
+
+  // Merged object where we prefer the values in mergeObj2
+  dynamic combinedPreferObj2 = folly::dynamic::object
     ("key1", "value1")
     ("key2", "value3")
     ("key3", "value4");
     ("key1", "value1")
     ("key2", "value3")
     ("key3", "value4");
+
+  // Merged object where we prefer the values in mergeObj1
+  dynamic combinedPreferObj1 = folly::dynamic::object
+    ("key1", "value1")
+    ("key2", "value2")
+    ("key3", "value4");
+
   auto newMergeObj = dynamic::merge(mergeObj1, mergeObj2);
   auto newMergeObj = dynamic::merge(mergeObj1, mergeObj2);
-  EXPECT_EQ(newMergeObj, combinedObj);
+  EXPECT_EQ(newMergeObj, combinedPreferObj2);
   EXPECT_EQ(mergeObj1, origMergeObj1); // mergeObj1 should be unchanged
 
   mergeObj1.update(mergeObj2);
   EXPECT_EQ(mergeObj1, origMergeObj1); // mergeObj1 should be unchanged
 
   mergeObj1.update(mergeObj2);
-  EXPECT_EQ(mergeObj1, combinedObj);
+  EXPECT_EQ(mergeObj1, combinedPreferObj2);
   dynamic arr = { 1, 2, 3, 4, 5, 6 };
   EXPECT_THROW(mergeObj1.update(arr), std::exception);
   dynamic arr = { 1, 2, 3, 4, 5, 6 };
   EXPECT_THROW(mergeObj1.update(arr), std::exception);
+
+  mergeObj1 = origMergeObj1; // reset it
+  mergeObj1.update_missing(mergeObj2);
+  EXPECT_EQ(mergeObj1, combinedPreferObj1);
 }
 
 TEST(Dynamic, ObjectErase) {
 }
 
 TEST(Dynamic, ObjectErase) {
@@ -216,12 +229,25 @@ TEST(Dynamic, DeepCopy) {
   EXPECT_EQ(obj2.at("a"), expected);
 }
 
   EXPECT_EQ(obj2.at("a"), expected);
 }
 
+TEST(Dynamic, ArrayReassignment) {
+  dynamic o = 1;
+
+  dynamic d1 = {o};
+  EXPECT_EQ(dynamic::ARRAY, d1.type());
+
+  d1 = {o};
+  EXPECT_EQ(dynamic::ARRAY, d1.type());
+}
+
 TEST(Dynamic, Operator) {
   bool caught = false;
   try {
     dynamic d1 = dynamic::object;
     dynamic d2 = dynamic::object;
     auto foo = d1 < d2;
 TEST(Dynamic, Operator) {
   bool caught = false;
   try {
     dynamic d1 = dynamic::object;
     dynamic d2 = dynamic::object;
     auto foo = d1 < d2;
+    LOG(ERROR) << "operator < returned "
+               << static_cast<int>(foo)
+               << " instead of throwing";
   } catch (std::exception const& e) {
     caught = true;
   }
   } catch (std::exception const& e) {
     caught = true;
   }