/*
 * 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 "TestRules.h"

#include <algorithm>
#include <gtest/gtest.h>
#include <string>
#include <utils/String8.h>

using namespace android;
using namespace split::test;

namespace split {

TEST(RuleTest, generatesValidJson) {
    Rule rule(AndRule()
        .add(EqRule(Rule::SDK_VERSION, 7))
        .add(OrRule()
                .add(GtRule(Rule::SCREEN_DENSITY, 10))
                .add(LtRule(Rule::SCREEN_DENSITY, 5))
        )
    );

    // Expected
    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]"
            "        }"
            "      ]"
            "     }"
            "  ]"
            "}");
    expected.erase(std::remove_if(expected.begin(), expected.end(), ::isspace), expected.end());

    // Result
    std::string result(rule.toJson().string());
    result.erase(std::remove_if(result.begin(), result.end(), ::isspace), result.end());

    ASSERT_EQ(expected, result);
}

TEST(RuleTest, simplifiesSingleSubruleRules) {
    sp<Rule> rule = new Rule(AndRule()
        .add(EqRule(Rule::SDK_VERSION, 7))
    );

    EXPECT_RULES_EQ(Rule::simplify(rule), EqRule(Rule::SDK_VERSION, 7));
}

TEST(RuleTest, simplifiesNestedSameOpSubrules) {
    sp<Rule> rule = new Rule(AndRule()
        .add(AndRule()
            .add(EqRule(Rule::SDK_VERSION, 7))
        )
        .add(EqRule(Rule::SDK_VERSION, 8))
    );

    EXPECT_RULES_EQ(Rule::simplify(rule),
            AndRule()
                .add(EqRule(Rule::SDK_VERSION, 7))
                .add(EqRule(Rule::SDK_VERSION, 8))
    );
}

} // namespace split
