/*
 * Copyright 2021 The casbin Authors. All Rights Reserved.
 *
 * 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.
 *
 * This is a test file for testing built in functions in casbin
 */

#include <casbin/casbin.h>
#include <gtest/gtest.h>

#include "config_path.h"

namespace {
std::string global_sub;
std::string global_obj;
std::string global_act;
std::string global_domain;

template <typename T>
std::shared_ptr<casbin::IEvaluator> InitializeParams(const std::string& sub, const std::string& obj, const std::string& act) {
    auto evaluator = std::make_shared<T>();
    evaluator->InitialObject("r");

    // Because of "Short String Optimization", these strings's data is in stack.
    // For MSVC compiler, when this stack frame return, these memory will can't access.
    // So we need keep this memory accessiable.
    global_sub = sub;
    global_obj = obj;
    global_act = act;

    evaluator->PushObjectString("r", "sub", global_sub);
    evaluator->PushObjectString("r", "obj", global_obj);
    evaluator->PushObjectString("r", "act", global_act);

    return evaluator;
}

template <typename T>
std::shared_ptr<casbin::IEvaluator> InitializeParamsWithoutUsers(const std::string& obj, const std::string& act) {
    auto evaluator = std::make_shared<T>();
    evaluator->InitialObject("r");

    global_obj = obj;
    global_act = act;
    evaluator->PushObjectString("r", "obj", global_obj);
    evaluator->PushObjectString("r", "act", global_act);
    return evaluator;
}

template <typename T>
std::shared_ptr<casbin::IEvaluator> InitializeParamsWithoutResources(const std::string& sub, const std::string& act) {
    auto evaluator = std::make_shared<T>();
    evaluator->InitialObject("r");

    global_sub = sub;
    global_act = act;
    evaluator->PushObjectString("r", "sub", global_sub);
    evaluator->PushObjectString("r", "act", global_act);
    return evaluator;
}

template <typename T>
std::shared_ptr<casbin::IEvaluator> InitializeParamsWithDomains(const std::string& sub, const std::string& domain, const std::string& obj, const std::string& act) {
    auto evaluator = std::make_shared<T>();
    evaluator->InitialObject("r");

    global_sub = sub;
    global_obj = obj;
    global_act = act;
    global_domain = domain;

    evaluator->PushObjectString("r", "sub", global_sub);
    evaluator->PushObjectString("r", "dom", global_domain);
    evaluator->PushObjectString("r", "obj", global_obj);
    evaluator->PushObjectString("r", "act", global_act);
    return evaluator;
}

// casbin::Scope InitializeParamsWithJson(std::shared_ptr<nlohmann::json> sub, std::string obj, std::string act) {
//     casbin::Scope scope = casbin::InitializeScope();
//     casbin::PushObject(scope, "r");

//     casbin::PushStringPropToObject(scope, "r", obj, "obj");
//     casbin::PushStringPropToObject(scope, "r", act, "act");

//     casbin::PushObject(scope, "sub");
//     casbin::PushObjectPropFromJson(scope, *sub, "sub");
//     casbin::PushObjectPropToObject(scope, "r", "sub");

//     return scope;
// }

// void TestEnforce(casbin::Enforcer& e, casbin::Scope& scope, bool res) {
//     auto evaluator = std::make_shared<casbin::DuktapeEvaluator>(scope);
//     ASSERT_EQ(res, e.Enforce(evaluator));
// }

void TestEnforce(casbin::Enforcer& e, std::shared_ptr<casbin::IEvaluator> evaluator, bool res) { ASSERT_EQ(res, e.Enforce(evaluator)); }

TEST(TestModelEnforcer, TestBasicModel) {
    casbin::Enforcer e(basic_model_path, basic_policy_path);

    std::shared_ptr<casbin::IEvaluator> evaluator;

    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "write");
    TestEnforce(e, evaluator, true);
}

TEST(TestModelEnforcer, TestBasicModelWithoutSpaces) {
    casbin::Enforcer e(basic_model_without_spaces_path, basic_policy_path);

    std::shared_ptr<casbin::IEvaluator> evaluator;

    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "write");
    TestEnforce(e, evaluator, true);
}

TEST(TestModelEnforcer, TestBasicModelNoPolicy) {
    casbin::Enforcer e(basic_model_path);

    std::shared_ptr<casbin::IEvaluator> evaluator;

    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "write");
    TestEnforce(e, evaluator, false);
}

