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