Fix and test JSON conversions on nonconsecutive enums

Change-Id: I057940c95bd6e371568be5ca1f426a40a6a73e95
diff --git a/aos/json_to_flatbuffer.cc b/aos/json_to_flatbuffer.cc
index f12014f..036ae01 100644
--- a/aos/json_to_flatbuffer.cc
+++ b/aos/json_to_flatbuffer.cc
@@ -1,8 +1,6 @@
 #include "aos/json_to_flatbuffer.h"
 
 #include <cstddef>
-#include "stdio.h"
-
 #include <string_view>
 
 #include "aos/flatbuffer_utils.h"
@@ -10,6 +8,7 @@
 #include "flatbuffers/flatbuffers.h"
 #include "flatbuffers/minireflect.h"
 #include "glog/logging.h"
+#include "stdio.h"
 
 // TODO(austin): Can we just do an Offset<void> ?  It doesn't matter, so maybe
 // just say that.
@@ -418,7 +417,11 @@
         bool found = false;
         for (size_t i = 0; i < enum_type_table->num_elems; ++i) {
           if (data == enum_type_table->names[i]) {
-            int_value = i;
+            if (enum_type_table->values) {
+              int_value = enum_type_table->values[i];
+            } else {
+              int_value = i;
+            }
             found = true;
             break;
           }
diff --git a/aos/json_to_flatbuffer.fbs b/aos/json_to_flatbuffer.fbs
index 7ce9ae6..7180322 100644
--- a/aos/json_to_flatbuffer.fbs
+++ b/aos/json_to_flatbuffer.fbs
@@ -21,6 +21,11 @@
     Array
 }
 
+enum NonConsecutive : int {
+  Zero = 0,
+  Big = 10000000,
+}
+
 table Location {
   name:string (id: 0);
   type:string (id: 1);
@@ -126,6 +131,9 @@
   foo_struct:FooStruct (id: 34);
   vector_foo_struct:[FooStruct] (id: 35);
   foo_struct_enum:StructEnum (id: 36);
+
+  foo_enum_nonconsecutive:NonConsecutive (id: 37);
+  foo_enum_nonconsecutive_default:NonConsecutive = Big (id: 38);
 }
 
 root_type Configuration;
diff --git a/aos/json_to_flatbuffer_test.cc b/aos/json_to_flatbuffer_test.cc
index 4379ae9..dd70908 100644
--- a/aos/json_to_flatbuffer_test.cc
+++ b/aos/json_to_flatbuffer_test.cc
@@ -1,9 +1,8 @@
 #include "aos/json_to_flatbuffer.h"
 
-#include "gtest/gtest.h"
-
 #include "aos/json_to_flatbuffer_generated.h"
 #include "flatbuffers/minireflect.h"
+#include "gtest/gtest.h"
 
 namespace aos {
 namespace testing {
@@ -64,6 +63,9 @@
   EXPECT_TRUE(JsonAndBack("{ \"foo_enum_default\": \"UType\" }"));
 
   EXPECT_TRUE(JsonAndBack("{ \"foo_string\": \"baz\" }"));
+
+  EXPECT_TRUE(JsonAndBack("{ \"foo_enum_nonconsecutive\": \"Zero\" }"));
+  EXPECT_TRUE(JsonAndBack("{ \"foo_enum_nonconsecutive\": \"Big\" }"));
 }
 
 // Tests that NaN is handled correctly
@@ -88,6 +90,11 @@
   EXPECT_FALSE(JsonAndBack("{ \"foo_enum\": \"5ype\" }"));
 
   EXPECT_FALSE(JsonAndBack("{ \"foo_enum_default\": \"7ype\" }"));
+
+  EXPECT_FALSE(JsonAndBack("{ \"foo_enum_nonconsecutive\": \"Nope\" }"));
+
+  EXPECT_FALSE(
+      JsonAndBack("{ \"foo_enum_nonconsecutive_default\": \"Nope\" }"));
 }
 
 // Test that adding a duplicate field results in an error.