/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "Rule.h" #include "SplitDescription.h" #include #include #include #include using namespace android; namespace split { TEST(RuleTest, generatesValidJson) { sp rule = new Rule(); rule->op = Rule::AND_SUBRULES; sp subrule = new Rule(); subrule->op = Rule::EQUALS; subrule->key = Rule::SDK_VERSION; subrule->longArgs.add(7); rule->subrules.add(subrule); subrule = new Rule(); subrule->op = Rule::OR_SUBRULES; rule->subrules.add(subrule); sp subsubrule = new Rule(); subsubrule->op = Rule::GREATER_THAN; subsubrule->key = Rule::SCREEN_DENSITY; subsubrule->longArgs.add(10); subrule->subrules.add(subsubrule); subsubrule = new Rule(); subsubrule->op = Rule::LESS_THAN; subsubrule->key = Rule::SCREEN_DENSITY; subsubrule->longArgs.add(5); subrule->subrules.add(subsubrule); std::string expected( "{" " \"op\": \"AND_SUBRULES\"," " \"subrules\": [" " {" " \"op\": \"EQUALS\"," " \"property\": \"SDK_VERSION\"," " \"args\": [7]" " }," " {" " \"op\": \"OR_SUBRULES\"," " \"subrules\": [" " {" " \"op\": \"GREATER_THAN\"," " \"property\": \"SCREEN_DENSITY\"," " \"args\": [10]" " }," " {" " \"op\": \"LESS_THAN\"," " \"property\": \"SCREEN_DENSITY\"," " \"args\": [5]" " }" " ]" " }" " ]" "}"); // Trim expected.erase(std::remove_if(expected.begin(), expected.end(), ::isspace), expected.end()); std::string result(rule->toJson().string()); // Trim result.erase(std::remove_if(result.begin(), result.end(), ::isspace), result.end()); ASSERT_EQ(expected, result); } TEST(RuleTest, simplifiesSingleSubruleRules) { sp rule = new Rule(); rule->op = Rule::AND_SUBRULES; sp subrule = new Rule(); subrule->op = Rule::EQUALS; subrule->key = Rule::SDK_VERSION; subrule->longArgs.add(7); rule->subrules.add(subrule); sp simplified = Rule::simplify(rule); EXPECT_EQ(Rule::EQUALS, simplified->op); EXPECT_EQ(Rule::SDK_VERSION, simplified->key); ASSERT_EQ(1u, simplified->longArgs.size()); EXPECT_EQ(7, simplified->longArgs[0]); } TEST(RuleTest, simplifiesNestedSameOpSubrules) { sp rule = new Rule(); rule->op = Rule::AND_SUBRULES; sp subrule = new Rule(); subrule->op = Rule::AND_SUBRULES; rule->subrules.add(subrule); sp subsubrule = new Rule(); subsubrule->op = Rule::EQUALS; subsubrule->key = Rule::SDK_VERSION; subsubrule->longArgs.add(7); subrule->subrules.add(subsubrule); subrule = new Rule(); subrule->op = Rule::EQUALS; subrule->key = Rule::SDK_VERSION; subrule->longArgs.add(8); rule->subrules.add(subrule); sp simplified = Rule::simplify(rule); EXPECT_EQ(Rule::AND_SUBRULES, simplified->op); ASSERT_EQ(2u, simplified->subrules.size()); sp simplifiedSubrule = simplified->subrules[0]; EXPECT_EQ(Rule::EQUALS, simplifiedSubrule->op); EXPECT_EQ(Rule::SDK_VERSION, simplifiedSubrule->key); ASSERT_EQ(1u, simplifiedSubrule->longArgs.size()); EXPECT_EQ(7, simplifiedSubrule->longArgs[0]); simplifiedSubrule = simplified->subrules[1]; EXPECT_EQ(Rule::EQUALS, simplifiedSubrule->op); EXPECT_EQ(Rule::SDK_VERSION, simplifiedSubrule->key); ASSERT_EQ(1u, simplifiedSubrule->longArgs.size()); EXPECT_EQ(8, simplifiedSubrule->longArgs[0]); } } // namespace split