42 lines
1.4 KiB
Python
42 lines
1.4 KiB
Python
from edgemind import safety
|
|
|
|
|
|
def test_evaluate_predicate_basic_true():
|
|
state = {"battery": 50, "dist": 3}
|
|
assert safety.evaluate_predicate("battery > 20 and dist < 5", state) is True
|
|
|
|
|
|
def test_evaluate_predicate_basic_false():
|
|
state = {"battery": 10, "dist": 10}
|
|
assert safety.evaluate_predicate("battery > 20 or dist < 5", state) is False
|
|
|
|
|
|
def test_evaluate_predicate_unknown_name():
|
|
state = {"battery": 50}
|
|
try:
|
|
safety.evaluate_predicate("battery > 20 and foo < 5", state)
|
|
assert False, "Expected UnsafeExpression for unknown name"
|
|
except safety.UnsafeExpression:
|
|
pass
|
|
|
|
|
|
def test_evaluate_predicate_malicious_code():
|
|
state = {"battery": 50}
|
|
# Attempt to call builtins or import should be rejected
|
|
try:
|
|
safety.evaluate_predicate("__import__('os').system('echo hi') == 0", state)
|
|
assert False, "Expected UnsafeExpression for malicious code"
|
|
except safety.UnsafeExpression:
|
|
pass
|
|
|
|
|
|
def test_check_contracts_aggregates_results():
|
|
contracts = {
|
|
"c1": {"predicate": "battery > 20", "fail_safe": "halt"},
|
|
"c2": {"predicate": "battery > 80", "fail_safe": "safe-mode"},
|
|
}
|
|
state = {"battery": 50}
|
|
results = dict((cid, (passed, fs)) for cid, passed, fs in safety.check_contracts(contracts, state))
|
|
assert results["c1"][0] is True and results["c1"][1] == "halt"
|
|
assert results["c2"][0] is False and results["c2"][1] == "safe-mode"
|