JavaClassGenerator_test.cpp revision ca5638fd85098c3d0a699492751043545f75553a
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#include "util/Util.h"
191ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
201ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "test/Builders.h"
216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <gtest/gtest.h>
236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <sstream>
246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <string>
256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskinamespace aapt {
276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
281ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST(JavaClassGeneratorTest, FailWhenEntryIsJavaKeyword) {
291ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
301ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .setPackageId(u"android", 0x01)
311ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .addSimple(u"@android:id/class", ResourceId(0x01020000))
321ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .build();
336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
341ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    JavaClassGenerator generator(table.get(), {});
356f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
366f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    std::stringstream out;
371ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    EXPECT_FALSE(generator.generate(u"android", &out));
386f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
396f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
401ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST(JavaClassGeneratorTest, TransformInvalidJavaIdentifierCharacter) {
411ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
421ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .setPackageId(u"android", 0x01)
431ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .addSimple(u"@android:id/hey-man", ResourceId(0x01020000))
441ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .addSimple(u"@android:attr/cool.attr", ResourceId(0x01010000))
451ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .addValue(u"@android:styleable/hey.dude", ResourceId(0x01030000),
461ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                      test::StyleableBuilder()
471ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                              .addItem(u"@android:attr/cool.attr", ResourceId(0x01010000))
481ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                              .build())
491ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .build();
506f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
511ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    JavaClassGenerator generator(table.get(), {});
526f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
536f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    std::stringstream out;
541ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    EXPECT_TRUE(generator.generate(u"android", &out));
551ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
566f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    std::string output = out.str();
576f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
586f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_NE(std::string::npos,
596f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski              output.find("public static final int hey_man = 0x01020000;"));
606f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
616f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_NE(std::string::npos,
626f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski              output.find("public static final int[] hey_dude = {"));
636f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
646f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_NE(std::string::npos,
656f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski              output.find("public static final int hey_dude_cool_attr = 0;"));
666f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
676f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
689e10ac70155c993e7053323ad36beaea7bf7d54fAdam LesinskiTEST(JavaClassGeneratorTest, CorrectPackageNameIsUsed) {
699e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
709e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .setPackageId(u"android", 0x01)
719e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .addSimple(u"@android:id/one", ResourceId(0x01020000))
729e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .addSimple(u"@android:id/com.foo$two", ResourceId(0x01020001))
739e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .build();
749e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
759e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    JavaClassGenerator generator(table.get(), {});
769e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    std::stringstream out;
779e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    ASSERT_TRUE(generator.generate(u"android", u"com.android.internal", &out));
789e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
799e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    std::string output = out.str();
809e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    EXPECT_NE(std::string::npos, output.find("package com.android.internal;"));
819e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    EXPECT_NE(std::string::npos, output.find("public static final int one = 0x01020000;"));
829e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    EXPECT_EQ(std::string::npos, output.find("two"));
839e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    EXPECT_EQ(std::string::npos, output.find("com_foo$two"));
849e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski}
859e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
869e10ac70155c993e7053323ad36beaea7bf7d54fAdam LesinskiTEST(JavaClassGeneratorTest, AttrPrivateIsWrittenAsAttr) {
879e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
889e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .setPackageId(u"android", 0x01)
899e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .addSimple(u"@android:^attr-private/one", ResourceId(0x01010000))
909e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .build();
919e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
929e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    JavaClassGenerator generator(table.get(), {});
939e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    std::stringstream out;
949e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    ASSERT_TRUE(generator.generate(u"android", &out));
959e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
969e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    std::string output = out.str();
979e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    EXPECT_NE(std::string::npos, output.find("public static final class attr"));
989e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    EXPECT_EQ(std::string::npos, output.find("public static final class ^attr-private"));
999e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski}
1009e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
1019e10ac70155c993e7053323ad36beaea7bf7d54fAdam LesinskiTEST(JavaClassGeneratorTest, OnlyWritePublicResources) {
1029e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    StdErrDiagnostics diag;
1039e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
1049e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .setPackageId(u"android", 0x01)
1059e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .addSimple(u"@android:id/one", ResourceId(0x01020000))
1069e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .addSimple(u"@android:id/two", ResourceId(0x01020001))
1079e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .addSimple(u"@android:id/three", ResourceId(0x01020002))
108e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski            .setSymbolState(u"@android:id/one", ResourceId(0x01020000), SymbolState::kPublic)
109e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski            .setSymbolState(u"@android:id/two", ResourceId(0x01020001), SymbolState::kPrivate)
1109e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski            .build();
1119e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
1129e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    JavaClassGeneratorOptions options;
1139e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    options.types = JavaClassGeneratorOptions::SymbolTypes::kPublic;
1149e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    {
1159e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        JavaClassGenerator generator(table.get(), options);
1169e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        std::stringstream out;
1179e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        ASSERT_TRUE(generator.generate(u"android", &out));
1189e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        std::string output = out.str();
1199e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        EXPECT_NE(std::string::npos, output.find("public static final int one = 0x01020000;"));
1209e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        EXPECT_EQ(std::string::npos, output.find("two"));
1219e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        EXPECT_EQ(std::string::npos, output.find("three"));
1229e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    }
1239e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
1249e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    options.types = JavaClassGeneratorOptions::SymbolTypes::kPublicPrivate;
1259e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    {
1269e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        JavaClassGenerator generator(table.get(), options);
1279e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        std::stringstream out;
1289e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        ASSERT_TRUE(generator.generate(u"android", &out));
1299e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        std::string output = out.str();
1309e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        EXPECT_NE(std::string::npos, output.find("public static final int one = 0x01020000;"));
1319e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        EXPECT_NE(std::string::npos, output.find("public static final int two = 0x01020001;"));
1329e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        EXPECT_EQ(std::string::npos, output.find("three"));
1339e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    }
1349e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
1359e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    options.types = JavaClassGeneratorOptions::SymbolTypes::kAll;
1369e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    {
1379e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        JavaClassGenerator generator(table.get(), options);
1389e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        std::stringstream out;
1399e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        ASSERT_TRUE(generator.generate(u"android", &out));
1409e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        std::string output = out.str();
1419e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        EXPECT_NE(std::string::npos, output.find("public static final int one = 0x01020000;"));
1429e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        EXPECT_NE(std::string::npos, output.find("public static final int two = 0x01020001;"));
1439e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        EXPECT_NE(std::string::npos, output.find("public static final int three = 0x01020002;"));
1449e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski    }
1459e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski}
1469e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski
1471ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski/*
1481ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * TODO(adamlesinski): Re-enable this once we get merging working again.
1491ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * TEST(JavaClassGeneratorTest, EmitPackageMangledSymbols) {
150769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    ASSERT_TRUE(addResource(ResourceName{ {}, ResourceType::kId, u"foo" },
151769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski                            ResourceId{ 0x01, 0x02, 0x0000 }));
152769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    ResourceTable table;
153769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    table.setPackage(u"com.lib");
154769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    ASSERT_TRUE(table.addResource(ResourceName{ {}, ResourceType::kId, u"test" }, {},
1551ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                                  Source{ "lib.xml", 33 }, util::make_unique<Id>()));
156769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    ASSERT_TRUE(mTable->merge(std::move(table)));
157769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski
158330edcdf1316ed599fe0eb16a64330821fd92f18Adam Lesinski    Linker linker(mTable,
159330edcdf1316ed599fe0eb16a64330821fd92f18Adam Lesinski                  std::make_shared<MockResolver>(mTable, std::map<ResourceName, ResourceId>()),
160330edcdf1316ed599fe0eb16a64330821fd92f18Adam Lesinski                  {});
161769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    ASSERT_TRUE(linker.linkAndValidate());
162769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski
163769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    JavaClassGenerator generator(mTable, {});
164769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski
165769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    std::stringstream out;
166769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    EXPECT_TRUE(generator.generate(mTable->getPackage(), out));
167769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    std::string output = out.str();
168769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    EXPECT_NE(std::string::npos, output.find("int foo ="));
169769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    EXPECT_EQ(std::string::npos, output.find("int test ="));
170769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski
171769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    out.str("");
172769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    EXPECT_TRUE(generator.generate(u"com.lib", out));
173769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    output = out.str();
174769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    EXPECT_NE(std::string::npos, output.find("int test ="));
175769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski    EXPECT_EQ(std::string::npos, output.find("int foo ="));
1761ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}*/
1771ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
1781ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST(JavaClassGeneratorTest, EmitOtherPackagesAttributesInStyleable) {
1791ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
1801ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                .setPackageId(u"android", 0x01)
1811ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                .setPackageId(u"com.lib", 0x02)
1821ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                .addSimple(u"@android:attr/bar", ResourceId(0x01010000))
1831ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                .addSimple(u"@com.lib:attr/bar", ResourceId(0x02010000))
1841ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                .addValue(u"@android:styleable/foo", ResourceId(0x01030000),
1851ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                          test::StyleableBuilder()
1861ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                                  .addItem(u"@android:attr/bar", ResourceId(0x01010000))
1871ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                                  .addItem(u"@com.lib:attr/bar", ResourceId(0x02010000))
1881ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                                  .build())
1891ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                .build();
1901ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
1911ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    JavaClassGenerator generator(table.get(), {});
192838a68705bc79527e592265371cbe4d8e888d9d9Adam Lesinski
193838a68705bc79527e592265371cbe4d8e888d9d9Adam Lesinski    std::stringstream out;
1941ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    EXPECT_TRUE(generator.generate(u"android", &out));
1951ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
196838a68705bc79527e592265371cbe4d8e888d9d9Adam Lesinski    std::string output = out.str();
1971ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    EXPECT_NE(std::string::npos, output.find("int foo_bar ="));
1981ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    EXPECT_NE(std::string::npos, output.find("int foo_com_lib_bar ="));
199838a68705bc79527e592265371cbe4d8e888d9d9Adam Lesinski}
200769de98f2dd41bfe39a1c9f76aefd1ad58942733Adam Lesinski
2016f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} // namespace aapt
202