Fix typed flatbuffer merge function

Change-Id: I2baeb5ab5a8fc48584466110f8d622838c2f05a0
diff --git a/aos/flatbuffer_merge_test.cc b/aos/flatbuffer_merge_test.cc
index ca63249..079eb11 100644
--- a/aos/flatbuffer_merge_test.cc
+++ b/aos/flatbuffer_merge_test.cc
@@ -13,6 +13,15 @@
  public:
   FlatbufferMerge() {}
 
+  void ExpectMergedOutput(const flatbuffers::DetachedBuffer &fb_merged,
+                          std::string_view expected_output) {
+    ASSERT_NE(fb_merged.size(), 0u);
+
+    const ::std::string merged_output =
+        FlatbufferToJson(fb_merged, ConfigurationTypeTable());
+    EXPECT_EQ(expected_output, merged_output);
+  }
+
   void JsonMerge(const ::std::string in1, const ::std::string in2,
                  const ::std::string out) {
     printf("Merging: %s\n", in1.c_str());
@@ -110,15 +119,40 @@
       // in1 merged with in2 => out.
       flatbuffers::DetachedBuffer fb_merged =
           MergeFlatBuffers<Configuration>(fb1.data(), fb2.data());
-      ASSERT_NE(fb_merged.size(), 0u);
 
-      const ::std::string merged_output =
-          FlatbufferToJson(fb_merged, ConfigurationTypeTable());
-      EXPECT_EQ(out, merged_output);
-
-      printf("Merged to: %s\n", merged_output.c_str());
+      ExpectMergedOutput(fb_merged, out);
     }
 
+    // Test all the different merge methods:
+    ExpectMergedOutput(
+        MergeFlatBuffers(ConfigurationTypeTable(), fb1.data(), fb2.data()),
+        out);
+    {
+      flatbuffers::FlatBufferBuilder fbb;
+      fbb.ForceDefaults(1);
+      fbb.Finish(MergeFlatBuffers(
+          ConfigurationTypeTable(),
+          flatbuffers::GetRoot<flatbuffers::Table>(fb1.data()),
+          flatbuffers::GetRoot<flatbuffers::Table>(fb2.data()), &fbb));
+      ExpectMergedOutput(fbb.Release(), out);
+    }
+    {
+      flatbuffers::FlatBufferBuilder fbb;
+      fbb.ForceDefaults(1);
+      fbb.Finish(MergeFlatBuffers<Configuration>(
+          flatbuffers::GetRoot<flatbuffers::Table>(fb1.data()),
+          flatbuffers::GetRoot<flatbuffers::Table>(fb2.data()), &fbb));
+      ExpectMergedOutput(fbb.Release(), out);
+    }
+    ExpectMergedOutput(MergeFlatBuffers<Configuration>(fb1.data(), fb2.data()),
+                       out);
+    ExpectMergedOutput(MergeFlatBuffers<Configuration>(fb1, fb2), out);
+    ExpectMergedOutput(MergeFlatBuffers<Configuration>(
+                           flatbuffers::GetRoot<Configuration>(fb1.data()),
+                           flatbuffers::GetRoot<Configuration>(fb2.data()))
+                           .buffer(),
+                       out);
+
     // Now, to make things extra exciting, nest a config inside a config.  And
     // run all the tests.  This will exercise some fun nested merges and copies.
 
@@ -196,6 +230,8 @@
 
 // Test the easy ones.  Test every type, single, no nesting.
 TEST_F(FlatbufferMerge, Basic) {
+  JsonMerge("{  }", "{  }", "{  }");
+
   JsonMerge("{ \"foo_bool\": true }", "{ \"foo_bool\": false }",
             "{ \"foo_bool\": false }");