1 /*
2 * Copyright (C) 2015 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 "util/Util.h"
18
19 #include <string>
20
21 #include "test/Test.h"
22
23 using android::StringPiece;
24
25 namespace aapt {
26
TEST(UtilTest,TrimOnlyWhitespace)27 TEST(UtilTest, TrimOnlyWhitespace) {
28 const std::string full = "\n ";
29
30 StringPiece trimmed = util::TrimWhitespace(full);
31 EXPECT_TRUE(trimmed.empty());
32 EXPECT_EQ(0u, trimmed.size());
33 }
34
TEST(UtilTest,StringEndsWith)35 TEST(UtilTest, StringEndsWith) {
36 EXPECT_TRUE(util::EndsWith("hello.xml", ".xml"));
37 }
38
TEST(UtilTest,StringStartsWith)39 TEST(UtilTest, StringStartsWith) {
40 EXPECT_TRUE(util::StartsWith("hello.xml", "he"));
41 }
42
TEST(UtilTest,StringBuilderSplitEscapeSequence)43 TEST(UtilTest, StringBuilderSplitEscapeSequence) {
44 EXPECT_EQ(StringPiece("this is a new\nline."), util::StringBuilder()
45 .Append("this is a new\\")
46 .Append("nline.")
47 .ToString());
48 }
49
TEST(UtilTest,StringBuilderWhitespaceRemoval)50 TEST(UtilTest, StringBuilderWhitespaceRemoval) {
51 EXPECT_EQ(StringPiece("hey guys this is so cool"),
52 util::StringBuilder()
53 .Append(" hey guys ")
54 .Append(" this is so cool ")
55 .ToString());
56
57 EXPECT_EQ(StringPiece(" wow, so many \t spaces. what?"),
58 util::StringBuilder()
59 .Append(" \" wow, so many \t ")
60 .Append("spaces. \"what? ")
61 .ToString());
62
63 EXPECT_EQ(StringPiece("where is the pie?"), util::StringBuilder()
64 .Append(" where \t ")
65 .Append(" \nis the "
66 " pie?")
67 .ToString());
68 }
69
TEST(UtilTest,StringBuilderEscaping)70 TEST(UtilTest, StringBuilderEscaping) {
71 EXPECT_EQ(StringPiece("hey guys\n this \t is so\\ cool"),
72 util::StringBuilder()
73 .Append(" hey guys\\n ")
74 .Append(" this \\t is so\\\\ cool ")
75 .ToString());
76
77 EXPECT_EQ(StringPiece("@?#\\\'"),
78 util::StringBuilder().Append("\\@\\?\\#\\\\\\'").ToString());
79 }
80
TEST(UtilTest,StringBuilderMisplacedQuote)81 TEST(UtilTest, StringBuilderMisplacedQuote) {
82 util::StringBuilder builder{};
83 EXPECT_FALSE(builder.Append("they're coming!"));
84 }
85
TEST(UtilTest,StringBuilderUnicodeCodes)86 TEST(UtilTest, StringBuilderUnicodeCodes) {
87 EXPECT_EQ(std::string("\u00AF\u0AF0 woah"),
88 util::StringBuilder().Append("\\u00AF\\u0AF0 woah").ToString());
89
90 EXPECT_FALSE(util::StringBuilder().Append("\\u00 yo"));
91 }
92
TEST(UtilTest,TokenizeInput)93 TEST(UtilTest, TokenizeInput) {
94 auto tokenizer = util::Tokenize(StringPiece("this| is|the|end"), '|');
95 auto iter = tokenizer.begin();
96 ASSERT_EQ(*iter, StringPiece("this"));
97 ++iter;
98 ASSERT_EQ(*iter, StringPiece(" is"));
99 ++iter;
100 ASSERT_EQ(*iter, StringPiece("the"));
101 ++iter;
102 ASSERT_EQ(*iter, StringPiece("end"));
103 ++iter;
104 ASSERT_EQ(tokenizer.end(), iter);
105 }
106
TEST(UtilTest,TokenizeEmptyString)107 TEST(UtilTest, TokenizeEmptyString) {
108 auto tokenizer = util::Tokenize(StringPiece(""), '|');
109 auto iter = tokenizer.begin();
110 ASSERT_NE(tokenizer.end(), iter);
111 ASSERT_EQ(StringPiece(), *iter);
112 ++iter;
113 ASSERT_EQ(tokenizer.end(), iter);
114 }
115
TEST(UtilTest,TokenizeAtEnd)116 TEST(UtilTest, TokenizeAtEnd) {
117 auto tokenizer = util::Tokenize(StringPiece("one."), '.');
118 auto iter = tokenizer.begin();
119 ASSERT_EQ(*iter, StringPiece("one"));
120 ++iter;
121 ASSERT_NE(iter, tokenizer.end());
122 ASSERT_EQ(*iter, StringPiece());
123 }
124
TEST(UtilTest,IsJavaClassName)125 TEST(UtilTest, IsJavaClassName) {
126 EXPECT_TRUE(util::IsJavaClassName("android.test.Class"));
127 EXPECT_TRUE(util::IsJavaClassName("android.test.Class$Inner"));
128 EXPECT_TRUE(util::IsJavaClassName("android_test.test.Class"));
129 EXPECT_TRUE(util::IsJavaClassName("_android_.test._Class_"));
130 EXPECT_FALSE(util::IsJavaClassName("android.test.$Inner"));
131 EXPECT_FALSE(util::IsJavaClassName("android.test.Inner$"));
132 EXPECT_FALSE(util::IsJavaClassName(".test.Class"));
133 EXPECT_FALSE(util::IsJavaClassName("android"));
134 }
135
TEST(UtilTest,IsJavaPackageName)136 TEST(UtilTest, IsJavaPackageName) {
137 EXPECT_TRUE(util::IsJavaPackageName("android"));
138 EXPECT_TRUE(util::IsJavaPackageName("android.test"));
139 EXPECT_TRUE(util::IsJavaPackageName("android.test_thing"));
140 EXPECT_FALSE(util::IsJavaPackageName("_android"));
141 EXPECT_FALSE(util::IsJavaPackageName("android_"));
142 EXPECT_FALSE(util::IsJavaPackageName("android."));
143 EXPECT_FALSE(util::IsJavaPackageName(".android"));
144 EXPECT_FALSE(util::IsJavaPackageName("android._test"));
145 EXPECT_FALSE(util::IsJavaPackageName(".."));
146 }
147
TEST(UtilTest,FullyQualifiedClassName)148 TEST(UtilTest, FullyQualifiedClassName) {
149 Maybe<std::string> res = util::GetFullyQualifiedClassName("android", ".asdf");
150 AAPT_ASSERT_TRUE(res);
151 EXPECT_EQ(res.value(), "android.asdf");
152
153 res = util::GetFullyQualifiedClassName("android", ".a.b");
154 AAPT_ASSERT_TRUE(res);
155 EXPECT_EQ(res.value(), "android.a.b");
156
157 res = util::GetFullyQualifiedClassName("android", "a.b");
158 AAPT_ASSERT_TRUE(res);
159 EXPECT_EQ(res.value(), "a.b");
160
161 res = util::GetFullyQualifiedClassName("", "a.b");
162 AAPT_ASSERT_TRUE(res);
163 EXPECT_EQ(res.value(), "a.b");
164
165 res = util::GetFullyQualifiedClassName("android", "Class");
166 AAPT_ASSERT_TRUE(res);
167 EXPECT_EQ(res.value(), "android.Class");
168
169 res = util::GetFullyQualifiedClassName("", "");
170 AAPT_ASSERT_FALSE(res);
171
172 res = util::GetFullyQualifiedClassName("android", "./Apple");
173 AAPT_ASSERT_FALSE(res);
174 }
175
TEST(UtilTest,ExtractResourcePathComponents)176 TEST(UtilTest, ExtractResourcePathComponents) {
177 StringPiece prefix, entry, suffix;
178 ASSERT_TRUE(util::ExtractResFilePathParts("res/xml-sw600dp/entry.xml",
179 &prefix, &entry, &suffix));
180 EXPECT_EQ(prefix, "res/xml-sw600dp/");
181 EXPECT_EQ(entry, "entry");
182 EXPECT_EQ(suffix, ".xml");
183
184 ASSERT_TRUE(util::ExtractResFilePathParts("res/xml-sw600dp/entry.9.png",
185 &prefix, &entry, &suffix));
186
187 EXPECT_EQ(prefix, "res/xml-sw600dp/");
188 EXPECT_EQ(entry, "entry");
189 EXPECT_EQ(suffix, ".9.png");
190
191 EXPECT_FALSE(util::ExtractResFilePathParts("AndroidManifest.xml", &prefix,
192 &entry, &suffix));
193 EXPECT_FALSE(
194 util::ExtractResFilePathParts("res/.xml", &prefix, &entry, &suffix));
195
196 ASSERT_TRUE(
197 util::ExtractResFilePathParts("res//.", &prefix, &entry, &suffix));
198 EXPECT_EQ(prefix, "res//");
199 EXPECT_EQ(entry, "");
200 EXPECT_EQ(suffix, ".");
201 }
202
TEST(UtilTest,VerifyJavaStringFormat)203 TEST(UtilTest, VerifyJavaStringFormat) {
204 ASSERT_TRUE(util::VerifyJavaStringFormat("%09.34f"));
205 ASSERT_TRUE(util::VerifyJavaStringFormat("%9$.34f %8$"));
206 ASSERT_TRUE(util::VerifyJavaStringFormat("%% %%"));
207 ASSERT_FALSE(util::VerifyJavaStringFormat("%09$f %f"));
208 ASSERT_FALSE(util::VerifyJavaStringFormat("%09f %08s"));
209 }
210
211 } // namespace aapt
212