• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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