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 "filter/ConfigFilter.h"
18
19#include "test/Test.h"
20
21namespace aapt {
22
23TEST(ConfigFilterTest, EmptyFilterMatchesAnything) {
24  AxisConfigFilter filter;
25
26  EXPECT_TRUE(filter.Match(test::ParseConfigOrDie("320dpi")));
27  EXPECT_TRUE(filter.Match(test::ParseConfigOrDie("fr")));
28}
29
30TEST(ConfigFilterTest, MatchesConfigWithUnrelatedAxis) {
31  AxisConfigFilter filter;
32  filter.AddConfig(test::ParseConfigOrDie("fr"));
33
34  EXPECT_TRUE(filter.Match(test::ParseConfigOrDie("320dpi")));
35}
36
37TEST(ConfigFilterTest, MatchesConfigWithSameValueAxis) {
38  AxisConfigFilter filter;
39  filter.AddConfig(test::ParseConfigOrDie("fr"));
40
41  EXPECT_TRUE(filter.Match(test::ParseConfigOrDie("fr")));
42}
43
44TEST(ConfigFilterTest, MatchesConfigWithSameValueAxisAndOtherUnrelatedAxis) {
45  AxisConfigFilter filter;
46  filter.AddConfig(test::ParseConfigOrDie("fr"));
47
48  EXPECT_TRUE(filter.Match(test::ParseConfigOrDie("fr-320dpi")));
49}
50
51TEST(ConfigFilterTest, MatchesConfigWithOneMatchingAxis) {
52  AxisConfigFilter filter;
53  filter.AddConfig(test::ParseConfigOrDie("fr-rFR"));
54  filter.AddConfig(test::ParseConfigOrDie("sw360dp"));
55  filter.AddConfig(test::ParseConfigOrDie("normal"));
56  filter.AddConfig(test::ParseConfigOrDie("en-rUS"));
57
58  EXPECT_TRUE(filter.Match(test::ParseConfigOrDie("en")));
59}
60
61TEST(ConfigFilterTest, DoesNotMatchConfigWithDifferentValueAxis) {
62  AxisConfigFilter filter;
63  filter.AddConfig(test::ParseConfigOrDie("fr"));
64
65  EXPECT_FALSE(filter.Match(test::ParseConfigOrDie("de")));
66}
67
68TEST(ConfigFilterTest, DoesNotMatchWhenOneQualifierIsExplicitlyNotMatched) {
69  AxisConfigFilter filter;
70  filter.AddConfig(test::ParseConfigOrDie("fr-rFR"));
71  filter.AddConfig(test::ParseConfigOrDie("en-rUS"));
72  filter.AddConfig(test::ParseConfigOrDie("normal"));
73  filter.AddConfig(test::ParseConfigOrDie("large"));
74  filter.AddConfig(test::ParseConfigOrDie("xxhdpi"));
75  filter.AddConfig(test::ParseConfigOrDie("sw320dp"));
76
77  EXPECT_FALSE(filter.Match(test::ParseConfigOrDie("fr-sw600dp-v13")));
78}
79
80TEST(ConfigFilterTest, MatchesSmallestWidthWhenSmaller) {
81  AxisConfigFilter filter;
82  filter.AddConfig(test::ParseConfigOrDie("sw600dp"));
83
84  EXPECT_TRUE(filter.Match(test::ParseConfigOrDie("fr-sw320dp-v13")));
85}
86
87TEST(ConfigFilterTest, MatchesConfigWithSameLanguageButNoRegionSpecified) {
88  AxisConfigFilter filter;
89  filter.AddConfig(test::ParseConfigOrDie("de-rDE"));
90
91  EXPECT_TRUE(filter.Match(test::ParseConfigOrDie("de")));
92}
93
94TEST(ConfigFilterTest, IgnoresVersion) {
95  AxisConfigFilter filter;
96  filter.AddConfig(test::ParseConfigOrDie("normal-v4"));
97
98  // The configs don't match on any axis besides version, which should be
99  // ignored.
100  EXPECT_TRUE(filter.Match(test::ParseConfigOrDie("sw600dp-v13")));
101}
102
103TEST(ConfigFilterTest, MatchesConfigWithRegion) {
104  AxisConfigFilter filter;
105  filter.AddConfig(test::ParseConfigOrDie("kok"));
106  filter.AddConfig(test::ParseConfigOrDie("kok-rIN"));
107  filter.AddConfig(test::ParseConfigOrDie("kok-v419"));
108
109  EXPECT_TRUE(filter.Match(test::ParseConfigOrDie("kok-rIN")));
110}
111
112TEST(ConfigFilterTest, MatchesScripts) {
113  AxisConfigFilter filter;
114
115  // "sr" gets automatically computed the script "Cyrl"
116  filter.AddConfig(test::ParseConfigOrDie("sr"));
117
118  // "sr" -> "b+sr+Cyrl"
119  EXPECT_TRUE(filter.Match(test::ParseConfigOrDie("b+sr+Cyrl")));
120
121  // The incoming "sr" is also auto-computed to "b+sr+Cyrl".
122  EXPECT_TRUE(filter.Match(test::ParseConfigOrDie("sr")));
123
124  // "sr" -> "b+sr+Cyrl", which doesn't match "Latn".
125  EXPECT_FALSE(filter.Match(test::ParseConfigOrDie("b+sr+Latn")));
126}
127
128}  // namespace aapt
129