// // 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 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