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"
186425497f4129a40e75569328525c0dcbaa6e3f22Adam Lesinski#include "SdkConstants.h"
196425497f4129a40e75569328525c0dcbaa6e3f22Adam Lesinski
201ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "util/StringPiece.h"
216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <gtest/gtest.h>
236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <string>
246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskinamespace aapt {
266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistatic ::testing::AssertionResult TestParse(const StringPiece& input,
286f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski                                            ConfigDescription* config = nullptr) {
296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    if (ConfigDescription::parse(input, config)) {
306f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski        return ::testing::AssertionSuccess() << input << " was successfully parsed";
316f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    }
326f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    return ::testing::AssertionFailure() << input << " could not be parsed";
336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
346f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
356f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(ConfigDescriptionTest, ParseFailWhenQualifiersAreOutOfOrder) {
366f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_FALSE(TestParse("en-sw600dp-ldrtl"));
376f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_FALSE(TestParse("land-en"));
386f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_FALSE(TestParse("hdpi-320dpi"));
396f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
406f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
416f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(ConfigDescriptionTest, ParseFailWhenQualifiersAreNotMatched) {
426f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_FALSE(TestParse("en-sw600dp-ILLEGAL"));
436f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
446f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
456f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(ConfigDescriptionTest, ParseFailWhenQualifiersHaveTrailingDash) {
466f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_FALSE(TestParse("en-sw600dp-land-"));
476f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
486f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
496f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(ConfigDescriptionTest, ParseBasicQualifiers) {
506f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    ConfigDescription config;
516f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_TRUE(TestParse("", &config));
526f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_EQ(std::string(""), config.toString().string());
536f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
546f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_TRUE(TestParse("fr-land", &config));
556f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_EQ(std::string("fr-land"), config.toString().string());
566f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
576f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_TRUE(TestParse("mcc310-pl-sw720dp-normal-long-port-night-"
586f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski                "xhdpi-keyssoft-qwerty-navexposed-nonav", &config));
596f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_EQ(std::string("mcc310-pl-sw720dp-normal-long-port-night-"
606f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski                "xhdpi-keyssoft-qwerty-navexposed-nonav-v13"), config.toString().string());
616f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
626f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
636f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(ConfigDescriptionTest, ParseLocales) {
646f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    ConfigDescription config;
656f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_TRUE(TestParse("en-rUS", &config));
666f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_EQ(std::string("en-rUS"), config.toString().string());
676f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
686f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
696f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(ConfigDescriptionTest, ParseQualifierAddedInApi13) {
706f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    ConfigDescription config;
716f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_TRUE(TestParse("sw600dp", &config));
726f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_EQ(std::string("sw600dp-v13"), config.toString().string());
736f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
746f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_TRUE(TestParse("sw600dp-v8", &config));
756f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_EQ(std::string("sw600dp-v13"), config.toString().string());
766f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
776f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
786f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam LesinskiTEST(ConfigDescriptionTest, ParseCarAttribute) {
796f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    ConfigDescription config;
806f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_TRUE(TestParse("car", &config));
816f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    EXPECT_EQ(android::ResTable_config::UI_MODE_TYPE_CAR, config.uiMode);
826f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
836f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
846425497f4129a40e75569328525c0dcbaa6e3f22Adam LesinskiTEST(ConfigDescriptionTest, TestParsingRoundQualifier) {
856425497f4129a40e75569328525c0dcbaa6e3f22Adam Lesinski    ConfigDescription config;
866425497f4129a40e75569328525c0dcbaa6e3f22Adam Lesinski    EXPECT_TRUE(TestParse("round", &config));
876425497f4129a40e75569328525c0dcbaa6e3f22Adam Lesinski    EXPECT_EQ(android::ResTable_config::SCREENROUND_YES,
886425497f4129a40e75569328525c0dcbaa6e3f22Adam Lesinski    config.screenLayout2 & android::ResTable_config::MASK_SCREENROUND);
896425497f4129a40e75569328525c0dcbaa6e3f22Adam Lesinski    EXPECT_EQ(SDK_MARSHMALLOW, config.sdkVersion);
906425497f4129a40e75569328525c0dcbaa6e3f22Adam Lesinski    EXPECT_EQ(std::string("round-v23"), config.toString().string());
916425497f4129a40e75569328525c0dcbaa6e3f22Adam Lesinski
926425497f4129a40e75569328525c0dcbaa6e3f22Adam Lesinski    EXPECT_TRUE(TestParse("notround", &config));
936425497f4129a40e75569328525c0dcbaa6e3f22Adam Lesinski    EXPECT_EQ(android::ResTable_config::SCREENROUND_NO,
946425497f4129a40e75569328525c0dcbaa6e3f22Adam Lesinski              config.screenLayout2 & android::ResTable_config::MASK_SCREENROUND);
956425497f4129a40e75569328525c0dcbaa6e3f22Adam Lesinski    EXPECT_EQ(SDK_MARSHMALLOW, config.sdkVersion);
966425497f4129a40e75569328525c0dcbaa6e3f22Adam Lesinski    EXPECT_EQ(std::string("notround-v23"), config.toString().string());
976425497f4129a40e75569328525c0dcbaa6e3f22Adam Lesinski}
986425497f4129a40e75569328525c0dcbaa6e3f22Adam Lesinski
996f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} // namespace aapt
100