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