blob: 02f4cb14eb410ef3db30e235de4673161c039675 [file] [log] [blame]
Adam Lesinski6f6ceb72014-11-14 14:48:12 -08001/*
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 Lesinskica5638f2015-10-21 14:42:43 -070017#include "java/JavaClassGenerator.h"
Adam Lesinski1ab598f2015-08-14 14:26:04 -070018
Adam Lesinski6f6ceb72014-11-14 14:48:12 -080019#include <string>
20
Adam Lesinskia693c4a2017-11-09 11:29:39 -080021#include "io/StringStream.h"
Adam Lesinskice5e56e22016-10-21 17:56:45 -070022#include "test/Test.h"
23#include "util/Util.h"
24
Adam Lesinskia693c4a2017-11-09 11:29:39 -080025using ::aapt::io::StringOutputStream;
Adam Lesinski09f4d702017-08-08 10:39:55 -070026using ::android::StringPiece;
27using ::testing::HasSubstr;
Adam Lesinski761d4342017-09-29 11:15:17 -070028using ::testing::Lt;
29using ::testing::Ne;
Adam Lesinski09f4d702017-08-08 10:39:55 -070030using ::testing::Not;
Adam Lesinskid5083f62017-01-16 15:07:21 -080031
Adam Lesinski6f6ceb72014-11-14 14:48:12 -080032namespace aapt {
33
Adam Lesinski1ab598f2015-08-14 14:26:04 -070034TEST(JavaClassGeneratorTest, FailWhenEntryIsJavaKeyword) {
Adam Lesinskice5e56e22016-10-21 17:56:45 -070035 std::unique_ptr<ResourceTable> table =
36 test::ResourceTableBuilder()
37 .SetPackageId("android", 0x01)
38 .AddSimple("android:id/class", ResourceId(0x01020000))
39 .Build();
Adam Lesinski6f6ceb72014-11-14 14:48:12 -080040
Adam Lesinskice5e56e22016-10-21 17:56:45 -070041 std::unique_ptr<IAaptContext> context =
42 test::ContextBuilder()
43 .AddSymbolSource(
44 util::make_unique<ResourceTableSymbolSource>(table.get()))
45 .SetNameManglerPolicy(NameManglerPolicy{"android"})
46 .Build();
47 JavaClassGenerator generator(context.get(), table.get(), {});
Adam Lesinski6f6ceb72014-11-14 14:48:12 -080048
Adam Lesinskia693c4a2017-11-09 11:29:39 -080049 std::string result;
50 StringOutputStream out(&result);
Adam Lesinskice5e56e22016-10-21 17:56:45 -070051 EXPECT_FALSE(generator.Generate("android", &out));
Adam Lesinski6f6ceb72014-11-14 14:48:12 -080052}
53
Adam Lesinski1ab598f2015-08-14 14:26:04 -070054TEST(JavaClassGeneratorTest, TransformInvalidJavaIdentifierCharacter) {
Adam Lesinskice5e56e22016-10-21 17:56:45 -070055 std::unique_ptr<ResourceTable> table =
56 test::ResourceTableBuilder()
57 .SetPackageId("android", 0x01)
58 .AddSimple("android:id/hey-man", ResourceId(0x01020000))
59 .AddValue("android:attr/cool.attr", ResourceId(0x01010000),
60 test::AttributeBuilder(false).Build())
Adam Lesinski09f4d702017-08-08 10:39:55 -070061 .AddValue("android:styleable/hey.dude", ResourceId(0x01030000),
62 test::StyleableBuilder()
63 .AddItem("android:attr/cool.attr", ResourceId(0x01010000))
64 .Build())
Adam Lesinskice5e56e22016-10-21 17:56:45 -070065 .Build();
Adam Lesinski6f6ceb72014-11-14 14:48:12 -080066
Adam Lesinskice5e56e22016-10-21 17:56:45 -070067 std::unique_ptr<IAaptContext> context =
68 test::ContextBuilder()
Adam Lesinski09f4d702017-08-08 10:39:55 -070069 .AddSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
Adam Lesinskice5e56e22016-10-21 17:56:45 -070070 .SetNameManglerPolicy(NameManglerPolicy{"android"})
71 .Build();
72 JavaClassGenerator generator(context.get(), table.get(), {});
Adam Lesinski6f6ceb72014-11-14 14:48:12 -080073
Adam Lesinskia693c4a2017-11-09 11:29:39 -080074 std::string output;
75 StringOutputStream out(&output);
Adam Lesinskice5e56e22016-10-21 17:56:45 -070076 EXPECT_TRUE(generator.Generate("android", &out));
Adam Lesinskia693c4a2017-11-09 11:29:39 -080077 out.Flush();
Adam Lesinski6f6ceb72014-11-14 14:48:12 -080078
Adam Lesinski09f4d702017-08-08 10:39:55 -070079 EXPECT_THAT(output, HasSubstr("public static final int hey_man=0x01020000;"));
80 EXPECT_THAT(output, HasSubstr("public static final int[] hey_dude={"));
81 EXPECT_THAT(output, HasSubstr("public static final int hey_dude_cool_attr=0;"));
Adam Lesinski6f6ceb72014-11-14 14:48:12 -080082}
83
Adam Lesinski9e10ac72015-10-16 14:37:48 -070084TEST(JavaClassGeneratorTest, CorrectPackageNameIsUsed) {
Adam Lesinskice5e56e22016-10-21 17:56:45 -070085 std::unique_ptr<ResourceTable> table =
86 test::ResourceTableBuilder()
87 .SetPackageId("android", 0x01)
88 .AddSimple("android:id/one", ResourceId(0x01020000))
89 .AddSimple("android:id/com.foo$two", ResourceId(0x01020001))
90 .Build();
Adam Lesinski9e10ac72015-10-16 14:37:48 -070091
Adam Lesinskice5e56e22016-10-21 17:56:45 -070092 std::unique_ptr<IAaptContext> context =
93 test::ContextBuilder()
Adam Lesinski09f4d702017-08-08 10:39:55 -070094 .AddSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
Adam Lesinskice5e56e22016-10-21 17:56:45 -070095 .SetNameManglerPolicy(NameManglerPolicy{"android"})
96 .Build();
97 JavaClassGenerator generator(context.get(), table.get(), {});
Adam Lesinski9e10ac72015-10-16 14:37:48 -070098
Adam Lesinskia693c4a2017-11-09 11:29:39 -080099 std::string output;
100 StringOutputStream out(&output);
101 ASSERT_TRUE(generator.Generate("android", "com.android.internal", &out));
102 out.Flush();
103
Adam Lesinski09f4d702017-08-08 10:39:55 -0700104 EXPECT_THAT(output, HasSubstr("package com.android.internal;"));
105 EXPECT_THAT(output, HasSubstr("public static final int one=0x01020000;"));
106 EXPECT_THAT(output, Not(HasSubstr("two")));
107 EXPECT_THAT(output, Not(HasSubstr("com_foo$two")));
Adam Lesinski9e10ac72015-10-16 14:37:48 -0700108}
109
110TEST(JavaClassGeneratorTest, AttrPrivateIsWrittenAsAttr) {
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700111 std::unique_ptr<ResourceTable> table =
112 test::ResourceTableBuilder()
113 .SetPackageId("android", 0x01)
114 .AddSimple("android:attr/two", ResourceId(0x01010001))
115 .AddSimple("android:^attr-private/one", ResourceId(0x01010000))
116 .Build();
Adam Lesinski9e10ac72015-10-16 14:37:48 -0700117
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700118 std::unique_ptr<IAaptContext> context =
119 test::ContextBuilder()
Adam Lesinski09f4d702017-08-08 10:39:55 -0700120 .AddSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700121 .SetNameManglerPolicy(NameManglerPolicy{"android"})
122 .Build();
123 JavaClassGenerator generator(context.get(), table.get(), {});
Adam Lesinski9e10ac72015-10-16 14:37:48 -0700124
Adam Lesinskia693c4a2017-11-09 11:29:39 -0800125 std::string output;
126 StringOutputStream out(&output);
127 ASSERT_TRUE(generator.Generate("android", &out));
128 out.Flush();
129
Adam Lesinski09f4d702017-08-08 10:39:55 -0700130 EXPECT_THAT(output, HasSubstr("public static final class attr"));
131 EXPECT_THAT(output, Not(HasSubstr("public static final class ^attr-private")));
Adam Lesinski9e10ac72015-10-16 14:37:48 -0700132}
133
134TEST(JavaClassGeneratorTest, OnlyWritePublicResources) {
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700135 StdErrDiagnostics diag;
136 std::unique_ptr<ResourceTable> table =
137 test::ResourceTableBuilder()
138 .SetPackageId("android", 0x01)
139 .AddSimple("android:id/one", ResourceId(0x01020000))
140 .AddSimple("android:id/two", ResourceId(0x01020001))
141 .AddSimple("android:id/three", ResourceId(0x01020002))
Adam Lesinski09f4d702017-08-08 10:39:55 -0700142 .SetSymbolState("android:id/one", ResourceId(0x01020000), SymbolState::kPublic)
143 .SetSymbolState("android:id/two", ResourceId(0x01020001), SymbolState::kPrivate)
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700144 .Build();
Adam Lesinski9e10ac72015-10-16 14:37:48 -0700145
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700146 std::unique_ptr<IAaptContext> context =
147 test::ContextBuilder()
Adam Lesinski09f4d702017-08-08 10:39:55 -0700148 .AddSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700149 .SetNameManglerPolicy(NameManglerPolicy{"android"})
150 .Build();
Adam Lesinski76565542016-03-10 21:55:04 -0800151
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700152 JavaClassGeneratorOptions options;
153 options.types = JavaClassGeneratorOptions::SymbolTypes::kPublic;
154 {
155 JavaClassGenerator generator(context.get(), table.get(), options);
Adam Lesinskia693c4a2017-11-09 11:29:39 -0800156 std::string output;
157 StringOutputStream out(&output);
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700158 ASSERT_TRUE(generator.Generate("android", &out));
Adam Lesinskia693c4a2017-11-09 11:29:39 -0800159 out.Flush();
160
Adam Lesinski09f4d702017-08-08 10:39:55 -0700161 EXPECT_THAT(output, HasSubstr("public static final int one=0x01020000;"));
162 EXPECT_THAT(output, Not(HasSubstr("two")));
163 EXPECT_THAT(output, Not(HasSubstr("three")));
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700164 }
Adam Lesinski9e10ac72015-10-16 14:37:48 -0700165
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700166 options.types = JavaClassGeneratorOptions::SymbolTypes::kPublicPrivate;
167 {
168 JavaClassGenerator generator(context.get(), table.get(), options);
Adam Lesinskia693c4a2017-11-09 11:29:39 -0800169 std::string output;
170 StringOutputStream out(&output);
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700171 ASSERT_TRUE(generator.Generate("android", &out));
Adam Lesinskia693c4a2017-11-09 11:29:39 -0800172 out.Flush();
173
Adam Lesinski09f4d702017-08-08 10:39:55 -0700174 EXPECT_THAT(output, HasSubstr("public static final int one=0x01020000;"));
175 EXPECT_THAT(output, HasSubstr("public static final int two=0x01020001;"));
176 EXPECT_THAT(output, Not(HasSubstr("three")));
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700177 }
Adam Lesinski9e10ac72015-10-16 14:37:48 -0700178
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700179 options.types = JavaClassGeneratorOptions::SymbolTypes::kAll;
180 {
181 JavaClassGenerator generator(context.get(), table.get(), options);
Adam Lesinskia693c4a2017-11-09 11:29:39 -0800182 std::string output;
183 StringOutputStream out(&output);
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700184 ASSERT_TRUE(generator.Generate("android", &out));
Adam Lesinskia693c4a2017-11-09 11:29:39 -0800185 out.Flush();
186
Adam Lesinski09f4d702017-08-08 10:39:55 -0700187 EXPECT_THAT(output, HasSubstr("public static final int one=0x01020000;"));
188 EXPECT_THAT(output, HasSubstr("public static final int two=0x01020001;"));
189 EXPECT_THAT(output, HasSubstr("public static final int three=0x01020002;"));
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700190 }
Adam Lesinski9e10ac72015-10-16 14:37:48 -0700191}
192
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700193/*
194 * TODO(adamlesinski): Re-enable this once we get merging working again.
195 * TEST(JavaClassGeneratorTest, EmitPackageMangledSymbols) {
Adam Lesinski769de982015-04-10 19:43:55 -0700196 ASSERT_TRUE(addResource(ResourceName{ {}, ResourceType::kId, u"foo" },
197 ResourceId{ 0x01, 0x02, 0x0000 }));
198 ResourceTable table;
199 table.setPackage(u"com.lib");
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700200 ASSERT_TRUE(table.addResource(ResourceName{ {}, ResourceType::kId, u"test"
201}, {},
202 Source{ "lib.xml", 33 },
203util::make_unique<Id>()));
Adam Lesinski769de982015-04-10 19:43:55 -0700204 ASSERT_TRUE(mTable->merge(std::move(table)));
205
Adam Lesinski330edcd2015-05-04 17:40:56 -0700206 Linker linker(mTable,
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700207 std::make_shared<MockResolver>(mTable, std::map<ResourceName,
208ResourceId>()),
Adam Lesinski330edcd2015-05-04 17:40:56 -0700209 {});
Adam Lesinski769de982015-04-10 19:43:55 -0700210 ASSERT_TRUE(linker.linkAndValidate());
211
212 JavaClassGenerator generator(mTable, {});
213
214 std::stringstream out;
215 EXPECT_TRUE(generator.generate(mTable->getPackage(), out));
216 std::string output = out.str();
217 EXPECT_NE(std::string::npos, output.find("int foo ="));
218 EXPECT_EQ(std::string::npos, output.find("int test ="));
219
220 out.str("");
221 EXPECT_TRUE(generator.generate(u"com.lib", out));
222 output = out.str();
223 EXPECT_NE(std::string::npos, output.find("int test ="));
224 EXPECT_EQ(std::string::npos, output.find("int foo ="));
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700225}*/
Adam Lesinski838a6872015-05-01 13:14:05 -0700226
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700227TEST(JavaClassGeneratorTest, EmitOtherPackagesAttributesInStyleable) {
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700228 std::unique_ptr<ResourceTable> table =
229 test::ResourceTableBuilder()
230 .SetPackageId("android", 0x01)
231 .SetPackageId("com.lib", 0x02)
232 .AddValue("android:attr/bar", ResourceId(0x01010000),
233 test::AttributeBuilder(false).Build())
234 .AddValue("com.lib:attr/bar", ResourceId(0x02010000),
235 test::AttributeBuilder(false).Build())
236 .AddValue("android:styleable/foo", ResourceId(0x01030000),
237 test::StyleableBuilder()
238 .AddItem("android:attr/bar", ResourceId(0x01010000))
239 .AddItem("com.lib:attr/bar", ResourceId(0x02010000))
240 .Build())
241 .Build();
Adam Lesinski838a6872015-05-01 13:14:05 -0700242
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700243 std::unique_ptr<IAaptContext> context =
244 test::ContextBuilder()
Adam Lesinski09f4d702017-08-08 10:39:55 -0700245 .AddSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700246 .SetNameManglerPolicy(NameManglerPolicy{"android"})
247 .Build();
248 JavaClassGenerator generator(context.get(), table.get(), {});
Adam Lesinski838a6872015-05-01 13:14:05 -0700249
Adam Lesinskia693c4a2017-11-09 11:29:39 -0800250 std::string output;
251 StringOutputStream out(&output);
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700252 EXPECT_TRUE(generator.Generate("android", &out));
Adam Lesinskia693c4a2017-11-09 11:29:39 -0800253 out.Flush();
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700254
Adam Lesinski09f4d702017-08-08 10:39:55 -0700255 EXPECT_THAT(output, HasSubstr("int foo_bar="));
256 EXPECT_THAT(output, HasSubstr("int foo_com_lib_bar="));
Adam Lesinski838a6872015-05-01 13:14:05 -0700257}
Adam Lesinski769de982015-04-10 19:43:55 -0700258
Adam Lesinski3b4cd942015-10-30 16:31:42 -0700259TEST(JavaClassGeneratorTest, CommentsForSimpleResourcesArePresent) {
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700260 std::unique_ptr<ResourceTable> table =
261 test::ResourceTableBuilder()
262 .SetPackageId("android", 0x01)
263 .AddSimple("android:id/foo", ResourceId(0x01010000))
264 .Build();
265 test::GetValue<Id>(table.get(), "android:id/foo")
266 ->SetComment(std::string("This is a comment\n@deprecated"));
Adam Lesinski3b4cd942015-10-30 16:31:42 -0700267
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700268 std::unique_ptr<IAaptContext> context =
269 test::ContextBuilder()
Adam Lesinski09f4d702017-08-08 10:39:55 -0700270 .AddSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700271 .SetNameManglerPolicy(NameManglerPolicy{"android"})
272 .Build();
273 JavaClassGenerator generator(context.get(), table.get(), {});
Adam Lesinskia693c4a2017-11-09 11:29:39 -0800274
275 std::string output;
276 StringOutputStream out(&output);
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700277 ASSERT_TRUE(generator.Generate("android", &out));
Adam Lesinskia693c4a2017-11-09 11:29:39 -0800278 out.Flush();
Adam Lesinski3b4cd942015-10-30 16:31:42 -0700279
Adam Lesinski09f4d702017-08-08 10:39:55 -0700280 const char* expected_text =
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700281 R"EOF(/**
Adam Lesinski3b4cd942015-10-30 16:31:42 -0700282 * This is a comment
283 * @deprecated
284 */
285 @Deprecated
Adam Lesinski803c7c82016-04-06 16:09:43 -0700286 public static final int foo=0x01010000;)EOF";
Adam Lesinski09f4d702017-08-08 10:39:55 -0700287 EXPECT_THAT(output, HasSubstr(expected_text));
Adam Lesinski3b4cd942015-10-30 16:31:42 -0700288}
289
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700290TEST(JavaClassGeneratorTest, CommentsForEnumAndFlagAttributesArePresent) {}
Adam Lesinski3b4cd942015-10-30 16:31:42 -0700291
Adam Lesinskiceb9b2f2017-02-16 12:05:42 -0800292TEST(JavaClassGeneratorTest, CommentsForStyleablesAndNestedAttributesArePresent) {
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700293 Attribute attr(false);
294 attr.SetComment(StringPiece("This is an attribute"));
Adam Lesinski3b4cd942015-10-30 16:31:42 -0700295
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700296 Styleable styleable;
Adam Lesinski09f4d702017-08-08 10:39:55 -0700297 styleable.entries.push_back(Reference(test::ParseNameOrDie("android:attr/one")));
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700298 styleable.SetComment(StringPiece("This is a styleable"));
Adam Lesinski3b4cd942015-10-30 16:31:42 -0700299
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700300 std::unique_ptr<ResourceTable> table =
301 test::ResourceTableBuilder()
302 .SetPackageId("android", 0x01)
303 .AddValue("android:attr/one", util::make_unique<Attribute>(attr))
304 .AddValue("android:styleable/Container",
305 std::unique_ptr<Styleable>(styleable.Clone(nullptr)))
306 .Build();
Adam Lesinski74605cd2016-03-03 15:39:50 -0800307
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700308 std::unique_ptr<IAaptContext> context =
309 test::ContextBuilder()
Adam Lesinski09f4d702017-08-08 10:39:55 -0700310 .AddSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700311 .SetNameManglerPolicy(NameManglerPolicy{"android"})
312 .Build();
313 JavaClassGeneratorOptions options;
314 options.use_final = false;
315 JavaClassGenerator generator(context.get(), table.get(), options);
Adam Lesinskia693c4a2017-11-09 11:29:39 -0800316
317 std::string output;
318 StringOutputStream out(&output);
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700319 ASSERT_TRUE(generator.Generate("android", &out));
Adam Lesinskia693c4a2017-11-09 11:29:39 -0800320 out.Flush();
Adam Lesinski74605cd2016-03-03 15:39:50 -0800321
Adam Lesinski09f4d702017-08-08 10:39:55 -0700322 EXPECT_THAT(output, HasSubstr("attr name android:one"));
323 EXPECT_THAT(output, HasSubstr("attr description"));
324 EXPECT_THAT(output, HasSubstr(attr.GetComment()));
325 EXPECT_THAT(output, HasSubstr(styleable.GetComment()));
Adam Lesinski3b4cd942015-10-30 16:31:42 -0700326}
327
Adam Lesinski761d4342017-09-29 11:15:17 -0700328TEST(JavaClassGeneratorTest, StyleableAndIndicesAreColocated) {
329 std::unique_ptr<ResourceTable> table =
330 test::ResourceTableBuilder()
331 .SetPackageId("android", 0x01)
332 .AddValue("android:attr/layout_gravity", util::make_unique<Attribute>())
333 .AddValue("android:attr/background", util::make_unique<Attribute>())
334 .AddValue("android:styleable/ActionBar",
335 test::StyleableBuilder()
336 .AddItem("android:attr/background", ResourceId(0x01010000))
337 .Build())
338 .AddValue("android:styleable/ActionBar.LayoutParams",
339 test::StyleableBuilder()
340 .AddItem("android:attr/layout_gravity", ResourceId(0x01010001))
341 .Build())
342 .Build();
343
344 std::unique_ptr<IAaptContext> context =
345 test::ContextBuilder()
346 .AddSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
347 .SetNameManglerPolicy(NameManglerPolicy{"android"})
348 .Build();
349
350 JavaClassGeneratorOptions options;
351 JavaClassGenerator generator(context.get(), table.get(), {});
Adam Lesinskia693c4a2017-11-09 11:29:39 -0800352
353 std::string output;
354 StringOutputStream out(&output);
Adam Lesinski761d4342017-09-29 11:15:17 -0700355 ASSERT_TRUE(generator.Generate("android", &out));
Adam Lesinskia693c4a2017-11-09 11:29:39 -0800356 out.Flush();
Adam Lesinski761d4342017-09-29 11:15:17 -0700357
358 std::string::size_type actionbar_pos = output.find("int[] ActionBar");
359 ASSERT_THAT(actionbar_pos, Ne(std::string::npos));
360
361 std::string::size_type actionbar_background_pos = output.find("int ActionBar_background");
362 ASSERT_THAT(actionbar_background_pos, Ne(std::string::npos));
363
364 std::string::size_type actionbar_layout_params_pos = output.find("int[] ActionBar_LayoutParams");
365 ASSERT_THAT(actionbar_layout_params_pos, Ne(std::string::npos));
366
367 std::string::size_type actionbar_layout_params_layout_gravity_pos =
368 output.find("int ActionBar_LayoutParams_layout_gravity");
369 ASSERT_THAT(actionbar_layout_params_layout_gravity_pos, Ne(std::string::npos));
370
371 EXPECT_THAT(actionbar_pos, Lt(actionbar_background_pos));
372 EXPECT_THAT(actionbar_pos, Lt(actionbar_layout_params_pos));
373 EXPECT_THAT(actionbar_background_pos, Lt(actionbar_layout_params_pos));
374 EXPECT_THAT(actionbar_layout_params_pos, Lt(actionbar_layout_params_layout_gravity_pos));
375}
376
Michael Wrightfeaf99f2016-05-06 17:16:06 +0100377TEST(JavaClassGeneratorTest, CommentsForRemovedAttributesAreNotPresentInClass) {
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700378 Attribute attr(false);
379 attr.SetComment(StringPiece("removed"));
Michael Wrightfeaf99f2016-05-06 17:16:06 +0100380
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700381 std::unique_ptr<ResourceTable> table =
382 test::ResourceTableBuilder()
383 .SetPackageId("android", 0x01)
384 .AddValue("android:attr/one", util::make_unique<Attribute>(attr))
385 .Build();
Michael Wrightfeaf99f2016-05-06 17:16:06 +0100386
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700387 std::unique_ptr<IAaptContext> context =
388 test::ContextBuilder()
Adam Lesinski09f4d702017-08-08 10:39:55 -0700389 .AddSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700390 .SetNameManglerPolicy(NameManglerPolicy{"android"})
391 .Build();
392 JavaClassGeneratorOptions options;
393 options.use_final = false;
394 JavaClassGenerator generator(context.get(), table.get(), options);
Adam Lesinskia693c4a2017-11-09 11:29:39 -0800395
396 std::string output;
397 StringOutputStream out(&output);
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700398 ASSERT_TRUE(generator.Generate("android", &out));
Adam Lesinskia693c4a2017-11-09 11:29:39 -0800399 out.Flush();
Michael Wrightfeaf99f2016-05-06 17:16:06 +0100400
Adam Lesinski09f4d702017-08-08 10:39:55 -0700401 EXPECT_THAT(output, Not(HasSubstr("@attr name android:one")));
402 EXPECT_THAT(output, Not(HasSubstr("@attr description")));
Michael Wrightfeaf99f2016-05-06 17:16:06 +0100403
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700404 // We should find @removed only in the attribute javadoc and not anywhere else
Adam Lesinski09f4d702017-08-08 10:39:55 -0700405 // (i.e. the class javadoc).
406 const std::string kRemoved("removed");
407 ASSERT_THAT(output, HasSubstr(kRemoved));
408 std::string after_first_match = output.substr(output.find(kRemoved) + kRemoved.size());
409 EXPECT_THAT(after_first_match, Not(HasSubstr(kRemoved)));
Michael Wrightfeaf99f2016-05-06 17:16:06 +0100410}
411
Adam Lesinskiceb9b2f2017-02-16 12:05:42 -0800412TEST(JavaClassGeneratorTest, GenerateOnResourcesLoadedCallbackForSharedLibrary) {
413 std::unique_ptr<ResourceTable> table =
414 test::ResourceTableBuilder()
415 .SetPackageId("android", 0x00)
416 .AddValue("android:attr/foo", ResourceId(0x00010000), util::make_unique<Attribute>(false))
417 .AddValue("android:id/foo", ResourceId(0x00020000), util::make_unique<Id>())
418 .AddValue(
419 "android:style/foo", ResourceId(0x00030000),
420 test::StyleBuilder()
421 .AddItem("android:attr/foo", ResourceId(0x00010000), util::make_unique<Id>())
422 .Build())
423 .Build();
424
425 std::unique_ptr<IAaptContext> context =
426 test::ContextBuilder().SetPackageId(0x00).SetCompilationPackage("android").Build();
427
428 JavaClassGeneratorOptions options;
429 options.use_final = false;
Adam Lesinski09f4d702017-08-08 10:39:55 -0700430 options.rewrite_callback_options = OnResourcesLoadedCallbackOptions{{"com.foo", "com.boo"}};
Adam Lesinskiceb9b2f2017-02-16 12:05:42 -0800431 JavaClassGenerator generator(context.get(), table.get(), options);
432
Adam Lesinskia693c4a2017-11-09 11:29:39 -0800433 std::string output;
434 StringOutputStream out(&output);
Adam Lesinskiceb9b2f2017-02-16 12:05:42 -0800435 ASSERT_TRUE(generator.Generate("android", &out));
Adam Lesinskia693c4a2017-11-09 11:29:39 -0800436 out.Flush();
Adam Lesinskiceb9b2f2017-02-16 12:05:42 -0800437
Adam Lesinski09f4d702017-08-08 10:39:55 -0700438 EXPECT_THAT(output, HasSubstr("void onResourcesLoaded"));
439 EXPECT_THAT(output, HasSubstr("com.foo.R.onResourcesLoaded"));
440 EXPECT_THAT(output, HasSubstr("com.boo.R.onResourcesLoaded"));
Adam Lesinskiceb9b2f2017-02-16 12:05:42 -0800441}
442
Adam Lesinskice5e56e22016-10-21 17:56:45 -0700443} // namespace aapt