diff --git a/src/Main.java b/src/Main.java index af6285e..893737a 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,54 +1,52 @@ -import manager.InMemoryTaskManager; -import manager.Managers; +import manager.FileBackedTaskManager; import manager.TaskManager; -import model.Epic; -import model.Status; -import model.Subtask; -import model.Task; +import model.*; -import java.util.List; +import java.io.File; +import java.time.Duration; +import java.time.LocalDateTime; public class Main { public static void main(String[] args) { - TaskManager manager = Managers.getDefault(); - Task task1 = new Task("Task1", "Desc", Status.NEW); - Task task2 = new Task("Task2", "Desc", Status.NEW); + File file = new File("tasks.csv"); + TaskManager manager = new FileBackedTaskManager(file); + + Task task1 = new Task("Task 1", "Simple task", + Status.NEW, Duration.ofMinutes(30), LocalDateTime.of(2025, 7, 1, 8, 0)); // 08:00–08:30 + Task task2 = new Task("Task 2", "Another task", + Status.NEW, Duration.ofMinutes(45), LocalDateTime.of(2025, 7, 1, 8, 45)); // 08:45–09:30 manager.addTask(task1); manager.addTask(task2); - Epic epic1 = new Epic("Epic1", "Desc"); - Epic epic2 = new Epic("Epic2", "Desc"); - manager.addEpic(epic1); - manager.addEpic(epic2); + Epic epic = new Epic("Epic 1", "Epic with subtasks"); + manager.addEpic(epic); - Subtask subtask1 = new Subtask("Sub1", "Desc", Status.NEW, epic1.getId()); - Subtask subtask2 = new Subtask("Sub2", "Desc", Status.NEW, epic1.getId()); + Subtask subtask1 = new Subtask("Subtask 1", "Part 1", + Status.NEW, epic.getId(), Duration.ofMinutes(60), LocalDateTime.of(2025, 7, 1, 10, 0)); // 10:00–11:00 + Subtask subtask2 = new Subtask("Subtask 2", "Part 2", + Status.DONE, epic.getId(), Duration.ofMinutes(90), LocalDateTime.of(2025, 7, 1, 11, 30)); // 11:30–13:00 manager.addSubtask(subtask1); manager.addSubtask(subtask2); - manager.getTaskById(task1.getId()); - manager.getEpicById(epic1.getId()); - manager.getTaskById(task1.getId()); - manager.getSubtaskById(subtask1.getId()); - printHistory(manager); + System.out.println("=== Prioritized Tasks ==="); + for (Task task : manager.getPrioritizedTasks()) { + System.out.println(task + " | start=" + task.getStartTime() + " | end=" + task.getEndTime()); + } - manager.removeTaskById(task1.getId()); - printHistory(manager); + TaskManager loadedManager = FileBackedTaskManager.loadFromFile(file); + System.out.println("\n=== Loaded Tasks ==="); + for (Task task : loadedManager.getAllTasks()) { + System.out.println(task); + } - manager.removeEpicById(epic1.getId()); - printHistory(manager); // [] - } + System.out.println("\n=== Loaded Epics ==="); + for (Epic e : loadedManager.getAllEpics()) { + System.out.println(e); + } - private static void printHistory(TaskManager manager) { - List history = manager.getHistory(); - if (history.isEmpty()) { - System.out.println("History is empty"); - } else { - System.out.println("\nView history (" + history.size() + " items):"); - for (int i = 0; i < history.size(); i++) { - Task task = history.get(i); - System.out.println((i + 1) + ". " + task.getTitle() + " [ID:" + task.getId() + "]"); - } + System.out.println("\n=== Loaded Subtasks ==="); + for (Subtask s : loadedManager.getAllSubtasks()) { + System.out.println(s); } } -} \ No newline at end of file +} diff --git a/src/manager/BaseHttpHandler.java b/src/manager/BaseHttpHandler.java index de0cb7b..1ddc39b 100644 --- a/src/manager/BaseHttpHandler.java +++ b/src/manager/BaseHttpHandler.java @@ -49,6 +49,6 @@ protected void sendError(HttpExchange exchange, int statusCode, String message) try { String json = "{\"error\":\"" + message + "\"}"; sendText(exchange, json, statusCode); - } catch (IOException ignored) {} + } catch (IOException ignored) { } } } diff --git a/src/model/Epic.java b/src/model/Epic.java index bdbde3d..cd578ea 100644 --- a/src/model/Epic.java +++ b/src/model/Epic.java @@ -1,34 +1,46 @@ package model; +import java.time.Duration; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Objects; public class Epic extends Task { private final List subtaskIds = new ArrayList<>(); + private LocalDateTime endTime; public Epic(String title, String description) { - super(title, description, Status.NEW); + super(title, description, Status.NEW, Duration.ZERO, null); } + public List getSubtaskIds() { return subtaskIds; } - public void addSubtask(Subtask subtask) { - subtaskIds.add(subtask.getId()); + public void addSubtaskId(int id) { + subtaskIds.add(id); } - public void removeSubtask(int subtaskId) { - subtaskIds.remove((Integer) subtaskId); + public void removeSubtaskId(int id) { + subtaskIds.remove(Integer.valueOf(id)); + } + + @Override + public LocalDateTime getEndTime() { + return endTime; + } + + public void setEndTime(LocalDateTime endTime) { + this.endTime = endTime; } @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof Epic)) return false; + if (!(o instanceof Epic epic)) return false; if (!super.equals(o)) return false; - Epic epic = (Epic) o; return Objects.equals(subtaskIds, epic.subtaskIds); } @@ -36,6 +48,7 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(super.hashCode(), subtaskIds); } + @Override public String toString() { return "Epic{" + @@ -43,7 +56,10 @@ public String toString() { ", title='" + getTitle() + '\'' + ", description='" + getDescription() + '\'' + ", status=" + getStatus() + + ", startTime=" + getStartTime() + + ", duration=" + getDuration() + + ", endTime=" + getEndTime() + ", subtaskIds=" + subtaskIds + '}'; } -} \ No newline at end of file +} diff --git a/src/model/Subtask.java b/src/model/Subtask.java index 0b4eef5..5ea97ba 100644 --- a/src/model/Subtask.java +++ b/src/model/Subtask.java @@ -1,10 +1,13 @@ package model; +import java.time.Duration; +import java.time.LocalDateTime; + public class Subtask extends Task { - private final int epicId; + private int epicId; - public Subtask(String title, String description, Status status, int epicId) { - super(title, description, status); + public Subtask(String title, String description, Status status, int epicId, Duration duration, LocalDateTime startTime) { + super(title, description, status, duration, startTime); this.epicId = epicId; } @@ -12,14 +15,20 @@ public int getEpicId() { return epicId; } + public void setEpicId(int epicId) { + this.epicId = epicId; + } + @Override public String toString() { return "Subtask{" + - "id=" + getId() + + "epicId=" + epicId + + ", id=" + getId() + ", title='" + getTitle() + '\'' + ", description='" + getDescription() + '\'' + ", status=" + getStatus() + - ", epicId=" + epicId + + ", duration=" + (getDuration() != null ? getDuration().toMinutes() : "null") + + ", startTime=" + getStartTime() + '}'; } } \ No newline at end of file diff --git a/src/model/Task.java b/src/model/Task.java index 79a3730..c89496c 100644 --- a/src/model/Task.java +++ b/src/model/Task.java @@ -1,43 +1,78 @@ package model; - -import java.util.Objects; +import java.time.Duration; +import java.time.LocalDateTime; public class Task { private int id; private String title; private String description; private Status status; + private Duration duration; + private LocalDateTime startTime; - public Task(String title, String description, Status status) { + public Task(String title, String description, Status status, Duration duration, LocalDateTime startTime) { this.title = title; this.description = description; this.status = status; + this.duration = duration; + this.startTime = startTime; } - public int getId() { return id; } - public void setId(int id) { this.id = id; } - public String getTitle() { return title; } - public void setTitle(String title) { this.title = title; } - public String getDescription() { return description; } - public void setDescription(String description) { this.description = description; } - public Status getStatus() { return status; } - public void setStatus(Status status) { this.status = status; } + public int getId() { + return id; + } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof Task)) return false; - Task task = (Task) o; - return id == task.id && - Objects.equals(title, task.title) && - Objects.equals(description, task.description) && - status == task.status; + public void setId(int id) { + this.id = id; } - @Override - public int hashCode() { - return Objects.hash(id, title, description, status); + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + + 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() { + if (startTime != null && duration != null) { + return startTime.plus(duration); + } + return null; } @Override @@ -47,6 +82,8 @@ public String toString() { ", title='" + title + '\'' + ", description='" + description + '\'' + ", status=" + status + + ", duration=" + (duration != null ? duration.toMinutes() : "null") + + ", startTime=" + startTime + '}'; } } \ No newline at end of file diff --git a/test/manager/FileBackedTaskManagerTest.java b/test/manager/FileBackedTaskManagerTest.java new file mode 100644 index 0000000..77dded5 --- /dev/null +++ b/test/manager/FileBackedTaskManagerTest.java @@ -0,0 +1,105 @@ +package test.manager; + +import manager.FileBackedTaskManager; +import manager.TaskManager; +import model.Epic; +import model.Status; +import model.Subtask; +import model.Task; +import org.junit.jupiter.api.*; + +import java.io.File; +import java.time.Duration; +import java.time.LocalDateTime; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +public class FileBackedTaskManagerTest { + + static File file; + TaskManager manager; + + @BeforeAll + static void beforeAll() { + file = new File("test_data.csv"); + } + + @BeforeEach + void setUp() { + manager = new FileBackedTaskManager(file); + manager.clearTasks(); + manager.clearEpics(); + manager.clearSubtasks(); + } + + @AfterEach + void tearDown() { + if (file.exists()) { + file.delete(); + } + } + + @Test + public void testSaveAndLoad() { + Task task = new Task("Task 1", "Description 1", Status.NEW, + Duration.ofMinutes(30), LocalDateTime.of(2025, 7, 1, 9, 0)); + manager.addTask(task); + + Epic epic = new Epic("Epic 1", "Epic description"); + manager.addEpic(epic); + + Subtask subtask1 = new Subtask("Subtask 1", "Part 1", Status.NEW, + epic.getId(), Duration.ofMinutes(60), LocalDateTime.of(2025, 7, 1, 10, 0)); + Subtask subtask2 = new Subtask("Subtask 2", "Part 2", Status.DONE, + epic.getId(), Duration.ofMinutes(90), LocalDateTime.of(2025, 7, 1, 12, 0)); + manager.addSubtask(subtask1); + manager.addSubtask(subtask2); + + manager.getTaskById(task.getId()); + manager.getEpicById(epic.getId()); + manager.getSubtaskById(subtask1.getId()); + + TaskManager loadedManager = FileBackedTaskManager.loadFromFile(file); + + Task loadedTask = loadedManager.getTaskById(task.getId()); + assertNotNull(loadedTask); + assertEquals(task.getTitle(), loadedTask.getTitle()); + assertEquals(task.getDuration(), loadedTask.getDuration()); + assertEquals(task.getStartTime(), loadedTask.getStartTime()); + + Epic loadedEpic = loadedManager.getEpicById(epic.getId()); + assertNotNull(loadedEpic); + assertEquals(epic.getTitle(), loadedEpic.getTitle()); + + List loadedSubtasks = loadedManager.getSubtasksOfEpic(epic.getId()); + assertEquals(2, loadedSubtasks.size()); + + Subtask loadedSubtask1 = loadedManager.getSubtaskById(subtask1.getId()); + assertEquals(subtask1.getDuration(), loadedSubtask1.getDuration()); + assertEquals(subtask1.getStartTime(), loadedSubtask1.getStartTime()); + + List history = loadedManager.getHistory(); + assertEquals(3, history.size()); + assertEquals(task.getId(), history.get(0).getId()); + assertEquals(epic.getId(), history.get(1).getId()); + assertEquals(subtask1.getId(), history.get(2).getId()); + } + + @Test + public void testLoadFromCorruptedFile() { + try { + java.nio.file.Files.writeString(file.toPath(), "Not a valid CSV content\n"); + } catch (Exception e) { + fail("Не удалось записать тестовый файл"); + } + + TaskManager loadedManager = FileBackedTaskManager.loadFromFile(file); + assertNotNull(loadedManager); + assertTrue(loadedManager.getAllTasks().isEmpty()); + assertTrue(loadedManager.getAllEpics().isEmpty()); + assertTrue(loadedManager.getAllSubtasks().isEmpty()); + assertTrue(loadedManager.getHistory().isEmpty()); + } + +} \ No newline at end of file diff --git a/test/manager/HttpTaskServerTasksTest.java b/test/manager/HttpTaskServerTasksTest.java new file mode 100644 index 0000000..77fb712 --- /dev/null +++ b/test/manager/HttpTaskServerTasksTest.java @@ -0,0 +1,57 @@ +package test.manager; + +import com.google.gson.Gson; +import model.Status; +import model.Task; +import org.junit.jupiter.api.*; +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.time.Duration; +import java.time.LocalDateTime; +import java.util.List; +import manager.TaskManager; +import manager.*; + +import static org.junit.jupiter.api.Assertions.*; + +public class HttpTaskServerTasksTest { + + private TaskManager manager; + private HttpTaskServer server; + private final HttpClient client = HttpClient.newHttpClient(); + private final Gson gson = HttpTaskServer.getGson(); + + @BeforeEach + public void setUp() throws IOException { + manager = new InMemoryTaskManager(); + server = new HttpTaskServer(manager); + server.start(); + } + + @AfterEach + public void tearDown() { + server.stop(); + } + + @Test + public void testAddTask() throws IOException, InterruptedException { + Task task = new Task("Test", "Check HTTP", Status.NEW, + Duration.ofMinutes(30), LocalDateTime.now()); + + String json = gson.toJson(task); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create("http://localhost:8080/tasks")) + .POST(HttpRequest.BodyPublishers.ofString(json)) + .build(); + + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + assertEquals(201, response.statusCode(), "Должен вернуться код 201"); + List tasks = manager.getAllTasks(); + assertEquals(1, tasks.size()); + assertEquals("Test", tasks.get(0).getTitle()); + } +} diff --git a/test/manager/InMemoryHistoryManagerTest.java b/test/manager/InMemoryHistoryManagerTest.java index 92122b9..81f606f 100644 --- a/test/manager/InMemoryHistoryManagerTest.java +++ b/test/manager/InMemoryHistoryManagerTest.java @@ -1,18 +1,24 @@ package test.manager; -import manager.HistoryManager; + import manager.InMemoryHistoryManager; import model.Task; import model.Status; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; + +import java.time.Duration; +import java.time.LocalDateTime; + import java.util.List; import static org.junit.jupiter.api.Assertions.*; class InMemoryHistoryManagerTest { - private HistoryManager historyManager; + + private InMemoryHistoryManager historyManager; + @BeforeEach void setUp() { @@ -20,47 +26,41 @@ void setUp() { } @Test - void addAndGetHistory() { - Task task1 = new Task("Task1", "Desc", Status.NEW); - task1.setId(1); - Task task2 = new Task("Task2", "Desc", Status.IN_PROGRESS); - task2.setId(2); - - historyManager.add(task1); - historyManager.add(task2); + void shouldAddAndReturnHistory() { + Task task = new Task("Test task", "Description", Status.NEW, Duration.ofMinutes(30), LocalDateTime.now()); + task.setId(1); + historyManager.add(task); List history = historyManager.getHistory(); - assertEquals(2, history.size()); - assertEquals(task1, history.get(0)); - assertEquals(task2, history.get(1)); + + assertEquals(1, history.size()); + assertEquals(task, history.get(0)); } @Test - void shouldRemoveDuplicates() { - Task task = new Task("Task", "Desc", Status.NEW); + void shouldNotAddDuplicates() { + Task task = new Task("Task", "Desc", Status.NEW, Duration.ofMinutes(20), LocalDateTime.now()); task.setId(1); - historyManager.add(task); historyManager.add(task); - List history = historyManager.getHistory(); - assertEquals(1, history.size()); + assertEquals(1, historyManager.getHistory().size()); } @Test - void shouldRemoveNodeFromMiddle() { - Task task1 = new Task("Task1", "Desc", Status.NEW); - Task task2 = new Task("Task2", "Desc", Status.NEW); - Task task3 = new Task("Task3", "Desc", Status.NEW); - task1.setId(1); task2.setId(2); task3.setId(3); + void shouldRemoveFromHistory() { + Task task1 = new Task("Task 1", "Desc 1", Status.NEW, Duration.ofMinutes(10), LocalDateTime.now()); + task1.setId(1); + Task task2 = new Task("Task 2", "Desc 2", Status.NEW, Duration.ofMinutes(10), LocalDateTime.now()); + task2.setId(2); historyManager.add(task1); historyManager.add(task2); - historyManager.add(task3); - historyManager.add(task2); // Дубликат + historyManager.remove(1); List history = historyManager.getHistory(); - assertEquals(3, history.size()); - assertEquals(List.of(task1, task3, task2), history); + assertEquals(1, history.size()); + assertEquals(task2, history.get(0)); } -} \ No newline at end of file +} + diff --git a/test/manager/InMemoryTaskManagerTest.java b/test/manager/InMemoryTaskManagerTest.java index 196ce8a..4e9a49a 100644 --- a/test/manager/InMemoryTaskManagerTest.java +++ b/test/manager/InMemoryTaskManagerTest.java @@ -8,6 +8,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.time.Duration; + import java.util.List; import static org.junit.jupiter.api.Assertions.*; @@ -23,7 +25,8 @@ public void setUp() { @Test public void testAddAndGetTask() { - Task task = new Task("Task 1", "Description task 1", Status.NEW); + Task task = new Task("Task 1", "Description task 1", Status.NEW, Duration.ZERO, null); + manager.addTask(task); List tasks = manager.getAllTasks(); @@ -46,7 +49,8 @@ public void testAddAndGetSubtask() { Epic epic = new Epic("Epic 1", "Description epic 1"); manager.addEpic(epic); - Subtask subtask = new Subtask("Subtask 1", "Description subtask 1", Status.NEW, epic.getId()); + Subtask subtask = new Subtask("Subtask 1", "Description subtask 1", Status.NEW, epic.getId(), Duration.ZERO, null); + manager.addSubtask(subtask); List subtasks = manager.getAllSubtasks(); @@ -59,7 +63,8 @@ public void testAddAndGetSubtask() { @Test public void testRemoveTask() { - Task task = new Task("Task 1", "Description task 1", Status.NEW); + Task task = new Task("Task 1", "Description task 1", Status.NEW, Duration.ZERO, null); + manager.addTask(task); manager.removeTaskById(task.getId()); @@ -71,7 +76,8 @@ public void testRemoveEpicAlsoRemovesSubtasks() { Epic epic = new Epic("Epic 1", "Description epic 1"); manager.addEpic(epic); - Subtask subtask = new Subtask("Subtask 1", "Description subtask 1", Status.NEW, epic.getId()); + Subtask subtask = new Subtask("Subtask 1", "Description subtask 1", Status.NEW, epic.getId(), Duration.ZERO, null); + manager.addSubtask(subtask); manager.removeEpicById(epic.getId()); @@ -83,7 +89,8 @@ public void testRemoveEpicAlsoRemovesSubtasks() { @Test public void testUpdateTask() { - Task task = new Task("Task 1", "Description task 1", Status.NEW); + Task task = new Task("Task 1", "Description task 1", Status.NEW, Duration.ZERO, null); + manager.addTask(task); task.setStatus(Status.DONE); diff --git a/test/model/EpicTest.java b/test/model/EpicTest.java index 0455b5a..d183a63 100644 --- a/test/model/EpicTest.java +++ b/test/model/EpicTest.java @@ -6,50 +6,43 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.time.Duration; +import java.time.LocalDateTime; + import static org.junit.jupiter.api.Assertions.*; -class EpicTest { +public class EpicTest { + private Epic epic; - private Subtask subtask1; - private Subtask subtask2; + private Subtask s1; + private Subtask s2; @BeforeEach - void setUp() { + public void setUp() { epic = new Epic("Epic Title", "Epic Description"); - - subtask1 = new Subtask("Subtask 1", "Description 1", Status.NEW, epic.getId()); - subtask2 = new Subtask("Subtask 2", "Description 2", Status.NEW, epic.getId()); - - subtask1.setId(1); - subtask2.setId(2); } @Test - void epicIsCreatedWithEmptySubtaskList() { - assertNotNull(epic.getSubtaskIds()); - assertTrue(epic.getSubtaskIds().isEmpty()); - } + public void shouldReturnNewStatusIfAllSubtasksNew() { + Subtask s1 = new Subtask("Sub1", "Desc1", Status.NEW, epic.getId(), + Duration.ofMinutes(30), LocalDateTime.of(2025, 7, 1, 10, 0)); + Subtask s2 = new Subtask("Sub2", "Desc2", Status.NEW, epic.getId(), + Duration.ofMinutes(60), LocalDateTime.of(2025, 7, 1, 12, 0)); - @Test - void addSubtask_addsIdToList() { - epic.addSubtask(subtask1); - epic.addSubtask(subtask2); + epic.addSubtaskId(s1.getEpicId()); + epic.addSubtaskId(s2.getEpicId()); - assertEquals(2, epic.getSubtaskIds().size()); - assertTrue(epic.getSubtaskIds().contains(subtask1.getId())); - assertTrue(epic.getSubtaskIds().contains(subtask2.getId())); + assertEquals(Status.NEW, epic.getStatus()); } - @Test - void removeSubtask_removesCorrectId() { - epic.addSubtask(subtask1); - epic.addSubtask(subtask2); - epic.removeSubtask(subtask1.getId()); - assertEquals(1, epic.getSubtaskIds().size()); - assertFalse(epic.getSubtaskIds().contains(subtask1.getId())); - assertTrue(epic.getSubtaskIds().contains(subtask2.getId())); + + @Test + void epicIsCreatedWithEmptySubtaskList() { + assertNotNull(epic.getSubtaskIds()); + assertTrue(epic.getSubtaskIds().isEmpty()); } + } \ No newline at end of file diff --git a/test/model/SubtaskTest.java b/test/model/SubtaskTest.java new file mode 100644 index 0000000..e4fb140 --- /dev/null +++ b/test/model/SubtaskTest.java @@ -0,0 +1,47 @@ +package test.model; + +import model.Status; +import model.Subtask; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.time.Duration; +import java.time.LocalDateTime; + +import static org.junit.jupiter.api.Assertions.*; + +class SubtaskTest { + + private Subtask subtask; + + @BeforeEach + void setUp() { + subtask = new Subtask("Subtask 1", "Subtask Description", Status.IN_PROGRESS, 10, Duration.ZERO, null); + subtask.setId(2); + subtask.setDuration(Duration.ofMinutes(45)); + subtask.setStartTime(LocalDateTime.of(2025, 7, 10, 11, 0)); + } + + @Test + void testGettersAndSetters() { + assertEquals(2, subtask.getId()); + assertEquals("Subtask 1", subtask.getTitle()); + assertEquals("Subtask Description", subtask.getDescription()); + assertEquals(Status.IN_PROGRESS, subtask.getStatus()); + assertEquals(10, subtask.getEpicId()); + assertEquals(Duration.ofMinutes(45), subtask.getDuration()); + assertEquals(LocalDateTime.of(2025, 7, 10, 11, 0), subtask.getStartTime()); + } + + @Test + void testGetEndTimeCalculation() { + LocalDateTime expectedEnd = subtask.getStartTime().plus(subtask.getDuration()); + assertEquals(expectedEnd, subtask.getEndTime()); + } + + @Test + void testToStringContainsEpicId() { + String toString = subtask.toString(); + assertTrue(toString.contains("epicId=10")); + } +} \ No newline at end of file diff --git a/test/model/TaskTest.java b/test/model/TaskTest.java index d6302bd..7b5d6e2 100644 --- a/test/model/TaskTest.java +++ b/test/model/TaskTest.java @@ -5,91 +5,71 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.time.Duration; +import java.time.LocalDateTime; + import static org.junit.jupiter.api.Assertions.*; -class TaskTest { +public class TaskTest { + private Task task; @BeforeEach - void setUp() { - task = new Task("Test Task", "Test Description", Status.NEW); - task.setId(1); + public void setUp() { + task = new Task( + "Test Task", + "Description of test task", + Status.NEW, + Duration.ofMinutes(120), + LocalDateTime.of(2025, 7, 10, 9, 0) + ); } @Test - void testConstructorAndGetters() { - assertEquals(1, task.getId()); + public void shouldCreateTaskWithCorrectFields() { assertEquals("Test Task", task.getTitle()); - assertEquals("Test Description", task.getDescription()); + assertEquals("Description of test task", task.getDescription()); assertEquals(Status.NEW, task.getStatus()); + assertEquals(Duration.ofMinutes(120), task.getDuration()); + assertEquals(LocalDateTime.of(2025, 7, 10, 9, 0), task.getStartTime()); } @Test - void testSetters() { - task.setId(42); - task.setTitle("Updated Title"); - task.setDescription("Updated Description"); - task.setStatus(Status.IN_PROGRESS); - - assertEquals(42, task.getId()); - assertEquals("Updated Title", task.getTitle()); - assertEquals("Updated Description", task.getDescription()); - assertEquals(Status.IN_PROGRESS, task.getStatus()); - } - - @Test - void testEquals_sameValues_shouldBeEqual() { - Task other = new Task("Test Task", "Test Description", Status.NEW); - other.setId(1); - - assertEquals(task, other); - } - - @Test - void testEquals_differentId_shouldNotBeEqual() { - Task other = new Task("Test Task", "Test Description", Status.NEW); - other.setId(99); - - assertNotEquals(task, other); + public void shouldCalculateEndTimeCorrectly() { + LocalDateTime expectedEndTime = LocalDateTime.of(2025, 7, 10, 11, 0); + assertEquals(expectedEndTime, task.getEndTime()); } @Test - void testEquals_differentTitle_shouldNotBeEqual() { - Task other = new Task("Different Title", "Test Description", Status.NEW); - other.setId(1); - - assertNotEquals(task, other); + public void shouldUpdateStatus() { + task.setStatus(Status.IN_PROGRESS); + assertEquals(Status.IN_PROGRESS, task.getStatus()); } @Test - void testEquals_differentDescription_shouldNotBeEqual() { - Task other = new Task("Test Task", "Other Description", Status.NEW); - other.setId(1); + public void shouldUpdateStartTimeAndDuration() { + task.setStartTime(LocalDateTime.of(2025, 7, 10, 10, 0)); + task.setDuration(Duration.ofMinutes(30)); - assertNotEquals(task, other); + assertEquals(LocalDateTime.of(2025, 7, 10, 10, 0), task.getStartTime()); + assertEquals(Duration.ofMinutes(30), task.getDuration()); + assertEquals(LocalDateTime.of(2025, 7, 10, 10, 30), task.getEndTime()); } @Test - void testEquals_differentStatus_shouldNotBeEqual() { - Task other = new Task("Test Task", "Test Description", Status.DONE); - other.setId(1); + public void toStringShouldContainAllFields() { + String str = task.toString(); - assertNotEquals(task, other); - } + assertNotNull(str); + assertFalse(str.isEmpty()); - @Test - void testHashCode_sameValues_shouldBeEqual() { - Task other = new Task("Test Task", "Test Description", Status.NEW); - other.setId(1); + assertTrue(str.contains(task.getTitle())); + assertTrue(str.contains(task.getDescription())); + assertTrue(str.contains(task.getStatus().toString())); - assertEquals(task.hashCode(), other.hashCode()); - } + assertTrue(str.contains(String.valueOf(task.getDuration().toMinutes()))); - @Test - void testHashCode_differentValues_shouldNotBeEqual() { - Task other = new Task("Other", "Other", Status.DONE); - other.setId(999); + assertTrue(str.contains(task.getStartTime().toString())); - assertNotEquals(task.hashCode(), other.hashCode()); } } \ No newline at end of file