140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski/*
240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * Copyright (C) 2014 The Android Open Source Project
340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski *
440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * you may not use this file except in compliance with the License.
640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * You may obtain a copy of the License at
740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski *
840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski *
1040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * Unless required by applicable law or agreed to in writing, software
1140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
1240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * See the License for the specific language governing permissions and
1440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * limitations under the License.
1540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski */
1640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
1740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski#include "RuleGenerator.h"
1840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
19dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski#include "aapt/SdkConstants.h"
20dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski#include "TestRules.h"
21dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski
2240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski#include <gtest/gtest.h>
23dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski#include <utils/Vector.h>
2440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
2540e8eefbedcafc51948945647d746daaee092f16Adam Lesinskiusing namespace android;
26dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinskiusing namespace split::test;
2740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
2840e8eefbedcafc51948945647d746daaee092f16Adam Lesinskinamespace split {
2940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
3040e8eefbedcafc51948945647d746daaee092f16Adam LesinskiTEST(RuleGeneratorTest, testAbiRules) {
3140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski    Vector<abi::Variant> abis;
32dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    const ssize_t armeabiIndex = abis.add(abi::Variant_armeabi);
33dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    const ssize_t armeabi_v7aIndex = abis.add(abi::Variant_armeabi_v7a);
34dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    const ssize_t x86Index = abis.add(abi::Variant_x86);
3540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
36dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    EXPECT_RULES_EQ(RuleGenerator::generateAbi(abis, armeabiIndex),
37dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            ContainsAnyRule(Rule::NATIVE_PLATFORM, "armeabi")
38dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    );
39dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski
40dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    EXPECT_RULES_EQ(RuleGenerator::generateAbi(abis, armeabi_v7aIndex),
41dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            ContainsAnyRule(Rule::NATIVE_PLATFORM, "armeabi-v7a", "arm64-v8a")
42dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    );
4340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
44dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    EXPECT_RULES_EQ(RuleGenerator::generateAbi(abis, x86Index),
45dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            ContainsAnyRule(Rule::NATIVE_PLATFORM, "x86", "x86_64")
46dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    );
4740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski}
4840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
49dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam LesinskiTEST(RuleGeneratorTest, densityConstantsAreSane) {
50c3344e8a6d7402326204d1232a4c5ffa382f70a9Adam Lesinski    EXPECT_LT(263, (int) ConfigDescription::DENSITY_XHIGH);
51c3344e8a6d7402326204d1232a4c5ffa382f70a9Adam Lesinski    EXPECT_GT(262, (int) ConfigDescription::DENSITY_HIGH);
52c3344e8a6d7402326204d1232a4c5ffa382f70a9Adam Lesinski    EXPECT_LT(363, (int) ConfigDescription::DENSITY_XXHIGH);
53c3344e8a6d7402326204d1232a4c5ffa382f70a9Adam Lesinski    EXPECT_GT(362, (int) ConfigDescription::DENSITY_XHIGH);
5440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski}
5540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
56dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam LesinskiTEST(RuleGeneratorTest, testDensityRules) {
57dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    Vector<int> densities;
58dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    const ssize_t highIndex = densities.add(ConfigDescription::DENSITY_HIGH);
59dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    const ssize_t xhighIndex = densities.add(ConfigDescription::DENSITY_XHIGH);
60dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    const ssize_t xxhighIndex = densities.add(ConfigDescription::DENSITY_XXHIGH);
61dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski
62dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    EXPECT_RULES_EQ(RuleGenerator::generateDensity(densities, highIndex),
63dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            AndRule()
64dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            .add(LtRule(Rule::SCREEN_DENSITY, 263))
65dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    );
66dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski
67dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    EXPECT_RULES_EQ(RuleGenerator::generateDensity(densities, xhighIndex),
68dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            AndRule()
69dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            .add(GtRule(Rule::SCREEN_DENSITY, 262))
70dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            .add(LtRule(Rule::SCREEN_DENSITY, 363))
71dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    );
72dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski
73dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    EXPECT_RULES_EQ(RuleGenerator::generateDensity(densities, xxhighIndex),
74dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            AndRule()
75dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            .add(GtRule(Rule::SCREEN_DENSITY, 362))
76dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    );
77c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski}
78c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski
79dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam LesinskiTEST(RuleGeneratorTest, testDensityRulesWithAnyDpi) {
80dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    Vector<int> densities;
81dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    const ssize_t highIndex = densities.add(ConfigDescription::DENSITY_HIGH);
82dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    const ssize_t xhighIndex = densities.add(ConfigDescription::DENSITY_XHIGH);
83dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    const ssize_t xxhighIndex = densities.add(ConfigDescription::DENSITY_XXHIGH);
84dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    const ssize_t anyIndex = densities.add(ConfigDescription::DENSITY_ANY);
85dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski
86dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    EXPECT_RULES_EQ(RuleGenerator::generateDensity(densities, highIndex),
87dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            AndRule()
88dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            .add(LtRule(Rule::SDK_VERSION, SDK_LOLLIPOP))
89dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            .add(LtRule(Rule::SCREEN_DENSITY, 263))
90dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    );
91dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski
92dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    EXPECT_RULES_EQ(RuleGenerator::generateDensity(densities, xhighIndex),
93dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            AndRule()
94dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            .add(LtRule(Rule::SDK_VERSION, SDK_LOLLIPOP))
95dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            .add(GtRule(Rule::SCREEN_DENSITY, 262))
96dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            .add(LtRule(Rule::SCREEN_DENSITY, 363))
97dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    );
98dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski
99dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    EXPECT_RULES_EQ(RuleGenerator::generateDensity(densities, xxhighIndex),
100dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            AndRule()
101dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            .add(LtRule(Rule::SDK_VERSION, SDK_LOLLIPOP))
102dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            .add(GtRule(Rule::SCREEN_DENSITY, 362))
103dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    );
104dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski
105dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    // We expect AlwaysTrue because anydpi always has attached v21 to the configuration
106dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    // and the rest of the rule generation code generates the sdk version checks.
107dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    EXPECT_RULES_EQ(RuleGenerator::generateDensity(densities, anyIndex), AlwaysTrue());
108c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski}
109c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski
11040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} // namespace split
111