TEST(TestModelEnforcer, TestBasicModelWithRoot) {
    casbin::Enforcer e(basic_with_root_model_path, basic_policy_path);

    std::shared_ptr<casbin::IEvaluator> evaluator;

    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "write");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("root", "data1", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("root", "data1", "write");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("root", "data2", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("root", "data2", "write");
    TestEnforce(e, evaluator, true);
}

TEST(TestModelEnforcer, TestBasicModelWithRootNoPolicy) {
    casbin::Enforcer e(basic_with_root_model_path);

    std::shared_ptr<casbin::IEvaluator> evaluator;

    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("root", "data1", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("root", "data1", "write");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("root", "data2", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("root", "data2", "write");
    TestEnforce(e, evaluator, true);
}

TEST(TestModelEnforcer, TestBasicModelWithoutUsers) {
    casbin::Enforcer e(basic_without_users_model_path, basic_without_users_policy_path);

    auto evaluator = InitializeParamsWithoutUsers<casbin::ExprtkEvaluator>("data1", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParamsWithoutUsers<casbin::ExprtkEvaluator>("data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithoutUsers<casbin::ExprtkEvaluator>("data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithoutUsers<casbin::ExprtkEvaluator>("data2", "write");
    TestEnforce(e, evaluator, true);
}

TEST(TestModelEnforcer, TestBasicModelWithoutResources) {
    casbin::Enforcer e(basic_without_resources_model_path, basic_without_resources_policy_path);

    auto evaluator = InitializeParamsWithoutResources<casbin::ExprtkEvaluator>("alice", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParamsWithoutResources<casbin::ExprtkEvaluator>("alice", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithoutResources<casbin::ExprtkEvaluator>("bob", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithoutResources<casbin::ExprtkEvaluator>("bob", "write");
    TestEnforce(e, evaluator, true);
}

TEST(TestModelEnforcer, TestRBACModel) {
    casbin::Enforcer e(rbac_model_path, rbac_policy_path);

    std::shared_ptr<casbin::IEvaluator> evaluator;

    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "write");
    TestEnforce(e, evaluator, true);
}

TEST(TestModelEnforcer, TestRBACModelWithResourceRoles) {
    casbin::Enforcer e(rbac_with_resource_roles_model_path, rbac_with_resource_roles_policy_path);

    std::shared_ptr<casbin::IEvaluator> evaluator;

    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "write");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "write");
    TestEnforce(e, evaluator, true);
}

TEST(TestModelEnforcer, TestRBACModelWithDomains) {
    casbin::Enforcer e(rbac_with_domains_model_path, rbac_with_domains_policy_path);

    auto evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data1", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data1", "write");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data2", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data1", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data2", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data2", "write");
    TestEnforce(e, evaluator, true);
}

TEST(TestModelEnforcer, TestRBACModelWithDomainsAtRuntime) {
    casbin::Enforcer e(rbac_with_domains_model_path);

    std::vector<std::string> params{"admin", "domain1", "data1", "read"};
    e.AddPolicy(params);
    params = std::vector<std::string>{"admin", "domain1", "data1", "write"};
    e.AddPolicy(params);
    params = std::vector<std::string>{"admin", "domain2", "data2", "read"};
    e.AddPolicy(params);
    params = std::vector<std::string>{"admin", "domain2", "data2", "write"};
    e.AddPolicy(params);

    params = std::vector<std::string>{"alice", "admin", "domain1"};
    e.AddGroupingPolicy(params);
    params = std::vector<std::string>{"bob", "admin", "domain2"};
    e.AddGroupingPolicy(params);

    auto evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data1", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data1", "write");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data2", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data1", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data2", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data2", "write");
    TestEnforce(e, evaluator, true);

    // Remove all policy rules related to domain1 and data1.
    params = std::vector<std::string>{"domain1", "data1"};
    e.RemoveFilteredPolicy(1, params);

    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data1", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data1", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data2", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data2", "write");
    TestEnforce(e, evaluator, true);

    // Remove the specified policy rule.
    params = std::vector<std::string>{"admin", "domain2", "data2", "read"};
    e.RemovePolicy(params);

    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data1", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data2", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data1", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data2", "write");
    TestEnforce(e, evaluator, true);
}

