Coverage Summary for Class: FIOInitialsGenerator (ru.eda.plgn.bizgen.core.generator.impl)
| Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| FIOInitialsGenerator |
100%
(1/1)
|
100%
(2/2)
|
|
100%
(3/3)
|
100%
(13/13)
|
package ru.eda.plgn.bizgen.core.generator.impl
import ru.eda.plgn.bizgen.core.generator.GeneratorResult
import ru.eda.plgn.bizgen.core.generator.GeneratorResultWithEscape
import ru.eda.plgn.bizgen.core.generator.GeneratorStr
import ru.eda.plgn.bizgen.core.generator.impl.FIOGeneratorInner.generateFioFull
import ru.eda.plgn.bizgen.core.generator.impl.FIOGeneratorInner.generateFioInitials
import ru.eda.plgn.bizgen.core.generator.impl.FIOGeneratorInner.generateFioShort
/**
* Генератор ФИО в полном формате (Фамилия Имя Отчество).
*
* @author Dmitry_Emelyanenko
*/
class FIOFullGenerator : GeneratorStr {
override val uniqueDistance: Int = 120
override fun generate(): GeneratorResult<String> = GeneratorResultWithEscape(data = generateFioFull())
}
/**
* Генератор ФИО в сокращенном формате (Фамилия И. О.).
*
* @author Dmitry_Emelyanenko
*/
class FIOShortGenerator : GeneratorStr {
override val uniqueDistance: Int = 30
override fun generate(): GeneratorResult<String> = GeneratorResultWithEscape(data = generateFioShort())
}
/**
* Генератор ФИО в формате инициалов (И.О. Фамилия).
*
* @author Dmitry_Emelyanenko
*/
class FIOInitialsGenerator : GeneratorStr {
override val uniqueDistance: Int = 30
override fun generate(): GeneratorResult<String> = GeneratorResultWithEscape(data = generateFioInitials())
}
private object FIOGeneratorInner {
private val maleFirstNames = listOf(
"Александр", "Дмитрий", "Максим", "Сергей", "Андрей", "Алексей", "Иван", "Михаил", "Артем", "Илья",
"Кирилл", "Никита", "Егор", "Павел", "Роман", "Владимир", "Константин", "Тимур", "Олег", "Юрий",
"Василий", "Виктор", "Глеб", "Даниил", "Евгений", "Захар", "Лев", "Матвей", "Николай", "Петр",
"Степан", "Федор", "Ярослав", "Борис", "Григорий", "Денис", "Игорь", "Леонид", "Станислав", "Тарас",
"Арсений", "Валентин", "Георгий", "Елисей", "Игнат", "Клим", "Марк", "Назар", "Оскар", "Родион"
)
private val femaleFirstNames = listOf(
"Елена", "Ольга", "Наталья", "Анна", "Мария", "Ирина", "Екатерина", "Светлана", "Татьяна", "Юлия",
"Александра", "Алина", "Алиса", "Анастасия", "Валентина", "Вера", "Виктория", "Галина", "Дарья", "Диана",
"Евгения", "Елизавета", "Жанна", "Зоя", "Инна", "Кира", "Ксения", "Лариса", "Лидия", "Любовь",
"Людмила", "Маргарита", "Марина", "Милана", "Надежда", "Нина", "Полина", "Раиса", "Регина", "Римма",
"Снежана", "София", "Тамара", "Ульяна", "Элина", "Эльвира", "Юлиана", "Яна", "Варвара", "Вероника"
)
private val maleLastNames = listOf(
"Иванов", "Петров", "Сидоров", "Смирнов", "Кузнецов", "Попов", "Васильев", "Павлов", "Семенов", "Голубев",
"Виноградов", "Богданов", "Воробьев", "Федоров", "Михайлов", "Беляев", "Тарасов", "Белов", "Комаров", "Орлов",
"Киселев", "Макаров", "Андреев", "Ковалев", "Ильин", "Гусев", "Титов", "Кузьмин", "Кудрявцев", "Баранов",
"Куликов", "Алексеев", "Степанов", "Яковлев", "Сорокин", "Сергеев", "Романов", "Захаров", "Борисов", "Королев",
"Герасимов", "Пономарев", "Григорьев", "Лазарев", "Медведев", "Ершов", "Никитин", "Соболев", "Рябов", "Поляков"
)
private val femaleLastNames = maleLastNames.map { it + "а" } + listOf(
"Цветкова", "Жукова", "Коновалова", "Крылова", "Скворцова",
"Зайцева", "Ермакова", "Фролова", "Данилова", "Мельникова"
)
private val middleNames = listOf(
"Александрович", "Алексеевич", "Анатольевич", "Андреевич", "Антонович",
"Аркадьевич", "Артемович", "Борисович", "Вадимович", "Валентинович",
"Валериевич", "Васильевич", "Викторович", "Витальевич", "Владимирович",
"Владиславович", "Вячеславович", "Геннадьевич", "Георгиевич", "Григорьевич",
"Данилович", "Денисович", "Дмитриевич", "Евгеньевич", "Егорович",
"Иванович", "Игоревич", "Ильич", "Кириллович", "Константинович",
"Александровна", "Алексеевна", "Анатольевна", "Андреевна", "Антоновна",
"Аркадьевна", "Артемовна", "Борисовна", "Вадимовна", "Валентиновна",
"Валерьевна", "Васильевна", "Викторовна", "Витальевна", "Владимировна",
"Владиславовна", "Вячеславовна", "Геннадьевна", "Георгиевна", "Григорьевна",
"Даниловна", "Денисовна", "Дмитриевна", "Евгеньевна", "Егоровна",
"Ивановна", "Игоревна", "Ильинична", "Кирилловна", "Константиновна"
)
fun generateFioInitials(): String = generate(format = NameFormat.INITIALS)
fun generateFioShort(): String = generate(format = NameFormat.SHORT)
fun generateFioFull(): String = generate(format = NameFormat.FULL)
private fun generate(format: NameFormat = NameFormat.FULL): String = generate(gender = Gender.random(), format = format)
private fun generate(gender: Gender = Gender.random(), format: NameFormat = NameFormat.FULL): String {
// имя
val firstName = when (gender) {
Gender.MALE -> maleFirstNames.random()
Gender.FEMALE -> femaleFirstNames.random()
}
// фамилия
val lastName = when (gender) {
Gender.MALE -> maleLastNames.random()
Gender.FEMALE -> femaleLastNames.random()
}
// отчество
val middleName = middleNames.filter {
it.endsWith("ич") && gender == Gender.MALE ||
it.endsWith("на") && gender == Gender.FEMALE
}.random()
return when (format) {
NameFormat.FULL -> "$lastName $firstName $middleName"
NameFormat.SHORT -> "$lastName ${firstName.first()}.${middleName.first()}."
NameFormat.INITIALS -> "${firstName.first()}.${middleName.first()}. $lastName"
}.trim()
}
// Перечисления для настроек
enum class Gender {
MALE, FEMALE;
companion object {
fun random(): Gender = entries.toTypedArray().random()
}
}
enum class NameFormat {
FULL, // Иванов Иван Иванович
SHORT, // Иванов И.И.
INITIALS, // И.И. Иванов
}
}