diff --git a/app/src/test/java/ru/project/AppTest.java b/app/src/test/java/ru/project/AppTest.java deleted file mode 100644 index 44a05ef..0000000 --- a/app/src/test/java/ru/project/AppTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package ru.project; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -import org.junit.jupiter.api.Test; - -/** Unit test for simple App. */ -public class AppTest { - - /** Rigorous Test :-) */ - @Test - public void shouldAnswerWithTrue() { - assertTrue(true); - } -} diff --git a/app/src/test/java/ru/project/MyListCollectorTest.java b/app/src/test/java/ru/project/MyListCollectorTest.java deleted file mode 100644 index 6155d57..0000000 --- a/app/src/test/java/ru/project/MyListCollectorTest.java +++ /dev/null @@ -1,63 +0,0 @@ -package ru.test.maven.spring; -import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; -import java.util.Set; -import java.util.stream.Collector; -import java.util.stream.IntStream; -import java.util.Collections; -public class MyListCollectorTest -{ - private final MyListCollector collector = new MyListCollector<>(); - - @Test - void shouldTestCollectInOrderSequential() { - MyList result = IntStream.range(0, 10) - .boxed() - .collect(MyCollectors.toMyList()); - - assertEquals(10, result.size()); - for (int i = 0; i < result.size(); i++) { - assertEquals(i, (int) result.get(i)); - } - - } - - @Test - void shouldTestCollectInOrderParallel() { - MyList result = IntStream.range(0, 100) - .parallel() - .boxed() - .collect(MyCollectors.toMyList()); - - assertEquals(100, result.size()); - for (int i = 0; i < result.size(); i++) { - assertEquals(i, (int) result.get(i)); - } - } - - @Test - void shouldTestHandleEmptyStream() { - MyList result = IntStream.empty() - .boxed() - .collect(MyCollectors.toMyList()); - - assertTrue(result.isEmpty()); - - } - @Test - void shouldTestNotUseStandardList() { - MyList result = IntStream.range(0, 5) - .mapToObj(i -> "item" + i) - .collect(MyCollectors.toMyList()); - - assertInstanceOf(MyList.class, result); - assertFalse(result instanceof java.util.List); - } - @Test - void shouldTestHaveCorrectCharacteristics() { - Set characteristics = collector.characteristics(); - assertTrue(characteristics.contains(java.util.stream.Collector.Characteristics.IDENTITY_FINISH)); - assertFalse(characteristics.contains(java.util.stream.Collector.Characteristics.UNORDERED)); - } - -} diff --git a/app/src/test/java/ru/project/collection/MyLinkedListTest.java b/app/src/test/java/ru/project/collection/MyLinkedListTest.java index 6c43673..8137964 100644 --- a/app/src/test/java/ru/project/collection/MyLinkedListTest.java +++ b/app/src/test/java/ru/project/collection/MyLinkedListTest.java @@ -1,130 +1,138 @@ -package ru.test.maven.spring; -import org.junit.jupiter.api.Test; +package ru.project.collection; + import static org.junit.jupiter.api.Assertions.*; -public class MyLinkedListTest -{ - @Test - public void shouldTestAdd() { - MyLinkedList list = new MyLinkedList<>(); - list.add(10); - list.add(20); - list.add(30); - assertEquals(10, list.get(0)); - assertEquals(20, list.get(1)); - assertEquals(30, list.get(2)); - } - @Test - public void shouldTestGet() - { - MyLinkedList list = new MyLinkedList<>(); - list.add(10); - assertEquals(10, list.get(0)); - } - @Test - public void shouldTestRemove() { - MyLinkedList list = new MyLinkedList<>(); - list.add(10); - list.add(20); - list.add(30); - list.remove(0); +import org.junit.jupiter.api.Test; - assertEquals(2, list.size()); - assertEquals(20, list.get(0)); - assertEquals(30, list.get(1)); - } - @Test - void shouldTestSet() { - MyLinkedList list = new MyLinkedList<>(); - list.add("A"); - list.add("B"); - list.add("C"); +public class MyLinkedListTest { + @Test + public void shouldTestAdd() { + MyLinkedList list = new MyLinkedList<>(); + list.add(10); + list.add(20); + list.add(30); - String oldValue = list.set(1, "Z"); + assertEquals(10, list.get(0)); + assertEquals(20, list.get(1)); + assertEquals(30, list.get(2)); + } - assertEquals("B", oldValue); - assertEquals("Z", list.get(1)); - assertEquals(3, list.size()); + @Test + public void shouldTestGet() { + MyLinkedList list = new MyLinkedList<>(); + list.add(10); + assertEquals(10, list.get(0)); + } - } - @Test - void shouldTestSize() - { - MyLinkedList list = new MyLinkedList<>(); - list.add(1); - list.add(2); - list.add(3); - assertEquals(3, list.size()); - } - @Test - void shouldTestisEmpty() - { - MyLinkedList list = new MyLinkedList<>(); - assertTrue(list.isEmpty()); - } - @Test - void shouldTestGet_OutOfBounds_ThrowsException() { - MyLinkedList list = new MyLinkedList<>(); - list.add(1); + @Test + public void shouldTestRemove() { + MyLinkedList list = new MyLinkedList<>(); + list.add(10); + list.add(20); + list.add(30); + list.remove(0); - assertThrows(IllegalArgumentException.class, () -> list.get(-1)); - assertThrows(IllegalArgumentException.class, () -> list.get(1)); // index == size - assertThrows(IllegalArgumentException.class, () -> list.get(5)); // index > size - } - @Test - void shouldTestSet_OutOfBounds_ThrowsException() { - MyLinkedList list = new MyLinkedList<>(); - list.add(1); + assertEquals(2, list.size()); + assertEquals(20, list.get(0)); + assertEquals(30, list.get(1)); + } - assertThrows(IllegalArgumentException.class, () -> list.set(-1, 99)); - assertThrows(IllegalArgumentException.class, () -> list.set(1, 99)); - } - @Test - void shouldTestRemove_IndexGreaterThanSize_ThrowsException() { - MyLinkedList list = new MyLinkedList<>(); - list.add("man"); - assertThrows(IndexOutOfBoundsException.class, () -> list.remove(5)); - } - @Test - void shouldTestRemove_NegativeIndex_ThrowsException() { - MyLinkedList list = new MyLinkedList<>(); - list.add("1"); - list.add("2"); + @Test + void shouldTestSet() { + MyLinkedList list = new MyLinkedList<>(); + list.add("A"); + list.add("B"); + list.add("C"); - assertThrows(IndexOutOfBoundsException.class, () -> list.remove(-1)); - } - @Test - void shouldTestaddAll_nonEmptySource_toEmptyList_addsAllElementsInOrder() { - MyList list = new MyLinkedList<>(); - MyList source = new MyLinkedList<>(); - source.add("A"); - source.add("B"); - source.add("C"); + String oldValue = list.set(1, "Z"); - list.addAll(source); + assertEquals("B", oldValue); + assertEquals("Z", list.get(1)); + assertEquals(3, list.size()); + } - assertEquals(3, list.size()); - assertEquals("A", list.get(0)); - assertEquals("B", list.get(1)); - assertEquals("C", list.get(2)); - } + @Test + void shouldTestSize() { + MyLinkedList list = new MyLinkedList<>(); + list.add(1); + list.add(2); + list.add(3); + assertEquals(3, list.size()); + } - @Test - void shouldTestaddAll_toNonEmptyList_appendsAtEnd() { - MyList list = new MyLinkedList<>(); - list.add("X"); - list.add("Y"); + @Test + void shouldTestisEmpty() { + MyLinkedList list = new MyLinkedList<>(); + assertTrue(list.isEmpty()); + } - MyList source = new MyLinkedList<>(); - source.add("A"); - source.add("B"); + @Test + void shouldTestGet_OutOfBounds_ThrowsException() { + MyLinkedList list = new MyLinkedList<>(); + list.add(1); - list.addAll(source); + assertThrows(IllegalArgumentException.class, () -> list.get(-1)); + assertThrows(IllegalArgumentException.class, () -> list.get(1)); // index == size + assertThrows(IllegalArgumentException.class, () -> list.get(5)); // index > size + } - assertEquals(4, list.size()); - assertEquals("X", list.get(0)); - assertEquals("Y", list.get(1)); - assertEquals("A", list.get(2)); - assertEquals("B", list.get(3)); - } + @Test + void shouldTestSet_OutOfBounds_ThrowsException() { + MyLinkedList list = new MyLinkedList<>(); + list.add(1); + + assertThrows(IllegalArgumentException.class, () -> list.set(-1, 99)); + assertThrows(IllegalArgumentException.class, () -> list.set(1, 99)); + } + + @Test + void shouldTestRemove_IndexGreaterThanSize_ThrowsException() { + MyLinkedList list = new MyLinkedList<>(); + list.add("man"); + assertThrows(IndexOutOfBoundsException.class, () -> list.remove(5)); + } + + @Test + void shouldTestRemove_NegativeIndex_ThrowsException() { + MyLinkedList list = new MyLinkedList<>(); + list.add("1"); + list.add("2"); + + assertThrows(IndexOutOfBoundsException.class, () -> list.remove(-1)); + } + + @Test + void shouldTestaddAll_nonEmptySource_toEmptyList_addsAllElementsInOrder() { + MyList list = new MyLinkedList<>(); + MyList source = new MyLinkedList<>(); + source.add("A"); + source.add("B"); + source.add("C"); + + list.addAll(source); + + assertEquals(3, list.size()); + assertEquals("A", list.get(0)); + assertEquals("B", list.get(1)); + assertEquals("C", list.get(2)); + } + + @Test + void shouldTestaddAll_toNonEmptyList_appendsAtEnd() { + MyList list = new MyLinkedList<>(); + list.add("X"); + list.add("Y"); + + MyList source = new MyLinkedList<>(); + source.add("A"); + source.add("B"); + + list.addAll(source); + + assertEquals(4, list.size()); + assertEquals("X", list.get(0)); + assertEquals("Y", list.get(1)); + assertEquals("A", list.get(2)); + assertEquals("B", list.get(3)); + } } diff --git a/app/src/test/java/ru/project/collectors/MyListCollectorTest.java b/app/src/test/java/ru/project/collectors/MyListCollectorTest.java index 3ca8d21..35abcbc 100644 --- a/app/src/test/java/ru/project/collectors/MyListCollectorTest.java +++ b/app/src/test/java/ru/project/collectors/MyListCollectorTest.java @@ -1,64 +1,58 @@ -package ru.test.maven.spring; -import org.junit.jupiter.api.Test; +package ru.project.collectors; + import static org.junit.jupiter.api.Assertions.*; + import java.util.Set; import java.util.stream.Collector; import java.util.stream.IntStream; -import java.util.Collections; +import org.junit.jupiter.api.Test; +import ru.project.collection.MyList; -public class MyListCollectorTest -{ - private final MyListCollector collector = new MyListCollector<>(); +public class MyListCollectorTest { + private final MyListCollector collector = new MyListCollector<>(); - @Test - void shouldTestCollectInOrderSequential() { - MyList result = IntStream.range(0, 10) - .boxed() - .collect(MyCollectors.toMyList()); - - assertEquals(10, result.size()); - for (int i = 0; i < result.size(); i++) { - assertEquals(i, (int) result.get(i)); - } + @Test + void shouldTestCollectInOrderSequential() { + MyList result = IntStream.range(0, 10).boxed().collect(MyCollectors.toMyList()); + assertEquals(10, result.size()); + for (int i = 0; i < result.size(); i++) { + assertEquals(i, (int) result.get(i)); } + } - @Test - void shouldTestCollectInOrderParallel() { - MyList result = IntStream.range(0, 100) - .parallel() - .boxed() - .collect(MyCollectors.toMyList()); + @Test + void shouldTestCollectInOrderParallel() { + MyList result = + IntStream.range(0, 100).parallel().boxed().collect(MyCollectors.toMyList()); - assertEquals(100, result.size()); - for (int i = 0; i < result.size(); i++) { - assertEquals(i, (int) result.get(i)); - } + assertEquals(100, result.size()); + for (int i = 0; i < result.size(); i++) { + assertEquals(i, (int) result.get(i)); } + } - @Test - void shouldTestHandleEmptyStream() { - MyList result = IntStream.empty() - .boxed() - .collect(MyCollectors.toMyList()); + @Test + void shouldTestHandleEmptyStream() { + MyList result = IntStream.empty().boxed().collect(MyCollectors.toMyList()); - assertTrue(result.isEmpty()); + assertTrue(result.isEmpty()); + } - } - @Test - void shouldTestNotUseStandardList() { - MyList result = IntStream.range(0, 5) - .mapToObj(i -> "item" + i) - .collect(MyCollectors.toMyList()); + @Test + void shouldTestNotUseStandardList() { + MyList result = + IntStream.range(0, 5).mapToObj(i -> "item" + i).collect(MyCollectors.toMyList()); - assertInstanceOf(MyList.class, result); - assertFalse(result instanceof java.util.List); - } - @Test - void shouldTestHaveCorrectCharacteristics() { - Set characteristics = collector.characteristics(); - assertTrue(characteristics.contains(java.util.stream.Collector.Characteristics.IDENTITY_FINISH)); - assertFalse(characteristics.contains(java.util.stream.Collector.Characteristics.UNORDERED)); - } + assertInstanceOf(MyList.class, result); + assertFalse(result instanceof java.util.List); + } + @Test + void shouldTestHaveCorrectCharacteristics() { + Set characteristics = collector.characteristics(); + assertTrue( + characteristics.contains(java.util.stream.Collector.Characteristics.IDENTITY_FINISH)); + assertFalse(characteristics.contains(java.util.stream.Collector.Characteristics.UNORDERED)); + } } diff --git a/app/src/test/java/ru/project/finder/StudentOccurrenceIndexFinderTest.java b/app/src/test/java/ru/project/finder/StudentOccurrenceIndexFinderTest.java index b61ed58..b928992 100644 --- a/app/src/test/java/ru/project/finder/StudentOccurrenceIndexFinderTest.java +++ b/app/src/test/java/ru/project/finder/StudentOccurrenceIndexFinderTest.java @@ -3,6 +3,10 @@ package ru.project.finder; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import ru.project.collection.MyLinkedList; +import ru.project.collection.MyList; +import ru.project.student.Student; + import static org.junit.jupiter.api.Assertions.*; public class StudentOccurrenceIndexFinderTest diff --git a/app/src/test/java/ru/project/search/StudentSearchTest.java b/app/src/test/java/ru/project/search/StudentSearchTest.java index d12bd9c..db43fa1 100644 --- a/app/src/test/java/ru/project/search/StudentSearchTest.java +++ b/app/src/test/java/ru/project/search/StudentSearchTest.java @@ -1,314 +1,317 @@ package ru.project.search; -import org.junit.jupiter.api.Test; -import ru.project.list.MyList; -import ru.project.list.MyLinkedList; -import ru.project.student.Student; - import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; +import ru.project.collection.MyLinkedList; +import ru.project.collection.MyList; +import ru.project.student.Student; + class StudentSearchTest { - @Test - void testGroupNumberRangeMatchesInside() { - StudentSearchCriteria criteria = new GroupNumberRangeCriteria("A10", "C30"); - Student student = new Student("B20", 4.5, 123); - assertTrue(criteria.matches(student)); + @Test + void testGroupNumberRangeMatchesInside() { + StudentSearchCriteria criteria = new GroupNumberRangeCriteria("A10", "C30"); + Student student = new Student("B20", 4.5, 123); + assertTrue(criteria.matches(student)); + } + + @Test + void testGroupNumberRangeMatchesLowerBoundary() { + StudentSearchCriteria criteria = new GroupNumberRangeCriteria("A10", "C30"); + Student student = new Student("A10", 4.5, 123); + assertTrue(criteria.matches(student)); + } + + @Test + void testGroupNumberRangeMatchesUpperBoundary() { + StudentSearchCriteria criteria = new GroupNumberRangeCriteria("A10", "C30"); + Student student = new Student("C30", 4.5, 123); + assertTrue(criteria.matches(student)); + } + + @Test + void testGroupNumberRangeDoesNotMatchOutside() { + StudentSearchCriteria criteria = new GroupNumberRangeCriteria("A10", "C30"); + Student student = new Student("D00", 4.5, 123); + assertFalse(criteria.matches(student)); + } + + @Test + void testGroupNumberRangeInvalidMinMaxThrowsException() { + assertThrows(IllegalArgumentException.class, () -> new GroupNumberRangeCriteria("C30", "A10")); + } + + @Test + void testGroupNumberRangeNullValuesThrowsException() { + assertThrows(IllegalArgumentException.class, () -> new GroupNumberRangeCriteria(null, "A10")); + assertThrows(IllegalArgumentException.class, () -> new GroupNumberRangeCriteria("A10", null)); + } + + @Test + void testAverageGradeRangeMatchesInside() { + StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); + Student student = new Student("A12", 4.5, 123); + assertTrue(criteria.matches(student)); + } + + @Test + void testAverageGradeRangeMatchesLowerBoundary() { + StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); + Student student = new Student("A12", 4.0, 123); + assertTrue(criteria.matches(student)); + } + + @Test + void testAverageGradeRangeMatchesUpperBoundary() { + StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); + Student student = new Student("A12", 5.0, 123); + assertTrue(criteria.matches(student)); + } + + @Test + void testAverageGradeRangeDoesNotMatchBelow() { + StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); + Student student = new Student("A12", 3.9, 123); + assertFalse(criteria.matches(student)); + } + + @Test + void testAverageGradeRangeDoesNotMatchAbove() { + StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); + Student student = new Student("A12", 5.1, 123); + assertFalse(criteria.matches(student)); + } + + @Test + void testAverageGradeRangeInvalidMinMaxThrowsException() { + assertThrows(IllegalArgumentException.class, () -> new AverageGradeRangeCriteria(5.0, 4.0)); + } + + @Test + void testRecordBookNumberRangeMatchesInside() { + StudentSearchCriteria criteria = new RecordBookNumberRangeCriteria(100, 200); + Student student = new Student("A12", 4.5, 150); + assertTrue(criteria.matches(student)); + } + + @Test + void testRecordBookNumberRangeMatchesLowerBoundary() { + StudentSearchCriteria criteria = new RecordBookNumberRangeCriteria(100, 200); + Student student = new Student("A12", 4.5, 100); + assertTrue(criteria.matches(student)); + } + + @Test + void testRecordBookNumberRangeMatchesUpperBoundary() { + StudentSearchCriteria criteria = new RecordBookNumberRangeCriteria(100, 200); + Student student = new Student("A12", 4.5, 200); + assertTrue(criteria.matches(student)); + } + + @Test + void testRecordBookNumberRangeDoesNotMatchBelow() { + StudentSearchCriteria criteria = new RecordBookNumberRangeCriteria(100, 200); + Student student = new Student("A12", 4.5, 99); + assertFalse(criteria.matches(student)); + } + + @Test + void testRecordBookNumberRangeDoesNotMatchAbove() { + StudentSearchCriteria criteria = new RecordBookNumberRangeCriteria(100, 200); + Student student = new Student("A12", 4.5, 201); + assertFalse(criteria.matches(student)); + } + + @Test + void testRecordBookNumberRangeInvalidMinMaxThrowsException() { + assertThrows(IllegalArgumentException.class, () -> new RecordBookNumberRangeCriteria(200, 100)); + } + + @Test + void testCompositeIntersectionEmptyReturnsTrue() { + CompositeStudentSearchCriteria composite = + new CompositeStudentSearchCriteria(SearchOperation.INTERSECTION); + Student student = new Student("A12", 4.5, 123); + assertTrue(composite.matches(student)); + } + + @Test + void testCompositeUnionEmptyReturnsFalse() { + CompositeStudentSearchCriteria composite = + new CompositeStudentSearchCriteria(SearchOperation.UNION); + Student student = new Student("A12", 4.5, 123); + assertFalse(composite.matches(student)); + } + + @Test + void testCompositeIntersectionAllTrue() { + CompositeStudentSearchCriteria composite = + new CompositeStudentSearchCriteria(SearchOperation.INTERSECTION); + composite.add(new GroupNumberRangeCriteria("A10", "C30")); + composite.add(new AverageGradeRangeCriteria(4.0, 5.0)); + Student student = new Student("B20", 4.5, 123); + assertTrue(composite.matches(student)); + } + + @Test + void testCompositeIntersectionOneFalse() { + CompositeStudentSearchCriteria composite = + new CompositeStudentSearchCriteria(SearchOperation.INTERSECTION); + composite.add(new GroupNumberRangeCriteria("A10", "C30")); + composite.add(new AverageGradeRangeCriteria(4.0, 5.0)); + Student student = new Student("B20", 3.5, 123); + assertFalse(composite.matches(student)); + } + + @Test + void testCompositeUnionOneTrue() { + CompositeStudentSearchCriteria composite = + new CompositeStudentSearchCriteria(SearchOperation.UNION); + composite.add(new GroupNumberRangeCriteria("A10", "C30")); + composite.add(new AverageGradeRangeCriteria(4.0, 5.0)); + Student student = new Student("D00", 4.5, 123); + assertTrue(composite.matches(student)); + } + + @Test + void testCompositeUnionAllFalse() { + CompositeStudentSearchCriteria composite = + new CompositeStudentSearchCriteria(SearchOperation.UNION); + composite.add(new GroupNumberRangeCriteria("A10", "C30")); + composite.add(new AverageGradeRangeCriteria(4.0, 5.0)); + Student student = new Student("D00", 3.5, 123); + assertFalse(composite.matches(student)); + } + + @Test + void testCompositeWithNestedComposite() { + CompositeStudentSearchCriteria outer = + new CompositeStudentSearchCriteria(SearchOperation.INTERSECTION); + outer.add(new GroupNumberRangeCriteria("A10", "C30")); + + CompositeStudentSearchCriteria inner = + new CompositeStudentSearchCriteria(SearchOperation.UNION); + inner.add(new AverageGradeRangeCriteria(4.0, 5.0)); + inner.add(new RecordBookNumberRangeCriteria(100, 200)); + + outer.add(inner); + + Student student = new Student("B20", 4.5, 150); + assertTrue(outer.matches(student)); + student = new Student("B20", 3.5, 150); + assertFalse(outer.matches(student)); + student = new Student("D00", 4.5, 150); + assertFalse(outer.matches(student)); + } + + @Test + void testSearchServiceWithSingleCriteria() { + MyList students = new MyLinkedList<>(); + students.add(new Student("A10", 4.5, 1)); + students.add(new Student("B20", 3.8, 2)); + students.add(new Student("C30", 4.9, 3)); + + StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); + StudentSearchService service = new StudentSearchService(criteria); + MyList result = service.find(students); + + assertEquals(2, result.size()); + assertEquals("A10", result.get(0).getGroupNumber()); + assertEquals("C30", result.get(1).getGroupNumber()); + } + + @Test + void testSearchServiceEmptyResult() { + MyList students = new MyLinkedList<>(); + students.add(new Student("A10", 3.5, 1)); + students.add(new Student("B20", 3.8, 2)); + + StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); + StudentSearchService service = new StudentSearchService(criteria); + MyList result = service.find(students); + + assertEquals(0, result.size()); + } + + @Test + void testSearchServiceEmptyCollection() { + MyList students = new MyLinkedList<>(); + StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); + StudentSearchService service = new StudentSearchService(criteria); + MyList result = service.find(students); + assertEquals(0, result.size()); + } + + @Test + void testSearchServicePreservesOrder() { + MyList students = new MyLinkedList<>(); + students.add(new Student("Z00", 4.5, 1)); + students.add(new Student("A10", 4.5, 2)); + students.add(new Student("M30", 4.5, 3)); + + StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); + StudentSearchService service = new StudentSearchService(criteria); + MyList result = service.find(students); + + assertEquals(3, result.size()); + assertEquals("Z00", result.get(0).getGroupNumber()); + assertEquals("A10", result.get(1).getGroupNumber()); + assertEquals("M30", result.get(2).getGroupNumber()); + } + + @Test + void testSearchServiceDoesNotModifyOriginal() { + MyList original = new MyLinkedList<>(); + original.add(new Student("A10", 4.5, 1)); + original.add(new Student("B20", 3.8, 2)); + + MyList copy = new MyLinkedList<>(); + for (int i = 0; i < original.size(); i++) { + copy.add(original.get(i)); } - @Test - void testGroupNumberRangeMatchesLowerBoundary() { - StudentSearchCriteria criteria = new GroupNumberRangeCriteria("A10", "C30"); - Student student = new Student("A10", 4.5, 123); - assertTrue(criteria.matches(student)); + StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); + StudentSearchService service = new StudentSearchService(criteria); + service.find(original); + + assertEquals(copy.size(), original.size()); + for (int i = 0; i < copy.size(); i++) { + assertEquals(copy.get(i).getGroupNumber(), original.get(i).getGroupNumber()); } + } - @Test - void testGroupNumberRangeMatchesUpperBoundary() { - StudentSearchCriteria criteria = new GroupNumberRangeCriteria("A10", "C30"); - Student student = new Student("C30", 4.5, 123); - assertTrue(criteria.matches(student)); - } + @Test + void testSearchServiceWithNullCriteriaThrowsException() { + assertThrows(IllegalArgumentException.class, () -> new StudentSearchService(null)); + } - @Test - void testGroupNumberRangeDoesNotMatchOutside() { - StudentSearchCriteria criteria = new GroupNumberRangeCriteria("A10", "C30"); - Student student = new Student("D00", 4.5, 123); - assertFalse(criteria.matches(student)); - } + @Test + void testSearchServiceWithCompositeCriteria() { + MyList students = new MyLinkedList<>(); + students.add(new Student("A10", 4.5, 1)); + students.add(new Student("B20", 4.5, 2)); + students.add(new Student("C30", 3.5, 3)); - @Test - void testGroupNumberRangeInvalidMinMaxThrowsException() { - assertThrows(IllegalArgumentException.class, - () -> new GroupNumberRangeCriteria("C30", "A10")); - } + CompositeStudentSearchCriteria composite = + new CompositeStudentSearchCriteria(SearchOperation.INTERSECTION); + composite.add(new GroupNumberRangeCriteria("A10", "B20")); + composite.add(new AverageGradeRangeCriteria(4.0, 5.0)); - @Test - void testGroupNumberRangeNullValuesThrowsException() { - assertThrows(IllegalArgumentException.class, - () -> new GroupNumberRangeCriteria(null, "A10")); - assertThrows(IllegalArgumentException.class, - () -> new GroupNumberRangeCriteria("A10", null)); - } + StudentSearchService service = new StudentSearchService(composite); + MyList result = service.find(students); - @Test - void testAverageGradeRangeMatchesInside() { - StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); - Student student = new Student("A12", 4.5, 123); - assertTrue(criteria.matches(student)); - } + assertEquals(2, result.size()); + assertEquals("A10", result.get(0).getGroupNumber()); + assertEquals("B20", result.get(1).getGroupNumber()); + } - @Test - void testAverageGradeRangeMatchesLowerBoundary() { - StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); - Student student = new Student("A12", 4.0, 123); - assertTrue(criteria.matches(student)); - } - - @Test - void testAverageGradeRangeMatchesUpperBoundary() { - StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); - Student student = new Student("A12", 5.0, 123); - assertTrue(criteria.matches(student)); - } - - @Test - void testAverageGradeRangeDoesNotMatchBelow() { - StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); - Student student = new Student("A12", 3.9, 123); - assertFalse(criteria.matches(student)); - } - - @Test - void testAverageGradeRangeDoesNotMatchAbove() { - StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); - Student student = new Student("A12", 5.1, 123); - assertFalse(criteria.matches(student)); - } - - @Test - void testAverageGradeRangeInvalidMinMaxThrowsException() { - assertThrows(IllegalArgumentException.class, - () -> new AverageGradeRangeCriteria(5.0, 4.0)); - } - - @Test - void testRecordBookNumberRangeMatchesInside() { - StudentSearchCriteria criteria = new RecordBookNumberRangeCriteria(100, 200); - Student student = new Student("A12", 4.5, 150); - assertTrue(criteria.matches(student)); - } - - @Test - void testRecordBookNumberRangeMatchesLowerBoundary() { - StudentSearchCriteria criteria = new RecordBookNumberRangeCriteria(100, 200); - Student student = new Student("A12", 4.5, 100); - assertTrue(criteria.matches(student)); - } - - @Test - void testRecordBookNumberRangeMatchesUpperBoundary() { - StudentSearchCriteria criteria = new RecordBookNumberRangeCriteria(100, 200); - Student student = new Student("A12", 4.5, 200); - assertTrue(criteria.matches(student)); - } - - @Test - void testRecordBookNumberRangeDoesNotMatchBelow() { - StudentSearchCriteria criteria = new RecordBookNumberRangeCriteria(100, 200); - Student student = new Student("A12", 4.5, 99); - assertFalse(criteria.matches(student)); - } - - @Test - void testRecordBookNumberRangeDoesNotMatchAbove() { - StudentSearchCriteria criteria = new RecordBookNumberRangeCriteria(100, 200); - Student student = new Student("A12", 4.5, 201); - assertFalse(criteria.matches(student)); - } - - @Test - void testRecordBookNumberRangeInvalidMinMaxThrowsException() { - assertThrows(IllegalArgumentException.class, - () -> new RecordBookNumberRangeCriteria(200, 100)); - } - - @Test - void testCompositeIntersectionEmptyReturnsTrue() { - CompositeStudentSearchCriteria composite = new CompositeStudentSearchCriteria(SearchOperation.INTERSECTION); - Student student = new Student("A12", 4.5, 123); - assertTrue(composite.matches(student)); - } - - @Test - void testCompositeUnionEmptyReturnsFalse() { - CompositeStudentSearchCriteria composite = new CompositeStudentSearchCriteria(SearchOperation.UNION); - Student student = new Student("A12", 4.5, 123); - assertFalse(composite.matches(student)); - } - - @Test - void testCompositeIntersectionAllTrue() { - CompositeStudentSearchCriteria composite = new CompositeStudentSearchCriteria(SearchOperation.INTERSECTION); - composite.add(new GroupNumberRangeCriteria("A10", "C30")); - composite.add(new AverageGradeRangeCriteria(4.0, 5.0)); - Student student = new Student("B20", 4.5, 123); - assertTrue(composite.matches(student)); - } - - @Test - void testCompositeIntersectionOneFalse() { - CompositeStudentSearchCriteria composite = new CompositeStudentSearchCriteria(SearchOperation.INTERSECTION); - composite.add(new GroupNumberRangeCriteria("A10", "C30")); - composite.add(new AverageGradeRangeCriteria(4.0, 5.0)); - Student student = new Student("B20", 3.5, 123); - assertFalse(composite.matches(student)); - } - - @Test - void testCompositeUnionOneTrue() { - CompositeStudentSearchCriteria composite = new CompositeStudentSearchCriteria(SearchOperation.UNION); - composite.add(new GroupNumberRangeCriteria("A10", "C30")); - composite.add(new AverageGradeRangeCriteria(4.0, 5.0)); - Student student = new Student("D00", 4.5, 123); - assertTrue(composite.matches(student)); - } - - @Test - void testCompositeUnionAllFalse() { - CompositeStudentSearchCriteria composite = new CompositeStudentSearchCriteria(SearchOperation.UNION); - composite.add(new GroupNumberRangeCriteria("A10", "C30")); - composite.add(new AverageGradeRangeCriteria(4.0, 5.0)); - Student student = new Student("D00", 3.5, 123); - assertFalse(composite.matches(student)); - } - - @Test - void testCompositeWithNestedComposite() { - CompositeStudentSearchCriteria outer = new CompositeStudentSearchCriteria(SearchOperation.INTERSECTION); - outer.add(new GroupNumberRangeCriteria("A10", "C30")); - - CompositeStudentSearchCriteria inner = new CompositeStudentSearchCriteria(SearchOperation.UNION); - inner.add(new AverageGradeRangeCriteria(4.0, 5.0)); - inner.add(new RecordBookNumberRangeCriteria(100, 200)); - - outer.add(inner); - - Student student = new Student("B20", 4.5, 150); - assertTrue(outer.matches(student)); - student = new Student("B20", 3.5, 150); - assertFalse(outer.matches(student)); - student = new Student("D00", 4.5, 150); - assertFalse(outer.matches(student)); - } - - @Test - void testSearchServiceWithSingleCriteria() { - MyList students = new MyLinkedList<>(); - students.add(new Student("A10", 4.5, 1)); - students.add(new Student("B20", 3.8, 2)); - students.add(new Student("C30", 4.9, 3)); - - StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); - StudentSearchService service = new StudentSearchService(criteria); - MyList result = service.find(students); - - assertEquals(2, result.size()); - assertEquals("A10", result.get(0).getGroupNumber()); - assertEquals("C30", result.get(1).getGroupNumber()); - } - - @Test - void testSearchServiceEmptyResult() { - MyList students = new MyLinkedList<>(); - students.add(new Student("A10", 3.5, 1)); - students.add(new Student("B20", 3.8, 2)); - - StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); - StudentSearchService service = new StudentSearchService(criteria); - MyList result = service.find(students); - - assertEquals(0, result.size()); - } - - @Test - void testSearchServiceEmptyCollection() { - MyList students = new MyLinkedList<>(); - StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); - StudentSearchService service = new StudentSearchService(criteria); - MyList result = service.find(students); - assertEquals(0, result.size()); - } - - @Test - void testSearchServicePreservesOrder() { - MyList students = new MyLinkedList<>(); - students.add(new Student("Z00", 4.5, 1)); - students.add(new Student("A10", 4.5, 2)); - students.add(new Student("M30", 4.5, 3)); - - StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); - StudentSearchService service = new StudentSearchService(criteria); - MyList result = service.find(students); - - assertEquals(3, result.size()); - assertEquals("Z00", result.get(0).getGroupNumber()); - assertEquals("A10", result.get(1).getGroupNumber()); - assertEquals("M30", result.get(2).getGroupNumber()); - } - - @Test - void testSearchServiceDoesNotModifyOriginal() { - MyList original = new MyLinkedList<>(); - original.add(new Student("A10", 4.5, 1)); - original.add(new Student("B20", 3.8, 2)); - - MyList copy = new MyLinkedList<>(); - for (int i = 0; i < original.size(); i++) { - copy.add(original.get(i)); - } - - StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); - StudentSearchService service = new StudentSearchService(criteria); - service.find(original); - - assertEquals(copy.size(), original.size()); - for (int i = 0; i < copy.size(); i++) { - assertEquals(copy.get(i).getGroupNumber(), original.get(i).getGroupNumber()); - } - } - - @Test - void testSearchServiceWithNullCriteriaThrowsException() { - assertThrows(IllegalArgumentException.class, - () -> new StudentSearchService(null)); - } - - @Test - void testSearchServiceWithCompositeCriteria() { - MyList students = new MyLinkedList<>(); - students.add(new Student("A10", 4.5, 1)); - students.add(new Student("B20", 4.5, 2)); - students.add(new Student("C30", 3.5, 3)); - - CompositeStudentSearchCriteria composite = new CompositeStudentSearchCriteria(SearchOperation.INTERSECTION); - composite.add(new GroupNumberRangeCriteria("A10", "B20")); - composite.add(new AverageGradeRangeCriteria(4.0, 5.0)); - - StudentSearchService service = new StudentSearchService(composite); - MyList result = service.find(students); - - assertEquals(2, result.size()); - assertEquals("A10", result.get(0).getGroupNumber()); - assertEquals("B20", result.get(1).getGroupNumber()); - } - - @Test - void testSearchServiceWithNullStudentListReturnsEmpty() { - StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); - StudentSearchService service = new StudentSearchService(criteria); - MyList result = service.find(null); - assertNotNull(result); - assertEquals(0, result.size()); - } -} \ No newline at end of file + @Test + void testSearchServiceWithNullStudentListReturnsEmpty() { + StudentSearchCriteria criteria = new AverageGradeRangeCriteria(4.0, 5.0); + StudentSearchService service = new StudentSearchService(criteria); + MyList result = service.find(null); + assertNotNull(result); + assertEquals(0, result.size()); + } +}