16f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/*
26f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Copyright (C) 2015 The Android Open Source Project
36f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
46f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
56f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * you may not use this file except in compliance with the License.
66f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * You may obtain a copy of the License at
76f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
86f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
96f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Unless required by applicable law or agreed to in writing, software
116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * See the License for the specific language governing permissions and
146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * limitations under the License.
156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */
166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
17ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski#include "java/JavaClassGenerator.h"
181ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
196f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <string>
206f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
21a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski#include "io/StringStream.h"
22ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "test/Test.h"
23ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "util/Util.h"
24ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
25a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinskiusing ::aapt::io::StringOutputStream;
2609f4d706d9438980465faabe81ed143fc299343eAdam Lesinskiusing ::android::StringPiece;
2709f4d706d9438980465faabe81ed143fc299343eAdam Lesinskiusing ::testing::HasSubstr;
28761d4341fcbb711f55d73a31e79098837146236dAdam Lesinskiusing ::testing::Lt;
29761d4341fcbb711f55d73a31e79098837146236dAdam Lesinskiusing ::testing::Ne;
3009f4d706d9438980465faabe81ed143fc299343eAdam Lesinskiusing ::testing::Not;
31d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski
326f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskinamespace aapt {
336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
341ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST(JavaClassGeneratorTest, FailWhenEntryIsJavaKeyword) {
35ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<ResourceTable> table =
36ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      test::ResourceTableBuilder()
37ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetPackageId("android", 0x01)
38ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddSimple("android:id/class", ResourceId(0x01020000))
39ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .Build();
40ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
41ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<IAaptContext> context =
42ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      test::ContextBuilder()
43ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddSymbolSource(
44ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski              util::make_unique<ResourceTableSymbolSource>(table.get()))
45ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetNameManglerPolicy(NameManglerPolicy{"android"})
46ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .Build();
47ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  JavaClassGenerator generator(context.get(), table.get(), {});
48ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
49a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  std::string result;
50a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  StringOutputStream out(&result);
51ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_FALSE(generator.Generate("android", &out));
526f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
536f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
541ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST(JavaClassGeneratorTest, TransformInvalidJavaIdentifierCharacter) {
55ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<ResourceTable> table =
56ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      test::ResourceTableBuilder()
57ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetPackageId("android", 0x01)
58ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddSimple("android:id/hey-man", ResourceId(0x01020000))
59ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddValue("android:attr/cool.attr", ResourceId(0x01010000),
6073bff1e8519bb73f17a801f45977d41b69b5b0d0Adam Lesinski                    test::AttributeBuilder().Build())
6109f4d706d9438980465faabe81ed143fc299343eAdam Lesinski          .AddValue("android:styleable/hey.dude", ResourceId(0x01030000),
6209f4d706d9438980465faabe81ed143fc299343eAdam Lesinski                    test::StyleableBuilder()
6309f4d706d9438980465faabe81ed143fc299343eAdam Lesinski                        .AddItem("android:attr/cool.attr", ResourceId(0x01010000))
6409f4d706d9438980465faabe81ed143fc299343eAdam Lesinski                        .Build())
65ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .Build();
66ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
67ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<IAaptContext> context =
68ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      test::ContextBuilder()
6909f4d706d9438980465faabe81ed143fc299343eAdam Lesinski          .AddSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
70ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetNameManglerPolicy(NameManglerPolicy{"android"})
71ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .Build();
72ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  JavaClassGenerator generator(context.get(), table.get(), {});
73ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
74a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  std::string output;
75a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  StringOutputStream out(&output);
76ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_TRUE(generator.Generate("android", &out));
77a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  out.Flush();
78ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
7909f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, HasSubstr("public static final int hey_man=0x01020000;"));
8009f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, HasSubstr("public static final int[] hey_dude={"));
8109f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, HasSubstr("public static final int hey_dude_cool_attr=0;"));
82ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski}
836f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
84ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam LesinskiTEST(JavaClassGeneratorTest, CorrectPackageNameIsUsed) {
85ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<ResourceTable> table =
86ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      test::ResourceTableBuilder()
87ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetPackageId("android", 0x01)
88ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddSimple("android:id/one", ResourceId(0x01020000))
89ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddSimple("android:id/com.foo$two", ResourceId(0x01020001))
90ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .Build();
91ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
92ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<IAaptContext> context =
93ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      test::ContextBuilder()
9409f4d706d9438980465faabe81ed143fc299343eAdam Lesinski          .AddSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
95ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetNameManglerPolicy(NameManglerPolicy{"android"})
96ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .Build();
97ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  JavaClassGenerator generator(context.get(), table.get(), {});
98a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski
99a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  std::string output;
100a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  StringOutputStream out(&output);
101ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  ASSERT_TRUE(generator.Generate("android", "com.android.internal", &out));
102a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  out.Flush();
103ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
10409f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, HasSubstr("package com.android.internal;"));
10509f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, HasSubstr("public static final int one=0x01020000;"));
10609f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, Not(HasSubstr("two")));
10709f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, Not(HasSubstr("com_foo$two")));
108ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski}
1096f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
110ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam LesinskiTEST(JavaClassGeneratorTest, AttrPrivateIsWrittenAsAttr) {
111ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<ResourceTable> table =
112ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      test::ResourceTableBuilder()
113ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetPackageId("android", 0x01)
114ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddSimple("android:attr/two", ResourceId(0x01010001))
115ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddSimple("android:^attr-private/one", ResourceId(0x01010000))
116ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .Build();
117ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
118ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<IAaptContext> context =
119ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      test::ContextBuilder()
12009f4d706d9438980465faabe81ed143fc299343eAdam Lesinski          .AddSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
121ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetNameManglerPolicy(NameManglerPolicy{"android"})
122ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .Build();
123ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  JavaClassGenerator generator(context.get(), table.get(), {});
124a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski
125a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  std::string output;
126a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  StringOutputStream out(&output);
127ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  ASSERT_TRUE(generator.Generate("android", &out));
128a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  out.Flush();
129ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
13009f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, HasSubstr("public static final class attr"));
13109f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, Not(HasSubstr("public static final class ^attr-private")));
1326f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
1336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
134ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam LesinskiTEST(JavaClassGeneratorTest, OnlyWritePublicResources) {
135ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  StdErrDiagnostics diag;
136ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<ResourceTable> table =
137ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      test::ResourceTableBuilder()
138ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetPackageId("android", 0x01)
139ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddSimple("android:id/one", ResourceId(0x01020000))
140ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddSimple("android:id/two", ResourceId(0x01020001))
141ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddSimple("android:id/three", ResourceId(0x01020002))
14271be70507de9cb619b644e55eda1cc181e3f7e90Adam Lesinski          .SetSymbolState("android:id/one", ResourceId(0x01020000), Visibility::Level::kPublic)
14371be70507de9cb619b644e55eda1cc181e3f7e90Adam Lesinski          .SetSymbolState("android:id/two", ResourceId(0x01020001), Visibility::Level::kPrivate)
144ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .Build();
145ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
146ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<IAaptContext> context =
147ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      test::ContextBuilder()
14809f4d706d9438980465faabe81ed143fc299343eAdam Lesinski          .AddSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
149ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetNameManglerPolicy(NameManglerPolicy{"android"})
150ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .Build();
151ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
152ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  JavaClassGeneratorOptions options;
153ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.types = JavaClassGeneratorOptions::SymbolTypes::kPublic;
154ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  {
155ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    JavaClassGenerator generator(context.get(), table.get(), options);
156a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski    std::string output;
157a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski    StringOutputStream out(&output);
158ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    ASSERT_TRUE(generator.Generate("android", &out));
159a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski    out.Flush();
160a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski
16109f4d706d9438980465faabe81ed143fc299343eAdam Lesinski    EXPECT_THAT(output, HasSubstr("public static final int one=0x01020000;"));
16209f4d706d9438980465faabe81ed143fc299343eAdam Lesinski    EXPECT_THAT(output, Not(HasSubstr("two")));
16309f4d706d9438980465faabe81ed143fc299343eAdam Lesinski    EXPECT_THAT(output, Not(HasSubstr("three")));
164ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  }
1659e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
166ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.types = JavaClassGeneratorOptions::SymbolTypes::kPublicPrivate;
167ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  {
168ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    JavaClassGenerator generator(context.get(), table.get(), options);
169a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski    std::string output;
170a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski    StringOutputStream out(&output);
171ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    ASSERT_TRUE(generator.Generate("android", &out));
172a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski    out.Flush();
173a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski
17409f4d706d9438980465faabe81ed143fc299343eAdam Lesinski    EXPECT_THAT(output, HasSubstr("public static final int one=0x01020000;"));
17509f4d706d9438980465faabe81ed143fc299343eAdam Lesinski    EXPECT_THAT(output, HasSubstr("public static final int two=0x01020001;"));
17609f4d706d9438980465faabe81ed143fc299343eAdam Lesinski    EXPECT_THAT(output, Not(HasSubstr("three")));
177ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  }
1789e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
179ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.types = JavaClassGeneratorOptions::SymbolTypes::kAll;
180ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  {
181ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    JavaClassGenerator generator(context.get(), table.get(), options);
182a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski    std::string output;
183a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski    StringOutputStream out(&output);
184ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    ASSERT_TRUE(generator.Generate("android", &out));
185a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski    out.Flush();
186a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski
18709f4d706d9438980465faabe81ed143fc299343eAdam Lesinski    EXPECT_THAT(output, HasSubstr("public static final int one=0x01020000;"));
18809f4d706d9438980465faabe81ed143fc299343eAdam Lesinski    EXPECT_THAT(output, HasSubstr("public static final int two=0x01020001;"));
18909f4d706d9438980465faabe81ed143fc299343eAdam Lesinski    EXPECT_THAT(output, HasSubstr("public static final int three=0x01020002;"));
190ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  }
1919e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski}
1929e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
1931ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski/*
1941ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * TODO(adamlesinski): Re-enable this once we get merging working again.
1951ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * TEST(JavaClassGeneratorTest, EmitPackageMangledSymbols) {
196769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    ASSERT_TRUE(addResource(ResourceName{ {}, ResourceType::kId, u"foo" },
197769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski                            ResourceId{ 0x01, 0x02, 0x0000 }));
198769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    ResourceTable table;
199769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    table.setPackage(u"com.lib");
200ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    ASSERT_TRUE(table.addResource(ResourceName{ {}, ResourceType::kId, u"test"
201ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski}, {},
202ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                  Source{ "lib.xml", 33 },
203ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinskiutil::make_unique<Id>()));
204769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    ASSERT_TRUE(mTable->merge(std::move(table)));
205769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski
206330edcdf1316ed599fe0eb16a64330821fd92f18Adam Lesinski    Linker linker(mTable,
207ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                  std::make_shared<MockResolver>(mTable, std::map<ResourceName,
208ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam LesinskiResourceId>()),
209330edcdf1316ed599fe0eb16a64330821fd92f18Adam Lesinski                  {});
210769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    ASSERT_TRUE(linker.linkAndValidate());
211769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski
212769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    JavaClassGenerator generator(mTable, {});
213769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski
214769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    std::stringstream out;
215769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    EXPECT_TRUE(generator.generate(mTable->getPackage(), out));
216769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    std::string output = out.str();
217769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    EXPECT_NE(std::string::npos, output.find("int foo ="));
218769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    EXPECT_EQ(std::string::npos, output.find("int test ="));
219769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski
220769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    out.str("");
221769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    EXPECT_TRUE(generator.generate(u"com.lib", out));
222769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    output = out.str();
223769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    EXPECT_NE(std::string::npos, output.find("int test ="));
224769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    EXPECT_EQ(std::string::npos, output.find("int foo ="));
2251ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}*/
2261ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
2271ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST(JavaClassGeneratorTest, EmitOtherPackagesAttributesInStyleable) {
228ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<ResourceTable> table =
229ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      test::ResourceTableBuilder()
230ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetPackageId("android", 0x01)
231ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetPackageId("com.lib", 0x02)
23273bff1e8519bb73f17a801f45977d41b69b5b0d0Adam Lesinski          .AddValue("android:attr/bar", ResourceId(0x01010000), test::AttributeBuilder().Build())
23373bff1e8519bb73f17a801f45977d41b69b5b0d0Adam Lesinski          .AddValue("com.lib:attr/bar", ResourceId(0x02010000), test::AttributeBuilder().Build())
234ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddValue("android:styleable/foo", ResourceId(0x01030000),
235ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                    test::StyleableBuilder()
236ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                        .AddItem("android:attr/bar", ResourceId(0x01010000))
237ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                        .AddItem("com.lib:attr/bar", ResourceId(0x02010000))
238ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                        .Build())
239ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .Build();
240ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
241ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<IAaptContext> context =
242ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      test::ContextBuilder()
24309f4d706d9438980465faabe81ed143fc299343eAdam Lesinski          .AddSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
244ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetNameManglerPolicy(NameManglerPolicy{"android"})
245ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .Build();
246ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  JavaClassGenerator generator(context.get(), table.get(), {});
247ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
248a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  std::string output;
249a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  StringOutputStream out(&output);
250ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_TRUE(generator.Generate("android", &out));
251a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  out.Flush();
252ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
25309f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, HasSubstr("int foo_bar="));
25409f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, HasSubstr("int foo_com_lib_bar="));
255838a68705bc79527e592265371cbe4d8e888d9d9Adam Lesinski}
256769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski
2573b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam LesinskiTEST(JavaClassGeneratorTest, CommentsForSimpleResourcesArePresent) {
258ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<ResourceTable> table =
259ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      test::ResourceTableBuilder()
260ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetPackageId("android", 0x01)
261ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddSimple("android:id/foo", ResourceId(0x01010000))
262ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .Build();
263ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  test::GetValue<Id>(table.get(), "android:id/foo")
264ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      ->SetComment(std::string("This is a comment\n@deprecated"));
265ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
266ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<IAaptContext> context =
267ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      test::ContextBuilder()
26809f4d706d9438980465faabe81ed143fc299343eAdam Lesinski          .AddSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
269ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetNameManglerPolicy(NameManglerPolicy{"android"})
270ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .Build();
271ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  JavaClassGenerator generator(context.get(), table.get(), {});
272a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski
273a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  std::string output;
274a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  StringOutputStream out(&output);
275ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  ASSERT_TRUE(generator.Generate("android", &out));
276a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  out.Flush();
277ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
27809f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  const char* expected_text =
279ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      R"EOF(/**
2803b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski     * This is a comment
2813b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski     * @deprecated
2823b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski     */
2833b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski    @Deprecated
284803c7c807969bea1f1c50f348832f5b60ad05d8eAdam Lesinski    public static final int foo=0x01010000;)EOF";
28509f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, HasSubstr(expected_text));
2863b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski}
2873b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski
288ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam LesinskiTEST(JavaClassGeneratorTest, CommentsForEnumAndFlagAttributesArePresent) {}
289ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
290ceb9b2f80f853059233cdd29057f39a5960a74aeAdam LesinskiTEST(JavaClassGeneratorTest, CommentsForStyleablesAndNestedAttributesArePresent) {
29173bff1e8519bb73f17a801f45977d41b69b5b0d0Adam Lesinski  Attribute attr;
292ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr.SetComment(StringPiece("This is an attribute"));
293ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
294ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  Styleable styleable;
29509f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  styleable.entries.push_back(Reference(test::ParseNameOrDie("android:attr/one")));
296ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  styleable.SetComment(StringPiece("This is a styleable"));
297ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
298ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<ResourceTable> table =
299ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      test::ResourceTableBuilder()
300ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetPackageId("android", 0x01)
301ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddValue("android:attr/one", util::make_unique<Attribute>(attr))
302ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddValue("android:styleable/Container",
303ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                    std::unique_ptr<Styleable>(styleable.Clone(nullptr)))
304ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .Build();
305ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
306ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<IAaptContext> context =
307ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      test::ContextBuilder()
30809f4d706d9438980465faabe81ed143fc299343eAdam Lesinski          .AddSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
309ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetNameManglerPolicy(NameManglerPolicy{"android"})
310ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .Build();
311ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  JavaClassGeneratorOptions options;
312ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.use_final = false;
313ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  JavaClassGenerator generator(context.get(), table.get(), options);
314a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski
315a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  std::string output;
316a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  StringOutputStream out(&output);
317ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  ASSERT_TRUE(generator.Generate("android", &out));
318a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  out.Flush();
319ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
32009f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, HasSubstr("attr name android:one"));
32109f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, HasSubstr("attr description"));
32209f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, HasSubstr(attr.GetComment()));
32309f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, HasSubstr(styleable.GetComment()));
3243b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski}
3253b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski
326761d4341fcbb711f55d73a31e79098837146236dAdam LesinskiTEST(JavaClassGeneratorTest, StyleableAndIndicesAreColocated) {
327761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski  std::unique_ptr<ResourceTable> table =
328761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski      test::ResourceTableBuilder()
329761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski          .SetPackageId("android", 0x01)
330761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski          .AddValue("android:attr/layout_gravity", util::make_unique<Attribute>())
331761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski          .AddValue("android:attr/background", util::make_unique<Attribute>())
332761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski          .AddValue("android:styleable/ActionBar",
333761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski                    test::StyleableBuilder()
334761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski                        .AddItem("android:attr/background", ResourceId(0x01010000))
335761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski                        .Build())
336761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski          .AddValue("android:styleable/ActionBar.LayoutParams",
337761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski                    test::StyleableBuilder()
338761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski                        .AddItem("android:attr/layout_gravity", ResourceId(0x01010001))
339761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski                        .Build())
340761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski          .Build();
341761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski
342761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski  std::unique_ptr<IAaptContext> context =
343761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski      test::ContextBuilder()
344761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski          .AddSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
345761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski          .SetNameManglerPolicy(NameManglerPolicy{"android"})
346761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski          .Build();
347761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski
348761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski  JavaClassGeneratorOptions options;
349761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski  JavaClassGenerator generator(context.get(), table.get(), {});
350a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski
351a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  std::string output;
352a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  StringOutputStream out(&output);
353761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski  ASSERT_TRUE(generator.Generate("android", &out));
354a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  out.Flush();
355761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski
356761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski  std::string::size_type actionbar_pos = output.find("int[] ActionBar");
357761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski  ASSERT_THAT(actionbar_pos, Ne(std::string::npos));
358761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski
359761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski  std::string::size_type actionbar_background_pos = output.find("int ActionBar_background");
360761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski  ASSERT_THAT(actionbar_background_pos, Ne(std::string::npos));
361761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski
362761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski  std::string::size_type actionbar_layout_params_pos = output.find("int[] ActionBar_LayoutParams");
363761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski  ASSERT_THAT(actionbar_layout_params_pos, Ne(std::string::npos));
364761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski
365761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski  std::string::size_type actionbar_layout_params_layout_gravity_pos =
366761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski      output.find("int ActionBar_LayoutParams_layout_gravity");
367761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski  ASSERT_THAT(actionbar_layout_params_layout_gravity_pos, Ne(std::string::npos));
368761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski
369761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski  EXPECT_THAT(actionbar_pos, Lt(actionbar_background_pos));
370761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski  EXPECT_THAT(actionbar_pos, Lt(actionbar_layout_params_pos));
371761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski  EXPECT_THAT(actionbar_background_pos, Lt(actionbar_layout_params_pos));
372761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski  EXPECT_THAT(actionbar_layout_params_pos, Lt(actionbar_layout_params_layout_gravity_pos));
373761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski}
374761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski
375feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael WrightTEST(JavaClassGeneratorTest, CommentsForRemovedAttributesAreNotPresentInClass) {
37673bff1e8519bb73f17a801f45977d41b69b5b0d0Adam Lesinski  Attribute attr;
377ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr.SetComment(StringPiece("removed"));
378ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
379ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<ResourceTable> table =
380ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      test::ResourceTableBuilder()
381ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetPackageId("android", 0x01)
382ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddValue("android:attr/one", util::make_unique<Attribute>(attr))
383ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .Build();
384ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
385ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<IAaptContext> context =
386ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      test::ContextBuilder()
38709f4d706d9438980465faabe81ed143fc299343eAdam Lesinski          .AddSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
388ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetNameManglerPolicy(NameManglerPolicy{"android"})
389ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .Build();
390ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  JavaClassGeneratorOptions options;
391ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.use_final = false;
392ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  JavaClassGenerator generator(context.get(), table.get(), options);
393a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski
394a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  std::string output;
395a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  StringOutputStream out(&output);
396ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  ASSERT_TRUE(generator.Generate("android", &out));
397a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  out.Flush();
398ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
39909f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, Not(HasSubstr("@attr name android:one")));
40009f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, Not(HasSubstr("@attr description")));
401ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
402ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  // We should find @removed only in the attribute javadoc and not anywhere else
40309f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  // (i.e. the class javadoc).
40409f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  const std::string kRemoved("removed");
40509f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  ASSERT_THAT(output, HasSubstr(kRemoved));
40609f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  std::string after_first_match = output.substr(output.find(kRemoved) + kRemoved.size());
40709f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(after_first_match, Not(HasSubstr(kRemoved)));
408feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright}
409feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright
410ceb9b2f80f853059233cdd29057f39a5960a74aeAdam LesinskiTEST(JavaClassGeneratorTest, GenerateOnResourcesLoadedCallbackForSharedLibrary) {
411ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski  std::unique_ptr<ResourceTable> table =
412ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski      test::ResourceTableBuilder()
413ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski          .SetPackageId("android", 0x00)
41473bff1e8519bb73f17a801f45977d41b69b5b0d0Adam Lesinski          .AddValue("android:attr/foo", ResourceId(0x00010000), util::make_unique<Attribute>())
415ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski          .AddValue("android:id/foo", ResourceId(0x00020000), util::make_unique<Id>())
416ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski          .AddValue(
417ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski              "android:style/foo", ResourceId(0x00030000),
418ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski              test::StyleBuilder()
419ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski                  .AddItem("android:attr/foo", ResourceId(0x00010000), util::make_unique<Id>())
420ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski                  .Build())
421ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski          .Build();
422ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski
423ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski  std::unique_ptr<IAaptContext> context =
424ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski      test::ContextBuilder().SetPackageId(0x00).SetCompilationPackage("android").Build();
425ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski
426ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski  JavaClassGeneratorOptions options;
427ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski  options.use_final = false;
42809f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  options.rewrite_callback_options = OnResourcesLoadedCallbackOptions{{"com.foo", "com.boo"}};
429ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski  JavaClassGenerator generator(context.get(), table.get(), options);
430ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski
431a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  std::string output;
432a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  StringOutputStream out(&output);
433ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski  ASSERT_TRUE(generator.Generate("android", &out));
434a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  out.Flush();
435ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski
43609f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, HasSubstr("void onResourcesLoaded"));
43709f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, HasSubstr("com.foo.R.onResourcesLoaded"));
43809f4d706d9438980465faabe81ed143fc299343eAdam Lesinski  EXPECT_THAT(output, HasSubstr("com.boo.R.onResourcesLoaded"));
439ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski}
440ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski
441ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski}  // namespace aapt
442