feat: solution for 'Экзамен: Самокорректирующийся агент'
This commit is contained in:
@@ -0,0 +1 @@
|
||||
# Test package initialization
|
||||
@@ -0,0 +1,53 @@
|
||||
import json
|
||||
import os
|
||||
import tempfile
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
from src.index import SelfCorrectingAgent, _safe_eval
|
||||
|
||||
|
||||
class TestSelfCorrectingAgent(unittest.TestCase):
|
||||
def setUp(self):
|
||||
# Create a temporary file for knowledge persistence
|
||||
self.temp_dir = tempfile.TemporaryDirectory()
|
||||
self.knowledge_file = Path(self.temp_dir.name) / "knowledge.json"
|
||||
self.agent = SelfCorrectingAgent(knowledge_file=self.knowledge_file)
|
||||
|
||||
def tearDown(self):
|
||||
self.temp_dir.cleanup()
|
||||
|
||||
def test_safe_eval_basic(self):
|
||||
self.assertEqual(_safe_eval("2+3*4"), 14)
|
||||
self.assertAlmostEqual(_safe_eval("10/4"), 2.5)
|
||||
self.assertEqual(_safe_eval("-5 + 2"), -3)
|
||||
|
||||
def test_safe_eval_invalid(self):
|
||||
with self.assertRaises(ValueError):
|
||||
_safe_eval("import os; os.system('echo hi')")
|
||||
with self.assertRaises(ValueError):
|
||||
_safe_eval("2 ** 3 ** 4") # exponentiation is allowed but nested is fine
|
||||
with self.assertRaises(ValueError):
|
||||
_safe_eval("2 + unknown_var")
|
||||
|
||||
def test_learning_and_persistence(self):
|
||||
problem = "1 + 1"
|
||||
# Initially unknown, should compute
|
||||
self.assertEqual(self.agent.solve(problem), 2)
|
||||
# Simulate user correction
|
||||
self.agent.knowledge[problem] = 3
|
||||
# Now should return learned answer
|
||||
self.assertEqual(self.agent.solve(problem), 3)
|
||||
# Persist knowledge
|
||||
self.agent._save_knowledge()
|
||||
# Load into new agent
|
||||
new_agent = SelfCorrectingAgent(knowledge_file=self.knowledge_file)
|
||||
self.assertEqual(new_agent.solve(problem), 3)
|
||||
|
||||
def test_invalid_expression(self):
|
||||
with self.assertRaises(ValueError):
|
||||
self.agent.solve("2 + * 3")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user