blob: a09001a71efc6a14094dc899d9ae574192048fbc [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 Lesinskid5083f62017-01-16 15:07:21 -080023using android::StringPiece;
24
Adam Lesinski1ab598f2015-08-14 14:26:04 -070025namespace aapt {
26
27TEST(UtilTest, TrimOnlyWhitespace) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070028 const std::string full = "\n ";
Adam Lesinski1ab598f2015-08-14 14:26:04 -070029
Adam Lesinskice5e56e2016-10-21 17:56:45 -070030 StringPiece trimmed = util::TrimWhitespace(full);
31 EXPECT_TRUE(trimmed.empty());
32 EXPECT_EQ(0u, trimmed.size());
Adam Lesinski1ab598f2015-08-14 14:26:04 -070033}
34
35TEST(UtilTest, StringEndsWith) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070036 EXPECT_TRUE(util::EndsWith("hello.xml", ".xml"));
Adam Lesinski1ab598f2015-08-14 14:26:04 -070037}
38
39TEST(UtilTest, StringStartsWith) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070040 EXPECT_TRUE(util::StartsWith("hello.xml", "he"));
Adam Lesinski1ab598f2015-08-14 14:26:04 -070041}
42
43TEST(UtilTest, StringBuilderSplitEscapeSequence) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070044 EXPECT_EQ(StringPiece("this is a new\nline."), util::StringBuilder()
45 .Append("this is a new\\")
46 .Append("nline.")
47 .ToString());
Adam Lesinski1ab598f2015-08-14 14:26:04 -070048}
49
50TEST(UtilTest, StringBuilderWhitespaceRemoval) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070051 EXPECT_EQ(StringPiece("hey guys this is so cool"),
52 util::StringBuilder()
53 .Append(" hey guys ")
54 .Append(" this is so cool ")
55 .ToString());
Adam Lesinski1ab598f2015-08-14 14:26:04 -070056
Adam Lesinskice5e56e2016-10-21 17:56:45 -070057 EXPECT_EQ(StringPiece(" wow, so many \t spaces. what?"),
58 util::StringBuilder()
59 .Append(" \" wow, so many \t ")
60 .Append("spaces. \"what? ")
61 .ToString());
Adam Lesinski1ab598f2015-08-14 14:26:04 -070062
Adam Lesinskice5e56e2016-10-21 17:56:45 -070063 EXPECT_EQ(StringPiece("where is the pie?"), util::StringBuilder()
64 .Append(" where \t ")
65 .Append(" \nis the "
66 " pie?")
67 .ToString());
Adam Lesinski1ab598f2015-08-14 14:26:04 -070068}
69
70TEST(UtilTest, StringBuilderEscaping) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070071 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());
Adam Lesinski1ab598f2015-08-14 14:26:04 -070076
Adam Lesinskice5e56e2016-10-21 17:56:45 -070077 EXPECT_EQ(StringPiece("@?#\\\'"),
78 util::StringBuilder().Append("\\@\\?\\#\\\\\\'").ToString());
Adam Lesinski1ab598f2015-08-14 14:26:04 -070079}
80
81TEST(UtilTest, StringBuilderMisplacedQuote) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070082 util::StringBuilder builder{};
83 EXPECT_FALSE(builder.Append("they're coming!"));
Adam Lesinski1ab598f2015-08-14 14:26:04 -070084}
85
86TEST(UtilTest, StringBuilderUnicodeCodes) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070087 EXPECT_EQ(std::string("\u00AF\u0AF0 woah"),
88 util::StringBuilder().Append("\\u00AF\\u0AF0 woah").ToString());
Adam Lesinski1ab598f2015-08-14 14:26:04 -070089
Adam Lesinskice5e56e2016-10-21 17:56:45 -070090 EXPECT_FALSE(util::StringBuilder().Append("\\u00 yo"));
Adam Lesinski1ab598f2015-08-14 14:26:04 -070091}
92
93TEST(UtilTest, TokenizeInput) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070094 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);
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700105}
106
Adam Lesinskicf95a582015-11-16 15:37:30 -0800107TEST(UtilTest, TokenizeEmptyString) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700108 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);
Adam Lesinskicf95a582015-11-16 15:37:30 -0800114}
115
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700116TEST(UtilTest, TokenizeAtEnd) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700117 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());
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700123}
124
125TEST(UtilTest, IsJavaClassName) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700126 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"));
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700134}
135
136TEST(UtilTest, IsJavaPackageName) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700137 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(".."));
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700146}
147
148TEST(UtilTest, FullyQualifiedClassName) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700149 Maybe<std::string> res = util::GetFullyQualifiedClassName("android", ".asdf");
Adam Lesinskia45893a2017-05-30 15:19:02 -0700150 ASSERT_TRUE(res);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700151 EXPECT_EQ(res.value(), "android.asdf");
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700152
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700153 res = util::GetFullyQualifiedClassName("android", ".a.b");
Adam Lesinskia45893a2017-05-30 15:19:02 -0700154 ASSERT_TRUE(res);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700155 EXPECT_EQ(res.value(), "android.a.b");
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700156
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700157 res = util::GetFullyQualifiedClassName("android", "a.b");
Adam Lesinskia45893a2017-05-30 15:19:02 -0700158 ASSERT_TRUE(res);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700159 EXPECT_EQ(res.value(), "a.b");
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700160
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700161 res = util::GetFullyQualifiedClassName("", "a.b");
Adam Lesinskia45893a2017-05-30 15:19:02 -0700162 ASSERT_TRUE(res);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700163 EXPECT_EQ(res.value(), "a.b");
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700164
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700165 res = util::GetFullyQualifiedClassName("android", "Class");
Adam Lesinskia45893a2017-05-30 15:19:02 -0700166 ASSERT_TRUE(res);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700167 EXPECT_EQ(res.value(), "android.Class");
Adam Lesinski71965e82016-07-07 17:12:12 -0700168
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700169 res = util::GetFullyQualifiedClassName("", "");
Adam Lesinskia45893a2017-05-30 15:19:02 -0700170 ASSERT_FALSE(res);
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700171
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700172 res = util::GetFullyQualifiedClassName("android", "./Apple");
Adam Lesinskia45893a2017-05-30 15:19:02 -0700173 ASSERT_FALSE(res);
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700174}
175
176TEST(UtilTest, ExtractResourcePathComponents) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700177 StringPiece prefix, entry, suffix;
Adam Lesinskia45893a2017-05-30 15:19:02 -0700178 ASSERT_TRUE(util::ExtractResFilePathParts("res/xml-sw600dp/entry.xml", &prefix, &entry, &suffix));
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700179 EXPECT_EQ(prefix, "res/xml-sw600dp/");
180 EXPECT_EQ(entry, "entry");
181 EXPECT_EQ(suffix, ".xml");
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700182
Adam Lesinskia45893a2017-05-30 15:19:02 -0700183 ASSERT_TRUE(util::ExtractResFilePathParts("res/xml-sw600dp/entry.9.png", &prefix, &entry, &suffix));
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700184 EXPECT_EQ(prefix, "res/xml-sw600dp/");
185 EXPECT_EQ(entry, "entry");
186 EXPECT_EQ(suffix, ".9.png");
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700187
Adam Lesinskia45893a2017-05-30 15:19:02 -0700188 EXPECT_FALSE(util::ExtractResFilePathParts("AndroidManifest.xml", &prefix, &entry, &suffix));
189 EXPECT_FALSE(util::ExtractResFilePathParts("res/.xml", &prefix, &entry, &suffix));
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700190
Adam Lesinskia45893a2017-05-30 15:19:02 -0700191 ASSERT_TRUE(util::ExtractResFilePathParts("res//.", &prefix, &entry, &suffix));
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700192 EXPECT_EQ(prefix, "res//");
193 EXPECT_EQ(entry, "");
194 EXPECT_EQ(suffix, ".");
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700195}
196
Adam Lesinskib23f1e02015-11-03 12:24:17 -0800197TEST(UtilTest, VerifyJavaStringFormat) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700198 ASSERT_TRUE(util::VerifyJavaStringFormat("%09.34f"));
199 ASSERT_TRUE(util::VerifyJavaStringFormat("%9$.34f %8$"));
200 ASSERT_TRUE(util::VerifyJavaStringFormat("%% %%"));
201 ASSERT_FALSE(util::VerifyJavaStringFormat("%09$f %f"));
202 ASSERT_FALSE(util::VerifyJavaStringFormat("%09f %08s"));
Adam Lesinskib23f1e02015-11-03 12:24:17 -0800203}
204
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700205} // namespace aapt