16f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/*
26f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Copyright (C) 2015 The Android Open Source Project
36f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
46f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
56f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * you may not use this file except in compliance with the License.
66f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * You may obtain a copy of the License at
76f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
86f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
96f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Unless required by applicable law or agreed to in writing, software
116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * See the License for the specific language governing permissions and
146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * limitations under the License.
156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */
166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
176f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include "ConfigDescription.h"
18ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
19ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include <string>
20ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
21d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski#include "androidfw/StringPiece.h"
22d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski
236425497f4129a40e75569328525c0dcbaa6e3f22Adam Lesinski#include "SdkConstants.h"
24d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski#include "test/Test.h"
25d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski
26d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskiusing android::StringPiece;
276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
286f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskinamespace aapt {
296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
30cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinskistatic ::testing::AssertionResult TestParse(
31cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    const StringPiece& input, ConfigDescription* config = nullptr) {
32ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  if (ConfigDescription::Parse(input, config)) {
33cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    return ::testing::AssertionSuccess() << input << " was successfully parsed";
34cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  }
35cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  return ::testing::AssertionFailure() << input << " could not be parsed";
366f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
376f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
386f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(ConfigDescriptionTest, ParseFailWhenQualifiersAreOutOfOrder) {
39cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_FALSE(TestParse("en-sw600dp-ldrtl"));
40cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_FALSE(TestParse("land-en"));
41cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_FALSE(TestParse("hdpi-320dpi"));
426f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
436f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
446f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(ConfigDescriptionTest, ParseFailWhenQualifiersAreNotMatched) {
45cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_FALSE(TestParse("en-sw600dp-ILLEGAL"));
466f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
476f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
486f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(ConfigDescriptionTest, ParseFailWhenQualifiersHaveTrailingDash) {
49cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_FALSE(TestParse("en-sw600dp-land-"));
506f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
516f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
526f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(ConfigDescriptionTest, ParseBasicQualifiers) {
53cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ConfigDescription config;
54cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_TRUE(TestParse("", &config));
55cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string(""), config.toString().string());
56cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
57cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_TRUE(TestParse("fr-land", &config));
58cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("fr-land"), config.toString().string());
59cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
60cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_TRUE(
61cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      TestParse("mcc310-pl-sw720dp-normal-long-port-night-"
62cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                "xhdpi-keyssoft-qwerty-navexposed-nonav",
63cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                &config));
64cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("mcc310-pl-sw720dp-normal-long-port-night-"
65cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        "xhdpi-keyssoft-qwerty-navexposed-nonav-v13"),
66cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski            config.toString().string());
676f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
686f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
696f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(ConfigDescriptionTest, ParseLocales) {
70cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ConfigDescription config;
71cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_TRUE(TestParse("en-rUS", &config));
72cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("en-rUS"), config.toString().string());
736f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
746f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
756f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(ConfigDescriptionTest, ParseQualifierAddedInApi13) {
76cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ConfigDescription config;
77cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_TRUE(TestParse("sw600dp", &config));
78cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("sw600dp-v13"), config.toString().string());
796f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
80cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_TRUE(TestParse("sw600dp-v8", &config));
81cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("sw600dp-v13"), config.toString().string());
826f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
836f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
846f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(ConfigDescriptionTest, ParseCarAttribute) {
85cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ConfigDescription config;
86cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_TRUE(TestParse("car", &config));
87cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(android::ResTable_config::UI_MODE_TYPE_CAR, config.uiMode);
886f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
896f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
906425497f4129a40e75569328525c0dcbaa6e3f22Adam LesinskiTEST(ConfigDescriptionTest, TestParsingRoundQualifier) {
91cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ConfigDescription config;
92cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_TRUE(TestParse("round", &config));
93cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(android::ResTable_config::SCREENROUND_YES,
94cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski            config.screenLayout2 & android::ResTable_config::MASK_SCREENROUND);
95cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(SDK_MARSHMALLOW, config.sdkVersion);
96cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("round-v23"), config.toString().string());
97cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
98cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_TRUE(TestParse("notround", &config));
99cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(android::ResTable_config::SCREENROUND_NO,
100cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski            config.screenLayout2 & android::ResTable_config::MASK_SCREENROUND);
101cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(SDK_MARSHMALLOW, config.sdkVersion);
102cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("notround-v23"), config.toString().string());
1036425497f4129a40e75569328525c0dcbaa6e3f22Adam Lesinski}
1046425497f4129a40e75569328525c0dcbaa6e3f22Adam Lesinski
105c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain GuyTEST(ConfigDescriptionTest, TestWideColorGamutQualifier) {
106c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy  ConfigDescription config;
107c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy  EXPECT_TRUE(TestParse("widecg", &config));
108c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy  EXPECT_EQ(android::ResTable_config::WIDE_COLOR_GAMUT_YES,
1094832745b84d6a358582f2264d22acacf25e01b07Romain Guy            config.colorMode & android::ResTable_config::MASK_WIDE_COLOR_GAMUT);
110c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy  EXPECT_EQ(SDK_O, config.sdkVersion);
111c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy  EXPECT_EQ(std::string("widecg-v26"), config.toString().string());
112c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy
113c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy  EXPECT_TRUE(TestParse("nowidecg", &config));
114c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy  EXPECT_EQ(android::ResTable_config::WIDE_COLOR_GAMUT_NO,
1154832745b84d6a358582f2264d22acacf25e01b07Romain Guy            config.colorMode & android::ResTable_config::MASK_WIDE_COLOR_GAMUT);
116c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy  EXPECT_EQ(SDK_O, config.sdkVersion);
117c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy  EXPECT_EQ(std::string("nowidecg-v26"), config.toString().string());
118c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy}
119c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy
120c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain GuyTEST(ConfigDescriptionTest, TestHdrQualifier) {
121c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy  ConfigDescription config;
122c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy  EXPECT_TRUE(TestParse("highdr", &config));
123c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy  EXPECT_EQ(android::ResTable_config::HDR_YES,
1244832745b84d6a358582f2264d22acacf25e01b07Romain Guy            config.colorMode & android::ResTable_config::MASK_HDR);
125c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy  EXPECT_EQ(SDK_O, config.sdkVersion);
126c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy  EXPECT_EQ(std::string("highdr-v26"), config.toString().string());
127c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy
128c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy  EXPECT_TRUE(TestParse("lowdr", &config));
129c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy  EXPECT_EQ(android::ResTable_config::HDR_NO,
1304832745b84d6a358582f2264d22acacf25e01b07Romain Guy            config.colorMode & android::ResTable_config::MASK_HDR);
131c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy  EXPECT_EQ(SDK_O, config.sdkVersion);
132c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy  EXPECT_EQ(std::string("lowdr-v26"), config.toString().string());
133c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy}
134c9ba55902123be5abcf2dcda5af9995be0b8d3d8Romain Guy
1351a6acdbb86c3e72bdb0a4dcab3bda58cbc4ea34cZak CohenTEST(ConfigDescriptionTest, ParseVrAttribute) {
1361a6acdbb86c3e72bdb0a4dcab3bda58cbc4ea34cZak Cohen  ConfigDescription config;
1371a6acdbb86c3e72bdb0a4dcab3bda58cbc4ea34cZak Cohen  EXPECT_TRUE(TestParse("vrheadset", &config));
1381a6acdbb86c3e72bdb0a4dcab3bda58cbc4ea34cZak Cohen  EXPECT_EQ(android::ResTable_config::UI_MODE_TYPE_VR_HEADSET, config.uiMode);
1391a6acdbb86c3e72bdb0a4dcab3bda58cbc4ea34cZak Cohen  EXPECT_EQ(SDK_O, config.sdkVersion);
1401a6acdbb86c3e72bdb0a4dcab3bda58cbc4ea34cZak Cohen  EXPECT_EQ(std::string("vrheadset-v26"), config.toString().string());
1411a6acdbb86c3e72bdb0a4dcab3bda58cbc4ea34cZak Cohen}
1421a6acdbb86c3e72bdb0a4dcab3bda58cbc4ea34cZak Cohen
1435d94fb7040c710af38119eebb60e0ecae122d650Adam LesinskiTEST(ConfigDescriptionTest, RangeQualifiersDoNotConflict) {
1445d94fb7040c710af38119eebb60e0ecae122d650Adam Lesinski  using test::ParseConfigOrDie;
1455d94fb7040c710af38119eebb60e0ecae122d650Adam Lesinski
1465d94fb7040c710af38119eebb60e0ecae122d650Adam Lesinski  EXPECT_FALSE(ParseConfigOrDie("large").ConflictsWith(ParseConfigOrDie("normal-land")));
1475d94fb7040c710af38119eebb60e0ecae122d650Adam Lesinski  EXPECT_FALSE(ParseConfigOrDie("long-hdpi").ConflictsWith(ParseConfigOrDie("xhdpi")));
1485d94fb7040c710af38119eebb60e0ecae122d650Adam Lesinski  EXPECT_FALSE(ParseConfigOrDie("sw600dp").ConflictsWith(ParseConfigOrDie("sw700dp")));
1495d94fb7040c710af38119eebb60e0ecae122d650Adam Lesinski  EXPECT_FALSE(ParseConfigOrDie("v11").ConflictsWith(ParseConfigOrDie("v21")));
1505d94fb7040c710af38119eebb60e0ecae122d650Adam Lesinski  EXPECT_FALSE(ParseConfigOrDie("h600dp").ConflictsWith(ParseConfigOrDie("h300dp")));
1515d94fb7040c710af38119eebb60e0ecae122d650Adam Lesinski  EXPECT_FALSE(ParseConfigOrDie("w400dp").ConflictsWith(ParseConfigOrDie("w300dp")));
1525d94fb7040c710af38119eebb60e0ecae122d650Adam Lesinski  EXPECT_FALSE(ParseConfigOrDie("600x400").ConflictsWith(ParseConfigOrDie("300x200")));
1535d94fb7040c710af38119eebb60e0ecae122d650Adam Lesinski}
1545d94fb7040c710af38119eebb60e0ecae122d650Adam Lesinski
155cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski}  // namespace aapt
156