TEST(TestModelEnforcer, TestRBACModelWithDomainsAtRuntimeMockAdapter) {
    std::shared_ptr<casbin::Adapter> adapter = std::make_shared<casbin::FileAdapter>(rbac_with_domains_policy_path);
    casbin::Enforcer e(rbac_with_domains_model_path, adapter);

    std::vector<std::string> params{"admin", "domain3", "data1", "read"};
    e.AddPolicy(params);
    params = std::vector<std::string>{"alice", "admin", "domain3"};
    e.AddGroupingPolicy(params);

    auto evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain3", "data1", "read");
    TestEnforce(e, evaluator, true);

    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data1", "read");
    TestEnforce(e, evaluator, true);

    params = std::vector<std::string>{"domain1", "data1"};
    e.RemoveFilteredPolicy(1, params);

    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data1", "read");
    TestEnforce(e, evaluator, false);

    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data2", "read");
    TestEnforce(e, evaluator, true);
    params = std::vector<std::string>{"admin", "domain2", "data2", "read"};
    e.RemovePolicy(params);

    evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data2", "read");
    TestEnforce(e, evaluator, false);
}

TEST(TestModelEnforcer, TestRBACModelWithDeny) {
    casbin::Enforcer e(rbac_with_deny_model_path, rbac_with_deny_policy_path);

    std::shared_ptr<casbin::IEvaluator> evaluator;

    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "write");
    TestEnforce(e, evaluator, true);
}

TEST(TestModelEnforcer, TestRBACModelWithOnlyDeny) {
    casbin::Enforcer e(rbac_with_not_deny_model_path, rbac_with_deny_policy_path);

    auto evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
    TestEnforce(e, evaluator, false);
}

TEST(TestModelEnforcer, TestRBACModelWithCustomData) {
    casbin::Enforcer e(rbac_model_path, rbac_policy_path);

    // You can add custom data to a grouping policy, Casbin will ignore it. It is only meaningful to the caller.
    // This feature can be used to store information like whether "bob" is an end user (so no subject will inherit "bob")
    // For Casbin, it is equivalent to: e.AddGroupingPolicy("bob", "data2_admin")
    std::vector<std::string> params{"bob", "data2_admin", "custom_data"};
    e.AddGroupingPolicy(params);

    auto evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "write");
    TestEnforce(e, evaluator, true);

    // You should also take the custom data as a parameter when deleting a grouping policy.
    // e.RemoveGroupingPolicy("bob", "data2_admin") won't work.
    // Or you can remove it by using RemoveFilteredGroupingPolicy().
    params = std::vector<std::string>{"bob", "data2_admin", "custom_data"};
    e.RemoveGroupingPolicy(params);

    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "read");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "write");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "read");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "write");
    TestEnforce(e, evaluator, true);
}

TEST(TestModelEnforcer, TestRBACModelWithPattern) {
    casbin::Enforcer e(rbac_with_pattern_model_path, rbac_with_pattern_policy_path);

    // Here's a little confusing: the matching function here is not the custom function used in matcher.
    // It is the matching function used by "g" (and "g2", "g3" if any..)
    // You can see in policy that: "g2, /book/:id, book_group", so in "g2()" function in the matcher, instead
    // of checking whether "/book/:id" equals the obj: "/book/1", it checks whether the pattern matches.
    // You can see it as normal RBAC: "/book/:id" == "/book/1" becomes KeyMatch2("/book/:id", "/book/1")
    e.AddNamedMatchingFunc("p", "", casbin::KeyMatch2);

    auto evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "/book/1", "GET");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "/book/2", "GET");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "/pen/1", "GET");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "/pen/2", "GET");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "/book/1", "GET");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "/book/2", "GET");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "/pen/1", "GET");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "/pen/2", "GET");
    TestEnforce(e, evaluator, true);

    // AddMatchingFunc() is actually setting a function because only one function is allowed,
    // so when we set "KeyMatch3", we are actually replacing "KeyMatch2" with "KeyMatch3".
    e.AddNamedMatchingFunc("p", "", casbin::KeyMatch3);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "/book2/1", "GET");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "/book2/2", "GET");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "/pen2/1", "GET");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "/pen2/2", "GET");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "/book2/1", "GET");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "/book2/2", "GET");
    TestEnforce(e, evaluator, false);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "/pen2/1", "GET");
    TestEnforce(e, evaluator, true);
    evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "/pen2/2", "GET");
    TestEnforce(e, evaluator, true);
}

} // namespace
