blob: 50788108d49827c9758ee678a5a5105bedb6200c [file] [log] [blame]
Tom Cherryd853f772017-10-27 15:18:02 -07001//
2// Copyright (C) 2017 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
16
17#include "trie_builder.h"
18
19#include <gtest/gtest.h>
20
21namespace android {
22namespace properties {
23
24TEST(propertyinfoserializer, BuildTrie_Simple) {
Tom Cherry4094e5e2018-01-11 16:26:10 -080025 auto trie_builder = TrieBuilder("default", "default_type");
Tom Cherryd853f772017-10-27 15:18:02 -070026
27 // Add test data to tree
28 auto error = std::string();
Tom Cherry4094e5e2018-01-11 16:26:10 -080029 EXPECT_TRUE(trie_builder.AddToTrie("test.", "1st", "1st_type", false, &error));
30 EXPECT_TRUE(trie_builder.AddToTrie("test.test", "2nd", "2nd_type", false, &error));
31 EXPECT_TRUE(trie_builder.AddToTrie("test.test1", "3rd", "3rd_type", true, &error));
32 EXPECT_TRUE(trie_builder.AddToTrie("test.test2", "3rd", "3rd_type", true, &error));
33 EXPECT_TRUE(trie_builder.AddToTrie("test.test3", "3rd", "3rd_type", true, &error));
34 EXPECT_TRUE(trie_builder.AddToTrie("this.is.a.long.string", "4th", "4th_type", true, &error));
Tom Cherryd853f772017-10-27 15:18:02 -070035
36 ASSERT_EQ(5U, trie_builder.contexts().size());
Tom Cherry4094e5e2018-01-11 16:26:10 -080037 ASSERT_EQ(5U, trie_builder.types().size());
Tom Cherryd853f772017-10-27 15:18:02 -070038
39 auto& builder_root = trie_builder.builder_root();
40
41 // Check the root node
42 EXPECT_EQ("root", builder_root.name());
43 ASSERT_NE(nullptr, builder_root.context());
44 EXPECT_EQ("default", *builder_root.context());
Tom Cherry4094e5e2018-01-11 16:26:10 -080045 ASSERT_NE(nullptr, builder_root.type());
46 EXPECT_EQ("default_type", *builder_root.type());
Tom Cherryd853f772017-10-27 15:18:02 -070047
48 EXPECT_EQ(0U, builder_root.prefixes().size());
49 EXPECT_EQ(0U, builder_root.exact_matches().size());
50
51 ASSERT_EQ(2U, builder_root.children().size());
52
53 // Check the 'test.' node
54 auto* test_node = builder_root.FindChild("test");
55 EXPECT_EQ("test", test_node->name());
56 ASSERT_NE(nullptr, test_node->context());
57 EXPECT_EQ("1st", *test_node->context());
Tom Cherry4094e5e2018-01-11 16:26:10 -080058 ASSERT_NE(nullptr, test_node->type());
59 EXPECT_EQ("1st_type", *test_node->type());
Tom Cherryd853f772017-10-27 15:18:02 -070060
61 EXPECT_EQ(0U, test_node->children().size());
62 EXPECT_EQ(1U, test_node->prefixes().size());
63 {
64 auto& property_entry = test_node->prefixes()[0];
65 EXPECT_EQ("test", property_entry.name);
66 ASSERT_NE(nullptr, property_entry.context);
67 EXPECT_EQ("2nd", *property_entry.context);
Tom Cherry4094e5e2018-01-11 16:26:10 -080068 ASSERT_NE(nullptr, property_entry.type);
69 EXPECT_EQ("2nd_type", *property_entry.type);
Tom Cherryd853f772017-10-27 15:18:02 -070070 }
71 EXPECT_EQ(3U, test_node->exact_matches().size());
72 EXPECT_EQ("test1", test_node->exact_matches()[0].name);
73 EXPECT_EQ("test2", test_node->exact_matches()[1].name);
74 EXPECT_EQ("test3", test_node->exact_matches()[2].name);
75
76 ASSERT_NE(nullptr, test_node->exact_matches()[0].context);
77 ASSERT_NE(nullptr, test_node->exact_matches()[1].context);
78 ASSERT_NE(nullptr, test_node->exact_matches()[2].context);
79 EXPECT_EQ("3rd", *test_node->exact_matches()[0].context);
80 EXPECT_EQ("3rd", *test_node->exact_matches()[1].context);
81 EXPECT_EQ("3rd", *test_node->exact_matches()[2].context);
82
Tom Cherry4094e5e2018-01-11 16:26:10 -080083 ASSERT_NE(nullptr, test_node->exact_matches()[0].type);
84 ASSERT_NE(nullptr, test_node->exact_matches()[1].type);
85 ASSERT_NE(nullptr, test_node->exact_matches()[2].type);
86 EXPECT_EQ("3rd_type", *test_node->exact_matches()[0].type);
87 EXPECT_EQ("3rd_type", *test_node->exact_matches()[1].type);
88 EXPECT_EQ("3rd_type", *test_node->exact_matches()[2].type);
Tom Cherryd853f772017-10-27 15:18:02 -070089
90 // Check the long string node
91 auto expect_empty_one_child = [](auto* node) {
92 ASSERT_NE(nullptr, node);
93 EXPECT_EQ(nullptr, node->context());
Tom Cherry4094e5e2018-01-11 16:26:10 -080094 EXPECT_EQ(nullptr, node->type());
Tom Cherryd853f772017-10-27 15:18:02 -070095 EXPECT_EQ(0U, node->prefixes().size());
96 EXPECT_EQ(0U, node->exact_matches().size());
97 EXPECT_EQ(1U, node->children().size());
98 };
99
100 // Start with 'this'
101 auto* long_string_node = builder_root.FindChild("this");
102 expect_empty_one_child(long_string_node);
103
104 // Move to 'is'
105 long_string_node = long_string_node->FindChild("is");
106 expect_empty_one_child(long_string_node);
107
108 // Move to 'a'
109 long_string_node = long_string_node->FindChild("a");
110 expect_empty_one_child(long_string_node);
111
112 // Move to 'long'
113 long_string_node = long_string_node->FindChild("long");
114 EXPECT_EQ(0U, long_string_node->prefixes().size());
115 EXPECT_EQ(1U, long_string_node->exact_matches().size());
116 EXPECT_EQ(0U, long_string_node->children().size());
117
118 {
119 auto& property_entry = long_string_node->exact_matches()[0];
120 EXPECT_EQ("string", property_entry.name);
121 ASSERT_NE(nullptr, property_entry.context);
122 EXPECT_EQ("4th", *property_entry.context);
Tom Cherry4094e5e2018-01-11 16:26:10 -0800123 ASSERT_NE(nullptr, property_entry.type);
124 EXPECT_EQ("4th_type", *property_entry.type);
Tom Cherryd853f772017-10-27 15:18:02 -0700125 }
126}
127
128} // namespace properties
129} // namespace android