feat: add math engine and puzzle services
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
import pytest
|
||||
from rest_framework.exceptions import ValidationError
|
||||
|
||||
from toolbox.engine import calculate, parse_expression
|
||||
|
||||
|
||||
def test_calculate_精确计算与微积分():
|
||||
exact = calculate({"operation": "calculate", "expression": "sqrt(2) + 1/3"})
|
||||
derivative = calculate(
|
||||
{"operation": "derivative", "expression": "sin(x) + x^3", "variable": "x"}
|
||||
)
|
||||
integral = calculate(
|
||||
{
|
||||
"operation": "integral",
|
||||
"expression": "x^2",
|
||||
"variable": "x",
|
||||
"lower": "0",
|
||||
"upper": "3",
|
||||
}
|
||||
)
|
||||
|
||||
assert exact["result"]["exact"] == "1/3 + sqrt(2)"
|
||||
assert derivative["result"]["exact"] == "3*x**2 + cos(x)"
|
||||
assert integral["result"]["exact"] == "9"
|
||||
|
||||
|
||||
def test_calculate_方程矩阵统计与进制():
|
||||
solved = calculate({"operation": "solve", "expression": "x^2 - 5*x + 6 = 0"})
|
||||
determinant = calculate({"operation": "matrix_det", "expression": "1,2;3,4"})
|
||||
statistics = calculate({"operation": "statistics", "expression": "1,2,3,4"})
|
||||
converted = calculate(
|
||||
{"operation": "base", "expression": "FF", "from_base": 16, "to_base": 2}
|
||||
)
|
||||
units = calculate(
|
||||
{
|
||||
"operation": "unit",
|
||||
"expression": "1.75",
|
||||
"from_unit": "m",
|
||||
"to_unit": "cm",
|
||||
}
|
||||
)
|
||||
combinations = calculate({"operation": "calculate", "expression": "binomial(10, 3)"})
|
||||
|
||||
assert [item["exact"] for item in solved["result"]] == ["2", "3"]
|
||||
assert determinant["result"]["exact"] == "-2"
|
||||
assert statistics["result"]["mean"] == 2.5
|
||||
assert converted["result"]["exact"] == "11111111"
|
||||
assert units["result"]["exact"] == "175 cm"
|
||||
assert combinations["result"]["exact"] == "120"
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"source",
|
||||
[
|
||||
"__import__('os').system('id')",
|
||||
"open('/etc/passwd')",
|
||||
"x.__class__",
|
||||
"[x for x in range(10)]",
|
||||
],
|
||||
)
|
||||
def test_parse_expression_拒绝非数学语法(source):
|
||||
with pytest.raises(ValidationError):
|
||||
parse_expression(source)
|
||||
Reference in New Issue
Block a user