blob: cac3de4696ab9947d22d1eaaec2e501b62e864f8 [file] [log] [blame]
Adam Lesinski1ab598f2015-08-14 14:26:04 -07001/*
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
Adam Lesinski1ab598f2015-08-14 14:26:04 -070017#include "util/Util.h"
18
Adam Lesinski1ab598f2015-08-14 14:26:04 -070019#include <string>
20
Adam Lesinskice5e56e2016-10-21 17:56:45 -070021#include "test/Test.h"
22
Adam Lesinski1ab598f2015-08-14 14:26:04 -070023namespace aapt {
24
25TEST(UtilTest, TrimOnlyWhitespace) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070026 const std::string full = "\n ";
Adam Lesinski1ab598f2015-08-14 14:26:04 -070027
Adam Lesinskice5e56e2016-10-21 17:56:45 -070028 StringPiece trimmed = util::TrimWhitespace(full);
29 EXPECT_TRUE(trimmed.empty());
30 EXPECT_EQ(0u, trimmed.size());
Adam Lesinski1ab598f2015-08-14 14:26:04 -070031}
32
33TEST(UtilTest, StringEndsWith) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070034 EXPECT_TRUE(util::EndsWith("hello.xml", ".xml"));
Adam Lesinski1ab598f2015-08-14 14:26:04 -070035}
36
37TEST(UtilTest, StringStartsWith) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070038 EXPECT_TRUE(util::StartsWith("hello.xml", "he"));
Adam Lesinski1ab598f2015-08-14 14:26:04 -070039}
40
41TEST(UtilTest, StringBuilderSplitEscapeSequence) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070042 EXPECT_EQ(StringPiece("this is a new\nline."), util::StringBuilder()
43 .Append("this is a new\\")
44 .Append("nline.")
45 .ToString());
Adam Lesinski1ab598f2015-08-14 14:26:04 -070046}
47
48TEST(UtilTest, StringBuilderWhitespaceRemoval) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070049 EXPECT_EQ(StringPiece("hey guys this is so cool"),
50 util::StringBuilder()
51 .Append(" hey guys ")
52 .Append(" this is so cool ")
53 .ToString());
Adam Lesinski1ab598f2015-08-14 14:26:04 -070054
Adam Lesinskice5e56e2016-10-21 17:56:45 -070055 EXPECT_EQ(StringPiece(" wow, so many \t spaces. what?"),
56 util::StringBuilder()
57 .Append(" \" wow, so many \t ")
58 .Append("spaces. \"what? ")
59 .ToString());
Adam Lesinski1ab598f2015-08-14 14:26:04 -070060
Adam Lesinskice5e56e2016-10-21 17:56:45 -070061 EXPECT_EQ(StringPiece("where is the pie?"), util::StringBuilder()
62 .Append(" where \t ")
63 .Append(" \nis the "
64 " pie?")
65 .ToString());
Adam Lesinski1ab598f2015-08-14 14:26:04 -070066}
67
68TEST(UtilTest, StringBuilderEscaping) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070069 EXPECT_EQ(StringPiece("hey guys\n this \t is so\\ cool"),
70 util::StringBuilder()
71 .Append(" hey guys\\n ")
72 .Append(" this \\t is so\\\\ cool ")
73 .ToString());
Adam Lesinski1ab598f2015-08-14 14:26:04 -070074
Adam Lesinskice5e56e2016-10-21 17:56:45 -070075 EXPECT_EQ(StringPiece("@?#\\\'"),
76 util::StringBuilder().Append("\\@\\?\\#\\\\\\'").ToString());
Adam Lesinski1ab598f2015-08-14 14:26:04 -070077}
78
79TEST(UtilTest, StringBuilderMisplacedQuote) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070080 util::StringBuilder builder{};
81 EXPECT_FALSE(builder.Append("they're coming!"));
Adam Lesinski1ab598f2015-08-14 14:26:04 -070082}
83
84TEST(UtilTest, StringBuilderUnicodeCodes) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070085 EXPECT_EQ(std::string("\u00AF\u0AF0 woah"),
86 util::StringBuilder().Append("\\u00AF\\u0AF0 woah").ToString());
Adam Lesinski1ab598f2015-08-14 14:26:04 -070087
Adam Lesinskice5e56e2016-10-21 17:56:45 -070088 EXPECT_FALSE(util::StringBuilder().Append("\\u00 yo"));
Adam Lesinski1ab598f2015-08-14 14:26:04 -070089}
90
91TEST(UtilTest, TokenizeInput) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070092 auto tokenizer = util::Tokenize(StringPiece("this| is|the|end"), '|');
93 auto iter = tokenizer.begin();
94 ASSERT_EQ(*iter, StringPiece("this"));
95 ++iter;
96 ASSERT_EQ(*iter, StringPiece(" is"));
97 ++iter;
98 ASSERT_EQ(*iter, StringPiece("the"));
99 ++iter;
100 ASSERT_EQ(*iter, StringPiece("end"));
101 ++iter;
102 ASSERT_EQ(tokenizer.end(), iter);
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700103}
104
Adam Lesinskicf95a582015-11-16 15:37:30 -0800105TEST(UtilTest, TokenizeEmptyString) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700106 auto tokenizer = util::Tokenize(StringPiece(""), '|');
107 auto iter = tokenizer.begin();
108 ASSERT_NE(tokenizer.end(), iter);
109 ASSERT_EQ(StringPiece(), *iter);
110 ++iter;
111 ASSERT_EQ(tokenizer.end(), iter);
Adam Lesinskicf95a582015-11-16 15:37:30 -0800112}
113
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700114TEST(UtilTest, TokenizeAtEnd) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700115 auto tokenizer = util::Tokenize(StringPiece("one."), '.');
116 auto iter = tokenizer.begin();
117 ASSERT_EQ(*iter, StringPiece("one"));
118 ++iter;
119 ASSERT_NE(iter, tokenizer.end());
120 ASSERT_EQ(*iter, StringPiece());
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700121}
122
123TEST(UtilTest, IsJavaClassName) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700124 EXPECT_TRUE(util::IsJavaClassName("android.test.Class"));
125 EXPECT_TRUE(util::IsJavaClassName("android.test.Class$Inner"));
126 EXPECT_TRUE(util::IsJavaClassName("android_test.test.Class"));
127 EXPECT_TRUE(util::IsJavaClassName("_android_.test._Class_"));
128 EXPECT_FALSE(util::IsJavaClassName("android.test.$Inner"));
129 EXPECT_FALSE(util::IsJavaClassName("android.test.Inner$"));
130 EXPECT_FALSE(util::IsJavaClassName(".test.Class"));
131 EXPECT_FALSE(util::IsJavaClassName("android"));
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700132}
133
134TEST(UtilTest, IsJavaPackageName) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700135 EXPECT_TRUE(util::IsJavaPackageName("android"));
136 EXPECT_TRUE(util::IsJavaPackageName("android.test"));
137 EXPECT_TRUE(util::IsJavaPackageName("android.test_thing"));
138 EXPECT_FALSE(util::IsJavaPackageName("_android"));
139 EXPECT_FALSE(util::IsJavaPackageName("android_"));
140 EXPECT_FALSE(util::IsJavaPackageName("android."));
141 EXPECT_FALSE(util::IsJavaPackageName(".android"));
142 EXPECT_FALSE(util::IsJavaPackageName("android._test"));
143 EXPECT_FALSE(util::IsJavaPackageName(".."));
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700144}
145
146TEST(UtilTest, FullyQualifiedClassName) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700147 Maybe<std::string> res = util::GetFullyQualifiedClassName("android", ".asdf");
148 AAPT_ASSERT_TRUE(res);
149 EXPECT_EQ(res.value(), "android.asdf");
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700150
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700151 res = util::GetFullyQualifiedClassName("android", ".a.b");
152 AAPT_ASSERT_TRUE(res);
153 EXPECT_EQ(res.value(), "android.a.b");
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700154
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700155 res = util::GetFullyQualifiedClassName("android", "a.b");
156 AAPT_ASSERT_TRUE(res);
157 EXPECT_EQ(res.value(), "a.b");
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700158
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700159 res = util::GetFullyQualifiedClassName("", "a.b");
160 AAPT_ASSERT_TRUE(res);
161 EXPECT_EQ(res.value(), "a.b");
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700162
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700163 res = util::GetFullyQualifiedClassName("android", "Class");
164 AAPT_ASSERT_TRUE(res);
165 EXPECT_EQ(res.value(), "android.Class");
Adam Lesinski71965e82016-07-07 17:12:12 -0700166
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700167 res = util::GetFullyQualifiedClassName("", "");
168 AAPT_ASSERT_FALSE(res);
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700169
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700170 res = util::GetFullyQualifiedClassName("android", "./Apple");
171 AAPT_ASSERT_FALSE(res);
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700172}
173
174TEST(UtilTest, ExtractResourcePathComponents) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700175 StringPiece prefix, entry, suffix;
176 ASSERT_TRUE(util::ExtractResFilePathParts("res/xml-sw600dp/entry.xml",
177 &prefix, &entry, &suffix));
178 EXPECT_EQ(prefix, "res/xml-sw600dp/");
179 EXPECT_EQ(entry, "entry");
180 EXPECT_EQ(suffix, ".xml");
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700181
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700182 ASSERT_TRUE(util::ExtractResFilePathParts("res/xml-sw600dp/entry.9.png",
183 &prefix, &entry, &suffix));
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700184
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700185 EXPECT_EQ(prefix, "res/xml-sw600dp/");
186 EXPECT_EQ(entry, "entry");
187 EXPECT_EQ(suffix, ".9.png");
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700188
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700189 EXPECT_FALSE(util::ExtractResFilePathParts("AndroidManifest.xml", &prefix,
190 &entry, &suffix));
191 EXPECT_FALSE(
192 util::ExtractResFilePathParts("res/.xml", &prefix, &entry, &suffix));
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700193
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700194 ASSERT_TRUE(
195 util::ExtractResFilePathParts("res//.", &prefix, &entry, &suffix));
196 EXPECT_EQ(prefix, "res//");
197 EXPECT_EQ(entry, "");
198 EXPECT_EQ(suffix, ".");
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700199}
200
Adam Lesinskib23f1e02015-11-03 12:24:17 -0800201TEST(UtilTest, VerifyJavaStringFormat) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700202 ASSERT_TRUE(util::VerifyJavaStringFormat("%09.34f"));
203 ASSERT_TRUE(util::VerifyJavaStringFormat("%9$.34f %8$"));
204 ASSERT_TRUE(util::VerifyJavaStringFormat("%% %%"));
205 ASSERT_FALSE(util::VerifyJavaStringFormat("%09$f %f"));
206 ASSERT_FALSE(util::VerifyJavaStringFormat("%09f %08s"));
Adam Lesinskib23f1e02015-11-03 12:24:17 -0800207}
208
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700209} // namespace aapt