/*
 * 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>

namespace {

void TestKeyMatchFn(std::string key1, std::string key2, bool res) {
    auto evaluator = casbin::ExprtkEvaluator();
    auto func = casbin::ExprtkFunctionFactory::GetExprtkFunction(casbin::ExprtkFunctionType::KeyMatch, 2);
    evaluator.AddFunction("keyMatch", func);
    evaluator.AddIdentifier("key1", key1);
    evaluator.AddIdentifier("key2", key2);
    evaluator.Eval("keyMatch(key1, key2)");
    bool my_res = evaluator.GetBoolean();
    EXPECT_EQ(res, my_res);
}

TEST(TestBuiltInFunctions, TestKeyMatch) {
    TestKeyMatchFn("/foo", "/foo", true);
    TestKeyMatchFn("/foo", "/foo*", true);
    TestKeyMatchFn("/foo", "/foo/*", false);
    TestKeyMatchFn("/foo/bar", "/foo", false);
    TestKeyMatchFn("/foo/bar", "/foo*", true);
    TestKeyMatchFn("/foo/bar", "/foo/*", true);
    TestKeyMatchFn("/foobar", "/foo", false);
    TestKeyMatchFn("/foobar", "/foo*", true);
    TestKeyMatchFn("/foobar", "/foo/*", false);
}

void testKeyGetFn(std::string key1, std::string key2, std::string res) {
    //    std::string my_res = casbin::KeyGet(key1, key2);
    //    ASSERT_EQ(res, my_res);

    auto evaluator = casbin::ExprtkEvaluator();
    auto func = casbin::ExprtkFunctionFactory::GetExprtkFunction(casbin::ExprtkFunctionType::KeyGet, 2);
    evaluator.AddFunction("keyGet", func);
    evaluator.AddIdentifier("key1", key1);
    evaluator.AddIdentifier("key2", key2);
    evaluator.EnableGet("key_get_result");
    bool ok = evaluator.Eval("key_get_result := keyGet(key1, key2);");
    ASSERT_EQ(true, ok);
    std::string actual_result = evaluator.GetString();
    ASSERT_EQ(res, actual_result);
}

TEST(TestBuiltInFunctions, testKeyGet) {
    testKeyGetFn("/foo", "/foo", "");
    testKeyGetFn("/foo", "/foo*", "");
    testKeyGetFn("/foo", "/foo/*", "");
    testKeyGetFn("/foo/bar", "/foo", "");
    testKeyGetFn("/foo/bar", "/foo*", "/bar");
    testKeyGetFn("/foo/bar", "/foo/*", "bar");
    testKeyGetFn("/foobar", "/foo", "");
    testKeyGetFn("/foobar", "/foo*", "bar");
    testKeyGetFn("/foobar", "/foo/*", "");
}

void TestKeyMatch2Fn(std::string key1, std::string key2, bool res) {
    auto evaluator = casbin::ExprtkEvaluator();
    auto func = casbin::ExprtkFunctionFactory::GetExprtkFunction(casbin::ExprtkFunctionType::KeyMatch2, 2);
    evaluator.AddFunction("keyMatch2", func);
    evaluator.AddIdentifier("key1", key1);
    evaluator.AddIdentifier("key2", key2);
    evaluator.Eval("keyMatch2(key1, key2)");
    bool my_res = evaluator.GetBoolean();
    EXPECT_EQ(res, my_res);
}

TEST(TestBuiltInFunctions, TestKeyMatch2) {
    TestKeyMatch2Fn("/foo", "/foo", true);
    TestKeyMatch2Fn("/foo", "/foo*", true);
    TestKeyMatch2Fn("/foo", "/foo/*", false);
    TestKeyMatch2Fn("/foo/bar", "/foo", false);
    TestKeyMatch2Fn("/foo/bar", "/foo*", false); // different with KeyMatch.
    TestKeyMatch2Fn("/foo/bar", "/foo/*", true);
    TestKeyMatch2Fn("/foobar", "/foo", false);
    TestKeyMatch2Fn("/foobar", "/foo*", false); // different with KeyMatch.
    TestKeyMatch2Fn("/foobar", "/foo/*", false);

    TestKeyMatch2Fn("/", "/:resource", false);
    TestKeyMatch2Fn("/resource1", "/:resource", true);
    TestKeyMatch2Fn("/myid", "/:id/using/:resId", false);
    TestKeyMatch2Fn("/myid/using/myresid", "/:id/using/:resId", true);

    TestKeyMatch2Fn("/proxy/myid", "/proxy/:id/*", false);
    TestKeyMatch2Fn("/proxy/myid/", "/proxy/:id/*", true);
    TestKeyMatch2Fn("/proxy/myid/res", "/proxy/:id/*", true);
    TestKeyMatch2Fn("/proxy/myid/res/res2", "/proxy/:id/*", true);
    TestKeyMatch2Fn("/proxy/myid/res/res2/res3", "/proxy/:id/*", true);
    TestKeyMatch2Fn("/proxy/", "/proxy/:id/*", false);

    TestKeyMatch2Fn("/alice", "/:id", true);
    TestKeyMatch2Fn("/alice/all", "/:id/all", true);
    TestKeyMatch2Fn("/alice", "/:id/all", false);
    TestKeyMatch2Fn("/alice/all", "/:id", false);

    TestKeyMatch2Fn("/alice/all", "/:/all", false);
}

void testKeyGet2Fn(std::string key1, std::string key2, std::string path_var, std::string res) {
    //    std::string my_res = casbin::KeyGet2(key1, key2, path_var);
    //    ASSERT_EQ(res, my_res);

    auto evaluator = casbin::ExprtkEvaluator();
    auto func = casbin::ExprtkFunctionFactory::GetExprtkFunction(casbin::ExprtkFunctionType::KeyGet2, 3);
    evaluator.AddFunction("keyGet2", func);
    evaluator.AddIdentifier("key1", key1);
    evaluator.AddIdentifier("key2", key2);
    evaluator.AddIdentifier("path_var", path_var);
    evaluator.EnableGet("key_get_result");
    bool ok = evaluator.Eval("key_get_result := keyGet2(key1, key2, path_var);");
    ASSERT_EQ(true, ok);
    std::string actual_result = evaluator.GetString();
    ASSERT_EQ(res, actual_result);
}

TEST(TestBuiltInFunctions, testKeyGet2) {
    testKeyGet2Fn("/foo", "/foo", "id", "");
    testKeyGet2Fn("/foo", "/foo*", "id", "");
    testKeyGet2Fn("/foo", "/foo/*", "id", "");
    testKeyGet2Fn("/foo/bar", "/foo", "id", "");
    testKeyGet2Fn("/foo/bar", "/foo*", "id", "");
    testKeyGet2Fn("/foo/bar", "/foo/*", "id", "");
    testKeyGet2Fn("/foobar", "/foo", "id", "");
    testKeyGet2Fn("/foobar", "/foo*", "id", "");
    testKeyGet2Fn("/foobar", "/foo/*", "id", "");

    testKeyGet2Fn("/", "/:resource", "resource", "");
    testKeyGet2Fn("/resource1", "/:resource", "resource", "resource1");
    testKeyGet2Fn("/myid", "/:id/using/:resId", "id", "");
    testKeyGet2Fn("/myid/using/myresid", "/:id/using/:resId", "id", "myid");
    testKeyGet2Fn("/myid/using/myresid", "/:id/using/:resId", "resId", "myresid");

    testKeyGet2Fn("/proxy/myid", "/proxy/:id/*", "id", "");
    testKeyGet2Fn("/proxy/myid/", "/proxy/:id/*", "id", "myid");
    testKeyGet2Fn("/proxy/myid/res", "/proxy/:id/*", "id", "myid");
    testKeyGet2Fn("/proxy/myid/res/res2", "/proxy/:id/*", "id", "myid");
    testKeyGet2Fn("/proxy/myid/res/res2/res3", "/proxy/:id/*", "id", "myid");
    testKeyGet2Fn("/proxy/myid/res/res2/res3", "/proxy/:id/res/*", "id", "myid");
    testKeyGet2Fn("/proxy/", "/proxy/:id/*", "id", "");

    testKeyGet2Fn("/alice", "/:id", "id", "alice");
    testKeyGet2Fn("/alice/all", "/:id/all", "id", "alice");
    testKeyGet2Fn("/alice", "/:id/all", "id", "");
    testKeyGet2Fn("/alice/all", "/:id", "id", "");

    testKeyGet2Fn("/alice/all", "/:/all", "", "");
}

void TestKeyMatch3Fn(std::string key1, std::string key2, bool res) {
    auto evaluator = casbin::ExprtkEvaluator();
    auto func = casbin::ExprtkFunctionFactory::GetExprtkFunction(casbin::ExprtkFunctionType::KeyMatch3, 2);
    evaluator.AddFunction("keyMatch3", func);
    evaluator.AddIdentifier("key1", key1);
    evaluator.AddIdentifier("key2", key2);
    evaluator.Eval("keyMatch3(key1, key2)");
    bool my_res = evaluator.GetBoolean();
    EXPECT_EQ(res, my_res);
}

TEST(TestBuiltInFunctions, TestKeyMatch3) {
    // keyMatch3() is similar with KeyMatch2(), except using "/proxy/{id}" instead of "/proxy/:id".
    TestKeyMatch3Fn("/foo", "/foo", true);
    TestKeyMatch3Fn("/foo", "/foo*", true);
    TestKeyMatch3Fn("/foo", "/foo/*", false);
    TestKeyMatch3Fn("/foo/bar", "/foo", false);
    TestKeyMatch3Fn("/foo/bar", "/foo*", false);
    TestKeyMatch3Fn("/foo/bar", "/foo/*", true);
    TestKeyMatch3Fn("/foobar", "/foo", false);
    TestKeyMatch3Fn("/foobar", "/foo*", false);
    TestKeyMatch3Fn("/foobar", "/foo/*", false);

    TestKeyMatch3Fn("/", "/{resource}", false);
    TestKeyMatch3Fn("/resource1", "/{resource}", true);
    TestKeyMatch3Fn("/myid", "/{id}/using/{resId}", false);
    TestKeyMatch3Fn("/myid/using/myresid", "/{id}/using/{resId}", true);

    TestKeyMatch3Fn("/proxy/myid", "/proxy/{id}/*", false);
    TestKeyMatch3Fn("/proxy/myid/", "/proxy/{id}/*", true);
    TestKeyMatch3Fn("/proxy/myid/res", "/proxy/{id}/*", true);
    TestKeyMatch3Fn("/proxy/myid/res/res2", "/proxy/{id}/*", true);
    TestKeyMatch3Fn("/proxy/myid/res/res2/res3", "/proxy/{id}/*", true);
    TestKeyMatch3Fn("/proxy/", "/proxy/{id}/*", false);

    TestKeyMatch3Fn("/myid/using/myresid", "/{id/using/{resId}", false);
}

void testKeyGet3Fn(std::string key1, std::string key2, std::string path_var, std::string res) {
    //    std::string my_res = casbin::KeyGet3(key1, key2, path_var);
    //    ASSERT_EQ(res, my_res);

    auto evaluator = casbin::ExprtkEvaluator();
    auto func = casbin::ExprtkFunctionFactory::GetExprtkFunction(casbin::ExprtkFunctionType::KeyGet3, 3);
    evaluator.AddFunction("keyGet3", func);
    evaluator.AddIdentifier("key1", key1);
    evaluator.AddIdentifier("key2", key2);
    evaluator.AddIdentifier("path_var", path_var);
    evaluator.EnableGet("key_get_result");
    bool ok = evaluator.Eval("key_get_result := keyGet3(key1, key2, path_var);");
    ASSERT_EQ(true, ok);
    std::string actual_result = evaluator.GetString();
    ASSERT_EQ(res, actual_result);
}

TEST(TestBuiltInFunctions, testKeyGet3) {
    // KeyGet3() is similar with KeyGet2(), except using "/proxy/{id}" instead of "/proxy/:id".
    testKeyGet3Fn("/foo", "/foo", "id", "");
    testKeyGet3Fn("/foo", "/foo*", "id", "");
    testKeyGet3Fn("/foo", "/foo/*", "id", "");
    testKeyGet3Fn("/foo/bar", "/foo", "id", "");
    testKeyGet3Fn("/foo/bar", "/foo*", "id", "");
    testKeyGet3Fn("/foo/bar", "/foo/*", "id", "");
    testKeyGet3Fn("/foobar", "/foo", "id", "");
    testKeyGet3Fn("/foobar", "/foo*", "id", "");
    testKeyGet3Fn("/foobar", "/foo/*", "id", "");

    testKeyGet3Fn("/", "/{resource}", "resource", "");
    testKeyGet3Fn("/resource1", "/{resource}", "resource", "resource1");
    testKeyGet3Fn("/myid", "/{id}/using/{resId}", "id", "");
    testKeyGet3Fn("/myid/using/myresid", "/{id}/using/{resId}", "id", "myid");
    testKeyGet3Fn("/myid/using/myresid", "/{id}/using/{resId}", "resId", "myresid");

    testKeyGet3Fn("/proxy/myid", "/proxy/{id}/*", "id", "");
    testKeyGet3Fn("/proxy/myid/", "/proxy/{id}/*", "id", "myid");
    testKeyGet3Fn("/proxy/myid/res", "/proxy/{id}/*", "id", "myid");
    testKeyGet3Fn("/proxy/myid/res/res2", "/proxy/{id}/*", "id", "myid");
    testKeyGet3Fn("/proxy/myid/res/res2/res3", "/proxy/{id}/*", "id", "myid");
    testKeyGet3Fn("/proxy/", "/proxy/{id}/*", "id", "");

    testKeyGet3Fn("/api/group1_group_name/project1_admin/info", "/api/{proj}_admin/info", "proj", "");
    testKeyGet3Fn("/{id/using/myresid", "/{id/using/{resId}", "resId", "myresid");
    testKeyGet3Fn("/{id/using/myresid/status}", "/{id/using/{resId}/status}", "resId", "myresid");

    testKeyGet3Fn("/proxy/myid/res/res2/res3", "/proxy/{id}/*/{res}", "res", "res3");
    testKeyGet3Fn("/api/project1_admin/info", "/api/{proj}_admin/info", "proj", "project1");
    testKeyGet3Fn("/api/group1_group_name/project1_admin/info", "/api/{g}_{gn}/{proj}_admin/info", "g", "group1");
    testKeyGet3Fn("/api/group1_group_name/project1_admin/info", "/api/{g}_{gn}/{proj}_admin/info", "gn", "group_name");
    testKeyGet3Fn("/api/group1_group_name/project1_admin/info", "/api/{g}_{gn}/{proj}_admin/info", "proj", "project1");
}

