Add a FlatbufferType implementation for a Schema

Change-Id: Ia58d86edc7bcfd1835087d8d8674b790dcbfaa67
diff --git a/aos/json_to_flatbuffer_test.cc b/aos/json_to_flatbuffer_test.cc
index dd70908..9dc12d2 100644
--- a/aos/json_to_flatbuffer_test.cc
+++ b/aos/json_to_flatbuffer_test.cc
@@ -11,22 +11,33 @@
  public:
   JsonToFlatbufferTest() {}
 
+  FlatbufferVector<reflection::Schema> Schema() {
+    return FileToFlatbuffer<reflection::Schema>("aos/json_to_flatbuffer.bfbs");
+  }
+
   bool JsonAndBack(const ::std::string str) { return JsonAndBack(str, str); }
 
   bool JsonAndBack(const ::std::string in, const ::std::string out) {
     printf("Testing: %s\n", in.c_str());
-    FlatbufferDetachedBuffer<Configuration> fb =
+    FlatbufferDetachedBuffer<Configuration> fb_typetable =
         JsonToFlatbuffer<Configuration>(in.data());
+    FlatbufferDetachedBuffer<Configuration> fb_reflection =
+        JsonToFlatbuffer(in.data(), FlatbufferType(&Schema().message()));
 
-    if (fb.span().size() == 0) {
+    if (fb_typetable.span().size() == 0) {
+      return false;
+    }
+    if (fb_reflection.span().size() == 0) {
       return false;
     }
 
-    const ::std::string back = FlatbufferToJson(fb);
+    const ::std::string back_typetable = FlatbufferToJson(fb_typetable);
+    const ::std::string back_reflection = FlatbufferToJson(fb_reflection);
 
-    printf("Back to string: %s\n", back.c_str());
+    printf("Back to string via TypeTable: %s\n", back_typetable.c_str());
+    printf("Back to string via reflection: %s\n", back_reflection.c_str());
 
-    return back == out;
+    return back_typetable == out && back_reflection == out;
   }
 };
 
@@ -222,20 +233,35 @@
   json_short += " ] }";
   json_long += ", 101 ] }";
 
-  const FlatbufferDetachedBuffer<Configuration> fb_short(
+  const FlatbufferDetachedBuffer<Configuration> fb_short_typetable(
       JsonToFlatbuffer<Configuration>(json_short));
-  ASSERT_GT(fb_short.span().size(), 0);
-  const FlatbufferDetachedBuffer<Configuration> fb_long(
+  ASSERT_GT(fb_short_typetable.span().size(), 0);
+  const FlatbufferDetachedBuffer<Configuration> fb_long_typetable(
       JsonToFlatbuffer<Configuration>(json_long));
-  ASSERT_GT(fb_long.span().size(), 0);
+  ASSERT_GT(fb_long_typetable.span().size(), 0);
+  const FlatbufferDetachedBuffer<Configuration> fb_short_reflection(
+      JsonToFlatbuffer(json_short, FlatbufferType(&Schema().message())));
+  ASSERT_GT(fb_short_reflection.span().size(), 0);
+  const FlatbufferDetachedBuffer<Configuration> fb_long_reflection(
+      JsonToFlatbuffer(json_long, FlatbufferType(&Schema().message())));
+  ASSERT_GT(fb_long_reflection.span().size(), 0);
 
-  const std::string back_json_short = FlatbufferToJson<Configuration>(
-      fb_short, {.multi_line = false, .max_vector_size = 100});
-  const std::string back_json_long = FlatbufferToJson<Configuration>(
-      fb_long, {.multi_line = false, .max_vector_size = 100});
+  const std::string back_json_short_typetable = FlatbufferToJson<Configuration>(
+      fb_short_typetable, {.multi_line = false, .max_vector_size = 100});
+  const std::string back_json_long_typetable = FlatbufferToJson<Configuration>(
+      fb_long_typetable, {.multi_line = false, .max_vector_size = 100});
+  const std::string back_json_short_reflection =
+      FlatbufferToJson<Configuration>(
+          fb_short_reflection, {.multi_line = false, .max_vector_size = 100});
+  const std::string back_json_long_reflection = FlatbufferToJson<Configuration>(
+      fb_long_reflection, {.multi_line = false, .max_vector_size = 100});
 
-  EXPECT_EQ(json_short, back_json_short);
-  EXPECT_EQ("{ \"vector_foo_int\": [ ... 101 elements ... ] }", back_json_long);
+  EXPECT_EQ(json_short, back_json_short_typetable);
+  EXPECT_EQ(json_short, back_json_short_reflection);
+  EXPECT_EQ("{ \"vector_foo_int\": [ ... 101 elements ... ] }",
+            back_json_long_typetable);
+  EXPECT_EQ("{ \"vector_foo_int\": [ ... 101 elements ... ] }",
+            back_json_long_reflection);
 }
 
 // Tests that a nullptr buffer prints nullptr.