From 36c9513445eb287385c05b606c918dc6290f4fe5 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 21 Jun 2025 14:55:05 +0400 Subject: [PATCH 1/5] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20void=20remove(int=20i?= =?UTF-8?q?d)=20=D0=B2=20HistoriManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/manager/HistoryManager.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/manager/HistoryManager.java b/src/manager/HistoryManager.java index 3307c60..d32c405 100644 --- a/src/manager/HistoryManager.java +++ b/src/manager/HistoryManager.java @@ -8,4 +8,7 @@ public interface HistoryManager { List getHistory(); void add(Task task); + + void remove (int id); + } From bb8d7d581f7de1a9b50b3809edbe317c274551c6 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 22 Jun 2025 14:56:26 +0400 Subject: [PATCH 2/5] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D1=8C:=201.=D0=B8=D1=81=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D1=8E=20=D0=BF=D0=BE=D1=81=D0=B5=D1=89=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9=20=D0=BD=D0=B5=D0=BE=D0=B3=D1=80=D0=B0=D0=BD=D0=B8=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D0=BE=D0=B9=20=D0=BF=D0=BE=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D0=BC=D0=B5=D1=80=D1=83=202.=D0=98=D0=B7=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D1=82=D1=8C=D1=81=D1=8F=20=D0=BE=D1=82=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B2=D1=82=D0=BE=D1=80=D0=BD=D1=8B=D1=85=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=81=D0=BC=D0=BE=D1=82=D1=80=D0=BE=D0=B2=20=D0=B2=20?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D0=BE=D1=80=D0=B8=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Main.java | 86 +++++++++++-------------- src/manager/HistoryManager.java | 2 +- src/manager/InMemoryHistoryManager.java | 80 +++++++++++++++++++---- src/manager/InMemoryTaskManager.java | 16 ++++- 4 files changed, 118 insertions(+), 66 deletions(-) diff --git a/src/Main.java b/src/Main.java index 039c654..784c22a 100644 --- a/src/Main.java +++ b/src/Main.java @@ -8,86 +8,72 @@ public class Main { public static void main(String[] args) { - TaskManager taskManager = Managers.getDefault(); - - // 1.Создать таску + // 1. Создать таску System.out.println("Создать таску"); - Task taskForCreate = new Task("Name", "Desc", TaskStatus.NEW); - taskManager.createTask(taskForCreate); + Task task = new Task("Name", "Desc", TaskStatus.NEW); + taskManager.createTask(task); System.out.println(taskManager.getTasks()); + System.out.println("История после создания задачи (должна быть пустая): " + taskManager.getHistory()); System.out.println(); - // 2.Получить таску + // 2. Получить таску (добавится в историю) System.out.println("Получить таску"); - System.out.println(taskManager.getTask(taskForCreate.getId())); + System.out.println(taskManager.getTask(task.getId())); + System.out.println("История после первого просмотра (1 задача): " + taskManager.getHistory()); System.out.println(); - // 3. Проверим обновление - System.out.println("Проверим обновление"); - Task taskForUpdate = new Task(taskForCreate.getId(), "New name", - taskForCreate.getDescription(), TaskStatus.IN_PROGRESS); - taskForUpdate = taskManager.updateTask(taskForUpdate); - System.out.println(taskManager.getTasks()); - System.out.println(); - - //4. Удаляем таску - System.out.println("Удаляем таску"); - taskManager.deleteTask(taskForUpdate.getId()); - System.out.println(taskManager.getTasks()); + // 3. Получить таску еще раз (должна остаться одна запись) + System.out.println("Получить таску повторно"); + System.out.println(taskManager.getTask(task.getId())); + System.out.println("История после повторного просмотра (все равно 1 задача): " + taskManager.getHistory()); System.out.println(); - //5. Создаём Эпик + // 4. Создаём Эпик System.out.println("Создаём Эпик"); Epic epic = new Epic("Отпуск", "Организовать отпуск"); taskManager.createEpic(epic); + System.out.println("История после создания эпика (не должна измениться): " + taskManager.getHistory()); + System.out.println(); + + // 5. Просматриваем эпик (добавится в историю) + System.out.println("Просматриваем эпик"); System.out.println(taskManager.getEpic(epic.getId())); + System.out.println("История после просмотра эпика (2 задачи): " + taskManager.getHistory()); System.out.println(); - //5. Создаём Сабтаски + // 6. Создаём Сабтаски System.out.println("Создаём Сабтаски"); Subtask subtask1 = new Subtask("Путёвка", "Выбрать путёвку", TaskStatus.NEW, epic.getId()); Subtask subtask2 = new Subtask("Билеты", "Купить билеты", TaskStatus.NEW, epic.getId()); taskManager.createSubtask(subtask1); taskManager.createSubtask(subtask2); - taskManager.getEpicSubtasks(epic.getId()); - System.out.println(taskManager.getEpicSubtasks(epic.getId())); - System.out.println(); - - //6. Проверяем статус Эпика (NEW) - System.out.println("Проверяем статус Эпика " + taskManager.getEpic(epic.getId()).getTaskStatus()); + System.out.println("История после создания подзадач (не должна измениться): " + taskManager.getHistory()); System.out.println(); - //7. Меняем статус первого Сабтаска. - Subtask updatedSubtask = new Subtask(subtask1.getId(), subtask1.getName(), subtask1.getDescription(), - TaskStatus.DONE, subtask1.getEpicId()); - taskManager.updateSubtask(updatedSubtask); - System.out.println("Статус Эпика после изменения одной Сабтаски " + taskManager.getEpic(epic.getId()).getTaskStatus()); + // 7. Просматриваем подзадачи (добавляются в историю) + System.out.println("Просматриваем подзадачи"); + System.out.println("Подзадача 1: " + taskManager.getSubtasks(subtask1.getId())); + System.out.println("Текущая история (3 задачи - задача, эпик, подзадача1): " + taskManager.getHistory()); + System.out.println("Подзадача 2: " + taskManager.getSubtasks(subtask2.getId())); + System.out.println("История после просмотра второй подзадачи (4 задачи): " + taskManager.getHistory()); System.out.println(); - //8. Меняем статус второго Сабтаска. - Subtask updatedSubtask2 = new Subtask(subtask2.getId(), subtask2.getName(), subtask2.getDescription(), - TaskStatus.DONE, subtask2.getEpicId()); - taskManager.updateSubtask(updatedSubtask2); - System.out.println("Статус Эпика после изменения одной Сабтаски " + taskManager.getEpic(epic.getId()).getTaskStatus()); + // 8. Удаляем таску (должна удалиться из истории) + System.out.println("Удаляем таску"); + taskManager.deleteTask(task.getId()); + System.out.println("История после удаления задачи (3 задачи): " + taskManager.getHistory()); System.out.println(); - //9. Удаляем Эпик. + // 9. Удаляем Эпик (должны удалиться эпик и его подзадачи из истории) + System.out.println("Удаляем Эпик"); taskManager.deleteEpic(epic.getId()); - System.out.println("Эпики после удаления: " + taskManager.getEpics()); - System.out.println("Сабтаски после удаления Эпика: " + taskManager.getSubtasks()); + System.out.println("История после удаления эпика (должна быть пустая): " + taskManager.getHistory()); System.out.println(); - //10. Проверяем удаление всех задач. - taskManager.deleteAllTasks(); - System.out.println("Все Таски после очистки: " + taskManager.getTasks()); - System.out.println("Все Сабтаски после очистки: " + taskManager.getSubtasks()); - System.out.println("Все Эпики после очистки: " + taskManager.getEpics()); - - //11.Проверяем историю. - System.out.println("Проверяем историю."); - System.out.println(taskManager.getHistory()); - System.out.println(); + // 10. Проверяем историю после всех операций + System.out.println("Финальная проверка истории"); + System.out.println("История: " + taskManager.getHistory()); } } diff --git a/src/manager/HistoryManager.java b/src/manager/HistoryManager.java index d32c405..be0776e 100644 --- a/src/manager/HistoryManager.java +++ b/src/manager/HistoryManager.java @@ -9,6 +9,6 @@ public interface HistoryManager { void add(Task task); - void remove (int id); + void remove(int id); } diff --git a/src/manager/InMemoryHistoryManager.java b/src/manager/InMemoryHistoryManager.java index e47e982..a8dadf9 100644 --- a/src/manager/InMemoryHistoryManager.java +++ b/src/manager/InMemoryHistoryManager.java @@ -1,31 +1,85 @@ package manager; import tasks.Task; -import java.util.LinkedList; -import java.util.List; +import java.util.*; public class InMemoryHistoryManager implements HistoryManager { - private static final int MAX_HISTORY_SIZE = 10; - private final LinkedList history = new LinkedList<>(); + // Внутренний класс для узла двусвязного списка. + private static class Node { + Task task; + Node prev; + Node next; - @Override - public List getHistory() { - //Получить список историй. - return new LinkedList<>(history); + Node(Task task) { + this.task = task; + } } + private final Map nodeMap = new HashMap<>(); + private Node head; + private Node tail; + + // Добавление задачи в историю просмотров. @Override public void add(Task task) { - //Добавить таску в список с историей. if (task == null) { return; } - if (history.size() >= MAX_HISTORY_SIZE) { - history.removeFirst(); + remove(task.getId()); + + Node node = new Node(task); + LinkLast(node); + nodeMap.put(task.getId(), node); + } + + // Удаление задачи из истории по ID. + @Override + public void remove(int id) { + Node node = nodeMap.remove(id); + + if (node != null) { + removeNode(node); } - history.remove(task); - history.addLast(task); + } + // Получение списка задач из истории просмотров. + @Override + public List getHistory() { + List history = new ArrayList<>(); + + Node current = head; + while (current != null) { + history.add(current.task); + current = current.next; + } + return history; + } + + // Добавление узла в конец двусвязного списка. + private void LinkLast(Node node) { + if (tail == null) { + head = tail = node; + } else { + tail.next = node; + node.prev = tail; + tail = node; + } + } + + // Удаление узла из двусвязного списка + private void removeNode(Node node) { + if (node.prev != null) { + node.prev.next = node.next; + } else { + head = node.next; + } + + if (node.next != null) { + node.next.prev = node.prev; + } else { + tail = node.prev; + } } } + diff --git a/src/manager/InMemoryTaskManager.java b/src/manager/InMemoryTaskManager.java index e755b7d..e64e7c8 100644 --- a/src/manager/InMemoryTaskManager.java +++ b/src/manager/InMemoryTaskManager.java @@ -23,6 +23,7 @@ public class InMemoryTaskManager implements TaskManager { // Методы для Task @Override public List getTasks() { + return new ArrayList<>(tasks.values()); } @@ -54,7 +55,11 @@ public Task updateTask(Task task) { @Override public Task deleteTask(int id) { - return tasks.remove(id); + Task task = tasks.remove(id); + if (task != null) { + historyManager.remove(id); + } + return task; } // Методы для Subtask @@ -119,6 +124,7 @@ public Subtask deleteSubtask(int id) { epic.removeSubtaskId(id); updateEpicStatus(epic); } + historyManager.remove(id); } return subtask; } @@ -162,8 +168,9 @@ public Epic deleteEpic(int id) { if (epic != null) { for (Integer subtaskId : epic.getSubtasksId()) { subtasks.remove(subtaskId); + historyManager.remove(subtaskId); } - + historyManager.remove(id); } return epic; } @@ -190,6 +197,11 @@ public void deleteAllTasks() { subtasks.clear(); epics.clear(); generatorId = 1; + + List history = historyManager.getHistory(); + for (Task task : history) { + historyManager.remove(task.getId()); + } } @Override From bdc1229c58da8f915807ffc616cd06f4d2fb33e6 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 22 Jun 2025 16:57:36 +0400 Subject: [PATCH 3/5] =?UTF-8?q?=D0=A1=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B=20=D0=BF=D0=BE=D0=B4=20=D0=B8=D0=B7=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B2=D1=88=D0=B8=D0=B9=D1=81=D1=8F=20=D0=B0?= =?UTF-8?q?=D0=BB=D0=B3=D0=BE=D1=80=D0=B8=D1=82=D0=BC=20=D1=85=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8?= =?UTF-8?q?=D0=B9=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/checkstyle-idea.xml | 19 ++ .idea/checkstyleidea-libs/readme.txt | 6 + checkstyle.xml | 253 +++++++++++++++++++ java-kanban.iml | 3 + test/manager/InMemoryHistoryManagerTest.java | 37 ++- test/manager/InMemoryTaskManagerTest.java | 27 ++ 6 files changed, 343 insertions(+), 2 deletions(-) create mode 100644 .idea/checkstyle-idea.xml create mode 100644 .idea/checkstyleidea-libs/readme.txt create mode 100644 checkstyle.xml diff --git a/.idea/checkstyle-idea.xml b/.idea/checkstyle-idea.xml new file mode 100644 index 0000000..94f04f1 --- /dev/null +++ b/.idea/checkstyle-idea.xml @@ -0,0 +1,19 @@ + + + + 10.25.0 + Everything + true + + + + \ No newline at end of file diff --git a/.idea/checkstyleidea-libs/readme.txt b/.idea/checkstyleidea-libs/readme.txt new file mode 100644 index 0000000..d011e75 --- /dev/null +++ b/.idea/checkstyleidea-libs/readme.txt @@ -0,0 +1,6 @@ +This folder contains libraries copied from the "java-kanban" project. +It is managed by the CheckStyle-IDEA IDE plugin. +Do not modify this folder while the IDE is running. +When the IDE is stopped, you may delete this folder at any time. It will be recreated as needed. +In order to prevent the CheckStyle-IDEA IDE plugin from creating this folder, +uncheck the "Copy libraries from project directory" option in the CheckStyle-IDEA settings dialog. diff --git a/checkstyle.xml b/checkstyle.xml new file mode 100644 index 0000000..87bb112 --- /dev/null +++ b/checkstyle.xml @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java-kanban.iml b/java-kanban.iml index 5dfd50f..265bb5c 100644 --- a/java-kanban.iml +++ b/java-kanban.iml @@ -1,5 +1,8 @@ + + diff --git a/test/manager/InMemoryHistoryManagerTest.java b/test/manager/InMemoryHistoryManagerTest.java index a08e241..d5e7059 100644 --- a/test/manager/InMemoryHistoryManagerTest.java +++ b/test/manager/InMemoryHistoryManagerTest.java @@ -6,8 +6,7 @@ import tasks.TaskStatus; import java.util.List; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.*; public class InMemoryHistoryManagerTest { @@ -46,5 +45,39 @@ void addToHistory() { assertEquals(1, history.size(), "История должна содержать 1 задачу"); assertEquals(task, history.get(0), "Задача в истории должна соответствовать добавленной"); } + + // Повторное добавление задачи заменяет предыдущую запись. + @Test + void duplicateTaskInHistory() { + Task task = taskManager.createTask(new Task("Task", "Desc", TaskStatus.NEW)); + historyManager.add(task); + Task updatedTask = new Task(task.getId(), "Task", "Updated Desc", TaskStatus.IN_PROGRESS); + historyManager.add(updatedTask); + + List history = historyManager.getHistory(); + assertEquals(1, history.size(), "История должна содержать только одну задачу"); + assertEquals(TaskStatus.IN_PROGRESS, history.get(0).getTaskStatus(), "Задача должна быть обновлена"); + } + + // Удаление задачи из истории. + @Test + void removeTaskFromHistory() { + Task task1 = taskManager.createTask(new Task("Task1", "Desc", TaskStatus.NEW)); + Task task2 = taskManager.createTask(new Task("Task2", "Desc", TaskStatus.IN_PROGRESS)); + historyManager.add(task1); + historyManager.add(task2); + historyManager.remove(task1.getId()); + + List history = historyManager.getHistory(); + assertEquals(1, history.size(), "История должна содержать 1 задачу после удаления"); + assertEquals(task2, history.get(0), "Оставшаяся задача должна быть task2"); + } + + // Пустая история. + @Test + void emptyHistory() { + List history = historyManager.getHistory(); + assertTrue(history.isEmpty(), "История должна быть пустой"); + } } diff --git a/test/manager/InMemoryTaskManagerTest.java b/test/manager/InMemoryTaskManagerTest.java index e9359fe..2cfaa0d 100644 --- a/test/manager/InMemoryTaskManagerTest.java +++ b/test/manager/InMemoryTaskManagerTest.java @@ -126,4 +126,31 @@ void taskRemainsUnchanged() { assertEquals(original.getTaskStatus(), added.getTaskStatus(), "Статус не должен изменяться"); } + // Удаление задачи удаляет её из истории. + @Test + void dtleteTaskRemovesFromHistory() { + Task task = taskManager.createTask(new Task("Task", "Desc", TaskStatus.NEW)); + taskManager.getTask(task.getId()); + taskManager.deleteTask(task.getId()); + + List history = taskManager.getHistory(); + assertTrue(history.isEmpty(), "История должна быть пустой после удаления задачи"); + } + + // Удаление эпика удаляет его подзадачи из истории. + @Test + void deleteEpicRemovesSubtasksFromHistory() { + Epic epic = taskManager.createEpic(new Epic("Epic", "Desc")); + Subtask subtask = taskManager.createSubtask( + new Subtask("Subtask", "Desc", TaskStatus.NEW, epic.getId())); + taskManager.getSubtasks(subtask.getId()); + taskManager.getEpic(epic.getId()); + taskManager.deleteEpic(epic.getId()); + + List history = taskManager.getHistory(); + assertTrue(history.isEmpty(), "История должна быть пустой после удаления эпика"); + } } + + + From 63123f908f3789efdcc2219649ac70d540d2b73d Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 22 Jun 2025 17:28:39 +0400 Subject: [PATCH 4/5] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D1=83=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B4=20=D1=81=D1=82=D0=B0=D0=B9=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/manager/InMemoryHistoryManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/manager/InMemoryHistoryManager.java b/src/manager/InMemoryHistoryManager.java index a8dadf9..251c414 100644 --- a/src/manager/InMemoryHistoryManager.java +++ b/src/manager/InMemoryHistoryManager.java @@ -29,7 +29,7 @@ public void add(Task task) { remove(task.getId()); Node node = new Node(task); - LinkLast(node); + linkLast(node); nodeMap.put(task.getId(), node); } @@ -57,7 +57,7 @@ public List getHistory() { } // Добавление узла в конец двусвязного списка. - private void LinkLast(Node node) { + private void linkLast(Node node) { if (tail == null) { head = tail = node; } else { From f9ded48a32591c74e32aeb9a96cb723613874d3a Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 24 Jun 2025 17:01:07 +0400 Subject: [PATCH 5/5] =?UTF-8?q?=D0=A0=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20AllTasks=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=82=D1=80=D0=B8=20=D0=BC=D0=B5=D1=82=D0=BE?= =?UTF-8?q?=D0=B4=D0=B0.=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=B2=D0=BD=D1=83=D1=82=D1=80=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9=20=D0=BA=D0=BB=D0=B0=D1=81=20Node=20=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B=D0=BC.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/manager/InMemoryHistoryManager.java | 25 +++++----- src/manager/InMemoryTaskManager.java | 34 +++++++++++-- src/manager/TaskManager.java | 10 +++- test/manager/InMemoryTaskManagerTest.java | 58 ++++++++++++++++++++++- 4 files changed, 108 insertions(+), 19 deletions(-) diff --git a/src/manager/InMemoryHistoryManager.java b/src/manager/InMemoryHistoryManager.java index 251c414..3ec8caa 100644 --- a/src/manager/InMemoryHistoryManager.java +++ b/src/manager/InMemoryHistoryManager.java @@ -5,16 +5,6 @@ public class InMemoryHistoryManager implements HistoryManager { - // Внутренний класс для узла двусвязного списка. - private static class Node { - Task task; - Node prev; - Node next; - - Node(Task task) { - this.task = task; - } - } private final Map nodeMap = new HashMap<>(); private Node head; @@ -48,9 +38,9 @@ public void remove(int id) { public List getHistory() { List history = new ArrayList<>(); - Node current = head; + Node current = head; while (current != null) { - history.add(current.task); + history.add(current.item); current = current.next; } return history; @@ -81,5 +71,16 @@ private void removeNode(Node node) { tail = node.prev; } } + + // Внутренний класс для узла двусвязного списка. + private static class Node { + T item; + Node prev; + Node next; + + Node(T item) { + this.item = item; + } + } } diff --git a/src/manager/InMemoryTaskManager.java b/src/manager/InMemoryTaskManager.java index e64e7c8..2c7dae9 100644 --- a/src/manager/InMemoryTaskManager.java +++ b/src/manager/InMemoryTaskManager.java @@ -193,15 +193,39 @@ public List getEpicSubtasks(int epicId) { @Override public void deleteAllTasks() { + for (Integer taskId : tasks.keySet()) { + historyManager.remove(taskId); + } tasks.clear(); + } + + @Override + public void deleteAllSubtasks() { + for (Integer subtaskId : subtasks.keySet()) { + historyManager.remove(subtaskId); + } subtasks.clear(); - epics.clear(); - generatorId = 1; + for (Epic epic : epics.values()) { + epic.getSubtasksId().clear(); + updateEpicStatus(epic); + } + } - List history = historyManager.getHistory(); - for (Task task : history) { - historyManager.remove(task.getId()); + @Override + public void deleteAllEpics() { + deleteAllSubtasks(); + for (Integer epicId : epics.keySet()) { + historyManager.remove(epicId); } + epics.clear(); + } + + @Override + public void deleteAll() { + deleteAllTasks(); + deleteAllSubtasks(); + deleteAllEpics(); + generatorId = 1; } @Override diff --git a/src/manager/TaskManager.java b/src/manager/TaskManager.java index e714b04..81e0619 100644 --- a/src/manager/TaskManager.java +++ b/src/manager/TaskManager.java @@ -41,7 +41,15 @@ public interface TaskManager { List getEpicSubtasks(int epicId); + // Метод для получения истории + List getHistory(); + + // Методы для удаления void deleteAllTasks(); - List getHistory(); + void deleteAllSubtasks(); + + void deleteAllEpics(); + + void deleteAll(); } diff --git a/test/manager/InMemoryTaskManagerTest.java b/test/manager/InMemoryTaskManagerTest.java index 2cfaa0d..1af39da 100644 --- a/test/manager/InMemoryTaskManagerTest.java +++ b/test/manager/InMemoryTaskManagerTest.java @@ -128,7 +128,7 @@ void taskRemainsUnchanged() { // Удаление задачи удаляет её из истории. @Test - void dtleteTaskRemovesFromHistory() { + void deleteTaskRemovesFromHistory() { Task task = taskManager.createTask(new Task("Task", "Desc", TaskStatus.NEW)); taskManager.getTask(task.getId()); taskManager.deleteTask(task.getId()); @@ -150,6 +150,62 @@ void deleteEpicRemovesSubtasksFromHistory() { List history = taskManager.getHistory(); assertTrue(history.isEmpty(), "История должна быть пустой после удаления эпика"); } + + // Удаляем только таски. + @Test + void deleteAllTasksRemovesOnlyTasks() { + Task task = taskManager.createTask(new Task("Task", "Desc", TaskStatus.NEW)); + Epic epic = taskManager.createEpic(new Epic("Epic", "Desc")); + Subtask subtask = taskManager.createSubtask(new Subtask("Sub", "Desc", TaskStatus.NEW, epic.getId())); + + taskManager.deleteAllTasks(); + + assertTrue(taskManager.getTasks().isEmpty(), "Все задачи должны быть удалены"); + assertFalse(taskManager.getEpics().isEmpty(), "Эпики должны остаться"); + assertFalse(taskManager.getSubtasks().isEmpty(), "Подзадачи должны остаться"); + } + + // Удаляем только сабтаски. + @Test + void deleteAllSubtasksRemovesOnlySubtasks() { + Task task = taskManager.createTask(new Task("Task", "Desc", TaskStatus.NEW)); + Epic epic = taskManager.createEpic(new Epic("Epic", "Desc")); + Subtask subtask = taskManager.createSubtask(new Subtask("Sub", "Desc", TaskStatus.NEW, epic.getId())); + + taskManager.deleteAllSubtasks(); + + assertFalse(taskManager.getTasks().isEmpty(), "Задачи должны остаться"); + assertFalse(taskManager.getEpics().isEmpty(), "Эпики должны остаться"); + assertTrue(taskManager.getSubtasks().isEmpty(), "Все подзадачи должны быть удалены"); + } + + // Удаляем эпики и их сабтаски. + @Test + void deleteAllEpicsRemovesEpicsAndSubtasks() { + Task task = taskManager.createTask(new Task("Task", "Desc", TaskStatus.NEW)); + Epic epic = taskManager.createEpic(new Epic("Epic", "Desc")); + Subtask subtask = taskManager.createSubtask(new Subtask("Sub", "Desc", TaskStatus.NEW, epic.getId())); + + taskManager.deleteAllEpics(); + + assertFalse(taskManager.getTasks().isEmpty(), "Задачи должны остаться"); + assertTrue(taskManager.getEpics().isEmpty(), "Все эпики должны быть удалены"); + assertTrue(taskManager.getSubtasks().isEmpty(), "Все подзадачи должны быть удалены"); + } + + // Удаляем всё. + @Test + void deleteAllRemovesEverything() { + Task task = taskManager.createTask(new Task("Task", "Desc", TaskStatus.NEW)); + Epic epic = taskManager.createEpic(new Epic("Epic", "Desc")); + Subtask subtask = taskManager.createSubtask(new Subtask("Sub", "Desc", TaskStatus.NEW, epic.getId())); + + taskManager.deleteAll(); + + assertTrue(taskManager.getTasks().isEmpty(), "Все задачи должны быть удалены"); + assertTrue(taskManager.getEpics().isEmpty(), "Все эпики должны быть удалены"); + assertTrue(taskManager.getSubtasks().isEmpty(), "Все подзадачи должны быть удалены"); + } }