void TestKeyMatch4Fn(std::string key1, std::string key2, bool res) {
    auto evaluator = casbin::ExprtkEvaluator();
    auto func = casbin::ExprtkFunctionFactory::GetExprtkFunction(casbin::ExprtkFunctionType::KeyMatch4, 2);
    evaluator.AddFunction("keyMatch4", func);
    evaluator.AddIdentifier("key1", key1);
    evaluator.AddIdentifier("key2", key2);
    evaluator.Eval("keyMatch4(key1, key2)");
    bool my_res = evaluator.GetBoolean();
    EXPECT_EQ(res, my_res);
}

TEST(TestBuiltInFunctions, TestKeyMatch4) {
    TestKeyMatch4Fn("/parent/123/child/123", "/parent/{id}/child/{id}", true);
    TestKeyMatch4Fn("/parent/123/child/456", "/parent/{id}/child/{id}", false);

    TestKeyMatch4Fn("/parent/123/child/123", "/parent/{id}/child/{another_id}", true);
    TestKeyMatch4Fn("/parent/123/child/456", "/parent/{id}/child/{another_id}", true);

    TestKeyMatch4Fn("/parent/123/child/123/book/123", "/parent/{id}/child/{id}/book/{id}", true);
    TestKeyMatch4Fn("/parent/123/child/123/book/456", "/parent/{id}/child/{id}/book/{id}", false);
    TestKeyMatch4Fn("/parent/123/child/456/book/123", "/parent/{id}/child/{id}/book/{id}", false);
    TestKeyMatch4Fn("/parent/123/child/456/book/", "/parent/{id}/child/{id}/book/{id}", false);
    TestKeyMatch4Fn("/parent/123/child/456", "/parent/{id}/child/{id}/book/{id}", false);

    TestKeyMatch4Fn("/parent/123/child/123", "/parent/{i/d}/child/{i/d}", false);
}

