blob: 50788108d49827c9758ee678a5a5105bedb6200c [file] [log] [blame]
//
// Copyright (C) 2017 The Android Open Source Project
//
// Licensed 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 "trie_builder.h"
#include <gtest/gtest.h>
namespace android {
namespace properties {
TEST(propertyinfoserializer, BuildTrie_Simple) {
auto trie_builder = TrieBuilder("default", "default_type");
// Add test data to tree
auto error = std::string();
EXPECT_TRUE(trie_builder.AddToTrie("test.", "1st", "1st_type", false, &error));
EXPECT_TRUE(trie_builder.AddToTrie("test.test", "2nd", "2nd_type", false, &error));
EXPECT_TRUE(trie_builder.AddToTrie("test.test1", "3rd", "3rd_type", true, &error));
EXPECT_TRUE(trie_builder.AddToTrie("test.test2", "3rd", "3rd_type", true, &error));
EXPECT_TRUE(trie_builder.AddToTrie("test.test3", "3rd", "3rd_type", true, &error));
EXPECT_TRUE(trie_builder.AddToTrie("this.is.a.long.string", "4th", "4th_type", true, &error));
ASSERT_EQ(5U, trie_builder.contexts().size());
ASSERT_EQ(5U, trie_builder.types().size());
auto& builder_root = trie_builder.builder_root();
// Check the root node
EXPECT_EQ("root", builder_root.name());
ASSERT_NE(nullptr, builder_root.context());
EXPECT_EQ("default", *builder_root.context());
ASSERT_NE(nullptr, builder_root.type());
EXPECT_EQ("default_type", *builder_root.type());
EXPECT_EQ(0U, builder_root.prefixes().size());
EXPECT_EQ(0U, builder_root.exact_matches().size());
ASSERT_EQ(2U, builder_root.children().size());
// Check the 'test.' node
auto* test_node = builder_root.FindChild("test");
EXPECT_EQ("test", test_node->name());
ASSERT_NE(nullptr, test_node->context());
EXPECT_EQ("1st", *test_node->context());
ASSERT_NE(nullptr, test_node->type());
EXPECT_EQ("1st_type", *test_node->type());
EXPECT_EQ(0U, test_node->children().size());
EXPECT_EQ(1U, test_node->prefixes().size());
{
auto& property_entry = test_node->prefixes()[0];
EXPECT_EQ("test", property_entry.name);
ASSERT_NE(nullptr, property_entry.context);
EXPECT_EQ("2nd", *property_entry.context);
ASSERT_NE(nullptr, property_entry.type);
EXPECT_EQ("2nd_type", *property_entry.type);
}
EXPECT_EQ(3U, test_node->exact_matches().size());
EXPECT_EQ("test1", test_node->exact_matches()[0].name);
EXPECT_EQ("test2", test_node->exact_matches()[1].name);
EXPECT_EQ("test3", test_node->exact_matches()[2].name);
ASSERT_NE(nullptr, test_node->exact_matches()[0].context);
ASSERT_NE(nullptr, test_node->exact_matches()[1].context);
ASSERT_NE(nullptr, test_node->exact_matches()[2].context);
EXPECT_EQ("3rd", *test_node->exact_matches()[0].context);
EXPECT_EQ("3rd", *test_node->exact_matches()[1].context);
EXPECT_EQ("3rd", *test_node->exact_matches()[2].context);
ASSERT_NE(nullptr, test_node->exact_matches()[0].type);
ASSERT_NE(nullptr, test_node->exact_matches()[1].type);
ASSERT_NE(nullptr, test_node->exact_matches()[2].type);
EXPECT_EQ("3rd_type", *test_node->exact_matches()[0].type);
EXPECT_EQ("3rd_type", *test_node->exact_matches()[1].type);
EXPECT_EQ("3rd_type", *test_node->exact_matches()[2].type);
// Check the long string node
auto expect_empty_one_child = [](auto* node) {
ASSERT_NE(nullptr, node);
EXPECT_EQ(nullptr, node->context());
EXPECT_EQ(nullptr, node->type());
EXPECT_EQ(0U, node->prefixes().size());
EXPECT_EQ(0U, node->exact_matches().size());
EXPECT_EQ(1U, node->children().size());
};
// Start with 'this'
auto* long_string_node = builder_root.FindChild("this");
expect_empty_one_child(long_string_node);
// Move to 'is'
long_string_node = long_string_node->FindChild("is");
expect_empty_one_child(long_string_node);
// Move to 'a'
long_string_node = long_string_node->FindChild("a");
expect_empty_one_child(long_string_node);
// Move to 'long'
long_string_node = long_string_node->FindChild("long");
EXPECT_EQ(0U, long_string_node->prefixes().size());
EXPECT_EQ(1U, long_string_node->exact_matches().size());
EXPECT_EQ(0U, long_string_node->children().size());
{
auto& property_entry = long_string_node->exact_matches()[0];
EXPECT_EQ("string", property_entry.name);
ASSERT_NE(nullptr, property_entry.context);
EXPECT_EQ("4th", *property_entry.context);
ASSERT_NE(nullptr, property_entry.type);
EXPECT_EQ("4th_type", *property_entry.type);
}
}
} // namespace properties
} // namespace android