Files
aston-team-project/docs/tasks/RandomStudentGenerator.md

7.9 KiB

Техническое задание: генератор случайных студентов

Задача

Реализовать класс для формирования MyList<Student> со случайными значениями.

По умолчанию ограничения диапазона для генерации не задаются. В таком случае значения должны генерироваться во всём допустимом диапазоне, установленном правилами класса Student.

Генерация объектов должна выполняться через существующий StudentBuilder.

Название класса

RandomStudentGenerator

Контракт класса

Класс должен хранить текущие ограничения генерации для каждого поля Student.

Для каждого поля необходимо предоставить по два метода: левое и правое ограничение.

groupNumber

Тип поля: String.

RandomStudentGenerator setMinGroupNumber(String minGroupNumber);
RandomStudentGenerator setMaxGroupNumber(String maxGroupNumber);

Ограничения применяются при генерации groupNumber.

Сравнение границ выполнять в соответствии с правилами, используемыми для groupNumber в Student.

averageGrade

Тип поля: double.

RandomStudentGenerator setMinAverageGrade(double minAverageGrade);
RandomStudentGenerator setMaxAverageGrade(double maxAverageGrade);

Диапазон должен быть включительным:

minAverageGrade <= averageGrade <= maxAverageGrade

recordBookNumber

Тип поля: int.

RandomStudentGenerator setMinRecordBookNumber(int minRecordBookNumber);
RandomStudentGenerator setMaxRecordBookNumber(int maxRecordBookNumber);

Диапазон должен быть включительным:

minRecordBookNumber <= recordBookNumber <= maxRecordBookNumber

Метод генерации

Основной метод:

MyList<Student> generate(int size);

Контракт:

  • создаёт ровно size объектов Student;
  • все объекты должны быть валидными;
  • каждый объект создаётся через StudentBuilder;
  • результат возвращается как MyList<Student>;
  • стандартные List, ArrayList, LinkedList и другие контейнеры использовать нельзя.

Поведение диапазонов по умолчанию

Если для поля ограничение не задано, используется весь допустимый диапазон этого поля.

Необходимо учитывать существующие ограничения Student, в частности:

averageGrade:
getMinAverageGrade()
getMaxAverageGrade()

recordBookNumber:
getMinRecordBookNumber()

Для groupNumber использовать существующий шаблон:

getGroupNumberPattern()

Генерируемое значение groupNumber должно соответствовать требованиям Student.

Проверка ограничений

При установке границ необходимо проверять их корректность.

Недопустимые случаи:

min > max

Для них выбрасывать:

IllegalArgumentException

Ограничение также не должно выходить за допустимые значения Student.

Рекомендуемая реализация

Класс должен хранить шесть ограничений:

minGroupNumber
maxGroupNumber

minAverageGrade
maxAverageGrade

minRecordBookNumber
maxRecordBookNumber

Для каждого поля значения генерируются независимо.

Рекомендуется использовать стандартный генератор случайных чисел Java, например:

Random

или:

ThreadLocalRandom

При создании Student:

сгенерировать поля
        ↓
StudentBuilder
        ↓
build()
        ↓
Student
        ↓
MyList<Student>

Дополнительную валидацию, дублирующую правила Student, в генераторе не реализовывать.

Примеры использования

Без настройки диапазонов:

RandomStudentGenerator generator =
        new RandomStudentGenerator();

MyList<Student> students =
        generator.generate(100);

С настройкой диапазонов:

RandomStudentGenerator generator =
        new RandomStudentGenerator()
                .setMinGroupNumber("A00")
                .setMaxGroupNumber("Z99")
                .setMinAverageGrade(3.0)
                .setMaxAverageGrade(5.0)
                .setMinRecordBookNumber(10000)
                .setMaxRecordBookNumber(99999);

MyList<Student> students =
        generator.generate(100);

Тесты

Генерация без ограничений

MyList<Student> result = generator.generate(100);

Проверить:

  • размер равен 100;
  • все элементы не равны null;
  • каждый Student валиден.

Ограничение averageGrade

Задать:

3.0 — 4.0

Проверить, что все значения находятся в указанном диапазоне.

Ограничение recordBookNumber

Задать:

10000 — 20000

Проверить диапазон и включение границ.

Ограничение groupNumber

Задать левую и правую границы.

Проверить, что все сгенерированные значения находятся между ними согласно правилам сравнения groupNumber.

Граничные значения

Установить:

min == max

Проверить, что все сгенерированные значения равны указанной границе.

Некорректный диапазон

Проверить выброс IllegalArgumentException, если:

min > max

Некорректное ограничение

Передать диапазон, выходящий за допустимые значения Student.

Проверить выброс исключения.

Генерация пустой коллекции

Для:

generate(0)

ожидается пустой MyList<Student>.

Некорректный размер

Для отрицательного размера:

generate(-1)

ожидается IllegalArgumentException.

Результат

Необходимо реализовать:

RandomStudentGenerator.java

Класс должен использовать существующие:

Student.java
StudentBuilder.java
MyList.java

Изменять интерфейсы Student, StudentBuilder и MyList для выполнения данного задания не требуется.