diff --git a/src/Main.java b/src/Main.java index 06c664c..9afb99b 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(); @@ -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..2104501 100644 --- a/src/tracker/EpicTask.java +++ b/src/tracker/EpicTask.java @@ -1,36 +1,71 @@ 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 < 6) { throw new IllegalArgumentException("Неверный формат строки: " + value); } @@ -38,9 +73,18 @@ 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.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; } 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/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/src/tracker/InMemoryTaskManager.java b/src/tracker/InMemoryTaskManager.java index 052b27c..afeebcf 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); @@ -122,19 +136,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; } @@ -156,14 +181,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)) { @@ -267,4 +290,32 @@ 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)); + + 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/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/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..cfffd28 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,9 +101,22 @@ 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; } + + 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/test/test/EpicTaskTest.java b/test/test/EpicTaskTest.java index fb8f126..6e87787 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<>(); @@ -25,16 +25,79 @@ class EpicTaskTest { InMemoryTaskManager manager = new InMemoryTaskManager(tasks, epicTasks, subTasks); @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()); + public void getSubtasksTaskShouldReturnListOfSubtasks() { + 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 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()); + 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 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)); + + manager.createSubTask(subtask1); + manager.createSubTask(subtask2); + + subtask1.setStatus(Status.DONE); + subtask2.setStatus(Status.DONE); + + manager.checkStatus(epic.getId(), 1); + + assertEquals(Status.DONE, epic.getStatus(), "Статус эпической задачи должен быть DONE."); + } + + + @Test + 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); + subtask2.setStatus(NEW); + manager.createSubTask(subtask1); + manager.createSubTask(subtask2); + + manager.checkStatus(epic.getId(), 1); + + assertEquals(IN_PROGRESS, epic.getStatus()); + } + + @Test + 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()); + subtask1.setStatus(IN_PROGRESS); + manager.createSubTask(subtask1); + + manager.checkStatus(epic.getId(), 1); + + assertEquals(IN_PROGRESS, epic.getStatus()); } } \ No newline at end of file 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 16ad6b3..9810f2e 100644 --- a/test/test/InMemoryHistoryManagerTest.java +++ b/test/test/InMemoryHistoryManagerTest.java @@ -5,6 +5,8 @@ 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,33 +17,45 @@ 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(); assertNotNull(history, "История не пустая."); - assertEquals(5, history.size(), "История содержит три задачи."); + 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(), "История содержит информацию об удаленной задаче"); + } + + @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); - //Евгений, привет. Это вот новые тесты, которые проходят в идеи, а тут нет. Я их закомментила как знак, что я писала новые тесты :). Не знаю, в чем дело, но гитхаб их не принимает. - //assertEquals(task3, history.get(2), "Последняя задача в истории"); - //assertEquals(task2, history.get(1), "Вторая задача в истории"); - //assertEquals(task1, history.get(0), "Первая задача в истории"); + historyManager.remove(task1.getId()); - //manager.removeTaskById(0); - //assertEquals(3, history.size(), "История содержит информацию об удаленной задаче"); + 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 index 6df1f7a..5900b87 100644 --- a/test/test/InMemoryTaskManagerTest.java +++ b/test/test/InMemoryTaskManagerTest.java @@ -1,126 +1,26 @@ 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 org.junit.jupiter.api.BeforeEach; +import tracker.*; 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; +class InMemoryTaskManagerTest extends TaskManagerTest { + private HashMap tasks; + private HashMap epicTasks; + private HashMap> subTasks; - - 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())); + @Override + protected InMemoryTaskManager createManager() { + return new InMemoryTaskManager(tasks, epicTasks, subTasks); } - @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()); + @BeforeEach + public void setUp() { + tasks = new HashMap<>(); + epicTasks = new HashMap<>(); + subTasks = new HashMap<>(); + super.setUp(); } -} \ No newline at end of file +} 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 cd93591..4ceec38 100644 --- a/test/test/SubtaskTest.java +++ b/test/test/SubtaskTest.java @@ -7,54 +7,50 @@ 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"; String subDescription_ = "third subtask description"; 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); + public void getEpicTaskShouldReturnEpicAssociatedWithSubtask() { + 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 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); - - id = manager.getTaskIndex(subHeading_, subDescription_, "subtask"); - Subtask subtaskSecond = new Subtask(subHeading_, subDescription_, id, 78); + public void getEpicTaskShouldReturnNullIfEpicIsNotInTheMap() { + int epicId = manager.getTaskIndex(epicHeading, epicDescription, "epic task"); + EpicTask epic = new EpicTask(epicHeading, epicDescription, epicId); + epicTasks.put(epic.getId(), epic); - epicTaskHashMap.put(epic.getId(), epic); + int subtaskId = manager.getTaskIndex(subHeading_, subDescription_, "subtask"); + Subtask subtaskSecond = new Subtask(subHeading_, subDescription_, subtaskId, 78, Duration.ofMinutes(30), LocalDateTime.now()); - assertNull(subtaskSecond.getEpicTask(epicTaskHashMap)); + Assertions.assertNull(subtaskSecond.getEpicTask(epicTasks), "Метод должен вернуть null, если эпик не найден."); } } \ No newline at end of file diff --git a/test/test/TaskManagerTest.java b/test/test/TaskManagerTest.java new file mode 100644 index 0000000..1a7536d --- /dev/null +++ b/test/test/TaskManagerTest.java @@ -0,0 +1,169 @@ +package test; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import tracker.*; + +import java.time.Duration; +import java.time.LocalDateTime; + +import static org.junit.jupiter.api.Assertions.*; + +abstract class TaskManagerTest { + protected T manager; + + @BeforeEach + public void setUp() { + manager = createManager(); + } + + protected abstract T createManager(); + + @Test + 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 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); + + 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(), "Количество задач должно быть 0 после удаления."); + } + + @Test + public void removeAllEpicTasksShouldClearAllEpicTasks() { + EpicTask epicTask = new EpicTask("Epic Task", "Description", 1); + manager.createEpicTask(epicTask); + manager.removeAllEpicTasks(); + + assertEquals(0, manager.getAllEpicTasks().size(), "Количество эпических задач должно быть 0 после удаления."); + } + + @Test + public void removeAllSubTasksShouldClearAllSubTasks() { + 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.removeAllSubTasks(); + + assertEquals(0, manager.getAllSubTasks().size(), "Количество подзадач должно быть 0 после удаления."); + } + + @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(task, retrievedTask, "Должен вернуть правильную задачу по ID."); + } + + @Test + public void getEpicTaskByIdShouldReturnCorrectEpicTask() { + EpicTask epicTask = new EpicTask("Epic Task", "Description", 1); + manager.createEpicTask(epicTask); + EpicTask retrievedEpicTask = manager.getEpicTaskById(epicTask.getId()); + + assertEquals(epicTask, retrievedEpicTask, "Должен вернуть правильную эпическую задачу по ID."); + } + + @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); + + assertEquals(1, manager.getAllTasks().size(), "Количество задач должно быть 1 после добавления."); + } + + @Test + public void createEpicTaskShouldAddEpicTask() { + EpicTask epicTask = new EpicTask("Epic Task", "Description", 1); + manager.createEpicTask(epicTask); + + assertEquals(1, manager.getAllEpicTasks().size(), "Количество эпических задач должно быть 1 после добавления."); + } + + @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 updateTaskShouldChangeTaskDetails() { + Task task = new Task("Task", "Description", 1, Duration.ofMinutes(30), LocalDateTime.now()); + manager.createTask(task); + manager.updateTask(task.getId(), 1, "Updated Task"); + + assertEquals("Updated Task", manager.getTaskById(task.getId()).getHeading(), "Заголовок задачи должен быть обновлен."); + } + + @Test + 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()); + + assertNull(manager.getSubTaskById(subtask.getId()), "Подзадача должна быть удалена."); + } + + @Test + 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