buffet: Change OneOf constraint to use generic PropValue list

Now ContraintOneOf contains a vector<PropValue> as opposed to
vector<T>. This will enable support for array types, because the
alternative would be to add explicit specializations for combinations
of basic types (int, bool, double, string,... ) and a vector.

BUG=brillo:107
TEST=`FEATURES=test emerge-link buffet`

Change-Id: Ia6bd93db23517c463ba6d915617d9571499a8491
Reviewed-on: https://chromium-review.googlesource.com/261564
Reviewed-by: Vitaly Buka <vitalybuka@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
Trybot-Ready: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/commands/object_schema_unittest.cc b/buffet/commands/object_schema_unittest.cc
index 5e913f8..f257a67 100644
--- a/buffet/commands/object_schema_unittest.cc
+++ b/buffet/commands/object_schema_unittest.cc
@@ -23,6 +23,25 @@
 using buffet::unittests::CreateDictionaryValue;
 using buffet::unittests::ValueToString;
 
+namespace {
+
+template<typename T>
+std::vector<T> GetOneOfValues(const buffet::PropType* prop_type) {
+  std::vector<T> values;
+  auto one_of = static_cast<const buffet::ConstraintOneOf*>(
+      prop_type->GetConstraint(buffet::ConstraintType::OneOf));
+  if (!one_of)
+    return values;
+
+  values.reserve(one_of->set_.value.size());
+  for (const auto& prop_value : one_of->set_.value) {
+    values.push_back(prop_value->GetValueAsAny().Get<T>());
+  }
+  return values;
+}
+
+}  // anonymous namespace
+
 TEST(CommandSchema, IntPropType_Empty) {
   buffet::IntPropType prop;
   EXPECT_TRUE(prop.GetConstraints().empty());
@@ -192,7 +211,7 @@
   param2.FromJson(CreateDictionaryValue("{}").get(), &prop, nullptr);
   EXPECT_FALSE(param2.HasOverriddenAttributes());
   EXPECT_TRUE(param2.IsBasedOnSchema());
-  EXPECT_EQ(std::vector<bool>{true}, prop.GetOneOfValues());
+  EXPECT_EQ(std::vector<bool>{true}, GetOneOfValues<bool>(&prop));
 
   buffet::BooleanPropType prop_base;
   buffet::BooleanPropType param3;
@@ -814,34 +833,25 @@
   EXPECT_EQ("number", schema.GetProp("param9")->GetTypeAsString());
   EXPECT_EQ("integer", schema.GetProp("param10")->GetTypeAsString());
 
-  EXPECT_EQ(4, schema.GetProp("param1")->GetInt()->GetOneOfValues().size());
-  EXPECT_EQ(3, schema.GetProp("param2")->GetDouble()->GetOneOfValues().size());
-  EXPECT_EQ(2, schema.GetProp("param3")->GetString()->GetOneOfValues().size());
-  EXPECT_EQ(3, schema.GetProp("param4")->GetInt()->GetOneOfValues().size());
-  EXPECT_EQ(3, schema.GetProp("param5")->GetDouble()->GetOneOfValues().size());
-  EXPECT_EQ(2, schema.GetProp("param6")->GetString()->GetOneOfValues().size());
-  EXPECT_EQ(3, schema.GetProp("param7")->GetInt()->GetOneOfValues().size());
-  EXPECT_EQ(3, schema.GetProp("param8")->GetDouble()->GetOneOfValues().size());
-  EXPECT_EQ(0, schema.GetProp("param9")->GetDouble()->GetOneOfValues().size());
-  EXPECT_EQ(0, schema.GetProp("param10")->GetInt()->GetOneOfValues().size());
+  EXPECT_EQ((std::vector<int>{0, 1, 2, 3}),
+            GetOneOfValues<int>(schema.GetProp("param1")));
+  EXPECT_EQ((std::vector<double>{0.0, 1.1, 2.2}),
+            GetOneOfValues<double>(schema.GetProp("param2")));
+  EXPECT_EQ((std::vector<std::string>{"id1", "id2"}),
+            GetOneOfValues<std::string>(schema.GetProp("param3")));
 
-  EXPECT_EQ(std::vector<int>({0, 1, 2, 3}),
-            schema.GetProp("param1")->GetInt()->GetOneOfValues());
-  EXPECT_EQ(std::vector<double>({0.0, 1.1, 2.2}),
-            schema.GetProp("param2")->GetDouble()->GetOneOfValues());
-  EXPECT_EQ(std::vector<std::string>({"id1", "id2"}),
-            schema.GetProp("param3")->GetString()->GetOneOfValues());
-
-  EXPECT_EQ(std::vector<int>({1, 2, 3}),
-            schema.GetProp("param4")->GetInt()->GetOneOfValues());
-  EXPECT_EQ(std::vector<double>({-1.1, 2.2, 3.0}),
-            schema.GetProp("param5")->GetDouble()->GetOneOfValues());
-  EXPECT_EQ(std::vector<std::string>({"id0", "id1"}),
-            schema.GetProp("param6")->GetString()->GetOneOfValues());
-  EXPECT_EQ(std::vector<int>({1, 2, 3}),
-            schema.GetProp("param7")->GetInt()->GetOneOfValues());
-  EXPECT_EQ(std::vector<double>({1.0, 2.0, 3.0}),
-            schema.GetProp("param8")->GetDouble()->GetOneOfValues());
+  EXPECT_EQ((std::vector<int>{1, 2, 3}),
+            GetOneOfValues<int>(schema.GetProp("param4")));
+  EXPECT_EQ((std::vector<double>{-1.1, 2.2, 3.0}),
+            GetOneOfValues<double>(schema.GetProp("param5")));
+  EXPECT_EQ((std::vector<std::string>{"id0", "id1"}),
+            GetOneOfValues<std::string>(schema.GetProp("param6")));
+  EXPECT_EQ((std::vector<int>{1, 2, 3}),
+            GetOneOfValues<int>(schema.GetProp("param7")));
+  EXPECT_EQ((std::vector<double>{1.0, 2.0, 3.0}),
+            GetOneOfValues<double>(schema.GetProp("param8")));
+  EXPECT_TRUE(GetOneOfValues<double>(schema.GetProp("param9")).empty());
+  EXPECT_TRUE(GetOneOfValues<int>(schema.GetProp("param10")).empty());
 }
 
 TEST(CommandSchema, ObjectSchema_FromJson_Inheritance) {
@@ -939,23 +949,23 @@
   EXPECT_EQ(3, schema.GetProp("param12")->GetString()->GetMinLength());
   EXPECT_EQ(8, schema.GetProp("param12")->GetString()->GetMaxLength());
   EXPECT_EQ("integer", schema.GetProp("param13")->GetTypeAsString());
-  EXPECT_EQ(std::vector<int>({1, 2, 3}),
-            schema.GetProp("param13")->GetInt()->GetOneOfValues());
+  EXPECT_EQ((std::vector<int>{1, 2, 3}),
+            GetOneOfValues<int>(schema.GetProp("param13")));
   EXPECT_EQ("integer", schema.GetProp("param14")->GetTypeAsString());
-  EXPECT_EQ(std::vector<int>({1, 2, 3, 4}),
-            schema.GetProp("param14")->GetInt()->GetOneOfValues());
+  EXPECT_EQ((std::vector<int>{1, 2, 3, 4}),
+            GetOneOfValues<int>(schema.GetProp("param14")));
   EXPECT_EQ("number", schema.GetProp("param15")->GetTypeAsString());
-  EXPECT_EQ(std::vector<double>({1.1, 2.2, 3.3}),
-            schema.GetProp("param15")->GetDouble()->GetOneOfValues());
+  EXPECT_EQ((std::vector<double>{1.1, 2.2, 3.3}),
+            GetOneOfValues<double>(schema.GetProp("param15")));
   EXPECT_EQ("number", schema.GetProp("param16")->GetTypeAsString());
-  EXPECT_EQ(std::vector<double>({1.1, 2.2, 3.3, 4.4}),
-            schema.GetProp("param16")->GetDouble()->GetOneOfValues());
+  EXPECT_EQ((std::vector<double>{1.1, 2.2, 3.3, 4.4}),
+            GetOneOfValues<double>(schema.GetProp("param16")));
   EXPECT_EQ("string", schema.GetProp("param17")->GetTypeAsString());
-  EXPECT_EQ(std::vector<std::string>({"id1", "id2"}),
-            schema.GetProp("param17")->GetString()->GetOneOfValues());
+  EXPECT_EQ((std::vector<std::string>{"id1", "id2"}),
+            GetOneOfValues<std::string>(schema.GetProp("param17")));
   EXPECT_EQ("string", schema.GetProp("param18")->GetTypeAsString());
-  EXPECT_EQ(std::vector<std::string>({"id1", "id3"}),
-            schema.GetProp("param18")->GetString()->GetOneOfValues());
+  EXPECT_EQ((std::vector<std::string>{"id1", "id3"}),
+            GetOneOfValues<std::string>(schema.GetProp("param18")));
   EXPECT_EQ("integer", schema.GetProp("param19")->GetTypeAsString());
   EXPECT_EQ(1, schema.GetProp("param19")->GetInt()->GetMinValue());
   EXPECT_EQ(5, schema.GetProp("param19")->GetInt()->GetMaxValue());