diff --git a/src/Main.java b/src/Main.java index a0d9915..a17bfa5 100644 --- a/src/Main.java +++ b/src/Main.java @@ -5,29 +5,37 @@ import tracker.model.Subtask; import tracker.model.Task; +import java.time.LocalDateTime; + public class Main { public static void main(String[] args) { + final long MINUTES_IN_DAY = 60 * 24; + final LocalDateTime TASK_START_TIME = LocalDateTime.now(); System.out.println("Поехали!"); TaskManager inMemoryTaskManager = Managers.getDefault(); // Создайте две задачи, а также эпик с двумя подзадачами и эпик с одной подзадачей - Task task1 = new Task("tracker.model.Task 1", "Do task 1", inMemoryTaskManager.getTaskId()); + Task task1 = new Task("tracker.model.Task 1", "Do task 1", inMemoryTaskManager.getTaskId(), + MINUTES_IN_DAY, TASK_START_TIME.minusDays(4)); inMemoryTaskManager.createTask(task1); - Task task2 = new Task("tracker.model.Task 2", "Do task 2", inMemoryTaskManager.getTaskId()); + Task task2 = new Task("tracker.model.Task 2", "Do task 2", inMemoryTaskManager.getTaskId(), + MINUTES_IN_DAY, TASK_START_TIME.minusDays(3)); inMemoryTaskManager.createTask(task2); - Epic epic1 = new Epic("tracker.model.Epic 1", "Do all subtasks from epic 1", inMemoryTaskManager.getTaskId()); + Epic epic1 = new Epic("tracker.model.Epic 1", "Do all subtasks from epic 1", + inMemoryTaskManager.getTaskId()); inMemoryTaskManager.createEpic(epic1); - Epic epic2 = new Epic("tracker.model.Epic 2", "Do all subtasks from epic 2", inMemoryTaskManager.getTaskId()); + Epic epic2 = new Epic("tracker.model.Epic 2", "Do all subtasks from epic 2", + inMemoryTaskManager.getTaskId()); inMemoryTaskManager.createEpic(epic2); - Subtask subtask1 = new Subtask("tracker.model.Subtask 1", "Do subtask 1", - inMemoryTaskManager.getTaskId(), epic1); + Subtask subtask1 = new Subtask("tracker.model.Subtask 1", "Do subtask 1", inMemoryTaskManager.getTaskId(), + epic1, MINUTES_IN_DAY, TASK_START_TIME.minusDays(2)); inMemoryTaskManager.createSubtask(subtask1); - Subtask subtask2 = new Subtask("tracker.model.Subtask 2", "Do subtask 2", - inMemoryTaskManager.getTaskId(), epic1); + Subtask subtask2 = new Subtask("tracker.model.Subtask 2", "Do subtask 2", inMemoryTaskManager.getTaskId(), + epic1, MINUTES_IN_DAY, TASK_START_TIME.minusDays(1)); inMemoryTaskManager.createSubtask(subtask2); - Subtask subtask3 = new Subtask("tracker.model.Subtask 3", "Do subtask 3", - inMemoryTaskManager.getTaskId(), epic2); + Subtask subtask3 = new Subtask("tracker.model.Subtask 3", "Do subtask 3", inMemoryTaskManager.getTaskId(), + epic2, MINUTES_IN_DAY, TASK_START_TIME); inMemoryTaskManager.createSubtask(subtask3); // Распечатайте списки эпиков, задач и подзадач через System.out.println(..) diff --git a/src/tracker/controllers/FileBackedTaskManager.java b/src/tracker/controllers/FileBackedTaskManager.java index 43b97eb..f4a8e7d 100644 --- a/src/tracker/controllers/FileBackedTaskManager.java +++ b/src/tracker/controllers/FileBackedTaskManager.java @@ -12,10 +12,11 @@ import java.io.Writer; import java.nio.file.Files; import java.nio.file.Path; +import java.time.LocalDateTime; public class FileBackedTaskManager extends InMemoryTaskManager { - private static final String HEADER = "id,type,name,status,description,epic"; + private static final String HEADER = "id,type,name,status,description,duration,startTime,endTime,epic"; private final File file; public FileBackedTaskManager(File file) { @@ -24,14 +25,22 @@ public FileBackedTaskManager(File file) { } public static void main(String[] args) { + final long MINUTES_IN_DAY = 60 * 24; + final LocalDateTime TASK_START_TIME = LocalDateTime.now(); + // Заведите несколько разных задач, эпиков и подзадач. - Task task1 = new Task("task 1", "task 1", 1, Status.NEW); - Task task2 = new Task("task 2", "task 2", 2, Status.NEW); + Task task1 = new Task("task 1", "task 1", 1, Status.NEW, MINUTES_IN_DAY, + TASK_START_TIME.minusDays(4)); + Task task2 = new Task("task 2", "task 2", 2, Status.NEW, MINUTES_IN_DAY, + TASK_START_TIME.minusDays(3)); Epic epic1 = new Epic("epic 1", "epic 1", 3); Epic epic2 = new Epic("epic 2", "epic 2", 4); - Subtask subtask1 = new Subtask("subtask 1", "subtask 1", 5, epic1); - Subtask subtask2 = new Subtask("subtask 2", "subtask 2", 6, epic1); - Subtask subtask3 = new Subtask("subtask 3", "subtask 3", 7, epic2); + Subtask subtask1 = new Subtask("subtask 1", "subtask 1", 5, epic1, MINUTES_IN_DAY, + TASK_START_TIME.minusDays(2)); + Subtask subtask2 = new Subtask("subtask 2", "subtask 2", 6, epic1, MINUTES_IN_DAY, + TASK_START_TIME.minusDays(1)); + Subtask subtask3 = new Subtask("subtask 3", "subtask 3", 7, epic2, MINUTES_IN_DAY, + TASK_START_TIME); try { File tempFile = File.createTempFile("sprint7-", ".csv"); @@ -48,9 +57,9 @@ public static void main(String[] args) { fileBackedTasksManager.getTaskById(1); fileBackedTasksManager.getTaskById(2); - fileBackedTasksManager.getTaskById(7); - fileBackedTasksManager.getTaskById(3); - fileBackedTasksManager.getTaskById(5); + fileBackedTasksManager.getSubtaskById(7); + fileBackedTasksManager.getEpicById(3); + fileBackedTasksManager.getSubtaskById(5); System.out.println(fileBackedTasksManager.getHistory()); @@ -185,19 +194,24 @@ static void fromString(String value, FileBackedTaskManager fileBackedTasksManage String[] elements = value.split(","); int id = Integer.parseInt(elements[0]); switch (elements[1]) { - case "TASK": - fileBackedTasksManager.tasks.put(id, new Task(elements[2], elements[4], id, - Status.valueOf(elements[3]))); - break; - case "EPIC": - fileBackedTasksManager.epics.put(id, new Epic(elements[2], elements[4], id, - Status.valueOf(elements[3]))); - break; - case "SUBTASK": - fileBackedTasksManager.subtasks.put(id, new Subtask(elements[2], elements[4], id, - Status.valueOf(elements[3]), - fileBackedTasksManager.getEpicById(Integer.parseInt(elements[5])))); - break; + case "TASK" -> { + Task task = new Task(elements[2], elements[4], id, + Status.valueOf(elements[3]), Long.parseLong(elements[5]), LocalDateTime.parse(elements[6])); + fileBackedTasksManager.tasks.put(id, task); + fileBackedTasksManager.sortedTasks.add(task); + } + case "EPIC" -> { + Epic epic = new Epic(elements[2], elements[4], id, Status.valueOf(elements[3]), + Long.parseLong(elements[5]), LocalDateTime.parse(elements[6]), LocalDateTime.parse(elements[7])); + fileBackedTasksManager.epics.put(id, epic); + } + case "SUBTASK" -> { + Subtask subtask = new Subtask(elements[2], elements[4], id, Status.valueOf(elements[3]), + fileBackedTasksManager.epics.get(Integer.parseInt(elements[8])), Long.parseLong(elements[5]), + LocalDateTime.parse(elements[6])); + fileBackedTasksManager.subtasks.put(id, subtask); + fileBackedTasksManager.sortedTasks.add(subtask); + } } if (id > fileBackedTasksManager.taskId) { fileBackedTasksManager.taskId = id; diff --git a/src/tracker/controllers/InMemoryTaskManager.java b/src/tracker/controllers/InMemoryTaskManager.java index 9073857..4c6e9c5 100644 --- a/src/tracker/controllers/InMemoryTaskManager.java +++ b/src/tracker/controllers/InMemoryTaskManager.java @@ -5,23 +5,39 @@ import tracker.model.Subtask; import tracker.model.Task; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; +import java.time.LocalDateTime; +import java.util.*; public class InMemoryTaskManager implements TaskManager { + private final LocalDateTime emptyDateTime = LocalDateTime.of(1970, 1, 1, 0, 0); protected final HashMap tasks; protected final HashMap subtasks; protected final HashMap epics; private final HistoryManager inMemoryHistoryManager; protected int taskId; + protected final TreeSet sortedTasks; + public InMemoryTaskManager() { tasks = new HashMap<>(); subtasks = new HashMap<>(); epics = new HashMap<>(); taskId = 1; inMemoryHistoryManager = Managers.getDefaultHistory(); + Comparator comparator = (task1, task2) -> { + LocalDateTime t1 = task1.getStartTime(); + LocalDateTime t2 = task2.getStartTime(); + if (task1.equals(task2)) { + return 0; + } else if (t1.isBefore(t2)) { + return -1; + } else if (t1.isAfter(t2) || t1.equals(t2)) { + return 1; + } + + return 0; + }; + this.sortedTasks = new TreeSet<>(comparator); } @Override @@ -48,16 +64,20 @@ public ArrayList getEpics() { // Удаление всех задач. @Override public void deleteAllTasks() { - for (Integer taskId: tasks.keySet()) { - inMemoryHistoryManager.remove(taskId); + for (Task task: tasks.values()) { + inMemoryHistoryManager.remove(task.getId()); + sortedTasks.remove(task); } tasks.clear(); } @Override public void deleteAllSubtasks() { - for (Integer subtaskId: subtasks.keySet()) { - inMemoryHistoryManager.remove(subtaskId); + for (Subtask subtask: subtasks.values()) { + inMemoryHistoryManager.remove(subtask.getId()); + sortedTasks.remove(subtask); + updateEpicStatus(subtask.getEpic()); + updateEpicEndTimeAndDuration(subtask.getEpic()); } subtasks.clear(); } @@ -66,6 +86,11 @@ public void deleteAllSubtasks() { public void deleteAllEpics() { for (Integer epicId: epics.keySet()) { inMemoryHistoryManager.remove(epicId); + ArrayList epicsSubtasks = getEpicsSubtasks(epicId); + for (Subtask subtask: epicsSubtasks) { + inMemoryHistoryManager.remove(subtask.getId()); + sortedTasks.remove(subtask); + } } epics.clear(); } @@ -74,19 +99,15 @@ public void deleteAllEpics() { @Override public Task getTaskById(int id) { Task task = tasks.get(id); - if (task != null) { - inMemoryHistoryManager.add(task); - } + inMemoryHistoryManager.add(task); return task; } @Override public Subtask getSubtaskById(int id) { - Subtask subtask = subtasks.get(id); - if (subtask != null) { - inMemoryHistoryManager.add(subtask); - } - return subtask; + Subtask task = subtasks.get(id); + inMemoryHistoryManager.add(task); + return task; } @Override @@ -113,15 +134,26 @@ public ArrayList getEpicsSubtasks(int epicId) { // Создание. Сам объект должен передаваться в качестве параметра. @Override public void createTask(Task task) { - tasks.put(taskId, task); - taskId++; + if (noIntersectionWithTasks(task)) { + tasks.put(taskId, task); + sortedTasks.add(task); + taskId++; + } else { + System.out.println("Пересечение с текущими задачами"); + } } @Override public void createSubtask(Subtask task) { - subtasks.put(taskId, task); - updateEpicStatus(task.getEpic()); - taskId++; + if (noIntersectionWithTasks(task)) { + subtasks.put(taskId, task); + sortedTasks.add(task); + updateEpicStatus(task.getEpic()); + updateEpicEndTimeAndDuration(task.getEpic()); + taskId++; + } else { + System.out.println("Пересечение с текущими задачами."); + } } @Override @@ -137,8 +169,13 @@ public void updateTask(Task task) { if (updatedTask == null) { System.out.println("Задача с id = " + task.getId() + " не найдена"); } - - tasks.put(task.getId(), task); + if (noIntersectionWithTasks(task)) { + sortedTasks.remove(updatedTask); + tasks.put(task.getId(), task); + sortedTasks.add(task); + } else { + System.out.println("Пересечение с текущими задачами"); + } } @Override @@ -147,14 +184,20 @@ public void updateSubtask(Subtask task) { if (updatedTask == null) { System.out.println("Задача с id = " + task.getId() + " не найдена"); } - - updateEpicStatus(task.getEpic()); - subtasks.put(task.getId(), task); + if (noIntersectionWithTasks(task)) { + sortedTasks.remove(updatedTask); + subtasks.put(task.getId(), task); + sortedTasks.add(task); + updateEpicStatus(task.getEpic()); + updateEpicEndTimeAndDuration(task.getEpic()); + } else { + System.out.println("Пересечение с текущими задачами"); + } } @Override public void updateEpicStatus(Epic epic) { - ArrayList epicsSubtasks = getEpicsSubtasks(epic.getId()); + ArrayList epicsSubtasks = getEpicsSubtasks(epic.getId()); int numberOfNewTasks = 0; int numberOfDoneTasks = 0; for (Subtask subtask: epicsSubtasks) { @@ -174,6 +217,34 @@ public void updateEpicStatus(Epic epic) { } } + void updateEpicEndTimeAndDuration(Epic epic) { + LocalDateTime epicStartTime = emptyDateTime; + LocalDateTime epicEndTime = emptyDateTime; + long epicDuration = 0; + ArrayList epicSubtasks = getEpicsSubtasks(epic.getId()); + for (Subtask subtask: epicSubtasks) { + if (epicStartTime.isEqual(emptyDateTime)) { + epicStartTime = subtask.getStartTime(); + } else if (!subtask.getStartTime().isEqual(emptyDateTime) + && subtask.getStartTime().isBefore(epicStartTime)) { + epicStartTime = subtask.getStartTime(); + } + + if (epicEndTime.isEqual(emptyDateTime)) { + epicEndTime = subtask.getEndTime(); + } else if (!subtask.getEndTime().isEqual(emptyDateTime) + && subtask.getEndTime().isAfter(epicEndTime)) { + epicEndTime = subtask.getEndTime(); + } + + epicDuration += subtask.getDuration(); + } + + epic.setStartTime(epicStartTime); + epic.setDuration(epicDuration); + epic.setEndTime(epicEndTime); + } + @Override public void updateEpic(Epic task) { Epic updatedTask = epics.get(task.getId()); @@ -188,13 +259,16 @@ public void updateEpic(Epic task) { public void deleteTask(Task task) { inMemoryHistoryManager.remove(task.getId()); tasks.remove(task.getId()); + sortedTasks.remove(task); } @Override public void deleteSubtask(Subtask task) { inMemoryHistoryManager.remove(task.getId()); subtasks.remove(task.getId()); + sortedTasks.remove(task); updateEpicStatus(task.getEpic()); + updateEpicEndTimeAndDuration(task.getEpic()); } @Override @@ -204,6 +278,7 @@ public void deleteEpic(Epic epic) { for (Subtask subtask: subtasksForDeletion) { inMemoryHistoryManager.remove(subtask.getId()); subtasks.remove(subtask.getId()); + sortedTasks.remove(subtask); } inMemoryHistoryManager.remove(epic.getId()); epics.remove(epic.getId()); @@ -213,4 +288,27 @@ public void deleteEpic(Epic epic) { public List getHistory() { return inMemoryHistoryManager.getHistory(); } + + @Override + public TreeSet getPrioritizedTasks() { + return sortedTasks; + } + + private boolean intersectionChecked(T task1, T task2) { + LocalDateTime endTime1 = task1.getStartTime().plusMinutes(task1.getDuration()).minusSeconds(1); + LocalDateTime endTime2 = task2.getStartTime().plusMinutes(task2.getDuration()).minusSeconds(1); + return (task1.getStartTime().isBefore(task2.getStartTime()) || task1.getStartTime().isEqual(task2.getStartTime())) + && (endTime1.isAfter(task2.getStartTime()) || endTime1.isEqual(task2.getStartTime())) + || (task1.getStartTime().isBefore(endTime2) || task1.getStartTime().isEqual(endTime2)) + && (endTime1.isAfter(endTime2) || endTime1.isEqual(endTime2)); + } + + private boolean noIntersectionWithTasks(T task) { + List intersectedTasks = sortedTasks.stream() + .filter(currentTask -> !currentTask.equals(task)) + .filter(currentTask -> intersectionChecked(task, currentTask)) + .toList(); + return intersectedTasks.isEmpty(); + } } + diff --git a/src/tracker/controllers/TaskManager.java b/src/tracker/controllers/TaskManager.java index 44d7d9d..71bfd44 100644 --- a/src/tracker/controllers/TaskManager.java +++ b/src/tracker/controllers/TaskManager.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.TreeSet; public interface TaskManager { // Получение списка всех задач. @@ -58,4 +59,6 @@ public interface TaskManager { void deleteEpic(Epic epic); List getHistory(); + + TreeSet getPrioritizedTasks(); } diff --git a/src/tracker/model/Epic.java b/src/tracker/model/Epic.java index 3d763ca..10fb55b 100644 --- a/src/tracker/model/Epic.java +++ b/src/tracker/model/Epic.java @@ -1,16 +1,44 @@ package tracker.model; +import java.time.LocalDateTime; + public class Epic extends Task { + + private LocalDateTime endTime; + private final LocalDateTime emptyDateTime = LocalDateTime.of(1970, 1, 1, 0, 0); + + @Override + public LocalDateTime getEndTime() { + return endTime; + } + + public void setEndTime(LocalDateTime endTime) { + this.endTime = endTime; + } + public Epic(String name, String description, int id) { super(name, description, id); + this.duration = 0; + this.startTime = emptyDateTime; + this.endTime = emptyDateTime; } public Epic(String name, String description, int id, Status status) { super(name, description, id, status); + this.duration = 0; + this.startTime = emptyDateTime; + this.endTime = emptyDateTime; + } + + public Epic(String name, String description, int id, Status status, long duration, LocalDateTime startTime, + LocalDateTime endTime) { + super(name, description, id, status, duration, startTime); + this.endTime = endTime; } @Override public String toString() { - return id + "," + TaskType.EPIC + "," + name + "," + status + "," + description + ","; + return id + "," + TaskType.EPIC + "," + name + "," + status + "," + description + "," + duration + "," + + startTime.toString() + "," + endTime.toString() + ","; } } diff --git a/src/tracker/model/Subtask.java b/src/tracker/model/Subtask.java index 9e10629..043f47f 100644 --- a/src/tracker/model/Subtask.java +++ b/src/tracker/model/Subtask.java @@ -1,15 +1,18 @@ package tracker.model; +import java.time.LocalDateTime; + public class Subtask extends Task { private final Epic epic; - public Subtask(String name, String description, int id, Epic epic) { - super(name, description, id); + public Subtask(String name, String description, int id, Epic epic, long duration, LocalDateTime startTime) { + super(name, description, id, duration, startTime); this.epic = epic; } - public Subtask(String name, String description, int id, Status status, Epic epic) { - super(name, description, id, status); + public Subtask(String name, String description, int id, Status status, Epic epic, long duration, + LocalDateTime startTime) { + super(name, description, id, status, duration, startTime); this.epic = epic; } @@ -19,6 +22,7 @@ public Epic getEpic() { @Override public String toString() { - return id + "," + TaskType.SUBTASK + "," + name + "," + status + "," + description + "," + epic.id; + return id + "," + TaskType.SUBTASK + "," + name + "," + status + "," + description + "," + duration + "," + + startTime.toString() + "," + "," + epic.id; } } diff --git a/src/tracker/model/Task.java b/src/tracker/model/Task.java index 54e1775..87479dc 100644 --- a/src/tracker/model/Task.java +++ b/src/tracker/model/Task.java @@ -1,5 +1,6 @@ package tracker.model; +import java.time.LocalDateTime; import java.util.Objects; public class Task { @@ -7,12 +8,15 @@ public class Task { protected String description; protected final int id; protected Status status; + protected long duration; + protected LocalDateTime startTime; public Task(String name, String description, int id) { this.name = name; this.description = description; this.id = id; - this.status = Status.NEW; + this.duration = 0; + this.startTime = LocalDateTime.of(1970, 1, 1, 0, 0); } public Task(String name, String description, int id, Status status) { @@ -20,6 +24,26 @@ public Task(String name, String description, int id, Status status) { this.description = description; this.id = id; this.status = status; + this.duration = 0; + this.startTime = LocalDateTime.of(1970, 1, 1, 0, 0); + } + + public Task(String name, String description, int id, long duration, LocalDateTime startTime) { + this.name = name; + this.description = description; + this.id = id; + this.status = Status.NEW; + this.duration = duration; + this.startTime = startTime; + } + + public Task(String name, String description, int id, Status status, long duration, LocalDateTime startTime) { + this.name = name; + this.description = description; + this.id = id; + this.status = status; + this.duration = duration; + this.startTime = startTime; } public String getName() { @@ -50,6 +74,26 @@ public void setStatus(Status status) { this.status = status; } + public long getDuration() { + return duration; + } + + public LocalDateTime getStartTime() { + return startTime; + } + + public LocalDateTime getEndTime() { + return startTime.plusSeconds(duration); + } + + public void setDuration(long duration) { + this.duration = duration; + } + + public void setStartTime(LocalDateTime startTime) { + this.startTime = startTime; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -65,6 +109,7 @@ public int hashCode() { @Override public String toString() { - return id + "," + TaskType.TASK + "," + name + "," + status + "," + description + ","; + return id + "," + TaskType.TASK + "," + name + "," + status + "," + description + "," + duration + "," + + startTime.toString() + "," + ","; } } diff --git a/test/tracker/controllers/FileBackedTaskManagerTest.java b/test/tracker/controllers/FileBackedTaskManagerTest.java index e4e0ab2..63e270a 100644 --- a/test/tracker/controllers/FileBackedTaskManagerTest.java +++ b/test/tracker/controllers/FileBackedTaskManagerTest.java @@ -9,13 +9,15 @@ import java.io.File; import java.io.IOException; +import java.time.LocalDateTime; import static org.junit.jupiter.api.Assertions.*; -class FileBackedTaskManagerTest extends InMemoryTaskManagerTest { +class FileBackedTaskManagerTest extends TaskManagerTest { File file; + final long MINUTES_IN_DAY = 60 * 24; + final LocalDateTime TASK_START_TIME = LocalDateTime.now(); - @Override @BeforeEach void initializeTask() { try { @@ -43,13 +45,18 @@ void checkImportFromEmptyFile() { @Test void checkImportFromFile() { - Task task1 = new Task("task 1", "task 1", 1, Status.NEW); - Task task2 = new Task("task 2", "task 2", 2, Status.NEW); + Task task1 = new Task("task 1", "task 1", 1, Status.NEW, MINUTES_IN_DAY, + TASK_START_TIME.minusDays(4)); + Task task2 = new Task("task 2", "task 2", 2, Status.NEW, MINUTES_IN_DAY, + TASK_START_TIME.minusDays(3)); Epic epic1 = new Epic("epic 1", "epic 1", 3); Epic epic2 = new Epic("epic 2", "epic 2", 4); - Subtask subtask1 = new Subtask("subtask 1", "subtask 1", 5, epic1); - Subtask subtask2 = new Subtask("subtask 2", "subtask 2", 6, epic1); - Subtask subtask3 = new Subtask("subtask 3", "subtask 3", 7, epic2); + Subtask subtask1 = new Subtask("subtask 1", "subtask 1", 5, epic1, MINUTES_IN_DAY, + TASK_START_TIME.minusDays(2)); + Subtask subtask2 = new Subtask("subtask 2", "subtask 2", 6, epic1, MINUTES_IN_DAY, + TASK_START_TIME.minusDays(1)); + Subtask subtask3 = new Subtask("subtask 3", "subtask 3", 7, epic2, MINUTES_IN_DAY, + TASK_START_TIME); taskManager.createTask(task1); taskManager.createTask(task2); @@ -66,9 +73,9 @@ void checkImportFromFile() { "Исходная задача не соответствует загруженной"); assertTrue(tasksAreEquals(taskManager1.getTaskById(2), taskManager2.getTaskById(2)), "Исходная задача не соответствует загруженной"); - assertTrue(tasksAreEquals(taskManager1.getEpicById(3), taskManager2.getEpicById(3)), + assertTrue(epicsAreEquals(taskManager1.getEpicById(3), taskManager2.getEpicById(3)), "Исходная задача не соответствует загруженной"); - assertTrue(tasksAreEquals(taskManager1.getEpicById(4), taskManager2.getEpicById(4)), + assertTrue(epicsAreEquals(taskManager1.getEpicById(4), taskManager2.getEpicById(4)), "Исходная задача не соответствует загруженной"); assertTrue(tasksAreEquals(taskManager1.getSubtaskById(5), taskManager2.getSubtaskById(5)), "Исходная задача не соответствует загруженной"); @@ -76,12 +83,26 @@ void checkImportFromFile() { "Исходная задача не соответствует загруженной"); assertTrue(tasksAreEquals(taskManager1.getSubtaskById(7), taskManager2.getSubtaskById(7)), "Исходная задача не соответствует загруженной"); + + } boolean tasksAreEquals(Task task1, Task task2) { return task1.getId() == task2.getId() && task1.getName().equals(task2.getName()) && task1.getDescription().equals(task2.getDescription()) - && task1.getStatus().equals(task2.getStatus()); + && task1.getStatus().equals(task2.getStatus()) + && task1.getStartTime().equals(task2.getStartTime()) + && task1.getDuration() == task2.getDuration(); + } + + boolean epicsAreEquals(Epic epic1, Epic epic2) { + return epic1.getId() == epic2.getId() + && epic1.getName().equals(epic2.getName()) + && epic1.getDescription().equals(epic2.getDescription()) + && epic1.getStatus().equals(epic2.getStatus()) + && epic1.getStartTime().equals(epic2.getStartTime()) + && epic1.getDuration() == epic2.getDuration() + && epic1.getEndTime().equals(epic2.getEndTime()); } } \ No newline at end of file diff --git a/test/tracker/controllers/InMemoryHistoryManagerTest.java b/test/tracker/controllers/InMemoryHistoryManagerTest.java index 6e9a683..1e883d4 100644 --- a/test/tracker/controllers/InMemoryHistoryManagerTest.java +++ b/test/tracker/controllers/InMemoryHistoryManagerTest.java @@ -6,10 +6,14 @@ import tracker.model.Subtask; import tracker.model.Task; +import java.time.LocalDateTime; + import static org.junit.jupiter.api.Assertions.*; class InMemoryHistoryManagerTest { TaskManager taskManager; + final long MINUTES_IN_DAY = 60 * 24; + final LocalDateTime TASK_START_TIME = LocalDateTime.now(); @BeforeEach void initializeTask() { @@ -17,9 +21,11 @@ void initializeTask() { } @Test void checkInMemoryHistoryManager() { - Task task1 = new Task("Task 1", "Do task 1", taskManager.getTaskId()); + Task task1 = new Task("Task 1", "Do task 1", taskManager.getTaskId(), MINUTES_IN_DAY, + TASK_START_TIME.minusDays(4)); taskManager.createTask(task1); - Task task2 = new Task("Task 2", "Do task 2", taskManager.getTaskId()); + Task task2 = new Task("Task 2", "Do task 2", taskManager.getTaskId(), MINUTES_IN_DAY, + TASK_START_TIME.minusDays(3)); taskManager.createTask(task2); Epic epic1 = new Epic("Epic 1", "Do all subtasks from epic 1", taskManager.getTaskId()); @@ -28,13 +34,13 @@ void checkInMemoryHistoryManager() { taskManager.getTaskId()); taskManager.createEpic(epic2); Subtask subtask1 = new Subtask("Subtask 1", "Do subtask 1", - taskManager.getTaskId(), epic1); + taskManager.getTaskId(), epic1, MINUTES_IN_DAY, TASK_START_TIME.minusDays(2)); taskManager.createSubtask(subtask1); Subtask subtask2 = new Subtask("Subtask 2", "Do subtask 2", - taskManager.getTaskId(), epic1); + taskManager.getTaskId(), epic1, MINUTES_IN_DAY, TASK_START_TIME.minusDays(1)); taskManager.createSubtask(subtask2); Subtask subtask3 = new Subtask("Subtask 3", "Do subtask 3", - taskManager.getTaskId(), epic2); + taskManager.getTaskId(), epic2, MINUTES_IN_DAY, TASK_START_TIME); taskManager.createSubtask(subtask3); taskManager.getTaskById(task1.getId()); diff --git a/test/tracker/controllers/InMemoryTaskManagerTest.java b/test/tracker/controllers/InMemoryTaskManagerTest.java index cba0d2c..8260e39 100644 --- a/test/tracker/controllers/InMemoryTaskManagerTest.java +++ b/test/tracker/controllers/InMemoryTaskManagerTest.java @@ -1,49 +1,11 @@ package tracker.controllers; -import tracker.model.Epic; -import tracker.model.Subtask; -import tracker.model.Task; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; - -class InMemoryTaskManagerTest { - TaskManager taskManager; +class InMemoryTaskManagerTest extends TaskManagerTest { @BeforeEach void initializeTask() { - taskManager = Managers.getDefault(); - } - - @Test - void checkEpic() { - Task task1 = new Task("Task 1", "Do task 1", taskManager.getTaskId()); - taskManager.createTask(task1); - Task task2 = new Task("Task 2", "Do task 2", taskManager.getTaskId()); - taskManager.createTask(task2); - Epic epic1 = new Epic("Epic 1", "Do all subtasks from epic 1", - taskManager.getTaskId()); - taskManager.createEpic(epic1); - Epic epic2 = new Epic("Epic 2", "Do all subtasks from epic 2", - taskManager.getTaskId()); - taskManager.createEpic(epic2); - Subtask subtask1 = new Subtask("Subtask 1", "Do subtask 1", - taskManager.getTaskId(), epic1); - taskManager.createSubtask(subtask1); - Subtask subtask2 = new Subtask("Subtask 2", "Do subtask 2", - taskManager.getTaskId(), epic1); - taskManager.createSubtask(subtask2); - Subtask subtask3 = new Subtask("Subtask 3", "Do subtask 3", - taskManager.getTaskId(), epic2); - taskManager.createSubtask(subtask3); - - assertEquals(1, taskManager.getTaskById(task1.getId()).getId(), "Неверный Id"); - assertEquals(2, taskManager.getTaskById(task2.getId()).getId(), "Неверный Id"); - assertEquals(3, taskManager.getEpicById(epic1.getId()).getId(), "Неверный Id"); - assertEquals(4, taskManager.getEpicById(epic2.getId()).getId(), "Неверный Id"); - assertEquals(5, taskManager.getSubtaskById(subtask1.getId()).getId(), "Неверный Id"); - assertEquals(6, taskManager.getSubtaskById(subtask2.getId()).getId(), "Неверный Id"); - assertEquals(7, taskManager.getSubtaskById(subtask3.getId()).getId(), "Неверный Id"); + taskManager = new InMemoryTaskManager(); } } \ No newline at end of file diff --git a/test/tracker/controllers/TaskManagerTest.java b/test/tracker/controllers/TaskManagerTest.java new file mode 100644 index 0000000..1db1a53 --- /dev/null +++ b/test/tracker/controllers/TaskManagerTest.java @@ -0,0 +1,105 @@ +package tracker.controllers; + +import org.junit.jupiter.api.Test; +import tracker.model.Epic; +import tracker.model.Status; +import tracker.model.Subtask; +import tracker.model.Task; + +import java.time.LocalDateTime; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +abstract class TaskManagerTest { + + T taskManager; + final long MINUTES_IN_DAY = 60 * 24; + final LocalDateTime TASK_START_TIME = LocalDateTime.now(); + + @Test + void checkEpic() { + Task task1 = new Task("Task 1", "Do task 1", taskManager.getTaskId(), MINUTES_IN_DAY, + TASK_START_TIME.minusDays(4)); + taskManager.createTask(task1); + Task task2 = new Task("Task 2", "Do task 2", taskManager.getTaskId(), MINUTES_IN_DAY, + TASK_START_TIME.minusDays(3)); + taskManager.createTask(task2); + Epic epic1 = new Epic("Epic 1", "Do all subtasks from epic 1", taskManager.getTaskId()); + taskManager.createEpic(epic1); + Epic epic2 = new Epic("Epic 2", "Do all subtasks from epic 2", taskManager.getTaskId()); + taskManager.createEpic(epic2); + Subtask subtask1 = new Subtask("Subtask 1", "Do subtask 1", taskManager.getTaskId(), epic1, + MINUTES_IN_DAY, TASK_START_TIME.minusDays(2)); + taskManager.createSubtask(subtask1); + Subtask subtask2 = new Subtask("Subtask 2", "Do subtask 2", taskManager.getTaskId(), epic1, + MINUTES_IN_DAY, TASK_START_TIME.minusDays(1)); + taskManager.createSubtask(subtask2); + Subtask subtask3 = new Subtask("Subtask 3", "Do subtask 3", taskManager.getTaskId(), epic2, + MINUTES_IN_DAY, TASK_START_TIME); + taskManager.createSubtask(subtask3); + + assertEquals(1, taskManager.getTaskById(task1.getId()).getId(), "Неверный Id"); + assertEquals(2, taskManager.getTaskById(task2.getId()).getId(), "Неверный Id"); + assertEquals(3, taskManager.getEpicById(epic1.getId()).getId(), "Неверный Id"); + assertEquals(4, taskManager.getEpicById(epic2.getId()).getId(), "Неверный Id"); + assertEquals(5, taskManager.getSubtaskById(subtask1.getId()).getId(), "Неверный Id"); + assertEquals(6, taskManager.getSubtaskById(subtask2.getId()).getId(), "Неверный Id"); + assertEquals(7, taskManager.getSubtaskById(subtask3.getId()).getId(), "Неверный Id"); + } + + @Test + void checkEpicStatus() { + // Все подзадачи со статусом NEW. + Epic epic1 = new Epic("Epic 1", "Do all subtasks from epic 1", taskManager.getTaskId()); + taskManager.createEpic(epic1); + Subtask subtask1 = new Subtask("Subtask 1", "Do subtask 1", taskManager.getTaskId(), epic1, + MINUTES_IN_DAY, TASK_START_TIME.minusDays(3)); + taskManager.createSubtask(subtask1); + Subtask subtask2 = new Subtask("Subtask 2", "Do subtask 2", taskManager.getTaskId(), epic1, + MINUTES_IN_DAY, TASK_START_TIME.minusDays(2)); + taskManager.createSubtask(subtask2); + assertEquals(Status.NEW, epic1.getStatus(), "Статус эпика должен быть NEW"); + // Подзадачи со статусами NEW и DONE. + subtask2.setStatus(Status.DONE); + taskManager.updateEpicStatus(epic1); + assertEquals(Status.IN_PROGRESS, epic1.getStatus(), "Статус эпика должен быть IN_PROGRESS"); + // Подзадачи со статусом IN_PROGRESS. + Epic epic2 = new Epic("Epic 2", "Do all subtasks from epic 2", taskManager.getTaskId()); + taskManager.createEpic(epic2); + Subtask subtask3 = new Subtask("Subtask 3", "Do subtask 3", taskManager.getTaskId(), epic2, + MINUTES_IN_DAY, TASK_START_TIME.minusDays(1)); + taskManager.createSubtask(subtask3); + Subtask subtask4 = new Subtask("Subtask 4", "Do subtask 4", taskManager.getTaskId(), epic2, + MINUTES_IN_DAY, TASK_START_TIME); + taskManager.createSubtask(subtask4); + subtask3.setStatus(Status.IN_PROGRESS); + subtask4.setStatus(Status.IN_PROGRESS); + taskManager.updateEpicStatus(epic2); + assertEquals(Status.IN_PROGRESS, epic2.getStatus(), "Статус эпика должен быть IN_PROGRESS"); + // Все подзадачи со статусом DONE. + subtask1.setStatus(Status.DONE); + subtask2.setStatus(Status.DONE); + subtask3.setStatus(Status.DONE); + subtask4.setStatus(Status.DONE); + taskManager.updateEpicStatus(epic1); + taskManager.updateEpicStatus(epic2); + assertEquals(Status.DONE, epic1.getStatus(), "Статус эпика должен быть DONE"); + assertEquals(Status.DONE, epic2.getStatus(), "Статус эпика должен быть DONE"); + } + + @Test + void checkTaskIntersection() { + // При наличии пересечения по времени выполнения задача не будет создана + Task task1 = new Task("Task 1", "Do task 1", taskManager.getTaskId(), MINUTES_IN_DAY, + TASK_START_TIME); + taskManager.createTask(task1); + Task task2 = new Task("Task 2", "Do task 2", taskManager.getTaskId(), MINUTES_IN_DAY, + TASK_START_TIME); + taskManager.createTask(task2); + assertEquals(1, taskManager.getTaskById(task1.getId()).getId(), "Неверный Id"); + assertEquals(1, taskManager.getTasks().size(), "Неверное количество задач"); + task2.setStartTime(TASK_START_TIME.plusDays(1)); + taskManager.createTask(task2); + assertEquals(2, taskManager.getTaskById(task2.getId()).getId(), "Неверный Id"); + } +} diff --git a/test/tracker/model/SubtaskTest.java b/test/tracker/model/SubtaskTest.java index 55a569a..eb685ba 100644 --- a/test/tracker/model/SubtaskTest.java +++ b/test/tracker/model/SubtaskTest.java @@ -5,10 +5,14 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.time.LocalDateTime; + import static org.junit.jupiter.api.Assertions.*; class SubtaskTest { TaskManager inMemoryTaskManager; + final long MINUTES_IN_DAY = 60 * 24; + final LocalDateTime TASK_START_TIME = LocalDateTime.now(); @BeforeEach void initializeTask() { @@ -24,9 +28,11 @@ void checkSubtask() { inMemoryTaskManager.getTaskId()); inMemoryTaskManager.createEpic(epic2); - Subtask subtask1 = new Subtask("Subtask 1", "Do subtask 1", 1, epic1); + Subtask subtask1 = new Subtask("Subtask 1", "Do subtask 1", 1, epic1, MINUTES_IN_DAY, + TASK_START_TIME.minusDays(1)); inMemoryTaskManager.createSubtask(subtask1); - Subtask subtask2 = new Subtask("Subtask 2", "Do subtask 2", 1, epic2); + Subtask subtask2 = new Subtask("Subtask 2", "Do subtask 2", 1, epic2, MINUTES_IN_DAY, + TASK_START_TIME); inMemoryTaskManager.createSubtask(subtask2); assertEquals(subtask1, subtask2, "Объекты не равны");