void TestRegexMatchFn(std::string key1, std::string key2, bool res) {
    auto evaluator = casbin::ExprtkEvaluator();
    auto func = casbin::ExprtkFunctionFactory::GetExprtkFunction(casbin::ExprtkFunctionType::RegexMatch, 2);
    evaluator.AddFunction("regexMatch", func);
    evaluator.AddIdentifier("key1", key1);
    evaluator.AddIdentifier("key2", key2);
    evaluator.Eval("regexMatch(key1, key2)");
    bool my_res = evaluator.GetBoolean();
    EXPECT_EQ(res, my_res);
}

TEST(TestBuiltInFunctions, TestRegexMatch) {
    TestRegexMatchFn("/topic/create", "/topic/create", true);
    TestRegexMatchFn("/topic/create/123", "/topic/create", false);
    TestRegexMatchFn("/topic/delete", "/topic/create", false);
    TestRegexMatchFn("/topic/edit", "/topic/edit/[0-9]+", false);
    TestRegexMatchFn("/topic/edit/123", "/topic/edit/[0-9]+", true);
    TestRegexMatchFn("/topic/edit/abc", "/topic/edit/[0-9]+", false);
    TestRegexMatchFn("/foo/delete/123", "/topic/delete/[0-9]+", false);
    TestRegexMatchFn("/topic/delete/0", "/topic/delete/[0-9]+", true);
    TestRegexMatchFn("/topic/edit/123s", "/topic/delete/[0-9]+", false);
}

void TestIPMatchFn(std::string ip1, std::string ip2, bool res) {
    auto evaluator = casbin::ExprtkEvaluator();
    auto func = casbin::ExprtkFunctionFactory::GetExprtkFunction(casbin::ExprtkFunctionType::IpMatch, 2);
    evaluator.AddFunction("ipMatch", func);
    evaluator.AddIdentifier("key1", ip1);
    evaluator.AddIdentifier("key2", ip2);
    evaluator.Eval("ipMatch(key1, key2)");
    bool my_res = evaluator.GetBoolean();
    EXPECT_EQ(res, my_res);
}

TEST(TestBuiltInFunctions, TestIPMatch) {
    TestIPMatchFn("192.168.2.123", "192.168.2.0/24", true);
    TestIPMatchFn("192.168.2.123", "192.168.3.0/24", false);
    TestIPMatchFn("192.168.2.123", "192.168.2.0/16", true);
    TestIPMatchFn("192.168.2.123", "192.168.2.123/32", true);
    TestIPMatchFn("10.0.0.11", "10.0.0.0/8", true);
    TestIPMatchFn("11.0.0.123", "10.0.0.0/8", false);
}

} // namespace
