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 "Rule.h"
1840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
1940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski#include "SplitDescription.h"
20dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski#include "TestRules.h"
2140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
2240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski#include <algorithm>
2340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski#include <gtest/gtest.h>
24dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski#include <string>
2540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski#include <utils/String8.h>
2640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
2740e8eefbedcafc51948945647d746daaee092f16Adam Lesinskiusing namespace android;
28dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinskiusing namespace split::test;
2940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
3040e8eefbedcafc51948945647d746daaee092f16Adam Lesinskinamespace split {
3140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
3240e8eefbedcafc51948945647d746daaee092f16Adam LesinskiTEST(RuleTest, generatesValidJson) {
33dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    Rule rule(AndRule()
34dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski        .add(EqRule(Rule::SDK_VERSION, 7))
35dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski        .add(OrRule()
36dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski                .add(GtRule(Rule::SCREEN_DENSITY, 10))
37dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski                .add(LtRule(Rule::SCREEN_DENSITY, 5))
38dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski        )
39dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    );
40dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski
41dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    // Expected
4240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski    std::string expected(
4340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "{"
4440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "  \"op\": \"AND_SUBRULES\","
4540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "  \"subrules\": ["
4640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "    {"
4740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "      \"op\": \"EQUALS\","
4840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "      \"property\": \"SDK_VERSION\","
4940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "      \"args\": [7]"
5040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "    },"
5140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "    {"
5240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "      \"op\": \"OR_SUBRULES\","
5340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "      \"subrules\": ["
5440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "        {"
5540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "          \"op\": \"GREATER_THAN\","
5640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "          \"property\": \"SCREEN_DENSITY\","
5740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "          \"args\": [10]"
5840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "        },"
5940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "        {"
6040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "          \"op\": \"LESS_THAN\","
6140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "          \"property\": \"SCREEN_DENSITY\","
6240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "          \"args\": [5]"
6340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "        }"
6440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "      ]"
6540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "     }"
6640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "  ]"
6740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            "}");
6840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski    expected.erase(std::remove_if(expected.begin(), expected.end(), ::isspace), expected.end());
6940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
70dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    // Result
71dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    std::string result(rule.toJson().string());
7240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski    result.erase(std::remove_if(result.begin(), result.end(), ::isspace), result.end());
7340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
7440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski    ASSERT_EQ(expected, result);
7540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski}
7640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
7740e8eefbedcafc51948945647d746daaee092f16Adam LesinskiTEST(RuleTest, simplifiesSingleSubruleRules) {
78dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    sp<Rule> rule = new Rule(AndRule()
79dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski        .add(EqRule(Rule::SDK_VERSION, 7))
80dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    );
8140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
82dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    EXPECT_RULES_EQ(Rule::simplify(rule), EqRule(Rule::SDK_VERSION, 7));
8340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski}
8440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
8540e8eefbedcafc51948945647d746daaee092f16Adam LesinskiTEST(RuleTest, simplifiesNestedSameOpSubrules) {
86dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    sp<Rule> rule = new Rule(AndRule()
87dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski        .add(AndRule()
88dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            .add(EqRule(Rule::SDK_VERSION, 7))
89dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski        )
90dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski        .add(EqRule(Rule::SDK_VERSION, 8))
91dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    );
92dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski
93dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    EXPECT_RULES_EQ(Rule::simplify(rule),
94dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski            AndRule()
95dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski                .add(EqRule(Rule::SDK_VERSION, 7))
96dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski                .add(EqRule(Rule::SDK_VERSION, 8))
97dcdfe9fef4b07ee53d312c3fbecc74cb215ace6fAdam Lesinski    );
9840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski}
9940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
10040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} // namespace split
101