blob: 40108af6b5633801b95c5823d8f4cc0548f0656a [file] [log] [blame]
/**
* 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