1fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski/*
2fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * Copyright (C) 2016 The Android Open Source Project
3fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski *
4fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * you may not use this file except in compliance with the License.
6fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * You may obtain a copy of the License at
7fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski *
8fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski *
10fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * Unless required by applicable law or agreed to in writing, software
11fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * See the License for the specific language governing permissions and
14fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski * limitations under the License.
15fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski */
16fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski
17d48944a745f9ed121e6bde22ef6feb3a44fbec39Adam Lesinski#include "optimize/VersionCollapser.h"
18ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
19fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski#include "test/Test.h"
20fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski
21d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskiusing android::StringPiece;
22d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski
23fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinskinamespace aapt {
24fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski
25ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinskistatic std::unique_ptr<ResourceTable> BuildTableWithConfigs(
26cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    const StringPiece& name, std::initializer_list<std::string> list) {
27cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  test::ResourceTableBuilder builder;
28cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  for (const std::string& item : list) {
29ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    builder.AddSimple(name, test::ParseConfigOrDie(item));
30cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  }
31ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  return builder.Build();
32fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski}
33fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski
34fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam LesinskiTEST(VersionCollapserTest, CollapseVersions) {
35ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<IAaptContext> context =
36ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      test::ContextBuilder().SetMinSdkVersion(7).Build();
37cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
38ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  const StringPiece res_name = "@android:string/foo";
39cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
40ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<ResourceTable> table = BuildTableWithConfigs(
41ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      res_name,
42cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      {"land-v4", "land-v5", "sw600dp", "land-v6", "land-v14", "land-v21"});
43cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
44cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  VersionCollapser collapser;
45ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  ASSERT_TRUE(collapser.Consume(context.get(), table.get()));
46cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
47cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  // These should be removed.
48cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(nullptr,
49ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            test::GetValueForConfig<Id>(table.get(), res_name,
50ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                        test::ParseConfigOrDie("land-v4")));
51cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(nullptr,
52ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            test::GetValueForConfig<Id>(table.get(), res_name,
53ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                        test::ParseConfigOrDie("land-v5")));
54cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  // This one should be removed because it was renamed to 'land', with the
55cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  // version dropped.
56cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(nullptr,
57ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            test::GetValueForConfig<Id>(table.get(), res_name,
58ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                        test::ParseConfigOrDie("land-v6")));
59cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
60cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  // These should remain.
61cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_NE(nullptr,
62ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            test::GetValueForConfig<Id>(table.get(), res_name,
63ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                        test::ParseConfigOrDie("sw600dp")));
64cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
65cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  // 'land' should be present because it was renamed from 'land-v6'.
66cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_NE(nullptr,
67ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            test::GetValueForConfig<Id>(table.get(), res_name,
68ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                        test::ParseConfigOrDie("land")));
69cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_NE(nullptr,
70ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            test::GetValueForConfig<Id>(table.get(), res_name,
71ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                        test::ParseConfigOrDie("land-v14")));
72ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_NE(nullptr,
73ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            test::GetValueForConfig<Id>(table.get(), res_name,
74ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                        test::ParseConfigOrDie("land-v21")));
75fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski}
76fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski
77fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam LesinskiTEST(VersionCollapserTest, CollapseVersionsWhenMinSdkIsHighest) {
78ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<IAaptContext> context =
79ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      test::ContextBuilder().SetMinSdkVersion(21).Build();
80cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
81ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  const StringPiece res_name = "@android:string/foo";
82cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
83ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<ResourceTable> table = BuildTableWithConfigs(
84ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      res_name, {"land-v4", "land-v5", "sw600dp", "land-v6", "land-v14",
85ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                 "land-v21", "land-v22"});
86cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  VersionCollapser collapser;
87ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  ASSERT_TRUE(collapser.Consume(context.get(), table.get()));
88cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
89cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  // These should all be removed.
90cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(nullptr,
91ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            test::GetValueForConfig<Id>(table.get(), res_name,
92ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                        test::ParseConfigOrDie("land-v4")));
93cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(nullptr,
94ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            test::GetValueForConfig<Id>(table.get(), res_name,
95ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                        test::ParseConfigOrDie("land-v5")));
96cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(nullptr,
97ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            test::GetValueForConfig<Id>(table.get(), res_name,
98ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                        test::ParseConfigOrDie("land-v6")));
99cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(nullptr,
100ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            test::GetValueForConfig<Id>(table.get(), res_name,
101ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                        test::ParseConfigOrDie("land-v14")));
102cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
103cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  // These should remain.
104cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_NE(nullptr,
105ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            test::GetValueForConfig<Id>(
106ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                table.get(), res_name,
107ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                test::ParseConfigOrDie("sw600dp").CopyWithoutSdkVersion()));
108cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
109cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  // land-v21 should have been converted to land.
110ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_NE(nullptr,
111ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            test::GetValueForConfig<Id>(table.get(), res_name,
112ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                        test::ParseConfigOrDie("land")));
113cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  // land-v22 should remain as-is.
114cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_NE(nullptr,
115ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            test::GetValueForConfig<Id>(table.get(), res_name,
116ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                        test::ParseConfigOrDie("land-v22")));
117fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski}
118fb6312fe93a8544e6a95d1c619c8cea3940cbe1aAdam Lesinski
119cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski}  // namespace aapt
120