diff --git a/.gitignore b/.gitignore index 93fca5e5d252a76785b7d8a1fef3b9d5d5d5939a..9dd8f45c59a3fe637ce46978b967f1350f483877 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ GTAGS /doc/lisp/elpa/ /doc/*.png /doc/*.gnu +/doc/filename.txt diff --git a/src/language/modules/MathModule.cpp b/src/language/modules/MathModule.cpp index 2217424e43bb9b276cf2260ce88c547252f88982..e73bfc4f5654f0864774ee2be8e1ada4b9d73927 100644 --- a/src/language/modules/MathModule.cpp +++ b/src/language/modules/MathModule.cpp @@ -2,6 +2,9 @@ #include <language/utils/BuiltinFunctionEmbedder.hpp> +#include <cmath> +#include <cstdlib> + MathModule::MathModule() { this->_addBuiltinFunction("sqrt", std::make_shared<BuiltinFunctionEmbedder<double(double)>>( @@ -10,6 +13,9 @@ MathModule::MathModule() this->_addBuiltinFunction("abs", std::make_shared<BuiltinFunctionEmbedder<double(double)>>( [](double x) -> double { return std::abs(x); })); + this->_addBuiltinFunction("abs", std::make_shared<BuiltinFunctionEmbedder<uint64_t(int64_t)>>( + [](int64_t x) -> uint64_t { return std::abs(x); })); + this->_addBuiltinFunction("sin", std::make_shared<BuiltinFunctionEmbedder<double(double)>>( [](double x) -> double { return std::sin(x); })); diff --git a/tests/test_BuiltinFunctionProcessor.cpp b/tests/test_BuiltinFunctionProcessor.cpp index 431fc186da94db30c013d73f565e8ede1619a5a2..60a4bd491f392b7cc0c303d94531edcf8634edbc 100644 --- a/tests/test_BuiltinFunctionProcessor.cpp +++ b/tests/test_BuiltinFunctionProcessor.cpp @@ -91,6 +91,15 @@ let x:R, x = sqrt(4); CHECK_BUILTIN_FUNCTION_EVALUATION_RESULT(data, "x", double{std::sqrt(4l)}); } + { // abs + tested_function_set.insert("abs:Z"); + std::string_view data = R"( +import math; +let z:Z, z = abs(-3); +)"; + CHECK_BUILTIN_FUNCTION_EVALUATION_RESULT(data, "z", int64_t{std::abs(-3)}); + } + { // abs tested_function_set.insert("abs:R"); std::string_view data = R"( diff --git a/tests/test_MathModule.cpp b/tests/test_MathModule.cpp index 99801b5f1d6602cbc40b0308e20ea1c1d9009b24..99966d4bacebb938fce5bc686661b5c53e8d708e 100644 --- a/tests/test_MathModule.cpp +++ b/tests/test_MathModule.cpp @@ -13,9 +13,30 @@ TEST_CASE("MathModule", "[language]") MathModule math_module; const auto& name_builtin_function = math_module.getNameBuiltinFunctionMap(); - REQUIRE(name_builtin_function.size() == 29); + REQUIRE(name_builtin_function.size() == 30); - SECTION("double -> double") + SECTION("Z -> N") + { + SECTION("abs:Z") + { + auto i_function = name_builtin_function.find("abs:Z"); + REQUIRE(i_function != name_builtin_function.end()); + + IBuiltinFunctionEmbedder& function_embedder = *i_function->second; + + int64_t arg = -3; + + DataVariant arg_variant = arg; + + DataVariant result_variant = function_embedder.apply({arg_variant}); + + uint64_t result = std::abs(arg); + + REQUIRE(std::get<decltype(result)>(result_variant) == Catch::Approx(result)); + } + } + + SECTION("R -> R") { double arg = 0.7; @@ -33,7 +54,7 @@ TEST_CASE("MathModule", "[language]") REQUIRE(std::get<decltype(result)>(result_variant) == Catch::Approx(result)); } - SECTION("abs") + SECTION("abs:R") { auto i_function = name_builtin_function.find("abs:R"); REQUIRE(i_function != name_builtin_function.end()); @@ -48,7 +69,7 @@ TEST_CASE("MathModule", "[language]") } { - arg = -3; + arg = double{-3}; DataVariant arg_variant = arg;