fix: fixed errors and tests

This commit is contained in:
Гаджикурбанов Темирлан
2026-09-01 17:11:08 +03:00
parent 34d08eb397
commit 712fe6c112
2 changed files with 34 additions and 32 deletions
@@ -14,7 +14,7 @@ import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord; import org.apache.commons.csv.CSVRecord;
import ru.project.student.Student; import ru.project.student.Student;
import ru.project.student.StudentBuilder; import ru.project.student.StudentBuilder;
public class StudentCsvReader implements Iterator<Student> { public class StudentCsvReader implements Iterator<Student>, AutoCloseable {
private static final String GROUP_NUMBER = "groupNumber"; private static final String GROUP_NUMBER = "groupNumber";
private static final String AVERAGE_GRADE = "averageGrade"; private static final String AVERAGE_GRADE = "averageGrade";
private static final String RECORD_BOOK_NUMBER = "recordBookNumber"; private static final String RECORD_BOOK_NUMBER = "recordBookNumber";
@@ -29,7 +29,7 @@ import ru.project.student.StudentBuilder;
CSVFormat format = CSVFormat.DEFAULT.builder() CSVFormat format = CSVFormat.DEFAULT.builder()
.setHeader() .setHeader()
.setSkipHeaderRecord(true) .setSkipHeaderRecord(true)
.build(); .get();
this.parser = CSVParser.parse(path, StandardCharsets.UTF_8, format); this.parser = CSVParser.parse(path, StandardCharsets.UTF_8, format);
validateHeader(parser.getHeaderMap()); validateHeader(parser.getHeaderMap());
this.records = parser.iterator(); this.records = parser.iterator();
@@ -1,22 +1,17 @@
package ru.project.io; package ru.project.io;
import static org.junit.jupiter.api.Assertions.assertEquals; import java.io.IOException;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
import org.junit.jupiter.api.BeforeAll; import java.util.Spliterators;
import org.junit.jupiter.api.BeforeEach; import java.util.stream.StreamSupport;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.io.TempDir;
import ru.project.student.Student; import ru.project.student.Student;
import ru.project.collection.MyLinkedList;
import ru.project.collection.MyList; import ru.project.collection.MyList;
import ru.project.collectors.MyCollectors; import ru.project.collectors.MyCollectors;
import ru.project.collectors.MyListCollector; import static org.junit.jupiter.api.Assertions.*;
class StudentCsvReaderTest { class StudentCsvReaderTest {
@TempDir @TempDir
Path tempDir; Path tempDir;
@@ -25,8 +20,8 @@ class StudentCsvReaderTest {
Path csv = tempDir.resolve("students.csv"); Path csv = tempDir.resolve("students.csv");
String content = String.join("\n", String content = String.join("\n",
"groupNumber,averageGrade,recordBookNumber", "groupNumber,averageGrade,recordBookNumber",
"M10,4.5,12345", // валидно: 1 буква + 2 цифры "M10,4.5,12345",
"B05,3.8,12346" // валидно "B05,3.8,12346"
); );
Files.writeString(csv, content, StandardCharsets.UTF_8); Files.writeString(csv, content, StandardCharsets.UTF_8);
try (var reader = new StudentCsvReader(csv.toAbsolutePath())) { try (var reader = new StudentCsvReader(csv.toAbsolutePath())) {
@@ -67,14 +62,15 @@ class StudentCsvReaderTest {
M101,4.5 M101,4.5
"""; """;
Files.writeString(csv, content, StandardCharsets.UTF_8); Files.writeString(csv, content, StandardCharsets.UTF_8);
var reader = new StudentCsvReader(csv.toAbsolutePath()); try (var reader = new StudentCsvReader(csv.toAbsolutePath())) {
assertTrue(reader.hasNext()); assertTrue(reader.hasNext());
// следующая строка имеет только 2 колонки
IllegalArgumentException ex = assertThrows( IllegalArgumentException ex = assertThrows(
IllegalArgumentException.class, IllegalArgumentException.class,
reader::next reader::next
); );
assertTrue(ex.getMessage().contains("Expected 3 columns")); assertTrue(ex.getMessage().contains("Expected 3 columns"));
}
} }
@Test @Test
void shouldTestparseErrorThrowsExceptionWithDetails() throws IOException { void shouldTestparseErrorThrowsExceptionWithDetails() throws IOException {
@@ -84,14 +80,15 @@ class StudentCsvReaderTest {
M101,not-a-number,12345 M101,not-a-number,12345
"""; """;
Files.writeString(csv, content, StandardCharsets.UTF_8); Files.writeString(csv, content, StandardCharsets.UTF_8);
try (var reader = new StudentCsvReader(csv.toAbsolutePath())) {
assertTrue(reader.hasNext());
var reader = new StudentCsvReader(csv.toAbsolutePath()); IllegalArgumentException ex = assertThrows(
assertTrue(reader.hasNext()); IllegalArgumentException.class,
IllegalArgumentException ex = assertThrows( reader::next
IllegalArgumentException.class, );
reader::next assertTrue(ex.getMessage().contains("cannot parse averageGrade"));
); }
assertTrue(ex.getMessage().contains("cannot parse averageGrade"));
} }
@Test @Test
void shouldTestemptyDataAfterHeaderThrowsNoSuchElement() throws IOException { void shouldTestemptyDataAfterHeaderThrowsNoSuchElement() throws IOException {
@@ -100,17 +97,22 @@ class StudentCsvReaderTest {
groupNumber,averageGrade,recordBookNumber groupNumber,averageGrade,recordBookNumber
"""; """;
Files.writeString(csv, content, StandardCharsets.UTF_8); Files.writeString(csv, content, StandardCharsets.UTF_8);
var reader = new StudentCsvReader(csv.toAbsolutePath());
assertFalse(reader.hasNext()); // ИСПРАВЛЕНО: добавлен try-with-resources
assertThrows(NoSuchElementException.class, reader::next); try (var reader = new StudentCsvReader(csv.toAbsolutePath())) {
assertFalse(reader.hasNext());
assertThrows(NoSuchElementException.class, reader::next);
}
} }
@Test @Test
void shouldTestrelativePathThrowsException() { void shouldTestrelativePathThrowsException() {
Path relative = Path.of("relative-path.csv"); Path relative = Path.of("relative-path.csv");
IllegalArgumentException ex = assertThrows( IllegalArgumentException ex = assertThrows(
IllegalArgumentException.class, IllegalArgumentException.class,
() -> new StudentCsvReader(relative) () -> new StudentCsvReader(relative)
); );
assertTrue(ex.getMessage().contains("absolute")); assertTrue(ex.getMessage().contains("absolute"));
} }
} }