diff --git a/campus_task/__init__.py b/campus_task/__init__.py index fb3b7982dae75be0253d3e0c1af67ee91fadadc5..f415f456ab039a5700de50122e021c82492365d8 100644 --- a/campus_task/__init__.py +++ b/campus_task/__init__.py @@ -1,4 +1,4 @@ from .task_model import Task -from .task_service import add_task, get_all_tasks, mark_task_done, get_task_by_id +from .task_service import add_task, get_all_tasks, mark_task_done, get_task_by_id, delete_task -__all__ = ["Task", "add_task", "get_all_tasks", "mark_task_done", "get_task_by_id"] \ No newline at end of file +__all__ = ["Task", "add_task", "get_all_tasks", "mark_task_done", "get_task_by_id", "delete_task"] \ No newline at end of file diff --git a/campus_task/task_service.py b/campus_task/task_service.py index 5b24eb96610941e86059d2d9154df673dcd8fa1e..cdad05514dae5ef708870f9f7a0e3659fd36dcde 100644 --- a/campus_task/task_service.py +++ b/campus_task/task_service.py @@ -35,4 +35,13 @@ def get_task_by_id(task_id: int) -> Optional[Task]: for task in tasks: if task.id == task_id: return task - return None \ No newline at end of file + return None + +def delete_task(task_id: int) -> bool: + tasks = load_tasks() + for i, task in enumerate(tasks): + if task.id == task_id: + del tasks[i] + save_tasks(tasks) + return True + return False \ No newline at end of file diff --git a/main.py b/main.py index dc617c540478cef52c244f1182d1b22c16c3603b..9c2d97e5391b375d03db1bb96421981103d00b10 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,5 @@ import sys -from campus_task import add_task, get_all_tasks, mark_task_done +from campus_task import add_task, get_all_tasks, mark_task_done, delete_task def print_tasks(): tasks = get_all_tasks() @@ -40,14 +40,29 @@ def handle_done(args): except ValueError: print("任务编号必须是数字") +def handle_delete(args): + if len(args) < 1: + print("用法: python main.py delete ") + return + try: + task_id = int(args[0]) + success = delete_task(task_id) + if success: + print(f"任务 {task_id} 已删除") + else: + print(f"未找到任务 {task_id}") + except ValueError: + print("任务编号必须是数字") + def interactive_mode(): while True: print("\n===== 校园任务清单 =====") print("1. 添加任务") print("2. 查看任务列表") print("3. 标记任务完成") - print("4. 退出") - choice = input("请输入选择 (1-4): ") + print("4. 删除任务") + print("5. 退出") + choice = input("请输入选择 (1-5): ") if choice == "1": title = input("请输入任务标题: ").strip() @@ -72,10 +87,21 @@ def interactive_mode(): except ValueError: print("任务编号必须是数字") elif choice == "4": + print_tasks() + try: + task_id = int(input("请输入要删除的任务编号: ")) + success = delete_task(task_id) + if success: + print(f"任务 {task_id} 已删除") + else: + print(f"未找到任务 {task_id}") + except ValueError: + print("任务编号必须是数字") + elif choice == "5": print("退出程序") break else: - print("无效选择,请输入 1-4") + print("无效选择,请输入 1-5") def main(): if len(sys.argv) >= 2: @@ -88,6 +114,8 @@ def main(): handle_list() elif command == "done": handle_done(args) + elif command == "delete": + handle_delete(args) else: print(f"未知命令: {command}") else: diff --git a/tests/test_delete.py b/tests/test_delete.py new file mode 100644 index 0000000000000000000000000000000000000000..e766267e66566f31e839ff0998d4eae885bcede2 --- /dev/null +++ b/tests/test_delete.py @@ -0,0 +1,36 @@ +import unittest +import os +import sys +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from campus_task import add_task, delete_task, get_all_tasks + +class TestDeleteFeature(unittest.TestCase): + + def setUp(self): + if os.path.exists("tasks.json"): + os.remove("tasks.json") + + def tearDown(self): + if os.path.exists("tasks.json"): + os.remove("tasks.json") + + def test_delete_existing_task(self): + task = add_task("测试任务") + result = delete_task(task.id) + self.assertTrue(result) + self.assertEqual(len(get_all_tasks()), 0) + + def test_delete_nonexistent_task(self): + result = delete_task(999) + self.assertFalse(result) + + def test_delete_last_task(self): + add_task("任务1") + add_task("任务2") + delete_task(1) + delete_task(2) + self.assertEqual(len(get_all_tasks()), 0) + +if __name__ == "__main__": + unittest.main() \ No newline at end of file