| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| **/ |
| |
| #include "utility/TreeStringSerializable.hpp" |
| |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "glog/logging.h" |
| #include "gtest/gtest.h" |
| |
| namespace quickstep { |
| |
| class TreeStringSerializableTest : public ::testing::Test { |
| protected: |
| class TestTree; |
| typedef std::shared_ptr<const TestTree> TestTreePtr; |
| |
| TreeStringSerializableTest() { |
| GenerateInlineFields(5, "root", &root_inline_field_names_, &root_inline_field_values_); |
| root_inline_field_names_.push_back("short_name_0"); |
| root_inline_field_values_.push_back("short_value_0"); |
| root_inline_field_names_.push_back("short_name_1"); |
| root_inline_field_values_.push_back("short_value_1"); |
| |
| GenerateInlineFields(3, "child", &child_inline_field_names_, &child_inline_field_values_); |
| } |
| |
| class TestTree : public TreeStringSerializable<std::shared_ptr<const TestTree>> { |
| public: |
| std::string getName() const override { |
| return name_; |
| } |
| |
| void getFieldStringItems(std::vector<std::string> *inline_field_names, |
| std::vector<std::string> *inline_field_values, |
| std::vector<std::string> *non_container_child_field_names, |
| std::vector<TestTreePtr> *non_container_child_fields, |
| std::vector<std::string> *container_child_field_names, |
| std::vector<std::vector<TestTreePtr>> *container_child_fields) const override { |
| *inline_field_names = inline_field_names_; |
| *inline_field_values = inline_field_strings_; |
| *non_container_child_field_names = non_container_child_field_names_; |
| *non_container_child_fields = non_container_child_fields_; |
| *container_child_field_names = container_child_field_names_; |
| *container_child_fields = container_child_fields_; |
| } |
| |
| static std::shared_ptr<const TestTree> Create( |
| const std::string &name, const std::vector<std::string> &inline_field_names, |
| const std::vector<std::string> &inline_field_strings, |
| const std::vector<std::string> &non_container_child_field_names, |
| const std::vector<TestTreePtr> &non_container_child_fields, |
| const std::vector<std::string> &container_child_field_names, |
| const std::vector<std::vector<TestTreePtr>> &container_child_fields) { |
| CHECK_EQ(non_container_child_field_names.size(), non_container_child_fields.size()); |
| CHECK_EQ(container_child_field_names.size(), container_child_fields.size()); |
| |
| return std::shared_ptr<const TestTree>( |
| new TestTree(name, inline_field_names, inline_field_strings, non_container_child_field_names, |
| non_container_child_fields, container_child_field_names, container_child_fields)); |
| } |
| |
| private: |
| TestTree(const std::string &name, const std::vector<std::string> &inline_field_names, |
| const std::vector<std::string> &inline_field_strings, |
| const std::vector<std::string> &non_container_child_field_names, |
| const std::vector<TestTreePtr> &non_container_child_fields, |
| const std::vector<std::string> &container_child_field_names, |
| const std::vector<std::vector<TestTreePtr>> &container_child_fields) |
| : name_(name), |
| inline_field_names_(inline_field_names), |
| inline_field_strings_(inline_field_strings), |
| non_container_child_field_names_(non_container_child_field_names), |
| non_container_child_fields_(non_container_child_fields), |
| container_child_field_names_(container_child_field_names), |
| container_child_fields_(container_child_fields) { |
| CHECK_EQ(inline_field_names.size(), inline_field_strings.size()); |
| } |
| |
| const std::string name_; |
| const std::vector<std::string> inline_field_names_; |
| const std::vector<std::string> inline_field_strings_; |
| const std::vector<std::string> non_container_child_field_names_; |
| const std::vector<TestTreePtr> non_container_child_fields_; |
| const std::vector<std::string> container_child_field_names_; |
| const std::vector<std::vector<TestTreePtr>> container_child_fields_; |
| }; |
| |
| // Helper method to generate inline fields. |
| static void GenerateInlineFields(int num_fields, |
| const std::string &prefix, |
| std::vector<std::string> *field_names, |
| std::vector<std::string> *field_values) { |
| field_names->clear(); |
| field_values->clear(); |
| for (int i = 0; i < num_fields; ++i) { |
| field_names->push_back(std::string(prefix).append("_child_field_").append(std::to_string(i))); |
| field_values->push_back(std::string(prefix).append("_child_field_value_").append(std::to_string(i))); |
| } |
| } |
| |
| std::vector<std::string> root_inline_field_names_; |
| std::vector<std::string> root_inline_field_values_; |
| std::vector<std::string> child_inline_field_names_; |
| std::vector<std::string> child_inline_field_values_; |
| }; |
| |
| TEST_F(TreeStringSerializableTest, GetShortStringTest) { |
| const TestTreePtr test_tree_root = TestTree::Create("TestTree" /* name */, |
| root_inline_field_names_ /* inline_field_names */, |
| root_inline_field_values_ /* inline_field_strings */, |
| {} /* non_container_child_field_names */, |
| {} /* non_container_child_fields */, |
| {} /* container_child_field_names */, |
| {} /* container_child_fields */); |
| |
| const std::string expected_string = |
| "TestTree[root_child_field_0=root_child_field_value_0,root_child_field_1=root_child_field_value_1," |
| "root_child_field_2=root_child_field_value_2,root_child_field_3=root_child_field_value_3," |
| "root_child_field_4=root_child_field_value_4,short_name_0=short_value_0,short_name_1=short_value_1]"; |
| EXPECT_EQ(expected_string, test_tree_root->getShortString()); |
| } |
| |
| TEST_F(TreeStringSerializableTest, ToStringWithoutChildrenTest) { |
| const TestTreePtr test_tree_root = TestTree::Create("TestTree" /* name */, |
| root_inline_field_names_ /* inline_field_names */, |
| root_inline_field_values_ /* inline_field_strings */, |
| {} /* non_container_child_field_names */, |
| {} /* non_container_child_fields */, |
| {} /* container_child_field_names */, |
| {} /* container_child_fields */); |
| |
| const std::string expected_string = |
| R"(TestTree[root_child_field_0=root_child_field_value_0, |
| root_child_field_1=root_child_field_value_1, |
| root_child_field_2=root_child_field_value_2, |
| root_child_field_3=root_child_field_value_3, |
| root_child_field_4=root_child_field_value_4,short_name_0=short_value_0, |
| short_name_1=short_value_1] |
| )"; |
| EXPECT_EQ(expected_string, test_tree_root->toString()); |
| } |
| |
| TEST_F(TreeStringSerializableTest, ToStringWithChildrenTest) { |
| const TestTreePtr test_tree_leaf_0 = TestTree::Create("TestTreeLeaf_0" /* name */, |
| {} /* inline_field_names */, |
| {} /* inline_field_strings */, |
| {} /* non_container_child_field_names */, |
| {} /* non_container_child_fields */, |
| {} /* container_child_field_names */, |
| {} /* container_child_fields */); |
| const TestTreePtr test_tree_leaf_1 = TestTree::Create("TestTreeLeaf_1" /* name */, |
| child_inline_field_names_ /* inline_field_names */, |
| child_inline_field_values_ /* inline_field_strings */, |
| {} /* non_container_child_field_names */, |
| {} /* non_container_child_fields */, |
| {} /* container_child_field_names */, |
| {} /* container_child_fields */); |
| |
| const TestTreePtr test_tree_child_0 = TestTree::Create( |
| "TestTreeChild_child0" /* name */, |
| child_inline_field_names_ /* inline_field_names */, |
| child_inline_field_values_ /* inline_field_strings */, |
| {"child_0", "child_1", "child_2"} /* non_container_child_field_names */, |
| {test_tree_leaf_0, test_tree_leaf_0, test_tree_leaf_1} /* non_container_child_fields */, |
| {} /* container_child_field_names */, |
| {} /* container_child_fields */); |
| const TestTreePtr test_tree_child_1 = TestTree::Create( |
| "TestTreeChild_child1" /* name */, |
| {} /* inline_field_names */, |
| {} /* inline_field_strings */, |
| {"child_0", "child_1", "child_2" }, /* non_container_child_field_names */ |
| {test_tree_child_0, |
| test_tree_leaf_0, |
| test_tree_child_0} /* non_container_child_fields */, |
| {} /* container_child_field_names */, {} /* container_child_fields */); |
| |
| const TestTreePtr test_tree_root = |
| TestTree::Create( |
| "TestTree" /* name */, |
| root_inline_field_names_ /* inline_field_names */, |
| root_inline_field_values_ /* inline_field_strings */, |
| { "child_0", "child_1", "child_2", "child_3", "child_4" } /* non_container_child_field_names */, |
| {test_tree_child_0, |
| test_tree_leaf_0, |
| test_tree_leaf_1, |
| test_tree_child_1, |
| test_tree_child_1} /* non_container_child_fields */, |
| {"list_0", "list_1"} /* container_child_field_names */, |
| {{test_tree_child_0, |
| test_tree_leaf_0, |
| test_tree_leaf_1, |
| test_tree_child_1}, |
| {test_tree_leaf_0, |
| test_tree_leaf_1}} /* container_child_fields */); |
| |
| const std::string expected_string = |
| R"(TestTree[root_child_field_0=root_child_field_value_0, |
| root_child_field_1=root_child_field_value_1, |
| root_child_field_2=root_child_field_value_2, |
| root_child_field_3=root_child_field_value_3, |
| root_child_field_4=root_child_field_value_4,short_name_0=short_value_0, |
| short_name_1=short_value_1] |
| +-child_0=TestTreeChild_child0[child_child_field_0=child_child_field_value_0, |
| | child_child_field_1=child_child_field_value_1, |
| | child_child_field_2=child_child_field_value_2] |
| | +-child_0=TestTreeLeaf_0 |
| | +-child_1=TestTreeLeaf_0 |
| | +-child_2=TestTreeLeaf_1[child_child_field_0=child_child_field_value_0, |
| | child_child_field_1=child_child_field_value_1, |
| | child_child_field_2=child_child_field_value_2] |
| +-child_1=TestTreeLeaf_0 |
| +-child_2=TestTreeLeaf_1[child_child_field_0=child_child_field_value_0, |
| | child_child_field_1=child_child_field_value_1, |
| | child_child_field_2=child_child_field_value_2] |
| +-child_3=TestTreeChild_child1 |
| | +-child_0=TestTreeChild_child0[child_child_field_0=child_child_field_value_0, |
| | | child_child_field_1=child_child_field_value_1, |
| | | child_child_field_2=child_child_field_value_2] |
| | | +-child_0=TestTreeLeaf_0 |
| | | +-child_1=TestTreeLeaf_0 |
| | | +-child_2=TestTreeLeaf_1[child_child_field_0=child_child_field_value_0, |
| | | child_child_field_1=child_child_field_value_1, |
| | | child_child_field_2=child_child_field_value_2] |
| | +-child_1=TestTreeLeaf_0 |
| | +-child_2=TestTreeChild_child0[child_child_field_0=child_child_field_value_0, |
| | child_child_field_1=child_child_field_value_1, |
| | child_child_field_2=child_child_field_value_2] |
| | +-child_0=TestTreeLeaf_0 |
| | +-child_1=TestTreeLeaf_0 |
| | +-child_2=TestTreeLeaf_1[child_child_field_0=child_child_field_value_0, |
| | child_child_field_1=child_child_field_value_1, |
| | child_child_field_2=child_child_field_value_2] |
| +-child_4=TestTreeChild_child1 |
| | +-child_0=TestTreeChild_child0[child_child_field_0=child_child_field_value_0, |
| | | child_child_field_1=child_child_field_value_1, |
| | | child_child_field_2=child_child_field_value_2] |
| | | +-child_0=TestTreeLeaf_0 |
| | | +-child_1=TestTreeLeaf_0 |
| | | +-child_2=TestTreeLeaf_1[child_child_field_0=child_child_field_value_0, |
| | | child_child_field_1=child_child_field_value_1, |
| | | child_child_field_2=child_child_field_value_2] |
| | +-child_1=TestTreeLeaf_0 |
| | +-child_2=TestTreeChild_child0[child_child_field_0=child_child_field_value_0, |
| | child_child_field_1=child_child_field_value_1, |
| | child_child_field_2=child_child_field_value_2] |
| | +-child_0=TestTreeLeaf_0 |
| | +-child_1=TestTreeLeaf_0 |
| | +-child_2=TestTreeLeaf_1[child_child_field_0=child_child_field_value_0, |
| | child_child_field_1=child_child_field_value_1, |
| | child_child_field_2=child_child_field_value_2] |
| +-list_0= |
| | +-TestTreeChild_child0[child_child_field_0=child_child_field_value_0, |
| | | child_child_field_1=child_child_field_value_1, |
| | | child_child_field_2=child_child_field_value_2] |
| | | +-child_0=TestTreeLeaf_0 |
| | | +-child_1=TestTreeLeaf_0 |
| | | +-child_2=TestTreeLeaf_1[child_child_field_0=child_child_field_value_0, |
| | | child_child_field_1=child_child_field_value_1, |
| | | child_child_field_2=child_child_field_value_2] |
| | +-TestTreeLeaf_0 |
| | +-TestTreeLeaf_1[child_child_field_0=child_child_field_value_0, |
| | | child_child_field_1=child_child_field_value_1, |
| | | child_child_field_2=child_child_field_value_2] |
| | +-TestTreeChild_child1 |
| | +-child_0=TestTreeChild_child0[ |
| | | child_child_field_0=child_child_field_value_0, |
| | | child_child_field_1=child_child_field_value_1, |
| | | child_child_field_2=child_child_field_value_2] |
| | | +-child_0=TestTreeLeaf_0 |
| | | +-child_1=TestTreeLeaf_0 |
| | | +-child_2=TestTreeLeaf_1[child_child_field_0=child_child_field_value_0, |
| | | child_child_field_1=child_child_field_value_1, |
| | | child_child_field_2=child_child_field_value_2] |
| | +-child_1=TestTreeLeaf_0 |
| | +-child_2=TestTreeChild_child0[ |
| | child_child_field_0=child_child_field_value_0, |
| | child_child_field_1=child_child_field_value_1, |
| | child_child_field_2=child_child_field_value_2] |
| | +-child_0=TestTreeLeaf_0 |
| | +-child_1=TestTreeLeaf_0 |
| | +-child_2=TestTreeLeaf_1[child_child_field_0=child_child_field_value_0, |
| | child_child_field_1=child_child_field_value_1, |
| | child_child_field_2=child_child_field_value_2] |
| +-list_1= |
| +-TestTreeLeaf_0 |
| +-TestTreeLeaf_1[child_child_field_0=child_child_field_value_0, |
| child_child_field_1=child_child_field_value_1, |
| child_child_field_2=child_child_field_value_2] |
| )"; |
| EXPECT_EQ(expected_string, test_tree_root->toString()); |
| } |
| |
| TEST_F(TreeStringSerializableTest, ToStringChildNodesWithEmptyNamesTest) { |
| const TestTreePtr test_tree_leaf_0 = TestTree::Create("TestTreeLeaf_0" /* name */, |
| {} /* inline_field_names */, |
| {} /* inline_field_strings */, |
| {} /* non_container_child_field_names */, |
| {} /* non_container_child_fields */, |
| {} /* container_child_field_names */, |
| {} /* container_child_fields */); |
| const TestTreePtr test_tree_leaf_1 = TestTree::Create("TestTreeLeaf_1" /* name */, |
| child_inline_field_names_ /* inline_field_names */, |
| child_inline_field_values_ /* inline_field_strings */, |
| {} /* non_container_child_field_names */, |
| {} /* non_container_child_fields */, |
| {} /* container_child_field_names */, |
| {} /* container_child_fields */); |
| const TestTreePtr test_tree_root = TestTree::Create( |
| "TestTree" /* name */, |
| root_inline_field_names_ /* inline_field_names */, |
| root_inline_field_values_ /* inline_field_strings */, |
| {"", "", "", "child_3", "child_4"} /* non_container_child_field_names */, |
| {test_tree_leaf_0, test_tree_leaf_0, test_tree_leaf_1, test_tree_leaf_0, |
| test_tree_leaf_1} /* non_container_child_fields */, |
| {"list_0", "", "", "list_3"} /* container_child_field_names */, |
| {{test_tree_leaf_0, test_tree_leaf_0}, {test_tree_leaf_0, test_tree_leaf_1}, |
| {test_tree_leaf_1, test_tree_leaf_0}, {test_tree_leaf_1, test_tree_leaf_1} } /* container_child_fields */); |
| const std::string expected_string = |
| R"(TestTree[root_child_field_0=root_child_field_value_0, |
| root_child_field_1=root_child_field_value_1, |
| root_child_field_2=root_child_field_value_2, |
| root_child_field_3=root_child_field_value_3, |
| root_child_field_4=root_child_field_value_4,short_name_0=short_value_0, |
| short_name_1=short_value_1] |
| +-TestTreeLeaf_0 |
| +-TestTreeLeaf_0 |
| +-TestTreeLeaf_1[child_child_field_0=child_child_field_value_0, |
| | child_child_field_1=child_child_field_value_1, |
| | child_child_field_2=child_child_field_value_2] |
| +-child_3=TestTreeLeaf_0 |
| +-child_4=TestTreeLeaf_1[child_child_field_0=child_child_field_value_0, |
| | child_child_field_1=child_child_field_value_1, |
| | child_child_field_2=child_child_field_value_2] |
| +-list_0= |
| | +-TestTreeLeaf_0 |
| | +-TestTreeLeaf_0 |
| +-TestTreeLeaf_0 |
| +-TestTreeLeaf_1[child_child_field_0=child_child_field_value_0, |
| | child_child_field_1=child_child_field_value_1, |
| | child_child_field_2=child_child_field_value_2] |
| +-TestTreeLeaf_1[child_child_field_0=child_child_field_value_0, |
| | child_child_field_1=child_child_field_value_1, |
| | child_child_field_2=child_child_field_value_2] |
| +-TestTreeLeaf_0 |
| +-list_3= |
| +-TestTreeLeaf_1[child_child_field_0=child_child_field_value_0, |
| | child_child_field_1=child_child_field_value_1, |
| | child_child_field_2=child_child_field_value_2] |
| +-TestTreeLeaf_1[child_child_field_0=child_child_field_value_0, |
| child_child_field_1=child_child_field_value_1, |
| child_child_field_2=child_child_field_value_2] |
| )"; |
| EXPECT_EQ(expected_string, test_tree_root->toString()); |
| } |
| |
| } // namespace quickstep |