| // Copyright 2012 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "tools/json_schema_compiler/test/arrays.h" |
| |
| #include <stddef.h> |
| |
| #include <iterator> |
| #include <memory> |
| #include <utility> |
| |
| #include "base/values.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "tools/json_schema_compiler/test/enums.h" |
| |
| namespace arrays = test::api::arrays; |
| |
| namespace { |
| |
| static base::Value::Dict CreateBasicArrayTypeDictionary() { |
| base::Value::Dict value; |
| base::Value::List strings_value; |
| strings_value.Append("a"); |
| strings_value.Append("b"); |
| strings_value.Append("c"); |
| strings_value.Append("it's easy as"); |
| base::Value::List integers_value; |
| integers_value.Append(1); |
| integers_value.Append(2); |
| integers_value.Append(3); |
| base::Value::List booleans_value; |
| booleans_value.Append(false); |
| booleans_value.Append(true); |
| base::Value::List numbers_value; |
| numbers_value.Append(6.1); |
| value.Set("numbers", std::move(numbers_value)); |
| value.Set("booleans", std::move(booleans_value)); |
| value.Set("strings", std::move(strings_value)); |
| value.Set("integers", std::move(integers_value)); |
| return value; |
| } |
| |
| base::Value CreateItemValue(int val) { |
| base::Value::Dict value; |
| value.Set("val", val); |
| return base::Value(std::move(value)); |
| } |
| |
| } // namespace |
| |
| TEST(JsonSchemaCompilerArrayTest, BasicArrayType) { |
| { |
| base::Value::Dict value(CreateBasicArrayTypeDictionary()); |
| arrays::BasicArrayType basic_array_type; |
| ASSERT_TRUE(arrays::BasicArrayType::Populate(value, basic_array_type)); |
| EXPECT_EQ(value, basic_array_type.ToValue()); |
| |
| EXPECT_EQ(basic_array_type.Clone().ToValue(), basic_array_type.ToValue()); |
| } |
| } |
| |
| TEST(JsonSchemaCompilerArrayTest, EnumArrayReference) { |
| // { "types": ["one", "two", "three"] } |
| base::Value::List types; |
| types.Append("one"); |
| types.Append("two"); |
| types.Append("three"); |
| base::Value::Dict value; |
| value.Set("types", std::move(types)); |
| |
| arrays::EnumArrayReference enum_array_reference; |
| |
| // Test Populate. |
| ASSERT_TRUE( |
| arrays::EnumArrayReference::Populate(value, enum_array_reference)); |
| |
| arrays::Enumeration expected_types[] = {arrays::ENUMERATION_ONE, |
| arrays::ENUMERATION_TWO, |
| arrays::ENUMERATION_THREE}; |
| EXPECT_EQ(std::vector<arrays::Enumeration>( |
| expected_types, expected_types + std::size(expected_types)), |
| enum_array_reference.types); |
| |
| // Test ToValue. |
| base::Value::Dict as_value(enum_array_reference.ToValue()); |
| EXPECT_EQ(value, as_value); |
| |
| EXPECT_EQ(enum_array_reference.Clone().ToValue(), |
| enum_array_reference.ToValue()); |
| } |
| |
| TEST(JsonSchemaCompilerArrayTest, EnumArrayMixed) { |
| // { "types": ["one", "two", "three"] } |
| base::Value::List infile_enums; |
| infile_enums.Append("one"); |
| infile_enums.Append("two"); |
| infile_enums.Append("three"); |
| |
| base::Value::List external_enums; |
| external_enums.Append("one"); |
| external_enums.Append("two"); |
| external_enums.Append("three"); |
| |
| base::Value::Dict value; |
| value.Set("infile_enums", std::move(infile_enums)); |
| value.Set("external_enums", std::move(external_enums)); |
| |
| arrays::EnumArrayMixed enum_array_mixed; |
| |
| // Test Populate. |
| ASSERT_TRUE(arrays::EnumArrayMixed::Populate(value, enum_array_mixed)); |
| |
| arrays::Enumeration expected_infile_types[] = {arrays::ENUMERATION_ONE, |
| arrays::ENUMERATION_TWO, |
| arrays::ENUMERATION_THREE}; |
| EXPECT_EQ(std::vector<arrays::Enumeration>( |
| expected_infile_types, |
| expected_infile_types + std::size(expected_infile_types)), |
| enum_array_mixed.infile_enums); |
| |
| test::api::enums::Enumeration expected_external_types[] = { |
| test::api::enums::Enumeration::kOne, test::api::enums::Enumeration::kTwo, |
| test::api::enums::Enumeration::kThree}; |
| EXPECT_EQ(std::vector<test::api::enums::Enumeration>( |
| expected_external_types, |
| expected_external_types + std::size(expected_external_types)), |
| enum_array_mixed.external_enums); |
| |
| // Test ToValue. |
| base::Value::Dict as_value(enum_array_mixed.ToValue()); |
| EXPECT_EQ(value, as_value); |
| |
| EXPECT_EQ(enum_array_mixed.Clone().ToValue(), enum_array_mixed.ToValue()); |
| } |
| |
| TEST(JsonSchemaCompilerArrayTest, OptionalEnumArrayType) { |
| { |
| std::vector<arrays::Enumeration> enums; |
| enums.push_back(arrays::ENUMERATION_ONE); |
| enums.push_back(arrays::ENUMERATION_TWO); |
| enums.push_back(arrays::ENUMERATION_THREE); |
| |
| base::Value::List types; |
| for (auto& enum_entry : enums) |
| types.Append(ToString(enum_entry)); |
| |
| base::Value::Dict value; |
| value.Set("types", std::move(types)); |
| |
| arrays::OptionalEnumArrayType enum_array_type; |
| ASSERT_TRUE( |
| arrays::OptionalEnumArrayType::Populate(value, enum_array_type)); |
| EXPECT_EQ(enums, *enum_array_type.types); |
| |
| EXPECT_EQ(enum_array_type.Clone().ToValue(), enum_array_type.ToValue()); |
| } |
| { |
| base::Value::Dict value; |
| base::Value::List enum_array; |
| enum_array.Append("invalid"); |
| |
| value.Set("types", std::move(enum_array)); |
| arrays::OptionalEnumArrayType enum_array_type; |
| ASSERT_FALSE( |
| arrays::OptionalEnumArrayType::Populate(value, enum_array_type)); |
| EXPECT_TRUE(enum_array_type.types->empty()); |
| } |
| } |
| |
| TEST(JsonSchemaCompilerArrayTest, RefArrayType) { |
| { |
| base::Value::Dict value; |
| base::Value::List ref_array; |
| ref_array.Append(CreateItemValue(1)); |
| ref_array.Append(CreateItemValue(2)); |
| ref_array.Append(CreateItemValue(3)); |
| value.Set("refs", std::move(ref_array)); |
| arrays::RefArrayType ref_array_type; |
| EXPECT_TRUE(arrays::RefArrayType::Populate(value, ref_array_type)); |
| ASSERT_EQ(3u, ref_array_type.refs.size()); |
| EXPECT_EQ(1, ref_array_type.refs[0].val); |
| EXPECT_EQ(2, ref_array_type.refs[1].val); |
| EXPECT_EQ(3, ref_array_type.refs[2].val); |
| |
| EXPECT_EQ(ref_array_type.Clone().ToValue(), ref_array_type.ToValue()); |
| } |
| { |
| base::Value::Dict value; |
| base::Value::List not_ref_array; |
| not_ref_array.Append(CreateItemValue(1)); |
| not_ref_array.Append(3); |
| value.Set("refs", std::move(not_ref_array)); |
| arrays::RefArrayType ref_array_type; |
| EXPECT_FALSE(arrays::RefArrayType::Populate(value, ref_array_type)); |
| } |
| } |
| |
| TEST(JsonSchemaCompilerArrayTest, IntegerArrayParamsCreate) { |
| base::Value::List params_value; |
| base::Value::List integer_array; |
| integer_array.Append(2); |
| integer_array.Append(4); |
| integer_array.Append(8); |
| params_value.Append(std::move(integer_array)); |
| absl::optional<arrays::IntegerArray::Params> params( |
| arrays::IntegerArray::Params::Create(params_value)); |
| EXPECT_TRUE(params.has_value()); |
| ASSERT_EQ(3u, params->nums.size()); |
| EXPECT_EQ(2, params->nums[0]); |
| EXPECT_EQ(4, params->nums[1]); |
| EXPECT_EQ(8, params->nums[2]); |
| } |
| |
| TEST(JsonSchemaCompilerArrayTest, AnyArrayParamsCreate) { |
| base::Value::List params_value; |
| base::Value::List any_array; |
| any_array.Append(1); |
| any_array.Append("test"); |
| any_array.Append(CreateItemValue(2)); |
| params_value.Append(std::move(any_array)); |
| absl::optional<arrays::AnyArray::Params> params( |
| arrays::AnyArray::Params::Create(params_value)); |
| EXPECT_TRUE(params.has_value()); |
| ASSERT_EQ(3u, params->anys.size()); |
| ASSERT_TRUE(params->anys[0].is_int()); |
| EXPECT_EQ(1, params->anys[0].GetInt()); |
| } |
| |
| TEST(JsonSchemaCompilerArrayTest, ObjectArrayParamsCreate) { |
| base::Value::List params_value; |
| base::Value::List item_array; |
| item_array.Append(CreateItemValue(1)); |
| item_array.Append(CreateItemValue(2)); |
| params_value.Append(std::move(item_array)); |
| absl::optional<arrays::ObjectArray::Params> params( |
| arrays::ObjectArray::Params::Create(params_value)); |
| EXPECT_TRUE(params.has_value()); |
| ASSERT_EQ(2u, params->objects.size()); |
| EXPECT_EQ(1, params->objects[0].additional_properties["val"]); |
| EXPECT_EQ(2, params->objects[1].additional_properties["val"]); |
| } |
| |
| TEST(JsonSchemaCompilerArrayTest, RefArrayParamsCreate) { |
| base::Value::List params_value; |
| base::Value::List item_array; |
| item_array.Append(CreateItemValue(1)); |
| item_array.Append(CreateItemValue(2)); |
| params_value.Append(std::move(item_array)); |
| absl::optional<arrays::RefArray::Params> params( |
| arrays::RefArray::Params::Create(params_value)); |
| EXPECT_TRUE(params.has_value()); |
| ASSERT_EQ(2u, params->refs.size()); |
| EXPECT_EQ(1, params->refs[0].val); |
| EXPECT_EQ(2, params->refs[1].val); |
| } |
| |
| TEST(JsonSchemaCompilerArrayTest, ReturnIntegerArrayResultCreate) { |
| std::vector<int> integers; |
| integers.push_back(1); |
| integers.push_back(2); |
| base::Value results(arrays::ReturnIntegerArray::Results::Create(integers)); |
| |
| base::Value::List expected; |
| base::Value::List expected_argument; |
| expected_argument.Append(1); |
| expected_argument.Append(2); |
| expected.Append(std::move(expected_argument)); |
| EXPECT_EQ(expected, results); |
| } |
| |
| TEST(JsonSchemaCompilerArrayTest, ReturnRefArrayResultCreate) { |
| std::vector<arrays::Item> items; |
| items.push_back(arrays::Item()); |
| items.push_back(arrays::Item()); |
| items[0].val = 1; |
| items[1].val = 2; |
| base::Value results(arrays::ReturnRefArray::Results::Create(items)); |
| |
| base::Value::List expected; |
| base::Value::List expected_argument; |
| base::Value::Dict first; |
| first.Set("val", 1); |
| expected_argument.Append(std::move(first)); |
| base::Value::Dict second; |
| second.Set("val", 2); |
| expected_argument.Append(std::move(second)); |
| expected.Append(std::move(expected_argument)); |
| EXPECT_EQ(expected, results); |
| } |