1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "link/Linkers.h"
18
19#include "test/Test.h"
20
21namespace aapt {
22
23TEST(ProductFilterTest, SelectTwoProducts) {
24  std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
25
26  const ConfigDescription land = test::ParseConfigOrDie("land");
27  const ConfigDescription port = test::ParseConfigOrDie("port");
28
29  ResourceTable table;
30  ASSERT_TRUE(table.AddResource(
31      test::ParseNameOrDie("android:string/one"), land, "",
32      test::ValueBuilder<Id>().SetSource(Source("land/default.xml")).Build(),
33      context->GetDiagnostics()));
34  ASSERT_TRUE(table.AddResource(
35      test::ParseNameOrDie("android:string/one"), land, "tablet",
36      test::ValueBuilder<Id>().SetSource(Source("land/tablet.xml")).Build(),
37      context->GetDiagnostics()));
38
39  ASSERT_TRUE(table.AddResource(
40      test::ParseNameOrDie("android:string/one"), port, "",
41      test::ValueBuilder<Id>().SetSource(Source("port/default.xml")).Build(),
42      context->GetDiagnostics()));
43  ASSERT_TRUE(table.AddResource(
44      test::ParseNameOrDie("android:string/one"), port, "tablet",
45      test::ValueBuilder<Id>().SetSource(Source("port/tablet.xml")).Build(),
46      context->GetDiagnostics()));
47
48  ProductFilter filter({"tablet"});
49  ASSERT_TRUE(filter.Consume(context.get(), &table));
50
51  EXPECT_EQ(nullptr, test::GetValueForConfigAndProduct<Id>(
52                         &table, "android:string/one", land, ""));
53  EXPECT_NE(nullptr, test::GetValueForConfigAndProduct<Id>(
54                         &table, "android:string/one", land, "tablet"));
55  EXPECT_EQ(nullptr, test::GetValueForConfigAndProduct<Id>(
56                         &table, "android:string/one", port, ""));
57  EXPECT_NE(nullptr, test::GetValueForConfigAndProduct<Id>(
58                         &table, "android:string/one", port, "tablet"));
59}
60
61TEST(ProductFilterTest, SelectDefaultProduct) {
62  std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
63
64  ResourceTable table;
65  ASSERT_TRUE(table.AddResource(
66      test::ParseNameOrDie("android:string/one"),
67      ConfigDescription::DefaultConfig(), "",
68      test::ValueBuilder<Id>().SetSource(Source("default.xml")).Build(),
69      context->GetDiagnostics()));
70  ASSERT_TRUE(table.AddResource(
71      test::ParseNameOrDie("android:string/one"),
72      ConfigDescription::DefaultConfig(), "tablet",
73      test::ValueBuilder<Id>().SetSource(Source("tablet.xml")).Build(),
74      context->GetDiagnostics()));
75
76  ProductFilter filter({});
77  ASSERT_TRUE(filter.Consume(context.get(), &table));
78
79  EXPECT_NE(nullptr, test::GetValueForConfigAndProduct<Id>(
80                         &table, "android:string/one",
81                         ConfigDescription::DefaultConfig(), ""));
82  EXPECT_EQ(nullptr, test::GetValueForConfigAndProduct<Id>(
83                         &table, "android:string/one",
84                         ConfigDescription::DefaultConfig(), "tablet"));
85}
86
87TEST(ProductFilterTest, FailOnAmbiguousProduct) {
88  std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
89
90  ResourceTable table;
91  ASSERT_TRUE(table.AddResource(
92      test::ParseNameOrDie("android:string/one"),
93      ConfigDescription::DefaultConfig(), "",
94      test::ValueBuilder<Id>().SetSource(Source("default.xml")).Build(),
95      context->GetDiagnostics()));
96  ASSERT_TRUE(table.AddResource(
97      test::ParseNameOrDie("android:string/one"),
98      ConfigDescription::DefaultConfig(), "tablet",
99      test::ValueBuilder<Id>().SetSource(Source("tablet.xml")).Build(),
100      context->GetDiagnostics()));
101  ASSERT_TRUE(table.AddResource(
102      test::ParseNameOrDie("android:string/one"),
103      ConfigDescription::DefaultConfig(), "no-sdcard",
104      test::ValueBuilder<Id>().SetSource(Source("no-sdcard.xml")).Build(),
105      context->GetDiagnostics()));
106
107  ProductFilter filter({"tablet", "no-sdcard"});
108  ASSERT_FALSE(filter.Consume(context.get(), &table));
109}
110
111TEST(ProductFilterTest, FailOnMultipleDefaults) {
112  std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
113
114  ResourceTable table;
115  ASSERT_TRUE(table.AddResource(
116      test::ParseNameOrDie("android:string/one"),
117      ConfigDescription::DefaultConfig(), "",
118      test::ValueBuilder<Id>().SetSource(Source(".xml")).Build(),
119      context->GetDiagnostics()));
120  ASSERT_TRUE(table.AddResource(
121      test::ParseNameOrDie("android:string/one"),
122      ConfigDescription::DefaultConfig(), "default",
123      test::ValueBuilder<Id>().SetSource(Source("default.xml")).Build(),
124      context->GetDiagnostics()));
125
126  ProductFilter filter({});
127  ASSERT_FALSE(filter.Consume(context.get(), &table));
128}
129
130}  // namespace aapt
131