JavaClassGenerator_test.cpp revision feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8
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"
187656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski#include "test/Test.h"
191ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "util/Util.h"
201ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <sstream>
226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <string>
236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskinamespace aapt {
256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
261ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST(JavaClassGeneratorTest, FailWhenEntryIsJavaKeyword) {
271ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
281ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .setPackageId(u"android", 0x01)
291ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .addSimple(u"@android:id/class", ResourceId(0x01020000))
301ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .build();
316f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
327656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
337656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
347656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .setNameManglerPolicy(NameManglerPolicy{ u"android" })
357656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .build();
367656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski    JavaClassGenerator generator(context.get(), table.get(), {});
376f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
386f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    std::stringstream out;
391ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    EXPECT_FALSE(generator.generate(u"android", &out));
406f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
416f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
421ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST(JavaClassGeneratorTest, TransformInvalidJavaIdentifierCharacter) {
431ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
441ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .setPackageId(u"android", 0x01)
451ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .addSimple(u"@android:id/hey-man", ResourceId(0x01020000))
46626b3dbf74f02ae630ae0089632f5962340694dcAdam Lesinski            .addValue(u"@android:attr/cool.attr", ResourceId(0x01010000),
47626b3dbf74f02ae630ae0089632f5962340694dcAdam Lesinski                      test::AttributeBuilder(false).build())
481ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .addValue(u"@android:styleable/hey.dude", ResourceId(0x01030000),
491ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                      test::StyleableBuilder()
501ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                              .addItem(u"@android:attr/cool.attr", ResourceId(0x01010000))
511ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                              .build())
521ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .build();
536f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
547656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
557656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
567656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .setNameManglerPolicy(NameManglerPolicy{ u"android" })
577656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .build();
587656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski    JavaClassGenerator generator(context.get(), table.get(), {});
596f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
606f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    std::stringstream out;
611ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    EXPECT_TRUE(generator.generate(u"android", &out));
621ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
636f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    std::string output = out.str();
646f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
656f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_NE(std::string::npos,
66b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski              output.find("public static final int hey_man=0x01020000;"));
676f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
686f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_NE(std::string::npos,
69b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski              output.find("public static final int[] hey_dude={"));
706f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
716f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_NE(std::string::npos,
72b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski              output.find("public static final int hey_dude_cool_attr=0;"));
736f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
746f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
759e10ac70155c993e7053323ad36beaea7bf7d54fAdam LesinskiTEST(JavaClassGeneratorTest, CorrectPackageNameIsUsed) {
769e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
779e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .setPackageId(u"android", 0x01)
789e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .addSimple(u"@android:id/one", ResourceId(0x01020000))
799e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .addSimple(u"@android:id/com.foo$two", ResourceId(0x01020001))
809e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .build();
819e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
827656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
837656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
847656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .setNameManglerPolicy(NameManglerPolicy{ u"android" })
857656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .build();
867656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski    JavaClassGenerator generator(context.get(), table.get(), {});
879e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    std::stringstream out;
889e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    ASSERT_TRUE(generator.generate(u"android", u"com.android.internal", &out));
899e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
909e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    std::string output = out.str();
919e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    EXPECT_NE(std::string::npos, output.find("package com.android.internal;"));
92b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski    EXPECT_NE(std::string::npos, output.find("public static final int one=0x01020000;"));
939e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    EXPECT_EQ(std::string::npos, output.find("two"));
949e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    EXPECT_EQ(std::string::npos, output.find("com_foo$two"));
959e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski}
969e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
979e10ac70155c993e7053323ad36beaea7bf7d54fAdam LesinskiTEST(JavaClassGeneratorTest, AttrPrivateIsWrittenAsAttr) {
989e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
999e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .setPackageId(u"android", 0x01)
100b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski            .addSimple(u"@android:attr/two", ResourceId(0x01010001))
1019e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .addSimple(u"@android:^attr-private/one", ResourceId(0x01010000))
1029e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .build();
1039e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
1047656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
1057656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
1067656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .setNameManglerPolicy(NameManglerPolicy{ u"android" })
1077656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .build();
1087656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski    JavaClassGenerator generator(context.get(), table.get(), {});
1099e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    std::stringstream out;
1109e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    ASSERT_TRUE(generator.generate(u"android", &out));
1119e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
1129e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    std::string output = out.str();
1139e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    EXPECT_NE(std::string::npos, output.find("public static final class attr"));
1149e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    EXPECT_EQ(std::string::npos, output.find("public static final class ^attr-private"));
1159e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski}
1169e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
1179e10ac70155c993e7053323ad36beaea7bf7d54fAdam LesinskiTEST(JavaClassGeneratorTest, OnlyWritePublicResources) {
1189e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    StdErrDiagnostics diag;
1199e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
1209e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .setPackageId(u"android", 0x01)
1219e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .addSimple(u"@android:id/one", ResourceId(0x01020000))
1229e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .addSimple(u"@android:id/two", ResourceId(0x01020001))
1239e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .addSimple(u"@android:id/three", ResourceId(0x01020002))
124e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski            .setSymbolState(u"@android:id/one", ResourceId(0x01020000), SymbolState::kPublic)
125e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski            .setSymbolState(u"@android:id/two", ResourceId(0x01020001), SymbolState::kPrivate)
1269e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .build();
1279e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
1287656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
1297656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
1307656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .setNameManglerPolicy(NameManglerPolicy{ u"android" })
1317656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .build();
1327656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski
1339e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    JavaClassGeneratorOptions options;
1349e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    options.types = JavaClassGeneratorOptions::SymbolTypes::kPublic;
1359e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    {
1367656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski        JavaClassGenerator generator(context.get(), table.get(), options);
1379e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        std::stringstream out;
1389e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        ASSERT_TRUE(generator.generate(u"android", &out));
1399e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        std::string output = out.str();
140b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski        EXPECT_NE(std::string::npos, output.find("public static final int one=0x01020000;"));
1419e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        EXPECT_EQ(std::string::npos, output.find("two"));
1429e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        EXPECT_EQ(std::string::npos, output.find("three"));
1439e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    }
1449e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
1459e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    options.types = JavaClassGeneratorOptions::SymbolTypes::kPublicPrivate;
1469e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    {
1477656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski        JavaClassGenerator generator(context.get(), table.get(), options);
1489e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        std::stringstream out;
1499e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        ASSERT_TRUE(generator.generate(u"android", &out));
1509e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        std::string output = out.str();
151b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski        EXPECT_NE(std::string::npos, output.find("public static final int one=0x01020000;"));
152b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski        EXPECT_NE(std::string::npos, output.find("public static final int two=0x01020001;"));
1539e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        EXPECT_EQ(std::string::npos, output.find("three"));
1549e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    }
1559e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
1569e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    options.types = JavaClassGeneratorOptions::SymbolTypes::kAll;
1579e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    {
1587656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski        JavaClassGenerator generator(context.get(), table.get(), options);
1599e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        std::stringstream out;
1609e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        ASSERT_TRUE(generator.generate(u"android", &out));
1619e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        std::string output = out.str();
162b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski        EXPECT_NE(std::string::npos, output.find("public static final int one=0x01020000;"));
163b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski        EXPECT_NE(std::string::npos, output.find("public static final int two=0x01020001;"));
164b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski        EXPECT_NE(std::string::npos, output.find("public static final int three=0x01020002;"));
1659e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    }
1669e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski}
1679e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
1681ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski/*
1691ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * TODO(adamlesinski): Re-enable this once we get merging working again.
1701ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * TEST(JavaClassGeneratorTest, EmitPackageMangledSymbols) {
171769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    ASSERT_TRUE(addResource(ResourceName{ {}, ResourceType::kId, u"foo" },
172769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski                            ResourceId{ 0x01, 0x02, 0x0000 }));
173769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    ResourceTable table;
174769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    table.setPackage(u"com.lib");
175769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    ASSERT_TRUE(table.addResource(ResourceName{ {}, ResourceType::kId, u"test" }, {},
1761ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                                  Source{ "lib.xml", 33 }, util::make_unique<Id>()));
177769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    ASSERT_TRUE(mTable->merge(std::move(table)));
178769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski
179330edcdf1316ed599fe0eb16a64330821fd92f18Adam Lesinski    Linker linker(mTable,
180330edcdf1316ed599fe0eb16a64330821fd92f18Adam Lesinski                  std::make_shared<MockResolver>(mTable, std::map<ResourceName, ResourceId>()),
181330edcdf1316ed599fe0eb16a64330821fd92f18Adam Lesinski                  {});
182769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    ASSERT_TRUE(linker.linkAndValidate());
183769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski
184769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    JavaClassGenerator generator(mTable, {});
185769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski
186769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    std::stringstream out;
187769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    EXPECT_TRUE(generator.generate(mTable->getPackage(), out));
188769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    std::string output = out.str();
189769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    EXPECT_NE(std::string::npos, output.find("int foo ="));
190769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    EXPECT_EQ(std::string::npos, output.find("int test ="));
191769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski
192769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    out.str("");
193769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    EXPECT_TRUE(generator.generate(u"com.lib", out));
194769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    output = out.str();
195769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    EXPECT_NE(std::string::npos, output.find("int test ="));
196769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    EXPECT_EQ(std::string::npos, output.find("int foo ="));
1971ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}*/
1981ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
1991ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST(JavaClassGeneratorTest, EmitOtherPackagesAttributesInStyleable) {
2001ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
2011ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                .setPackageId(u"android", 0x01)
2021ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                .setPackageId(u"com.lib", 0x02)
203626b3dbf74f02ae630ae0089632f5962340694dcAdam Lesinski                .addValue(u"@android:attr/bar", ResourceId(0x01010000),
204626b3dbf74f02ae630ae0089632f5962340694dcAdam Lesinski                          test::AttributeBuilder(false).build())
205626b3dbf74f02ae630ae0089632f5962340694dcAdam Lesinski                .addValue(u"@com.lib:attr/bar", ResourceId(0x02010000),
206626b3dbf74f02ae630ae0089632f5962340694dcAdam Lesinski                           test::AttributeBuilder(false).build())
2071ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                .addValue(u"@android:styleable/foo", ResourceId(0x01030000),
2081ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                          test::StyleableBuilder()
2091ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                                  .addItem(u"@android:attr/bar", ResourceId(0x01010000))
2101ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                                  .addItem(u"@com.lib:attr/bar", ResourceId(0x02010000))
2111ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                                  .build())
2121ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                .build();
2131ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
2147656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
2157656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
2167656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .setNameManglerPolicy(NameManglerPolicy{ u"android" })
2177656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .build();
2187656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski    JavaClassGenerator generator(context.get(), table.get(), {});
219838a68705bc79527e592265371cbe4d8e888d9d9Adam Lesinski
220838a68705bc79527e592265371cbe4d8e888d9d9Adam Lesinski    std::stringstream out;
2211ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    EXPECT_TRUE(generator.generate(u"android", &out));
2221ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
223838a68705bc79527e592265371cbe4d8e888d9d9Adam Lesinski    std::string output = out.str();
224b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski    EXPECT_NE(std::string::npos, output.find("int foo_bar="));
225b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski    EXPECT_NE(std::string::npos, output.find("int foo_com_lib_bar="));
226838a68705bc79527e592265371cbe4d8e888d9d9Adam Lesinski}
227769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski
2283b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam LesinskiTEST(JavaClassGeneratorTest, CommentsForSimpleResourcesArePresent) {
2293b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
2303b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski            .setPackageId(u"android", 0x01)
2313b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski            .addSimple(u"@android:id/foo", ResourceId(0x01010000))
2323b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski            .build();
2333b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski    test::getValue<Id>(table.get(), u"@android:id/foo")
2343b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski            ->setComment(std::u16string(u"This is a comment\n@deprecated"));
2353b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski
2367656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
2377656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
2387656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .setNameManglerPolicy(NameManglerPolicy{ u"android" })
2397656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .build();
2407656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski    JavaClassGenerator generator(context.get(), table.get(), {});
2413b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski    std::stringstream out;
2423b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski    ASSERT_TRUE(generator.generate(u"android", &out));
2433b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski    std::string actual = out.str();
2443b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski
245803c7c807969bea1f1c50f348832f5b60ad05d8eAdam Lesinski    const char* expectedText =
246803c7c807969bea1f1c50f348832f5b60ad05d8eAdam LesinskiR"EOF(/**
2473b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski     * This is a comment
2483b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski     * @deprecated
2493b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski     */
2503b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski    @Deprecated
251803c7c807969bea1f1c50f348832f5b60ad05d8eAdam Lesinski    public static final int foo=0x01010000;)EOF";
252803c7c807969bea1f1c50f348832f5b60ad05d8eAdam Lesinski
253803c7c807969bea1f1c50f348832f5b60ad05d8eAdam Lesinski    EXPECT_NE(std::string::npos, actual.find(expectedText));
2543b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski}
2553b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski
2563b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam LesinskiTEST(JavaClassGeneratorTest, CommentsForEnumAndFlagAttributesArePresent) {
2573b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski
2583b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski}
2593b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski
2603b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam LesinskiTEST(JavaClassGeneratorTest, CommentsForStyleablesAndNestedAttributesArePresent) {
26174605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski    Attribute attr(false);
26274605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski    attr.setComment(StringPiece16(u"This is an attribute"));
2633b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski
26474605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski    Styleable styleable;
26574605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski    styleable.entries.push_back(Reference(test::parseNameOrDie(u"@android:attr/one")));
26674605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski    styleable.setComment(StringPiece16(u"This is a styleable"));
26774605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski
26874605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
26974605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski            .setPackageId(u"android", 0x01)
27074605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski            .addValue(u"@android:attr/one", util::make_unique<Attribute>(attr))
27174605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski            .addValue(u"@android:styleable/Container",
27274605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski                      std::unique_ptr<Styleable>(styleable.clone(nullptr)))
27374605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski            .build();
27474605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski
2757656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
2767656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
2777656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .setNameManglerPolicy(NameManglerPolicy{ u"android" })
2787656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski            .build();
27974605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski    JavaClassGeneratorOptions options;
28074605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski    options.useFinal = false;
2817656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski    JavaClassGenerator generator(context.get(), table.get(), options);
28274605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski    std::stringstream out;
28374605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski    ASSERT_TRUE(generator.generate(u"android", &out));
28474605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski    std::string actual = out.str();
28574605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski
28674605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski    EXPECT_NE(std::string::npos, actual.find("@attr name android:one"));
28774605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski    EXPECT_NE(std::string::npos, actual.find("@attr description"));
28874605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski    EXPECT_NE(std::string::npos, actual.find(util::utf16ToUtf8(attr.getComment())));
28974605cd40256ca75b44cc3182eeeb886c92d737cAdam Lesinski    EXPECT_NE(std::string::npos, actual.find(util::utf16ToUtf8(styleable.getComment())));
2903b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski}
2913b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski
292feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael WrightTEST(JavaClassGeneratorTest, CommentsForRemovedAttributesAreNotPresentInClass) {
293feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright    Attribute attr(false);
294feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright    attr.setComment(StringPiece16(u"@removed"));
295feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright
296feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright
297feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
298feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright            .setPackageId(u"android", 0x01)
299feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright            .addValue(u"@android:attr/one", util::make_unique<Attribute>(attr))
300feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright            .build();
301feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright
302feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
303feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
304feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright            .setNameManglerPolicy(NameManglerPolicy{ u"android" })
305feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright            .build();
306feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright    JavaClassGeneratorOptions options;
307feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright    options.useFinal = false;
308feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright    JavaClassGenerator generator(context.get(), table.get(), options);
309feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright    std::stringstream out;
310feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright    ASSERT_TRUE(generator.generate(u"android", &out));
311feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright    std::string actual = out.str();
312feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright
313feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright    std::cout << actual << std::endl;
314feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright
315feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright    EXPECT_EQ(std::string::npos, actual.find("@attr name android:one"));
316feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright    EXPECT_EQ(std::string::npos, actual.find("@attr description"));
317feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright
318feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright    // We should find @removed only in the attribute javadoc and not anywhere else (i.e. the class
319feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright    // javadoc).
320feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright    const size_t pos = actual.find("@removed");
321feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright    EXPECT_NE(std::string::npos, pos);
322feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright    EXPECT_EQ(std::string::npos, actual.find("@removed", pos + 1));
323feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright}
324feaf99fa1b7563f15dbd4211718a6cfb7a3cc3c8Michael Wright
3256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} // namespace aapt
326