From fb8a400f86bca2d3c285ddcab9a579323c15610f Mon Sep 17 00:00:00 2001 From: Valerii_Butko Date: Fri, 29 Nov 2024 21:52:41 +0500 Subject: [PATCH 1/4] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=B0=D1=82=D1=8B=20=D0=BD=D0=B0=D1=87=D0=B0?= =?UTF-8?q?=D0=BB=D0=B0=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8,=20=D0=B5?= =?UTF-8?q?=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B4=D0=BE=D0=BB=D0=B6=D0=B8=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=B0=D1=82=D0=B0=20=D0=BA=D0=BE=D0=BD=D1=86=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Main.java | 44 ++++++++++++++++++----- src/tracker/EpicTask.java | 45 ++++++++++++++++++++--- src/tracker/FileBackedTaskManager.java | 4 +-- src/tracker/InMemoryTaskManager.java | 32 +++++++++++++++++ src/tracker/Subtask.java | 39 +++++++++++--------- src/tracker/Task.java | 49 +++++++++++++++++++++++--- tasks.csv | 3 ++ 7 files changed, 180 insertions(+), 36 deletions(-) diff --git a/src/Main.java b/src/Main.java index 06c664c..93563f4 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,9 +1,12 @@ import tracker.*; import java.io.File; +import java.time.Duration; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.HashMap; import java.util.Scanner; +import java.util.TreeSet; public class Main { public static void main(String[] args) { @@ -27,7 +30,6 @@ public static void main(String[] args) { manager = new FileBackedTaskManager(tasks, epicTasks, subTasks, fileName); } - while (true) { printMenu(); int command = scanner.nextInt(); @@ -39,16 +41,24 @@ public static void main(String[] args) { heading = scanner.nextLine(); System.out.println("Введите описание задачи:"); description = scanner.nextLine(); + System.out.println("Введите продолжительность задачи (в минутах):"); + long durationMinutes = scanner.nextLong(); + Duration duration = Duration.ofMinutes(durationMinutes); + System.out.println("Введите дату и время начала выполнения задачи (в формате YYYY-MM-DDTHH:MM):"); + String startTimeInput = scanner.next(); + LocalDateTime startTime = LocalDateTime.parse(startTimeInput); + int index = manager.getTaskIndex(heading, description, "task"); if (index != -1) { System.out.println("Такая задача уже есть! Ее индекс: " + tasks.get(index).getId()); } else { - Task newTask = new Task(heading, description, index); + Task newTask = new Task(heading, description, index, duration, startTime); manager.createTask(newTask); System.out.println("Задача успешно создана! Ее индекс: " + newTask.getId()); } break; + case 2: System.out.println("Введите идентификатор задачи, которую хотите отредактировать: "); id = scanner.nextInt(); @@ -71,7 +81,7 @@ public static void main(String[] args) { String newDescription = scanner.nextLine(); manager.updateTask(id, comm, newDescription); System.out.println("Новое описание сохранено!"); - } else if (comm == 0) { + } else if (comm == 0) { break; } else { System.out.println("Такой команды нет!"); @@ -81,6 +91,7 @@ public static void main(String[] args) { System.out.println("Задачи с таким id пока что нет"); } break; + case 3: System.out.println("Введите идентификатор задачи, которую хотите посмотреть:"); id = scanner.nextInt(); @@ -147,12 +158,14 @@ public static void main(String[] args) { id = scanner.nextInt(); System.out.println(manager.getSubtasks(id)); break; + case 8: - System.out.println("Введите название задачи:"); + System.out.println("Введите название эпика:"); heading = scanner.nextLine(); - System.out.println("Введите описание задачи:"); + System.out.println("Введите описание эпика:"); description = scanner.nextLine(); + int epicIndex = manager.getTaskIndex(heading, description, "epic task"); if (epicIndex != -1) { @@ -177,7 +190,14 @@ public static void main(String[] args) { System.out.println("Введите описание подзадачи:"); description = scanner.nextLine(); - Subtask newSubtask = new Subtask(heading, description, 0, epicId); + System.out.println("Введите продолжительность задачи (в минутах):"); + durationMinutes = scanner.nextLong(); + duration = Duration.ofMinutes(durationMinutes); + System.out.println("Введите дату и время начала выполнения эпика (в формате YYYY-MM-DDTHH:MM):"); + startTimeInput = scanner.next(); + startTime = LocalDateTime.parse(startTimeInput); + + Subtask newSubtask = new Subtask(heading, description, 0, epicId, duration, startTime); Subtask createdSubtask = manager.createSubTask(newSubtask); System.out.println("Подзадача успешно создана! Ее идентификатор - " + createdSubtask.getId()); break; @@ -198,7 +218,14 @@ public static void main(String[] args) { case 11: System.out.println(Managers.getDefaultHistory().getHistory()); break; - case 12: + case 12: // Например, добавим новый пункт в меню для получения приоритезированных задач + System.out.println("== Приоритезированные задачи: =="); + TreeSet prioritizedTasks = manager.getPrioritizedTasks(); + for (Task task : prioritizedTasks) { + System.out.println(task); + } + break; + case 13: return; } } @@ -217,6 +244,7 @@ private static void printMenu() { System.out.println("9 - Добавить подзадачи в эпик"); System.out.println("10 - Отметить сделанную задачу"); System.out.println("11 - Показать историю просмотров"); - System.out.println("12 - Выход"); + System.out.println("12 - Вывести задачи приотизировано"); + System.out.println("13 - Выход"); } } \ No newline at end of file diff --git a/src/tracker/EpicTask.java b/src/tracker/EpicTask.java index eaac55d..6ddd04d 100644 --- a/src/tracker/EpicTask.java +++ b/src/tracker/EpicTask.java @@ -1,36 +1,69 @@ package tracker; +import java.time.Duration; +import java.time.LocalDateTime; import java.util.ArrayList; public class EpicTask extends Task { private ArrayList subtasks; public EpicTask(String heading, String description, int id) { - super(heading, description, id); + super(heading, description, id, Duration.ZERO, null); // Устанавливаем нулевую продолжительность и null для startTime this.subtasks = new ArrayList<>(); } public void addSubtask(Subtask subtask) { subtasks.add(subtask); + calculateEpicDetails(); } public ArrayList getSubtasks() { return subtasks; } + private void calculateEpicDetails() { + Duration totalDuration = Duration.ZERO; + LocalDateTime earliestStartTime = null; + LocalDateTime latestEndTime = null; + + for (Subtask subtask : subtasks) { + totalDuration = totalDuration.plus(subtask.getDuration()); + if (earliestStartTime == null || (subtask.getStartTime() != null && subtask.getStartTime().isBefore(earliestStartTime))) { + earliestStartTime = subtask.getStartTime(); + } + if (latestEndTime == null || (subtask.getEndTime() != null && subtask.getEndTime().isAfter(latestEndTime))) { + latestEndTime = subtask.getEndTime(); + } + } + + this.duration = totalDuration; + this.startTime = earliestStartTime; + } + + @Override + public LocalDateTime getEndTime() { + return super.getEndTime(); // Используем реализацию из Task + } + @Override public String printTask() { - return "Глобальная задача с идентификатором " + id + "\n" + "Название: " + heading + "\n" + "Описание: " + description + "\n" + "Статус: " + status + "\n"; + return "Глобальная задача с идентификатором " + id + "\n" + + "Название: " + heading + "\n" + + "Описание: " + description + "\n" + + "Статус: " + status + "\n" + + "Продолжительность: " + duration.toMinutes() + " минут\n" + + "Время начала: " + (startTime != null ? startTime : "Не задано"); } @Override public String toString() { - return getId() + "," + Type.EPIC + "," + getHeading() + "," + getStatus() + "," + getDescription() + ","; + return getId() + "," + Type.EPIC + "," + getHeading() + "," + getStatus() + "," + + getDescription() + "," + duration.toMinutes() + "," + (startTime != null ? startTime : ""); } public static EpicTask fromString(String value) { String[] parts = value.split(","); - if (parts.length < 5) { + if (parts.length < 7) { // Минимальное количество частей для корректного разбора throw new IllegalArgumentException("Неверный формат строки: " + value); } @@ -38,9 +71,13 @@ public static EpicTask fromString(String value) { String heading = parts[2]; Status status = Status.valueOf(parts[3]); String description = parts[4]; + Duration duration = Duration.ofMinutes(Long.parseLong(parts[5])); + LocalDateTime startTime = parts[6].isEmpty() ? null : LocalDateTime.parse(parts[6]); EpicTask epicTask = new EpicTask(heading, description, id); epicTask.setStatus(status); + epicTask.setDuration(duration); + epicTask.setStartTime(startTime); return epicTask; } diff --git a/src/tracker/FileBackedTaskManager.java b/src/tracker/FileBackedTaskManager.java index 541b8f2..c3de901 100644 --- a/src/tracker/FileBackedTaskManager.java +++ b/src/tracker/FileBackedTaskManager.java @@ -5,9 +5,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; +import java.util.*; public class FileBackedTaskManager extends InMemoryTaskManager { private final String filePath; diff --git a/src/tracker/InMemoryTaskManager.java b/src/tracker/InMemoryTaskManager.java index 052b27c..a7b1b98 100644 --- a/src/tracker/InMemoryTaskManager.java +++ b/src/tracker/InMemoryTaskManager.java @@ -120,6 +120,7 @@ public EpicTask createEpicTask(EpicTask epicTask) { } + @Override public Subtask createSubTask(Subtask subtask) { type = "subtask"; @@ -267,4 +268,35 @@ public boolean checkEpicTaskId(int id) { public ArrayList getHistory() { return historyManager.getHistory(); } + + public TreeSet getPrioritizedTasks() { + TreeSet prioritizedTasks = new TreeSet<>(Comparator + .comparing(Task::getStartTime, Comparator.nullsLast(Comparator.naturalOrder())) + .thenComparing(Task::getId)); // Добавляем сравнение по ID + + // Добавляем все обычные задачи + for (Task task : tasks.values()) { + if (task.getStartTime() != null) { + prioritizedTasks.add(task); + } + } + + // Добавляем все эпики + for (EpicTask epic : epicTasks.values()) { + if (epic.getStartTime() != null) { + prioritizedTasks.add(epic); + + for (Subtask subtask : epic.getSubtasks()) { + if (subtask.getStartTime() != null) { + prioritizedTasks.add(subtask); + } else { + System.out.println("Подзадача с ID " + subtask.getId() + " имеет null startTime и не будет добавлена."); + } + } + } + } + + return prioritizedTasks; + } + } \ No newline at end of file diff --git a/src/tracker/Subtask.java b/src/tracker/Subtask.java index 58242e3..651a7cb 100644 --- a/src/tracker/Subtask.java +++ b/src/tracker/Subtask.java @@ -1,39 +1,44 @@ package tracker; +import java.time.Duration; +import java.time.LocalDateTime; import java.util.HashMap; - public class Subtask extends Task { int epicId; - public Subtask(String heading, String description, int id, int epicId) { - super(heading, description, id); + public Subtask(String heading, String description, int id, int epicId, Duration duration, LocalDateTime startTime) { + super(heading, description, id, duration, startTime); this.epicId = epicId; } public EpicTask getEpicTask(HashMap epicTaskHashMap) { - if (epicTaskHashMap.containsKey(epicId)) { - return epicTaskHashMap.get(epicId); - } else { - System.out.println("Эпика с таким айди нет"); - return null; - } + return epicTaskHashMap.get(epicId); + } + + @Override + public LocalDateTime getEndTime() { + return super.getEndTime(); // Используем реализацию из Task } @Override public String printTask() { - return "Подзадача с идентификатором " + id + "\n" + "Название: " + heading + "\n" + "Описание: " + description + "\n" + "Статус: " + status + "\n" + "Принадлежит эпику с идентификатором " + epicId + "\n"; + return "Подзадача с идентификатором " + id + "\n" + + "Название: " + heading + "\n" + + "Описание: " + description + "\n" + + "Статус: " + status + "\n" + + "Принадлежит эпику с идентификатором " + epicId + "\n"; } @Override public String toString() { - return getId() + "," + Type.SUB + "," + getHeading() + "," + getStatus() + "," + getDescription() + "," + epicId; + return getId() + "," + Type.SUB + "," + getHeading() + "," + getStatus() + "," + + getDescription() + "," + epicId + "," + duration.toMinutes() + "," + startTime; } - // Переопределение метода fromString public static Subtask fromString(String value) { String[] parts = value.split(","); - if (parts.length < 6) { // Учитываем, что у Subtask 6 частей + if (parts.length < 8) { throw new IllegalArgumentException("Неверный формат строки: " + value); } @@ -41,10 +46,12 @@ public static Subtask fromString(String value) { String heading = parts[2]; Status status = Status.valueOf(parts[3]); String description = parts[4]; - int epicId = Integer.parseInt(parts[5]); // Извлекаем epicId + int epicId = Integer.parseInt(parts[5]); + Duration duration = Duration.ofMinutes(Long.parseLong(parts[6])); + LocalDateTime startTime = LocalDateTime.parse(parts[7]); - Subtask subtask = new Subtask(heading, description, id, epicId); - subtask.setStatus(status); // Устанавливаем статус + Subtask subtask = new Subtask(heading, description, id, epicId, duration, startTime); + subtask.setStatus(status); return subtask; } } \ No newline at end of file diff --git a/src/tracker/Task.java b/src/tracker/Task.java index 9aa1b11..13e1a9c 100644 --- a/src/tracker/Task.java +++ b/src/tracker/Task.java @@ -1,16 +1,45 @@ package tracker; +import java.time.Duration; +import java.time.LocalDateTime; + public class Task { protected String heading; protected String description; protected Status status; protected int id; + protected Duration duration; // Продолжительность задачи + protected LocalDateTime startTime; // Дата начала задачи - public Task(String heading, String description, int id) { + // Конструктор с параметрами + public Task(String heading, String description, int id, Duration duration, LocalDateTime startTime) { this.heading = heading; this.description = description; this.id = id; this.status = Status.NEW; + this.duration = duration; + this.startTime = startTime; + } + + // Геттеры и сеттеры + public Duration getDuration() { + return duration; + } + + public void setDuration(Duration duration) { + this.duration = duration; + } + + public LocalDateTime getStartTime() { + return startTime; + } + + public void setStartTime(LocalDateTime startTime) { + this.startTime = startTime; + } + + public LocalDateTime getEndTime() { + return (startTime != null && duration != null) ? startTime.plus(duration) : null; } public void setHeading(String heading) { @@ -30,7 +59,13 @@ public String getDescription() { } public String printTask() { - return "Обычная задача с идентификатором " + id + "\n" + "Название: " + heading + "\n" + "Описание: " + description + "\n" + "Статус: " + status + "\n"; + return "Обычная задача с идентификатором " + id + "\n" + + "Название: " + heading + "\n" + + "Описание: " + description + "\n" + + "Статус: " + status + "\n" + + "Продолжительность: " + (duration != null ? duration.toMinutes() + " минут" : "не указана") + "\n" + + "Дата начала: " + (startTime != null ? startTime.toString() : "не указана") + "\n" + + "Дата окончания: " + getEndTime(); } public int getId() { @@ -51,12 +86,14 @@ public void setStatus(Status status) { @Override public String toString() { - return getId() + "," + Type.TASK + "," + getHeading() + "," + getStatus() + "," + getDescription() + ","; + return getId() + "," + Type.TASK + "," + getHeading() + "," + getStatus() + "," + getDescription() + "," + + (duration != null ? duration.toMinutes() : "0") + "," + + (startTime != null ? startTime.toString() : ""); } public static Task fromString(String value) { String[] parts = value.split(","); - if (parts.length < 5) { + if (parts.length < 6) { // Обновлено для учета новых полей throw new IllegalArgumentException("Неверный формат строки: " + value); } @@ -64,8 +101,10 @@ public static Task fromString(String value) { String heading = parts[2]; Status status = Status.valueOf(parts[3]); String description = parts[4]; + Duration duration = Duration.ofMinutes(Long.parseLong(parts[5])); + LocalDateTime startTime = parts.length > 6 && !parts[6].isEmpty() ? LocalDateTime.parse(parts[6]) : null; - Task task = new Task(heading, description, id); + Task task = new Task(heading, description, id, duration, startTime); task.setStatus(status); return task; } diff --git a/tasks.csv b/tasks.csv index 5cdfc28..05025cf 100644 --- a/tasks.csv +++ b/tasks.csv @@ -1 +1,4 @@ id,type,name,status,description,epic +1,EPIC,эпик,NEW,эпик,129,2023-03-08T14:30 +2,SUB,подзадача ,NEW,подзадача,1,120,2023-03-08T14:30 +3,SUB,ми,NEW,ми,1,9,2026-03-08T14:30 From 7892c336e13fb7e140cf23c7693e81bdc3e8af78 Mon Sep 17 00:00:00 2001 From: Valerii_Butko Date: Sat, 30 Nov 2024 01:40:18 +0500 Subject: [PATCH 2/4] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=20api,=20=D0=BF=D0=B5=D1=80=D0=B5=D1=81?= =?UTF-8?q?=D0=B5=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D1=87=20=D0=BF=D0=BE=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8,=20=D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D1=8B=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tracker/EpicTask.java | 11 +- src/tracker/InMemoryTaskManager.java | 92 +++++++++------ src/tracker/Managers.java | 4 - src/tracker/Task.java | 11 ++ tasks.csv | 3 - test/test/EpicTaskTest.java | 77 ++++++++++-- test/test/ExseptionsTest.java | 4 + test/test/FileBackedTaskManagerTest.java | 88 -------------- test/test/InMemoryHistoryManagerTest.java | 25 +++- test/test/InMemoryTaskManagerTest.java | 126 -------------------- test/test/SubtaskTest.java | 30 +++-- test/test/TaskManagerTest.java | 138 ++++++++++++++++++++++ 12 files changed, 317 insertions(+), 292 deletions(-) create mode 100644 test/test/ExseptionsTest.java delete mode 100644 test/test/FileBackedTaskManagerTest.java delete mode 100644 test/test/InMemoryTaskManagerTest.java create mode 100644 test/test/TaskManagerTest.java diff --git a/src/tracker/EpicTask.java b/src/tracker/EpicTask.java index 6ddd04d..2104501 100644 --- a/src/tracker/EpicTask.java +++ b/src/tracker/EpicTask.java @@ -63,7 +63,9 @@ public String toString() { public static EpicTask fromString(String value) { String[] parts = value.split(","); - if (parts.length < 7) { // Минимальное количество частей для корректного разбора + + // Проверка на минимальное количество частей + if (parts.length < 6) { throw new IllegalArgumentException("Неверный формат строки: " + value); } @@ -72,13 +74,18 @@ public static EpicTask fromString(String value) { Status status = Status.valueOf(parts[3]); String description = parts[4]; Duration duration = Duration.ofMinutes(Long.parseLong(parts[5])); - LocalDateTime startTime = parts[6].isEmpty() ? null : LocalDateTime.parse(parts[6]); + LocalDateTime startTime = parts.length > 6 && !parts[6].isEmpty() ? LocalDateTime.parse(parts[6]) : null; EpicTask epicTask = new EpicTask(heading, description, id); epicTask.setStatus(status); epicTask.setDuration(duration); epicTask.setStartTime(startTime); + // Инициализация пустого списка подзадач, если у эпика нет подзадач + if (duration.isZero() && startTime == null) { + epicTask.subtasks = new ArrayList<>(); // Инициализируем пустой список подзадач + } + return epicTask; } } \ No newline at end of file diff --git a/src/tracker/InMemoryTaskManager.java b/src/tracker/InMemoryTaskManager.java index a7b1b98..6239a9b 100644 --- a/src/tracker/InMemoryTaskManager.java +++ b/src/tracker/InMemoryTaskManager.java @@ -1,6 +1,7 @@ package tracker; import java.util.*; +import java.util.stream.Collectors; public class InMemoryTaskManager implements TaskManager { protected final HashMap tasks; @@ -12,7 +13,6 @@ public class InMemoryTaskManager implements TaskManager { int id = 0; String type = ""; - public InMemoryTaskManager(HashMap tasks, HashMap epicTasks, HashMap> subTasks) { this.tasks = tasks; this.epicTasks = epicTasks; @@ -31,13 +31,12 @@ public ArrayList getAllEpicTasks() { @Override public List getAllSubTasks() { - ArrayList allSubtasks = new ArrayList<>(); - for (List subtasksForEpic : subTasks.values()) { - allSubtasks.addAll(subtasksForEpic); - } - return allSubtasks; + return subTasks.values().stream() + .flatMap(Collection::stream) + .collect(Collectors.toList()); } + @Override public void removeAllTasks() { tasks.clear(); @@ -81,17 +80,15 @@ public EpicTask getEpicTaskById(int id) { @Override public Subtask getSubTaskById(int id) { - for (List subtasks : subTasks.values()) { - for (Subtask subtask : subtasks) { - if (subtask.getId() == id) { - historyManager.add(subtask); - return subtask; - } - } - } - return null; + return subTasks.values().stream() + .flatMap(List::stream) + .filter(subtask -> subtask.getId() == id) + .peek(historyManager::add) + .findFirst() + .orElse(null); } + public int getTaskIndex(String heading, String description, String type) { String taskKey = heading + " " + description + " " + type; if (taskIndexMap.containsKey(taskKey)) { @@ -103,6 +100,14 @@ public int getTaskIndex(String heading, String description, String type) { @Override public Task createTask(Task task) { + boolean isOverlapping = tasks.values().stream() + .filter(existingTask -> existingTask.getStartTime() != null) + .anyMatch(existingTask -> task.isOverlapping(existingTask)); + + if (isOverlapping) { + throw new IllegalArgumentException("Задача пересекается с существующей задачей."); + } + type = "task"; task.setId(++id); tasks.put(id, task); @@ -110,8 +115,17 @@ public Task createTask(Task task) { return task; } + @Override public EpicTask createEpicTask(EpicTask epicTask) { + boolean isOverlapping = epicTasks.values().stream() + .filter(existingEpic -> existingEpic.getStartTime() != null) + .anyMatch(existingEpic -> epicTask.isOverlapping(existingEpic)); + + if (isOverlapping) { + throw new IllegalArgumentException("Эпическая задача пересекается с существующей эпической задачей."); + } + type = "epic task"; epicTask.setId(++id); epicTasks.put(id, epicTask); @@ -123,19 +137,30 @@ public EpicTask createEpicTask(EpicTask epicTask) { @Override public Subtask createSubTask(Subtask subtask) { + int epicId = subtask.epicId; + + if (!epicTasks.containsKey(epicId)) { + return null; + } + + if (!subTasks.containsKey(epicId)) { + subTasks.put(epicId, new ArrayList<>()); + } + + boolean isOverlapping = subTasks.get(epicId).stream() + .filter(existingSubtask -> existingSubtask.getStartTime() != null) + .anyMatch(existingSubtask -> subtask.isOverlapping(existingSubtask)); + + if (isOverlapping) { + throw new IllegalArgumentException("Подзадача пересекается с существующей подзадачей."); + } + type = "subtask"; subtask.setId(++id); - int epicId = subtask.epicId; // Получаем ID эпической задачи - if (epicTasks.containsKey(epicId)) { - if (!subTasks.containsKey(epicId)) { - subTasks.put(epicId, new ArrayList<>()); // Создаем список подзадач, если его нет - } - subTasks.get(epicId).add(subtask); // Добавляем подзадачу в список подзадач эпика - epicTasks.get(epicId).addSubtask(subtask); // Добавляем подзадачу в эпическую задачу - taskIndexMap.put(subtask.heading + " " + subtask.description + " " + type, id); - return subtask; - } - return null; // Не добавляем, если эпика нет + subTasks.get(epicId).add(subtask); + epicTasks.get(epicId).addSubtask(subtask); + taskIndexMap.put(subtask.heading + " " + subtask.description + " " + type, id); + return subtask; } @@ -157,14 +182,12 @@ public void updateTask(int id, int comm, String change) { } public List getSubtasks(int id) { - if (epicTasks.containsKey(id)) { - EpicTask epic = epicTasks.get(id); - return epic.getSubtasks(); - } else { - return new ArrayList<>(); - } + return epicTasks.containsKey(id) ? + epicTasks.get(id).getSubtasks() : + Collections.emptyList(); } + @Override public boolean removeTaskById(int id) { if (tasks.containsKey(id)) { @@ -272,16 +295,14 @@ public ArrayList getHistory() { public TreeSet getPrioritizedTasks() { TreeSet prioritizedTasks = new TreeSet<>(Comparator .comparing(Task::getStartTime, Comparator.nullsLast(Comparator.naturalOrder())) - .thenComparing(Task::getId)); // Добавляем сравнение по ID + .thenComparing(Task::getId)); - // Добавляем все обычные задачи for (Task task : tasks.values()) { if (task.getStartTime() != null) { prioritizedTasks.add(task); } } - // Добавляем все эпики for (EpicTask epic : epicTasks.values()) { if (epic.getStartTime() != null) { prioritizedTasks.add(epic); @@ -298,5 +319,4 @@ public TreeSet getPrioritizedTasks() { return prioritizedTasks; } - } \ No newline at end of file diff --git a/src/tracker/Managers.java b/src/tracker/Managers.java index 2c37876..5b724cf 100644 --- a/src/tracker/Managers.java +++ b/src/tracker/Managers.java @@ -20,8 +20,4 @@ public static InMemoryHistoryManager getDefaultHistory() { } return historyManager; } - - public static TaskManager getFileManager(String fileName) { - return new FileBackedTaskManager(new HashMap<>(), new HashMap<>(), new HashMap<>(), fileName); - } } diff --git a/src/tracker/Task.java b/src/tracker/Task.java index 13e1a9c..cfffd28 100644 --- a/src/tracker/Task.java +++ b/src/tracker/Task.java @@ -108,4 +108,15 @@ public static Task fromString(String value) { task.setStatus(status); return task; } + + public boolean isOverlapping(Task other) { + if (this.startTime == null || other.startTime == null) { + return false; + } + + LocalDateTime thisEndTime = this.getEndTime(); + LocalDateTime otherEndTime = other.getEndTime(); + + return this.startTime.isBefore(otherEndTime) && thisEndTime.isAfter(other.startTime); + } } \ No newline at end of file diff --git a/tasks.csv b/tasks.csv index 05025cf..5cdfc28 100644 --- a/tasks.csv +++ b/tasks.csv @@ -1,4 +1 @@ id,type,name,status,description,epic -1,EPIC,эпик,NEW,эпик,129,2023-03-08T14:30 -2,SUB,подзадача ,NEW,подзадача,1,120,2023-03-08T14:30 -3,SUB,ми,NEW,ми,1,9,2026-03-08T14:30 diff --git a/test/test/EpicTaskTest.java b/test/test/EpicTaskTest.java index fb8f126..6b8de1e 100644 --- a/test/test/EpicTaskTest.java +++ b/test/test/EpicTaskTest.java @@ -1,22 +1,22 @@ package test; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import tracker.EpicTask; -import tracker.InMemoryTaskManager; -import tracker.Subtask; -import tracker.Task; +import tracker.*; +import java.time.Duration; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.HashMap; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static tracker.Status.*; + class EpicTaskTest { String epicHeading = "first epic"; String epicDescription = "first description"; String subHeading = "first subtask"; String subDescription = "first subtask description"; - int id; HashMap tasks = new HashMap<>(); HashMap epicTasks = new HashMap<>(); @@ -26,15 +26,68 @@ class EpicTaskTest { @Test public void shouldGiveListOfSubtasks() { - id = manager.getTaskIndex(epicHeading, epicDescription, "epic task"); - EpicTask epicTask = new EpicTask(epicHeading, epicDescription, id); - id = manager.getTaskIndex(subHeading, subDescription, "subtask"); - Subtask subtask = new Subtask(subHeading, subDescription, id, epicTask.getId()); + EpicTask epicTask = new EpicTask(epicHeading, epicDescription, 0); + manager.createEpicTask(epicTask); + + int subtaskId = manager.getTaskIndex(subHeading, subDescription, "subtask"); + Subtask subtask = new Subtask(subHeading, subDescription, subtaskId, epicTask.getId(), Duration.ofMinutes(30), LocalDateTime.now()); + manager.createSubTask(subtask); ArrayList expectedSubtasks = new ArrayList<>(); expectedSubtasks.add(subtask); - epicTask.addSubtask(subtask); - Assertions.assertEquals(expectedSubtasks, epicTask.getSubtasks()); + assertEquals(expectedSubtasks, manager.getSubtasks(epicTask.getId())); + } + + @Test + public void testEpicStatusAllNew() { + EpicTask epic = new EpicTask("Epic Task", "Epic Description", 1); + manager.createEpicTask(epic); + Subtask subtask1 = new Subtask("Subtask 1", "Description", 2, epic.getId(), Duration.ofMinutes(30), LocalDateTime.now()); + Subtask subtask2 = new Subtask("Subtask 2", "Description", 3, epic.getId(), Duration.ofMinutes(45), LocalDateTime.now().plusDays(1)); + manager.createSubTask(subtask1); + manager.createSubTask(subtask2); + + assertEquals(NEW, epic.getStatus()); + } + + @Test + public void testEpicStatusAllDone() { + EpicTask epic = new EpicTask("Epic Task", "Epic Description", 1); + manager.createEpicTask(epic); + Subtask subtask1 = new Subtask("Subtask 1", "Description", 2, epic.getId(), Duration.ofMinutes(30), LocalDateTime.now()); + Subtask subtask2 = new Subtask("Subtask 2", "Description", 3, epic.getId(), Duration.ofMinutes(45), LocalDateTime.now().plusDays(1)); + subtask1.setStatus(DONE); + subtask2.setStatus(DONE); + manager.createSubTask(subtask1); + manager.createSubTask(subtask2); + + assertEquals(NEW, epic.getStatus()); + } + + @Test + public void testEpicStatusMixed() { + EpicTask epic = new EpicTask("Epic Task", "Epic Description", 1); + manager.createEpicTask(epic); + Subtask subtask1 = new Subtask("Subtask 1", "Description", 2, epic.getId(), Duration.ofMinutes(30), LocalDateTime.now()); + Subtask subtask2 = new Subtask("Subtask 2", "Description", 3, epic.getId(), Duration.ofMinutes(45), LocalDateTime.now().plusDays(1)); + subtask1.setStatus(DONE); + subtask1.setStatus(NEW); + subtask2.setStatus(DONE); + manager.createSubTask(subtask1); + manager.createSubTask(subtask2); + + assertEquals(NEW, epic.getStatus()); + } + + @Test + public void testEpicStatusInProgress() { + EpicTask epic = new EpicTask("Epic Task", "Epic Description", 1); + manager.createEpicTask(epic); + Subtask subtask1 = new Subtask("Subtask 1", "Description", 2, epic.getId(), Duration.ofMinutes(30), LocalDateTime.now()); + subtask1.setStatus(IN_PROGRESS); + manager.createSubTask(subtask1); + + assertEquals(NEW, epic.getStatus()); } } \ No newline at end of file diff --git a/test/test/ExseptionsTest.java b/test/test/ExseptionsTest.java new file mode 100644 index 0000000..4c5d852 --- /dev/null +++ b/test/test/ExseptionsTest.java @@ -0,0 +1,4 @@ +package test; + +public class ExseptionsTest { +} diff --git a/test/test/FileBackedTaskManagerTest.java b/test/test/FileBackedTaskManagerTest.java deleted file mode 100644 index 052e23f..0000000 --- a/test/test/FileBackedTaskManagerTest.java +++ /dev/null @@ -1,88 +0,0 @@ -package test; - -import org.junit.jupiter.api.*; -import tracker.FileBackedTaskManager; -import tracker.Task; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.HashMap; - -import static org.junit.jupiter.api.Assertions.*; - -public class FileBackedTaskManagerTest { - private static final String FILE_PATH = "test_tasks.csv"; - private FileBackedTaskManager manager; - - @BeforeEach - public void setUp() { - manager = new FileBackedTaskManager(new HashMap<>(), new HashMap<>(), new HashMap<>(), FILE_PATH); - } - - @AfterEach - public void tearDown() throws IOException { - Files.deleteIfExists(Paths.get(FILE_PATH)); - } - - @Test - public void testCreateTask() { - Task task = new Task("Test Task", "Description", 1); - Task createdTask = manager.createTask(task); - - assertNotNull(createdTask); - assertEquals("Test Task", createdTask.getHeading()); - assertEquals("Description", createdTask.getDescription()); - assertTrue(new File(FILE_PATH).exists()); - } - - @Test - public void testSaveAndLoad() { - Task task = new Task("Test Task", "Description", 1); - manager.createTask(task); - - FileBackedTaskManager loadedManager = FileBackedTaskManager.loadFromFile(new File(FILE_PATH)); - Task loadedTask = loadedManager.getTaskById(1); - - assertNotNull(loadedTask); - assertEquals("Test Task", loadedTask.getHeading()); - assertEquals("Description", loadedTask.getDescription()); - } - - @Test - public void testUpdateTask() { - Task task = new Task("Test Task", "Description", 1); - manager.createTask(task); - manager.updateTask(1, 1, "Updated Task"); - - Task updatedTask = manager.getTaskById(1); - assertEquals("Updated Task", updatedTask.getHeading()); - } - - @Test - public void testRemoveAllTasks() { - Task task1 = new Task("Test Task 1", "Description", 1); - Task task2 = new Task("Test Task 2", "Description", 2); - manager.createTask(task1); - manager.createTask(task2); - - manager.removeAllTasks(); - - assertEquals(0, manager.getAllTasks().size()); - } - - @Test - public void testLoadFromFile() throws IOException { - String data = "id,type,name,status,description,epic\n" + - "1,TASK,Test Task,NEW,Description,0\n" + - "2,EPIC,Test Epic,NEW,Description,0\n" + - "3,SUB,Test Subtask,NEW,Description,2\n"; - Files.write(Paths.get(FILE_PATH), data.getBytes()); - - FileBackedTaskManager loadedManager = FileBackedTaskManager.loadFromFile(new File(FILE_PATH)); - assertEquals(1, loadedManager.getAllTasks().size()); - assertEquals(1, loadedManager.getAllEpicTasks().size()); - assertEquals(1, loadedManager.getAllSubTasks().size()); - } -} \ No newline at end of file diff --git a/test/test/InMemoryHistoryManagerTest.java b/test/test/InMemoryHistoryManagerTest.java index e051970..c8c593e 100644 --- a/test/test/InMemoryHistoryManagerTest.java +++ b/test/test/InMemoryHistoryManagerTest.java @@ -1,10 +1,11 @@ package test; - import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; import tracker.*; +import java.time.Duration; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.HashMap; @@ -15,21 +16,22 @@ class InMemoryHistoryManagerTest { HashMap> subTasks = new HashMap<>(); InMemoryTaskManager manager = new InMemoryTaskManager(tasks, epicTasks, subTasks); + @Test void historyShouldContainOnlyLastAddedTask() { String heading1 = "task1"; String description1 = "task1 description"; - Task task1 = new Task(heading1, description1, 1); + Task task1 = new Task(heading1, description1, 1, Duration.ofMinutes(30), LocalDateTime.now()); historyManager.add(task1); String heading2 = "task2"; String description2 = "task description2"; - Task task2 = new Task(heading2, description2, 2); + Task task2 = new Task(heading2, description2, 2, Duration.ofMinutes(45), LocalDateTime.now().plusHours(1)); historyManager.add(task2); String heading3 = "task3"; String description3 = "task description3"; - Task task3 = new Task(heading3, description3, 3); + Task task3 = new Task(heading3, description3, 3, Duration.ofMinutes(60), LocalDateTime.now().plusHours(2)); historyManager.add(task3); final ArrayList history = historyManager.getHistory(); @@ -39,7 +41,20 @@ void historyShouldContainOnlyLastAddedTask() { assertEquals(task2, history.get(1), "Вторая задача в истории"); assertEquals(task1, history.get(0), "Первая задача в истории"); - manager.removeTaskById(0); + manager.removeTaskById(1); assertEquals(3, history.size(), "История содержит информацию об удаленной задаче"); } + + @Test + public void testRemoveFromHistory() { + Task task1 = new Task("Task 1", "Description", 1, Duration.ofMinutes(30), LocalDateTime.now()); + Task task2 = new Task("Task 2", "Description", 2, Duration.ofMinutes(45), LocalDateTime.now().plusDays(1)); + historyManager.add(task1); + historyManager.add(task2); + + historyManager.remove(task1.getId()); + + assertEquals(1, historyManager.getHistory().size(), "История должна содержать одну задачу"); + assertEquals(task2, historyManager.getHistory().get(0), "Осталась неверная задача в истории"); + } } \ No newline at end of file diff --git a/test/test/InMemoryTaskManagerTest.java b/test/test/InMemoryTaskManagerTest.java deleted file mode 100644 index 6df1f7a..0000000 --- a/test/test/InMemoryTaskManagerTest.java +++ /dev/null @@ -1,126 +0,0 @@ -package test; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import tracker.EpicTask; -import tracker.InMemoryTaskManager; -import tracker.Subtask; -import tracker.Task; - -import java.util.ArrayList; -import java.util.HashMap; - -class InMemoryTaskManagerTest { - HashMap tasks = new HashMap<>(); - HashMap epicTasks = new HashMap<>(); - HashMap> subTasks = new HashMap<>(); - InMemoryTaskManager manager = new InMemoryTaskManager(tasks, epicTasks, subTasks); - int id; - - - String heading = "task"; - String description = "task description"; - Task task = new Task(heading, description, id); - - @Test - public void tasksShouldHaveSameIdWhenTwoTasksAreSimilar() { - String heading1 = "task"; - String description1 = "description"; - String heading2 = "task"; - String description2 = "description"; - - int id1 = manager.getTaskIndex(heading1, description1, "task"); - int id2 = manager.getTaskIndex(heading2, description2, "task"); - - Assertions.assertEquals(id1, id2); - } - - @Test - public void shouldReturnTaskByID() { - id = manager.getTaskIndex(heading, description, "task"); - tasks.put(task.getId(), task); - - Assertions.assertEquals(task, manager.getTaskById(task.getId())); - } - - @Test - public void shouldReturnEpicTaskByID() { - id = manager.getTaskIndex(heading, description, "epic task"); - EpicTask epictask = new EpicTask(heading, description, id); - epicTasks.put(epictask.getId(), epictask); - - Assertions.assertEquals(epictask, manager.getEpicTaskById(epictask.getId())); - } - - @Test - public void shouldReturnSubtaskByID() { - id = manager.getTaskIndex(heading, description, "epic task"); - EpicTask epictask = new EpicTask(heading, description, id); - - String heading1 = "subtask"; - String description1 = "subtask description"; - id = manager.getTaskIndex(heading1, description1, "subtask"); - Subtask task = new Subtask(heading1, description1, id, epictask.getId()); - - ArrayList subtaskArrayList = new ArrayList<>(); - subtaskArrayList.add(task); - subTasks.put(epictask.getId(), subtaskArrayList); - - Assertions.assertEquals(task, manager.getSubTaskById(task.getId())); - } - - @Test - public void taskShouldBeUnchangedAcrossAllFields() { - id = manager.getTaskIndex(heading, description, "task"); - Task task = new Task(heading, description, id); - manager.createTask(task); - tasks.put(task.getId(), task); - - Task fetchedTask = manager.getTaskById(task.getId()); - - Assertions.assertEquals(task.getHeading(), fetchedTask.getHeading()); - Assertions.assertEquals(task.getDescription(), fetchedTask.getDescription()); - Assertions.assertEquals(task.getId(), fetchedTask.getId()); - Assertions.assertEquals(task.getStatus(), fetchedTask.getStatus()); - } - - @Test - public void epicTaskShouldBeUnchangedAcrossAllFields() { - id = manager.getTaskIndex(heading, description, "epic task"); - EpicTask task = new EpicTask(heading, description, id); - manager.createEpicTask(task); - epicTasks.put(task.getId(), task); - - EpicTask fetchedTask = manager.getEpicTaskById(task.getId()); - - Assertions.assertEquals(task.getHeading(), fetchedTask.getHeading()); - Assertions.assertEquals(task.getDescription(), fetchedTask.getDescription()); - Assertions.assertEquals(task.getId(), fetchedTask.getId()); - Assertions.assertEquals(task.getStatus(), fetchedTask.getStatus()); - } - - @Test - public void subTaskShouldBeUnchangedAcrossAllFields() { - id = manager.getTaskIndex(heading, description, "epic task"); - EpicTask epictask = new EpicTask(heading, description, id); - epicTasks.put(epictask.getId(), epictask); - - String heading1 = "subtask"; - String description1 = "subtask description"; - id = manager.getTaskIndex(heading1, description1, "subtask"); - Subtask task = new Subtask(heading1, description1, id, epictask.getId()); - - manager.createSubTask(task); - ArrayList subtaskArrayList = new ArrayList<>(); - subtaskArrayList.add(task); - subTasks.put(epictask.getId(), subtaskArrayList); - - Subtask fetchedTask = manager.getSubTaskById(task.getId()); - - Assertions.assertEquals(task.getHeading(), fetchedTask.getHeading()); - Assertions.assertEquals(task.getDescription(), fetchedTask.getDescription()); - Assertions.assertEquals(task.getId(), fetchedTask.getId()); - Assertions.assertEquals(task.getId(), fetchedTask.getId()); - Assertions.assertEquals(task.getStatus(), fetchedTask.getStatus()); - } -} \ No newline at end of file diff --git a/test/test/SubtaskTest.java b/test/test/SubtaskTest.java index cd93591..3cc0311 100644 --- a/test/test/SubtaskTest.java +++ b/test/test/SubtaskTest.java @@ -7,17 +7,15 @@ import tracker.Subtask; import tracker.Task; +import java.time.Duration; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.HashMap; -import static org.junit.jupiter.api.Assertions.*; - class SubtaskTest { String epicHeading = "second epic"; String epicDescription = "second description"; - String subHeading = "second subtask"; - String subDescription = "second subtask description"; int id; String subHeading_ = "third subtask"; @@ -26,35 +24,35 @@ class SubtaskTest { HashMap tasks = new HashMap<>(); HashMap epicTasks = new HashMap<>(); HashMap> subTasks = new HashMap<>(); - InMemoryTaskManager manager = new InMemoryTaskManager(tasks, epicTasks, subTasks); - - HashMap epicTaskHashMap = new HashMap<>(); - @Test public void shouldGiveEpic() { id = manager.getTaskIndex(epicHeading, epicDescription, "epic task"); EpicTask epic = new EpicTask(epicHeading, epicDescription, id); + epicTasks.put(epic.getId(), epic); - id = manager.getTaskIndex(subHeading, subDescription, "subtask"); - Subtask subtask = new Subtask(subHeading, subDescription, id, epic.getId()); + String subHeading = "second subtask"; + String subDescription = "second subtask description"; + int subtaskId = manager.getTaskIndex(subHeading, subDescription, "subtask"); + Subtask subtask = new Subtask(subHeading, subDescription, subtaskId, epic.getId(), Duration.ofMinutes(30), LocalDateTime.now()); - epicTaskHashMap.put(epic.getId(), epic); + ArrayList subtaskList = new ArrayList<>(); + subtaskList.add(subtask); + subTasks.put(epic.getId(), subtaskList); - Assertions.assertEquals(subtask.getEpicTask(epicTaskHashMap), epic); + Assertions.assertEquals(epic, subtask.getEpicTask(epicTasks)); } @Test public void shouldGiveNullIfEpicIsNotInTheMap() { id = manager.getTaskIndex(epicHeading, epicDescription, "epic task"); EpicTask epic = new EpicTask(epicHeading, epicDescription, id); + epicTasks.put(epic.getId(), epic); id = manager.getTaskIndex(subHeading_, subDescription_, "subtask"); - Subtask subtaskSecond = new Subtask(subHeading_, subDescription_, id, 78); - - epicTaskHashMap.put(epic.getId(), epic); + Subtask subtaskSecond = new Subtask(subHeading_, subDescription_, id, 78, Duration.ofMinutes(30), LocalDateTime.now()); - assertNull(subtaskSecond.getEpicTask(epicTaskHashMap)); + Assertions.assertNull(subtaskSecond.getEpicTask(epicTasks)); } } \ No newline at end of file diff --git a/test/test/TaskManagerTest.java b/test/test/TaskManagerTest.java new file mode 100644 index 0000000..5dcdb94 --- /dev/null +++ b/test/test/TaskManagerTest.java @@ -0,0 +1,138 @@ +package test; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import tracker.*; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.time.Duration; +import java.time.LocalDateTime; +import java.util.HashMap; + +import static org.junit.jupiter.api.Assertions.*; +import static tracker.Status.*; + +abstract class TaskManagerTest { + protected T manager; + + @BeforeEach + public void setUp() { + manager = createManager(); + } + + protected abstract T createManager(); + + @Test + public void testAddTask() { + Task task = new Task("Test Task", "Description", 1, Duration.ofMinutes(30), LocalDateTime.now()); + manager.createTask(task); + assertEquals(1, manager.getAllTasks().size()); + } + + @Test + public void testRemoveAllTasks() { + Task task1 = new Task("Test Task 1", "Description", 1, Duration.ofMinutes(30), LocalDateTime.now()); + Task task2 = new Task("Test Task 2", "Description", 2, Duration.ofMinutes(45), LocalDateTime.now().plusDays(1)); + + manager.createTask(task1); + manager.createTask(task2); + manager.removeAllTasks(); + + assertEquals(0, manager.getAllTasks().size()); + } + + @Test + public void testSubtaskShouldBelongToEpic() { + EpicTask epicTask = new EpicTask("Epic Task", "Epic Description", 1); + manager.createEpicTask(epicTask); + Subtask subtask = new Subtask("Subtask", "Subtask Description", 2, epicTask.getId(), Duration.ofMinutes(30), LocalDateTime.now()); + manager.createSubTask(subtask); + + assertTrue(epicTask.getSubtasks().contains(subtask)); + } + + @Test + public void testEpicStatusCalculation() { + EpicTask epicTask = new EpicTask("Epic Task", "Epic Description", 1); + manager.createEpicTask(epicTask); + Subtask subtask1 = new Subtask("Subtask 1", "Description", 2, epicTask.getId(), Duration.ofMinutes(30), LocalDateTime.now()); + Subtask subtask2 = new Subtask("Subtask 2", "Description", 3, epicTask.getId(), Duration.ofMinutes(30), LocalDateTime.now().plusHours(1)); + + manager.createSubTask(subtask1); + manager.createSubTask(subtask2); + + subtask1.setStatus(DONE); + + assertEquals(NEW, epicTask.getStatus()); + } + + @Test + public void testIntervalOverlap() { + Task task1 = new Task("Task 1", "Description 1", 1, Duration.ofMinutes(30), LocalDateTime.now()); + Task task2 = new Task("Task 2", "Description 2", 2, Duration.ofMinutes(30), LocalDateTime.now().plusMinutes(15)); + + manager.createTask(task1); + + try { + manager.createTask(task2); + fail("Expected IllegalArgumentException for overlapping tasks"); + } catch (IllegalArgumentException e) { + assertEquals("Задача пересекается с существующей задачей.", e.getMessage()); + } + } + +} + +class InMemoryTaskManagerTest extends TaskManagerTest { + @Override + protected InMemoryTaskManager createManager() { + return new InMemoryTaskManager(new HashMap<>(), new HashMap<>(), new HashMap<>()); + } +} + +class FileBackedTaskManagerTest extends TaskManagerTest { + private static final String FILE_PATH = "test_tasks.csv"; + + @Override + protected FileBackedTaskManager createManager() { + return new FileBackedTaskManager(new HashMap<>(), new HashMap<>(), new HashMap<>(), FILE_PATH); + } + + @AfterEach + public void tearDown() throws IOException { + Files.deleteIfExists(Paths.get(FILE_PATH)); + } + + @Test + public void testLoadThrowsManagerSaveException() { + String invalidFilePath = "invalid/path/to/file.txt"; + + assertThrows(ManagerSaveException.class, () -> { + manager.load(); + }, "Ошибка при загрузке данных из файла: " + invalidFilePath); + } + + @Test + public void testCreateSubTaskThrowsIllegalArgumentException() { + EpicTask epic = new EpicTask("Epic 1", "Description 1", 1); + manager.createEpicTask(epic); + Subtask subtask1 = new Subtask("Subtask 1", "Description 1", 1, 1, Duration.ofMinutes(30), LocalDateTime.now()); + manager.createSubTask(subtask1); + Subtask overlappingSubtask = new Subtask("Subtask 2", "Description 2", 2, 1, Duration.ofMinutes(30), LocalDateTime.now().plusMinutes(15)); + + assertThrows(IllegalArgumentException.class, () -> { + manager.createSubTask(overlappingSubtask); + }, "Подзадача пересекается с существующей подзадачей."); + } + + @Test + public void testFromStringThrowsIllegalArgumentException() { + String invalidString = "1,TASK"; + assertThrows(IllegalArgumentException.class, () -> { + Subtask.fromString(invalidString); + }, "Неверный формат строки: " + invalidString); + } +} \ No newline at end of file From 011c3e9f9fdd5c4e40f1288f26772240c4e903ae Mon Sep 17 00:00:00 2001 From: Valerii_Butko Date: Sat, 30 Nov 2024 01:43:03 +0500 Subject: [PATCH 3/4] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D0=B0=20=D1=81=D1=82=D0=B8=D0=BB=D1=8C=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Main.java | 2 +- src/tracker/InMemoryTaskManager.java | 1 - test/test/ExseptionsTest.java | 4 ---- test/test/InMemoryHistoryManagerTest.java | 1 + 4 files changed, 2 insertions(+), 6 deletions(-) delete mode 100644 test/test/ExseptionsTest.java diff --git a/src/Main.java b/src/Main.java index 93563f4..9afb99b 100644 --- a/src/Main.java +++ b/src/Main.java @@ -81,7 +81,7 @@ public static void main(String[] args) { String newDescription = scanner.nextLine(); manager.updateTask(id, comm, newDescription); System.out.println("Новое описание сохранено!"); - } else if (comm == 0) { + } else if (comm == 0) { break; } else { System.out.println("Такой команды нет!"); diff --git a/src/tracker/InMemoryTaskManager.java b/src/tracker/InMemoryTaskManager.java index 6239a9b..afeebcf 100644 --- a/src/tracker/InMemoryTaskManager.java +++ b/src/tracker/InMemoryTaskManager.java @@ -134,7 +134,6 @@ public EpicTask createEpicTask(EpicTask epicTask) { } - @Override public Subtask createSubTask(Subtask subtask) { int epicId = subtask.epicId; diff --git a/test/test/ExseptionsTest.java b/test/test/ExseptionsTest.java deleted file mode 100644 index 4c5d852..0000000 --- a/test/test/ExseptionsTest.java +++ /dev/null @@ -1,4 +0,0 @@ -package test; - -public class ExseptionsTest { -} diff --git a/test/test/InMemoryHistoryManagerTest.java b/test/test/InMemoryHistoryManagerTest.java index c8c593e..9810f2e 100644 --- a/test/test/InMemoryHistoryManagerTest.java +++ b/test/test/InMemoryHistoryManagerTest.java @@ -1,4 +1,5 @@ package test; + import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; From 6edeed9226da6643f8b694b5f18023f818a8847a Mon Sep 17 00:00:00 2001 From: Valerii_Butko Date: Sun, 1 Dec 2024 22:06:50 +0500 Subject: [PATCH 4/4] =?UTF-8?q?=D0=BD=D0=B0=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD?= =?UTF-8?q?=20=D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BE=D0=BA=20=D0=B2=20=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tracker/InMemoryHistoryManager.java | 15 +- test/test/EpicTaskTest.java | 36 +++-- test/test/InMemoryHistoryManagerTest.java | 42 +++--- test/test/InMemoryTaskManagerTest.java | 26 ++++ test/test/ManagersTest.java | 17 +-- test/test/SubtaskTest.java | 22 ++- test/test/TaskManagerTest.java | 175 +++++++++++++--------- 7 files changed, 202 insertions(+), 131 deletions(-) create mode 100644 test/test/InMemoryTaskManagerTest.java diff --git a/src/tracker/InMemoryHistoryManager.java b/src/tracker/InMemoryHistoryManager.java index a0d502c..1e3fc4d 100644 --- a/src/tracker/InMemoryHistoryManager.java +++ b/src/tracker/InMemoryHistoryManager.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.HashMap; + public class InMemoryHistoryManager implements HistoryManager { private final HashMap tasksById; private Node head; @@ -32,6 +33,12 @@ public void remove(int id) { } } + public void clear() { + tasksById.clear(); + head = null; + tail = null; + } + private void linkLast(Node node) { if (head == null) { head = node; @@ -43,12 +50,6 @@ private void linkLast(Node node) { } } - public void clear() { - tasksById.clear(); - head = null; - tail = null; - } - private void removeNode(Node node) { if (node == head && node == tail) { head = null; @@ -90,4 +91,4 @@ public Node(Task task) { this.next = null; } } -} \ No newline at end of file +} diff --git a/test/test/EpicTaskTest.java b/test/test/EpicTaskTest.java index 6b8de1e..6e87787 100644 --- a/test/test/EpicTaskTest.java +++ b/test/test/EpicTaskTest.java @@ -25,7 +25,7 @@ class EpicTaskTest { InMemoryTaskManager manager = new InMemoryTaskManager(tasks, epicTasks, subTasks); @Test - public void shouldGiveListOfSubtasks() { + public void getSubtasksTaskShouldReturnListOfSubtasks() { EpicTask epicTask = new EpicTask(epicHeading, epicDescription, 0); manager.createEpicTask(epicTask); @@ -40,7 +40,7 @@ public void shouldGiveListOfSubtasks() { } @Test - public void testEpicStatusAllNew() { + public void getStatusShouldReturnEpicStatusAllNew() { EpicTask epic = new EpicTask("Epic Task", "Epic Description", 1); manager.createEpicTask(epic); Subtask subtask1 = new Subtask("Subtask 1", "Description", 2, epic.getId(), Duration.ofMinutes(30), LocalDateTime.now()); @@ -52,42 +52,52 @@ public void testEpicStatusAllNew() { } @Test - public void testEpicStatusAllDone() { + public void checkStatusShouldReturnEpicStatusAllDone() { EpicTask epic = new EpicTask("Epic Task", "Epic Description", 1); manager.createEpicTask(epic); + Subtask subtask1 = new Subtask("Subtask 1", "Description", 2, epic.getId(), Duration.ofMinutes(30), LocalDateTime.now()); Subtask subtask2 = new Subtask("Subtask 2", "Description", 3, epic.getId(), Duration.ofMinutes(45), LocalDateTime.now().plusDays(1)); - subtask1.setStatus(DONE); - subtask2.setStatus(DONE); + manager.createSubTask(subtask1); manager.createSubTask(subtask2); - assertEquals(NEW, epic.getStatus()); + subtask1.setStatus(Status.DONE); + subtask2.setStatus(Status.DONE); + + manager.checkStatus(epic.getId(), 1); + + assertEquals(Status.DONE, epic.getStatus(), "Статус эпической задачи должен быть DONE."); } + @Test - public void testEpicStatusMixed() { + public void checkStatusShouldReturnEpicStatusMixed() { EpicTask epic = new EpicTask("Epic Task", "Epic Description", 1); manager.createEpicTask(epic); Subtask subtask1 = new Subtask("Subtask 1", "Description", 2, epic.getId(), Duration.ofMinutes(30), LocalDateTime.now()); Subtask subtask2 = new Subtask("Subtask 2", "Description", 3, epic.getId(), Duration.ofMinutes(45), LocalDateTime.now().plusDays(1)); subtask1.setStatus(DONE); - subtask1.setStatus(NEW); - subtask2.setStatus(DONE); + subtask2.setStatus(NEW); manager.createSubTask(subtask1); manager.createSubTask(subtask2); - assertEquals(NEW, epic.getStatus()); + manager.checkStatus(epic.getId(), 1); + + assertEquals(IN_PROGRESS, epic.getStatus()); } @Test - public void testEpicStatusInProgress() { + public void checkStatusShouldReturnEpicStatusInProgress() { EpicTask epic = new EpicTask("Epic Task", "Epic Description", 1); manager.createEpicTask(epic); - Subtask subtask1 = new Subtask("Subtask 1", "Description", 2, epic.getId(), Duration.ofMinutes(30), LocalDateTime.now()); + Subtask subtask1 = new Subtask("Subtask 1", "Description", 2, epic.getId(), + Duration.ofMinutes(30), LocalDateTime.now()); subtask1.setStatus(IN_PROGRESS); manager.createSubTask(subtask1); - assertEquals(NEW, epic.getStatus()); + manager.checkStatus(epic.getId(), 1); + + assertEquals(IN_PROGRESS, epic.getStatus()); } } \ No newline at end of file diff --git a/test/test/InMemoryHistoryManagerTest.java b/test/test/InMemoryHistoryManagerTest.java index 9810f2e..fd427cb 100644 --- a/test/test/InMemoryHistoryManagerTest.java +++ b/test/test/InMemoryHistoryManagerTest.java @@ -8,18 +8,12 @@ import java.time.Duration; import java.time.LocalDateTime; import java.util.ArrayList; -import java.util.HashMap; class InMemoryHistoryManagerTest { InMemoryHistoryManager historyManager = Managers.getDefaultHistory(); - HashMap tasks = new HashMap<>(); - HashMap epicTasks = new HashMap<>(); - HashMap> subTasks = new HashMap<>(); - InMemoryTaskManager manager = new InMemoryTaskManager(tasks, epicTasks, subTasks); - @Test - void historyShouldContainOnlyLastAddedTask() { + void addShouldContainOnlyLastAddedTaskInHistory() { String heading1 = "task1"; String description1 = "task1 description"; Task task1 = new Task(heading1, description1, 1, Duration.ofMinutes(30), LocalDateTime.now()); @@ -36,26 +30,38 @@ void historyShouldContainOnlyLastAddedTask() { historyManager.add(task3); final ArrayList history = historyManager.getHistory(); - assertNotNull(history, "История не пустая."); - assertEquals(3, history.size(), "История содержит три задачи."); - assertEquals(task3, history.get(2), "Последняя задача в истории"); - assertEquals(task2, history.get(1), "Вторая задача в истории"); - assertEquals(task1, history.get(0), "Первая задача в истории"); - - manager.removeTaskById(1); - assertEquals(3, history.size(), "История содержит информацию об удаленной задаче"); + assertNotNull(history, "История не должна быть пустой."); + assertEquals(3, history.size(), "История должна содержать три задачи."); + assertEquals(task3, history.get(2), "Последняя задача в истории должна быть task3"); + assertEquals(task2, history.get(1), "Вторая задача в истории должна быть task2"); + assertEquals(task1, history.get(0), "Первая задача в истории должна быть task1"); } @Test - public void testRemoveFromHistory() { + void removeShouldMaintainHistoryWithoutRemovedTask() { + historyManager.clear(); Task task1 = new Task("Task 1", "Description", 1, Duration.ofMinutes(30), LocalDateTime.now()); Task task2 = new Task("Task 2", "Description", 2, Duration.ofMinutes(45), LocalDateTime.now().plusDays(1)); + historyManager.add(task1); historyManager.add(task2); historyManager.remove(task1.getId()); - assertEquals(1, historyManager.getHistory().size(), "История должна содержать одну задачу"); - assertEquals(task2, historyManager.getHistory().get(0), "Осталась неверная задача в истории"); + assertEquals(1, historyManager.getHistory().size(), "История должна содержать одну задачу после удаления."); + assertEquals(task2, historyManager.getHistory().getFirst(), "Осталась задача в истории."); + } + + + @Test + void removeShouldNotAffectHistory() { + Task task1 = new Task("Task 1", "Description", 1, Duration.ofMinutes(30), LocalDateTime.now()); + historyManager.add(task1); + + + historyManager.remove(999); + + assertEquals(1, historyManager.getHistory().size(), "История должна оставаться неизменной после попытки удалить несуществующую задачу."); + assertEquals(task1, historyManager.getHistory().get(0), "Задача в истории должна оставаться task1."); } } \ No newline at end of file diff --git a/test/test/InMemoryTaskManagerTest.java b/test/test/InMemoryTaskManagerTest.java new file mode 100644 index 0000000..5900b87 --- /dev/null +++ b/test/test/InMemoryTaskManagerTest.java @@ -0,0 +1,26 @@ +package test; + +import org.junit.jupiter.api.BeforeEach; +import tracker.*; + +import java.util.ArrayList; +import java.util.HashMap; + +class InMemoryTaskManagerTest extends TaskManagerTest { + private HashMap tasks; + private HashMap epicTasks; + private HashMap> subTasks; + + @Override + protected InMemoryTaskManager createManager() { + return new InMemoryTaskManager(tasks, epicTasks, subTasks); + } + + @BeforeEach + public void setUp() { + tasks = new HashMap<>(); + epicTasks = new HashMap<>(); + subTasks = new HashMap<>(); + super.setUp(); + } +} diff --git a/test/test/ManagersTest.java b/test/test/ManagersTest.java index 84e5ca8..8effed1 100644 --- a/test/test/ManagersTest.java +++ b/test/test/ManagersTest.java @@ -1,6 +1,5 @@ package test; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import tracker.InMemoryHistoryManager; import tracker.Managers; @@ -11,22 +10,22 @@ public class ManagersTest { @Test - public void testGetDefaultHistoryReturnsInitializedInstance() { + public void getDefaultHistoryShouldReturnInitializedInstance() { InMemoryHistoryManager history1 = Managers.getDefaultHistory(); InMemoryHistoryManager history2 = Managers.getDefaultHistory(); - assertNotNull(history1); - assertNotNull(history2); - Assertions.assertEquals(history1, history2); + assertNotNull(history1, "Первый экземпляр истории не должен быть null."); + assertNotNull(history2, "Второй экземпляр истории не должен быть null."); + assertEquals(history1, history2, "Оба экземпляра истории должны быть равны."); } @Test - public void testGetDefaultReturnsInitializedInstance() { + public void getDefaultShouldReturnInitializedInstance() { TaskManager default1 = Managers.getDefault(); TaskManager default2 = Managers.getDefault(); - assertNotNull(default1); - assertNotNull(default2); - Assertions.assertEquals(default1, default2); + assertNotNull(default1, "Первый экземпляр TaskManager не должен быть null."); + assertNotNull(default2, "Второй экземпляр TaskManager не должен быть null."); + assertEquals(default1, default2, "Оба экземпляра TaskManager должны быть равны."); } } \ No newline at end of file diff --git a/test/test/SubtaskTest.java b/test/test/SubtaskTest.java index 3cc0311..4ceec38 100644 --- a/test/test/SubtaskTest.java +++ b/test/test/SubtaskTest.java @@ -16,8 +16,6 @@ class SubtaskTest { String epicHeading = "second epic"; String epicDescription = "second description"; - int id; - String subHeading_ = "third subtask"; String subDescription_ = "third subtask description"; @@ -27,9 +25,9 @@ class SubtaskTest { InMemoryTaskManager manager = new InMemoryTaskManager(tasks, epicTasks, subTasks); @Test - public void shouldGiveEpic() { - id = manager.getTaskIndex(epicHeading, epicDescription, "epic task"); - EpicTask epic = new EpicTask(epicHeading, epicDescription, id); + public void getEpicTaskShouldReturnEpicAssociatedWithSubtask() { + int epicId = manager.getTaskIndex(epicHeading, epicDescription, "epic task"); + EpicTask epic = new EpicTask(epicHeading, epicDescription, epicId); epicTasks.put(epic.getId(), epic); String subHeading = "second subtask"; @@ -41,18 +39,18 @@ public void shouldGiveEpic() { subtaskList.add(subtask); subTasks.put(epic.getId(), subtaskList); - Assertions.assertEquals(epic, subtask.getEpicTask(epicTasks)); + Assertions.assertEquals(epic, subtask.getEpicTask(epicTasks), "Метод должен вернуть связанный эпик для сабтаска."); } @Test - public void shouldGiveNullIfEpicIsNotInTheMap() { - id = manager.getTaskIndex(epicHeading, epicDescription, "epic task"); - EpicTask epic = new EpicTask(epicHeading, epicDescription, id); + public void getEpicTaskShouldReturnNullIfEpicIsNotInTheMap() { + int epicId = manager.getTaskIndex(epicHeading, epicDescription, "epic task"); + EpicTask epic = new EpicTask(epicHeading, epicDescription, epicId); epicTasks.put(epic.getId(), epic); - id = manager.getTaskIndex(subHeading_, subDescription_, "subtask"); - Subtask subtaskSecond = new Subtask(subHeading_, subDescription_, id, 78, Duration.ofMinutes(30), LocalDateTime.now()); + int subtaskId = manager.getTaskIndex(subHeading_, subDescription_, "subtask"); + Subtask subtaskSecond = new Subtask(subHeading_, subDescription_, subtaskId, 78, Duration.ofMinutes(30), LocalDateTime.now()); - Assertions.assertNull(subtaskSecond.getEpicTask(epicTasks)); + Assertions.assertNull(subtaskSecond.getEpicTask(epicTasks), "Метод должен вернуть null, если эпик не найден."); } } \ No newline at end of file diff --git a/test/test/TaskManagerTest.java b/test/test/TaskManagerTest.java index 5dcdb94..1a7536d 100644 --- a/test/test/TaskManagerTest.java +++ b/test/test/TaskManagerTest.java @@ -1,19 +1,13 @@ package test; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import tracker.*; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; import java.time.Duration; import java.time.LocalDateTime; -import java.util.HashMap; import static org.junit.jupiter.api.Assertions.*; -import static tracker.Status.*; abstract class TaskManagerTest { protected T manager; @@ -26,113 +20,150 @@ public void setUp() { protected abstract T createManager(); @Test - public void testAddTask() { - Task task = new Task("Test Task", "Description", 1, Duration.ofMinutes(30), LocalDateTime.now()); - manager.createTask(task); - assertEquals(1, manager.getAllTasks().size()); + public void getAllTasksShouldReturnAllTasks() { + Task task1 = new Task("Task 1", "Description 1", 1, Duration.ofMinutes(30), LocalDateTime.now()); + Task task2 = new Task("Task 2", "Description 2", 2, Duration.ofMinutes(45), LocalDateTime.now().plusDays(1)); + manager.createTask(task1); + manager.createTask(task2); + + assertEquals(2, manager.getAllTasks().size(), "Должно быть 2 задачи."); } @Test - public void testRemoveAllTasks() { - Task task1 = new Task("Test Task 1", "Description", 1, Duration.ofMinutes(30), LocalDateTime.now()); - Task task2 = new Task("Test Task 2", "Description", 2, Duration.ofMinutes(45), LocalDateTime.now().plusDays(1)); + public void getAllEpicTasksShouldReturnAllEpicTasks() { + EpicTask epicTask1 = new EpicTask("Epic Task 1", "Description 1", 1); + EpicTask epicTask2 = new EpicTask("Epic Task 2", "Description 2", 2); + manager.createEpicTask(epicTask1); + manager.createEpicTask(epicTask2); - manager.createTask(task1); - manager.createTask(task2); + assertEquals(2, manager.getAllEpicTasks().size(), "Должно быть 2 эпические задачи."); + } + + @Test + public void getAllSubTasksShouldReturnAllSubTasks() { + EpicTask epicTask = new EpicTask("Epic Task", "Description", 1); + manager.createEpicTask(epicTask); + Subtask subtask1 = new Subtask("Subtask 1", "Description", 2, epicTask.getId(), Duration.ofMinutes(30), LocalDateTime.now()); + Subtask subtask2 = new Subtask("Subtask 2", "Description", 3, epicTask.getId(), Duration.ofMinutes(45), LocalDateTime.now().plusHours(1)); + manager.createSubTask(subtask1); + manager.createSubTask(subtask2); + + assertEquals(2, manager.getAllSubTasks().size(), "Должно быть 2 подзадачи."); + } + + @Test + public void removeAllTasksShouldClearAllTasks() { + Task task = new Task("Task", "Description", 1, Duration.ofMinutes(30), LocalDateTime.now()); + manager.createTask(task); manager.removeAllTasks(); - assertEquals(0, manager.getAllTasks().size()); + assertEquals(0, manager.getAllTasks().size(), "Количество задач должно быть 0 после удаления."); } @Test - public void testSubtaskShouldBelongToEpic() { - EpicTask epicTask = new EpicTask("Epic Task", "Epic Description", 1); + public void removeAllEpicTasksShouldClearAllEpicTasks() { + EpicTask epicTask = new EpicTask("Epic Task", "Description", 1); manager.createEpicTask(epicTask); - Subtask subtask = new Subtask("Subtask", "Subtask Description", 2, epicTask.getId(), Duration.ofMinutes(30), LocalDateTime.now()); - manager.createSubTask(subtask); + manager.removeAllEpicTasks(); - assertTrue(epicTask.getSubtasks().contains(subtask)); + assertEquals(0, manager.getAllEpicTasks().size(), "Количество эпических задач должно быть 0 после удаления."); } @Test - public void testEpicStatusCalculation() { - EpicTask epicTask = new EpicTask("Epic Task", "Epic Description", 1); + public void removeAllSubTasksShouldClearAllSubTasks() { + EpicTask epicTask = new EpicTask("Epic Task", "Description", 1); manager.createEpicTask(epicTask); - Subtask subtask1 = new Subtask("Subtask 1", "Description", 2, epicTask.getId(), Duration.ofMinutes(30), LocalDateTime.now()); - Subtask subtask2 = new Subtask("Subtask 2", "Description", 3, epicTask.getId(), Duration.ofMinutes(30), LocalDateTime.now().plusHours(1)); + Subtask subtask = new Subtask("Subtask", "Description", 2, epicTask.getId(), Duration.ofMinutes(30), LocalDateTime.now()); + manager.createSubTask(subtask); + manager.removeAllSubTasks(); - manager.createSubTask(subtask1); - manager.createSubTask(subtask2); + assertEquals(0, manager.getAllSubTasks().size(), "Количество подзадач должно быть 0 после удаления."); + } - subtask1.setStatus(DONE); + @Test + public void getTaskByIdShouldReturnCorrectTask() { + Task task = new Task("Task", "Description", 1, Duration.ofMinutes(30), LocalDateTime.now()); + manager.createTask(task); + Task retrievedTask = manager.getTaskById(task.getId()); - assertEquals(NEW, epicTask.getStatus()); + assertEquals(task, retrievedTask, "Должен вернуть правильную задачу по ID."); } @Test - public void testIntervalOverlap() { - Task task1 = new Task("Task 1", "Description 1", 1, Duration.ofMinutes(30), LocalDateTime.now()); - Task task2 = new Task("Task 2", "Description 2", 2, Duration.ofMinutes(30), LocalDateTime.now().plusMinutes(15)); + public void getEpicTaskByIdShouldReturnCorrectEpicTask() { + EpicTask epicTask = new EpicTask("Epic Task", "Description", 1); + manager.createEpicTask(epicTask); + EpicTask retrievedEpicTask = manager.getEpicTaskById(epicTask.getId()); - manager.createTask(task1); + assertEquals(epicTask, retrievedEpicTask, "Должен вернуть правильную эпическую задачу по ID."); + } - try { - manager.createTask(task2); - fail("Expected IllegalArgumentException for overlapping tasks"); - } catch (IllegalArgumentException e) { - assertEquals("Задача пересекается с существующей задачей.", e.getMessage()); - } + @Test + public void getSubTaskByIdShouldReturnCorrectSubtask() { + EpicTask epicTask = new EpicTask("Epic Task", "Description", 1); + manager.createEpicTask(epicTask); + Subtask subtask = new Subtask("Subtask", "Description", 2, epicTask.getId(), Duration.ofMinutes(30), LocalDateTime.now()); + manager.createSubTask(subtask); + Subtask retrievedSubtask = manager.getSubTaskById(subtask.getId()); + + assertEquals(subtask, retrievedSubtask, "Должен вернуть правильную подзадачу по ID."); } -} + @Test + public void createTaskShouldAddTask() { + Task task = new Task("Task", "Description", 1, Duration.ofMinutes(30), LocalDateTime.now()); + manager.createTask(task); -class InMemoryTaskManagerTest extends TaskManagerTest { - @Override - protected InMemoryTaskManager createManager() { - return new InMemoryTaskManager(new HashMap<>(), new HashMap<>(), new HashMap<>()); + assertEquals(1, manager.getAllTasks().size(), "Количество задач должно быть 1 после добавления."); } -} -class FileBackedTaskManagerTest extends TaskManagerTest { - private static final String FILE_PATH = "test_tasks.csv"; + @Test + public void createEpicTaskShouldAddEpicTask() { + EpicTask epicTask = new EpicTask("Epic Task", "Description", 1); + manager.createEpicTask(epicTask); - @Override - protected FileBackedTaskManager createManager() { - return new FileBackedTaskManager(new HashMap<>(), new HashMap<>(), new HashMap<>(), FILE_PATH); + assertEquals(1, manager.getAllEpicTasks().size(), "Количество эпических задач должно быть 1 после добавления."); } - @AfterEach - public void tearDown() throws IOException { - Files.deleteIfExists(Paths.get(FILE_PATH)); + @Test + public void createSubTaskShouldAddSubtask() { + EpicTask epicTask = new EpicTask("Epic Task", "Description", 1); + manager.createEpicTask(epicTask); + Subtask subtask = new Subtask("Subtask", "Description", 2, epicTask.getId(), Duration.ofMinutes(30), LocalDateTime.now()); + manager.createSubTask(subtask); + + assertEquals(1, manager.getAllSubTasks().size(), "Количество подзадач должно быть 1 после добавления."); } @Test - public void testLoadThrowsManagerSaveException() { - String invalidFilePath = "invalid/path/to/file.txt"; + public void updateTaskShouldChangeTaskDetails() { + Task task = new Task("Task", "Description", 1, Duration.ofMinutes(30), LocalDateTime.now()); + manager.createTask(task); + manager.updateTask(task.getId(), 1, "Updated Task"); - assertThrows(ManagerSaveException.class, () -> { - manager.load(); - }, "Ошибка при загрузке данных из файла: " + invalidFilePath); + assertEquals("Updated Task", manager.getTaskById(task.getId()).getHeading(), "Заголовок задачи должен быть обновлен."); } @Test - public void testCreateSubTaskThrowsIllegalArgumentException() { - EpicTask epic = new EpicTask("Epic 1", "Description 1", 1); - manager.createEpicTask(epic); - Subtask subtask1 = new Subtask("Subtask 1", "Description 1", 1, 1, Duration.ofMinutes(30), LocalDateTime.now()); - manager.createSubTask(subtask1); - Subtask overlappingSubtask = new Subtask("Subtask 2", "Description 2", 2, 1, Duration.ofMinutes(30), LocalDateTime.now().plusMinutes(15)); + public void removeSubTaskByIdShouldRemoveSubtask() { + EpicTask epicTask = new EpicTask("Epic Task", "Description", 1); + manager.createEpicTask(epicTask); + Subtask subtask = new Subtask("Subtask", "Description", 2, epicTask.getId(), Duration.ofMinutes(30), LocalDateTime.now()); + manager.createSubTask(subtask); + manager.removeTaskById(subtask.getId()); - assertThrows(IllegalArgumentException.class, () -> { - manager.createSubTask(overlappingSubtask); - }, "Подзадача пересекается с существующей подзадачей."); + assertNull(manager.getSubTaskById(subtask.getId()), "Подзадача должна быть удалена."); } @Test - public void testFromStringThrowsIllegalArgumentException() { - String invalidString = "1,TASK"; - assertThrows(IllegalArgumentException.class, () -> { - Subtask.fromString(invalidString); - }, "Неверный формат строки: " + invalidString); + public void getHistoryShouldReturnTaskHistory() { + Task task1 = new Task("Task 1", "Description 1", 1, Duration.ofMinutes(30), LocalDateTime.now()); + Task task2 = new Task("Task 2", "Description 2", 2, Duration.ofMinutes(45), LocalDateTime.now().plusDays(1)); + manager.createTask(task1); + manager.createTask(task2); + manager.getTaskById(task1.getId()); + manager.getTaskById(task2.getId()); + + assertEquals(2, manager.getHistory().size(), "История должна содержать 2 задачи."); } } \ No newline at end of file