11ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski/*
21ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * Copyright (C) 2015 The Android Open Source Project
31ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski *
41ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
51ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * you may not use this file except in compliance with the License.
61ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * You may obtain a copy of the License at
71ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski *
81ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
91ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski *
101ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * Unless required by applicable law or agreed to in writing, software
111ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
121ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * See the License for the specific language governing permissions and
141ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * limitations under the License.
151ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski */
161ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
171ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "link/Linkers.h"
18ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
19ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "ConfigDescription.h"
20fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski#include "test/Test.h"
211ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
22a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinskiusing ::testing::NotNull;
23a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski
241ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskinamespace aapt {
251ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
261ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST(AutoVersionerTest, GenerateVersionedResources) {
27ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  const ConfigDescription land_config = test::ParseConfigOrDie("land");
28a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  const ConfigDescription sw600dp_land_config = test::ParseConfigOrDie("sw600dp-land");
29cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
30cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ResourceEntry entry("foo");
31a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  entry.values.push_back(util::make_unique<ResourceConfigValue>(ConfigDescription::DefaultConfig(), ""));
32a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  entry.values.push_back(util::make_unique<ResourceConfigValue>(land_config, ""));
33a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  entry.values.push_back(util::make_unique<ResourceConfigValue>(sw600dp_land_config, ""));
34a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski
35a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  EXPECT_TRUE(ShouldGenerateVersionedResource(&entry, ConfigDescription::DefaultConfig(), 17));
36ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_TRUE(ShouldGenerateVersionedResource(&entry, land_config, 17));
371ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}
381ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
391ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST(AutoVersionerTest, GenerateVersionedResourceWhenHigherVersionExists) {
40a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  const ConfigDescription sw600dp_v13_config = test::ParseConfigOrDie("sw600dp-v13");
41ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  const ConfigDescription v21_config = test::ParseConfigOrDie("v21");
42cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
43cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ResourceEntry entry("foo");
44a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  entry.values.push_back(util::make_unique<ResourceConfigValue>(ConfigDescription::DefaultConfig(), ""));
455b7337f77cf036dda2c7218ccf22dedc774dcf76Adam Lesinski  entry.values.push_back(util::make_unique<ResourceConfigValue>(sw600dp_v13_config, ""));
46bb94f32a0042c8e2ab3d6e0de1b693713d2a6eabAdam Lesinski  entry.values.push_back(util::make_unique<ResourceConfigValue>(v21_config, ""));
47a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski
48a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  EXPECT_TRUE(ShouldGenerateVersionedResource(&entry, ConfigDescription::DefaultConfig(), 17));
49a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  EXPECT_FALSE(ShouldGenerateVersionedResource(&entry, ConfigDescription::DefaultConfig(), 22));
501ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}
511ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
521ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST(AutoVersionerTest, VersionStylesForTable) {
53cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  std::unique_ptr<ResourceTable> table =
54cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      test::ResourceTableBuilder()
55ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetPackageId("app", 0x7f)
56ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddValue(
57ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski              "app:style/Foo", test::ParseConfigOrDie("v4"),
58cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski              ResourceId(0x7f020000),
59cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski              test::StyleBuilder()
60ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                  .AddItem("android:attr/onClick", ResourceId(0x0101026f),
61cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                           util::make_unique<Id>())
62ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                  .AddItem("android:attr/paddingStart", ResourceId(0x010103b3),
63cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                           util::make_unique<Id>())
64ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                  .AddItem("android:attr/requiresSmallestWidthDp",
65cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                           ResourceId(0x01010364), util::make_unique<Id>())
66ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                  .AddItem("android:attr/colorAccent", ResourceId(0x01010435),
67cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                           util::make_unique<Id>())
68ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                  .Build())
69ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddValue(
70ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski              "app:style/Foo", test::ParseConfigOrDie("v21"),
71cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski              ResourceId(0x7f020000),
72cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski              test::StyleBuilder()
73ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                  .AddItem("android:attr/paddingEnd", ResourceId(0x010103b4),
74cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                           util::make_unique<Id>())
75ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                  .Build())
76ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .Build();
77cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
78cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  std::unique_ptr<IAaptContext> context = test::ContextBuilder()
79ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                              .SetCompilationPackage("app")
80ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                              .SetPackageId(0x7f)
81ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                              .Build();
82cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
83cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  AutoVersioner versioner;
84ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  ASSERT_TRUE(versioner.Consume(context.get(), table.get()));
85cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
86a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  Style* style = test::GetValueForConfig<Style>(table.get(), "app:style/Foo", test::ParseConfigOrDie("v4"));
87a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  ASSERT_THAT(style, NotNull());
88cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_EQ(style->entries.size(), 1u);
89a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  EXPECT_EQ(make_value(test::ParseNameOrDie("android:attr/onClick")), style->entries.front().key.name);
90cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
91a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  style = test::GetValueForConfig<Style>(table.get(), "app:style/Foo", test::ParseConfigOrDie("v13"));
92a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  ASSERT_THAT(style, NotNull());
93cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_EQ(style->entries.size(), 2u);
94a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  EXPECT_EQ(make_value(test::ParseNameOrDie("android:attr/onClick")),style->entries[0].key.name);
95a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  EXPECT_EQ(make_value(test::ParseNameOrDie("android:attr/requiresSmallestWidthDp")), style->entries[1].key.name);
96a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski
97a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  style = test::GetValueForConfig<Style>(table.get(), "app:style/Foo", test::ParseConfigOrDie("v17"));
98a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  ASSERT_THAT(style, NotNull());
99cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_EQ(style->entries.size(), 3u);
100a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  EXPECT_EQ(make_value(test::ParseNameOrDie("android:attr/onClick")), style->entries[0].key.name);
101a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  EXPECT_EQ(make_value(test::ParseNameOrDie("android:attr/requiresSmallestWidthDp")), style->entries[1].key.name);
102a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  EXPECT_EQ(make_value(test::ParseNameOrDie("android:attr/paddingStart")), style->entries[2].key.name);
103a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski
104a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  style = test::GetValueForConfig<Style>(table.get(), "app:style/Foo", test::ParseConfigOrDie("v21"));
105a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  ASSERT_THAT(style, NotNull());
106a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  ASSERT_EQ(1u, style->entries.size());
107a45893a5c51cc26f1fd63ec1aa4c39f55911c85bAdam Lesinski  EXPECT_EQ(make_value(test::ParseNameOrDie("android:attr/paddingEnd")), style->entries.front().key.name);
1081ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}
1091ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
110cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski}  // namespace aapt
111