17a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski/* 27a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski * Copyright (C) 2016 The Android Open Source Project 37a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski * 47a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 57a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski * you may not use this file except in compliance with the License. 67a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski * You may obtain a copy of the License at 77a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski * 87a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 97a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski * 107a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski * Unless required by applicable law or agreed to in writing, software 117a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 127a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski * See the License for the specific language governing permissions and 147a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski * limitations under the License. 157a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski */ 167a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 177a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski#include "androidfw/AttributeResolution.h" 18ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinski 1906d3e8fec7e2b29f99d755bee849023d88957953Adam Lesinski#include <array> 2006d3e8fec7e2b29f99d755bee849023d88957953Adam Lesinski 21ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinski#include "android-base/file.h" 22ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinski#include "android-base/logging.h" 23ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinski#include "android-base/macros.h" 24ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinski 257a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski#include "TestHelpers.h" 267a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski#include "data/styles/R.h" 277a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 287a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinskiusing com::android::app::R; 297a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 30ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinskinamespace android { 31ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinski 327a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinskiclass AttributeResolutionTest : public ::testing::Test { 337a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski public: 347a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski virtual void SetUp() override { 357a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski std::string contents; 364c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ASSERT_TRUE(ReadFileFromZipToString( 374c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski GetTestDataPath() + "/styles/styles.apk", "resources.arsc", &contents)); 384c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ASSERT_EQ(NO_ERROR, table_.add(contents.data(), contents.size(), 394c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski 1 /*cookie*/, true /*copyData*/)); 407a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski } 417a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 427a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski protected: 437a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski ResTable table_; 447a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski}; 457a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 467a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinskiclass AttributeResolutionXmlTest : public AttributeResolutionTest { 477a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski public: 487a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski virtual void SetUp() override { 497a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski AttributeResolutionTest::SetUp(); 504c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski 517a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski std::string contents; 524c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ASSERT_TRUE( 534c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ReadFileFromZipToString(GetTestDataPath() + "/styles/styles.apk", 544c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski "res/layout/layout.xml", &contents)); 554c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski 564c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ASSERT_EQ(NO_ERROR, xml_parser_.setTo(contents.data(), contents.size(), 574c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski true /*copyData*/)); 587a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 597a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski // Skip to the first tag. 607a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski while (xml_parser_.next() != ResXMLParser::START_TAG) { 617a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski } 627a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski } 637a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 647a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski protected: 657a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski ResXMLTree xml_parser_; 667a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski}; 677a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 687a37b74d37ff79e805c9e97d977e07bfec753c5aAdam LesinskiTEST_F(AttributeResolutionTest, Theme) { 697a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski ResTable::Theme theme(table_); 707a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski ASSERT_EQ(NO_ERROR, theme.applyStyle(R::style::StyleTwo)); 717a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 7232e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski std::array<uint32_t, 5> attrs{{R::attr::attr_one, R::attr::attr_two, R::attr::attr_three, 7332e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski R::attr::attr_four, R::attr::attr_empty}}; 7406d3e8fec7e2b29f99d755bee849023d88957953Adam Lesinski std::array<uint32_t, attrs.size() * STYLE_NUM_ENTRIES> values; 757a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 767a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski ASSERT_TRUE(ResolveAttrs(&theme, 0 /*def_style_attr*/, 0 /*def_style_res*/, 7706d3e8fec7e2b29f99d755bee849023d88957953Adam Lesinski nullptr /*src_values*/, 0 /*src_values_length*/, attrs.data(), 7806d3e8fec7e2b29f99d755bee849023d88957953Adam Lesinski attrs.size(), values.data(), nullptr /*out_indices*/)); 797a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 807a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski const uint32_t public_flag = ResTable_typeSpec::SPEC_PUBLIC; 817a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 827a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski const uint32_t* values_cursor = values.data(); 837a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(Res_value::TYPE_INT_DEC, values_cursor[STYLE_TYPE]); 847a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(1u, values_cursor[STYLE_DATA]); 857a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 867a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]); 877a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 887a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 897a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 907a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski values_cursor += STYLE_NUM_ENTRIES; 917a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(Res_value::TYPE_STRING, values_cursor[STYLE_TYPE]); 927a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 937a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]); 947a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 957a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 967a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 977a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski values_cursor += STYLE_NUM_ENTRIES; 987a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(Res_value::TYPE_INT_DEC, values_cursor[STYLE_TYPE]); 997a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(3u, values_cursor[STYLE_DATA]); 1007a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 1017a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]); 1027a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 1037a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 1047a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 1057a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski values_cursor += STYLE_NUM_ENTRIES; 1067a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(Res_value::TYPE_NULL, values_cursor[STYLE_TYPE]); 1077a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(Res_value::DATA_NULL_UNDEFINED, values_cursor[STYLE_DATA]); 1087a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 1097a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]); 1107a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 1117a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 11232e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski 11332e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski // @empty comes from the theme, so it has the same asset cookie and changing configurations flags 11432e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski // as the theme. 11532e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski values_cursor += STYLE_NUM_ENTRIES; 11632e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(Res_value::TYPE_NULL, values_cursor[STYLE_TYPE]); 11732e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(Res_value::DATA_NULL_EMPTY, values_cursor[STYLE_DATA]); 11832e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 11932e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]); 12032e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 12132e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 1227a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski} 1237a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 1247a37b74d37ff79e805c9e97d977e07bfec753c5aAdam LesinskiTEST_F(AttributeResolutionXmlTest, XmlParser) { 12532e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski std::array<uint32_t, 5> attrs{{R::attr::attr_one, R::attr::attr_two, R::attr::attr_three, 12632e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski R::attr::attr_four, R::attr::attr_empty}}; 12706d3e8fec7e2b29f99d755bee849023d88957953Adam Lesinski std::array<uint32_t, attrs.size() * STYLE_NUM_ENTRIES> values; 1287a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 12906d3e8fec7e2b29f99d755bee849023d88957953Adam Lesinski ASSERT_TRUE(RetrieveAttributes(&table_, &xml_parser_, attrs.data(), attrs.size(), values.data(), 13006d3e8fec7e2b29f99d755bee849023d88957953Adam Lesinski nullptr /*out_indices*/)); 1317a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 1327a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski uint32_t* values_cursor = values.data(); 1337a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(Res_value::TYPE_NULL, values_cursor[STYLE_TYPE]); 13432e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(Res_value::DATA_NULL_EMPTY, values_cursor[STYLE_DATA]); 1357a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 1367a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]); 1377a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 1387a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 1397a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 1407a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski values_cursor += STYLE_NUM_ENTRIES; 1417a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(Res_value::TYPE_NULL, values_cursor[STYLE_TYPE]); 1427a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_DATA]); 1437a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 1447a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]); 1457a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 1467a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 1477a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 1487a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski values_cursor += STYLE_NUM_ENTRIES; 1497a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(Res_value::TYPE_INT_DEC, values_cursor[STYLE_TYPE]); 1507a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(10u, values_cursor[STYLE_DATA]); 1517a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 1527a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]); 1537a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 1547a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 1557a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 1567a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski values_cursor += STYLE_NUM_ENTRIES; 1577a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(Res_value::TYPE_ATTRIBUTE, values_cursor[STYLE_TYPE]); 1587a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(R::attr::attr_indirect, values_cursor[STYLE_DATA]); 1597a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 1607a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]); 1617a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 1627a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 16332e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski 16432e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski values_cursor += STYLE_NUM_ENTRIES; 16532e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(Res_value::TYPE_NULL, values_cursor[STYLE_TYPE]); 16632e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(Res_value::DATA_NULL_UNDEFINED, values_cursor[STYLE_DATA]); 16732e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 16832e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]); 16932e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 17032e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 1717a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski} 1727a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 1737a37b74d37ff79e805c9e97d977e07bfec753c5aAdam LesinskiTEST_F(AttributeResolutionXmlTest, ThemeAndXmlParser) { 1747a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski ResTable::Theme theme(table_); 1757a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski ASSERT_EQ(NO_ERROR, theme.applyStyle(R::style::StyleTwo)); 1767a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 17732e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski std::array<uint32_t, 6> attrs{{R::attr::attr_one, R::attr::attr_two, R::attr::attr_three, 17832e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski R::attr::attr_four, R::attr::attr_five, R::attr::attr_empty}}; 17906d3e8fec7e2b29f99d755bee849023d88957953Adam Lesinski std::array<uint32_t, attrs.size() * STYLE_NUM_ENTRIES> values; 18032e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski std::array<uint32_t, attrs.size() + 1> indices; 1817a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 18206d3e8fec7e2b29f99d755bee849023d88957953Adam Lesinski ApplyStyle(&theme, &xml_parser_, 0 /*def_style_attr*/, 0 /*def_style_res*/, attrs.data(), 18306d3e8fec7e2b29f99d755bee849023d88957953Adam Lesinski attrs.size(), values.data(), indices.data()); 1847a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 1857a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski const uint32_t public_flag = ResTable_typeSpec::SPEC_PUBLIC; 1867a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 1877a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski uint32_t* values_cursor = values.data(); 18832e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(Res_value::TYPE_NULL, values_cursor[STYLE_TYPE]); 18932e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(Res_value::DATA_NULL_EMPTY, values_cursor[STYLE_DATA]); 1907a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 19132e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]); 1927a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 19332e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 1947a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 1957a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski values_cursor += STYLE_NUM_ENTRIES; 1967a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(Res_value::TYPE_STRING, values_cursor[STYLE_TYPE]); 1977a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 1987a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]); 1997a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 2007a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 2017a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 2027a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski values_cursor += STYLE_NUM_ENTRIES; 2037a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(Res_value::TYPE_INT_DEC, values_cursor[STYLE_TYPE]); 2047a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(10u, values_cursor[STYLE_DATA]); 2057a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 2067a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]); 2077a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 2087a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 2097a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 2107a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski values_cursor += STYLE_NUM_ENTRIES; 2117a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(Res_value::TYPE_INT_DEC, values_cursor[STYLE_TYPE]); 2127a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(3u, values_cursor[STYLE_DATA]); 2137a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 2147a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]); 2157a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 2167a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 2177a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 2187a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski values_cursor += STYLE_NUM_ENTRIES; 2197a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(Res_value::TYPE_STRING, values_cursor[STYLE_TYPE]); 2207a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(R::string::string_one, values_cursor[STYLE_RESOURCE_ID]); 2217a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]); 2227a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 2237a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 22432e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski 22532e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski // @empty comes from the theme, so it has the same asset cookie and changing configurations flags 22632e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski // as the theme. 22732e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski values_cursor += STYLE_NUM_ENTRIES; 22832e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(Res_value::TYPE_NULL, values_cursor[STYLE_TYPE]); 22932e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(Res_value::DATA_NULL_EMPTY, values_cursor[STYLE_DATA]); 23032e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 23132e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]); 23232e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 23332e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 23432e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski 23532e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski // The first element of indices contains the number of indices. 23632e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski std::array<uint32_t, 7> expected_indices = {{6u, 0u, 1u, 2u, 3u, 4u, 5u}}; 23732e7501a27f0f19bccdf9e91f9b87869c093f695Adam Lesinski EXPECT_EQ(expected_indices, indices); 2387a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski} 239ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinski 2407ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} // namespace android 2417ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 242