Coverage Summary for Class: OrgRuNameGenerator (ru.eda.plgn.bizgen.core.generator.impl)

Class Method, % Branch, % Line, % Instruction, %
OrgRuNameGenerator 100% (2/2) 100% (3/3) 100% (13/13)
OrgRuNameGenerator$OrganizationRuNameGeneratorInner 100% (2/2) 75% (3/4) 98.2% (109/111) 99% (1696/1713)
Total 100% (4/4) 75% (3/4) 98.2% (112/114) 99% (1709/1726)


 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.OrgRuNameGenerator.OrganizationRuNameGeneratorInner.generateOrganizationName
 import kotlin.random.Random
 
 /**
  * Генератор наименований организаций на русском языке.
  *
  * @author Dmitry_Emelyanenko
  */
 class OrgRuNameGenerator : GeneratorStr {
   override val uniqueDistance: Int = 130
 
   override fun generate(): GeneratorResult<String> = GeneratorResultWithEscape(data = generateOrganizationName())
 
   private object OrganizationRuNameGeneratorInner {
     private val companyTypes = listOf(
       // Коммерческие организации
       "ООО",   // Общество с ограниченной ответственностью
       "АО",    // Акционерное общество
       "ПАО",   // Публичное акционерное общество
       "НАО",   // Непубличное акционерное общество
       "ИП",    // Индивидуальный предприниматель
 
       // Государственные и муниципальные
       "ФКП",   // Федеральное казённое предприятие
       "ФГУП",  // Федеральное государственное унитарное предприятие
       "ГУП",   // Государственное унитарное предприятие
       "МУП",   // Муниципальное унитарное предприятие
       "ГБУ",   // Государственное бюджетное учреждение
       "МБУ",   // Муниципальное бюджетное учреждение
       "ГАУ",   // Государственное автономное учреждение
       "МАУ",   // Муниципальное автономное учреждение
 
       // Некоммерческие организации
       "АНО",   // Автономная некоммерческая организация
       "НКО",   // Некоммерческая организация
       "Фонд",  // Фонд
       "Ассоциация",
     )
 
     private val firstWords = listOf(
       "Глобал", "Техно", "Рос", "Металл", "Строй", "Транс", "Нефть", "Газ",
       "Агро", "Мед", "Фарм", "Телеком", "Инвест", "Финанс", "Энерго", "Прогресс",
       "Мега", "Космос", "Альфа", "Омега", "Дельта", "Сигма", "Вектор", "Квант",
       "Сиб", "Даль", "Урал", "Север", "Юг", "Восток", "Запад", "Центр",
       "Науч", "Тех", "Пром", "Хим", "Эко", "Био", "Нано", "Кибер",
       "Москва", "Петербург", "Сибирь", "Байкал", "Волга", "Дон", "Амур", "Алтай",
       "Камчатка", "Сахалин", "Крым", "Кавказ", "Черноземье", "Нева", "Обь", "Енисей",
       "Лена", "Ангара", "Балтика", "Арктик", "Таймыр", "Приморье", "Забайкалье", "Курск",
       "Тверь", "Рязань", "Владимир", "Ярославль", "Кострома", "Вологда", "Псков", "Новгород",
       "Робот", "АйТи", "Код", "Софт", "Хард", "Чип", "Драйв", "Смарт",
       "Дижитал", "Вирту", "Клауд", "Нейро", "Крипто", "Блокчейн", "Токен", "Айпи",
       "Датчик", "Сенсор", "Микро", "Опто", "Лазер", "Плазмо", "Квантум", "Фотон",
       "Дом", "Квартал", "Жил", "Комфорт", "Фасад", "Фундамент", "Кровля", "Бетон",
       "Кирпич", "Стекло", "Метро", "Мост", "Тоннель", "Высот", "Архитек", "Проект",
       "Авиа", "Авто", "Желдор", "Речфлот", "Морфлот", "Транзит", "Экспресс", "Карго",
       "Фрахт", "Контейнер", "Логист", "Транса", "Аэро", "Такси", "Бус", "Троллей",
       "Капитал", "Актив", "Траст", "Кредит", "Депозит", "Лизинг", "Факторинг", "Аудит",
       "Консалт", "Маркет", "Бизнес", "Трейд", "Импэкс", "Экспо", "Форум", "Клуб",
       "Академи", "Универ", "Колледж", "Лицей", "Институт", "Лаборатор", "Исслед", "Эксперимент",
       "Знание", "Прогресс", "Интеллект", "Гений", "Талант", "Олимп", "Эрудит", "Курс",
       "Медика", "Клиника", "Диагност", "Терапия", "Стомат", "Офтальмо", "Кардио", "Нейро",
       "Фарма", "Вита", "Генетик", "Иммуно", "Био", "Гигиена", "Санаторий", "Спа",
       "Торг", "Маркет", "Супер", "Гипер", "Мега", "Универсам", "Гастроном", "Продукт",
       "Сервис", "Центр", "Плюс", "Экстра", "Премиум", "Люкс", "Гранд", "Элит",
       "Лес", "Вода", "Воздух", "Земля", "Плодородие", "Эко", "Ресурс", "Гео",
       "Нефте", "Газо", "Уголь", "Руда", "Металлург", "Хим", "Полимер", "Энерг",
       "Арт", "Культ", "Театр", "Кино", "Музей", "Галерея", "Выставка", "Фестиваль",
       "Концерт", "Филармония", "Оркестр", "Хор", "Балет", "Опера", "Драма", "Цирк",
       "Спектр", "Импульс", "Горизонт", "Потенциал", "Резонанс", "Контур", "Парадигма",
       "Модуль", "Матрица", "Платформа", "Экосистема", "Синергия", "Инициатива",
       "Динамика", "Ориентир", "Полюс", "Фактор", "Баланс", "Интеграл", "Вектория",
       "Полис", "Мегаполис", "Ареал", "Регионум", "Территория", "Доминион",
       "Спин", "Кварк", "Бозон", "Нейтрон", "Изотоп", "Синтез", "Катализ",
       "Геометрия", "Алгоритм", "Протокол", "Интерфейс", "Архитектура",
       "Прайм", "Фокус", "Статус", "Профит", "Рента", "Аксиома", "Формула",
       "Диверсиф", "Кооператив", "Инкубатор"
     )
 
     private val secondWords = listOf(
       "Сервис", "Групп", "Холдинг", "Трейд", "Лизинг", "Банк", "Капитал", "Ресурс",
       "Снаб", "Торг", "Пром", "Тех", "Индустрия", "Системы", "Технологии", "Решения",
       "Консалтинг", "Менеджмент", "Развитие", "Партнеры", "Центр", "Альянс", "Траст",
       "Корпорация", "Компани", "Концерн", "Синдикат", "Трест", "Ассоциация", "Фонд",
       "Венчур", "Диджитал", "Инновации", "Логистика", "Маркет", "Недвижимость", "Ойл",
       "Проект", "Строй", "Транзит", "Универсал", "Фабрика", "Хайтек", "Центр", "Эксперт",
       "Юнион", "Ярд", "Лаб", "Медиа", "Нетворк", "Онлайн", "Премиум", "Квалити",
       "Солюшнс", "Инжиниринг", "Девелопмент", "Аналитика", "Операции",
       "Инфраструктура", "Интеграция", "Автоматизация", "Оптимизация",
       "Поддержка", "Эксплуатация", "Модернизация", "Сопровождение",
       "Партнерство", "Консорциум", "Коалиция", "Объединение",
       "Инициатива", "Платформа", "Экосистема",
       "Датацентр", "Облака", "Кибербезопасность", "Разработка",
       "Продукты", "Сервисы", "РешенияПлюс"
     )
 
     private val longSuffixes = listOf(
       " имени академика Петрова-Соколова",
       " Северо-Западного федерального округа",
       " по производству высокотехнологичного оборудования",
       " для нефтегазовой промышленности и энергетики",
       " в сфере информационных технологий и цифровой трансформации",
       " городского округа Краснознаменск Московской области",
       " при Правительстве Российской Федерации",
       " по разработке инновационных решений в области искусственного интеллекта",
       " и дочерние предприятия группы компаний 'Восток-Запад'",
       " (бывшее предприятие 'Прогресс-Электронмаш')",
       " федерального значения в области стратегического развития",
       " полного инновационного цикла от исследований до внедрения",
       " с участием международных технологических партнеров",
       " в рамках национальных и межрегиональных программ",
       " по комплексной цифровизации производственных процессов",
       " на базе собственных научно-исследовательских центров",
       " с распределенной структурой управления и филиальной сетью",
       " в сфере импортозамещения и технологического суверенитета",
       " в интересах государственных и корпоративных заказчиков",
       " с применением сертифицированных методологий и стандартов",
       " действующее на основании устава и законодательства РФ",
       " зарегистрированное в установленном законом порядке",
       " с местом нахождения в Российской Федерации",
       " осуществляющее деятельность на территории РФ"
     )
 
     private val separators = listOf("", "-", " ")
 
     fun generateOrganizationName(): String {
       val random = Random.Default
       val type = companyTypes.random()
 
       val baseName = buildString {
         append(firstWords.random())
         append(separators.random())
         append(secondWords.random())
       }
 
       // 50% chance to add long suffix
       val fullName = if (random.nextDouble() < 0.5) {
         val suffix = longSuffixes.random()
         // Ensure total length doesn't exceed 255 chars
         if (type.length + 1 + baseName.length + suffix.length <= 255) {
           "$type $baseName$suffix"
         } else {
           // If too long, truncate suffix
           val maxSuffixLength = 255 - (type.length + 1 + baseName.length)
           "$type $baseName${suffix.take(maxSuffixLength)}"
         }
       } else {
         "$type $baseName"
       }
 
       return fullName
     }
   }
 }