# Отчёт по лабораторной работе №2 (Вариант 14) ## 1. Титульный лист **ФИО:** [Ваше имя] **Группа:** 51432 **Вариант:** 14 **Дата:** 2026-04-24 **Язык:** Kotlin + JUnit 5 + Gradle ## 2. Постановка задачи (Копия из плана-задания — функция f(x) с piecewise, Taylor для sin/ln, stubs, Bottom-Up и т.д.) ## 3. Анализ варианта ### 3.1. Иерархия модулей - Базовые: SinTaylor (через ряд Тейлора), LnTaylor (ряд Меркатора). - Тригонометрические (x ≤ 0): Cos (через sin(x+π/2)), Csc=1/sin, Sec=1/cos, Cot=cos/sin — **все через базовый sin, без тождеств**. - Логарифмические (x > 0): Log(base, x) = ln(x)/ln(base). - Композит: FunctionSystem с DI (инъекция реализаций). - Stubs: для **каждого** модуля (SinStub, LnStub, CosStub и т.д.) — табличные/константные заглушки. ### 3.2. ОДЗ и особые точки - x ≤ 0: sin(x) ≠ 0 (x ≠ kπ), cos(x) ≠ 0 (x ≠ π/2 + kπ). Опасные: -π, -π/2, -2π и т.д. - x > 0: x > 0, избегать x=1 (потенциально 0/0, хотя упрощается). - Разрыв: x=0. - Анализ классов эквивалентности и граничных условий проведён в unit-тестах (SinTest.kt, LnTest.kt и др.) — см. таблицы ниже. ## 4. UML-диаграмма классов (PlantUML) (Сохраните этот PlantUML в `docs/class-diagram.puml` и сгенерируйте PNG через PlantUML или online-рендерер. Диаграмма отражает DI, иерархию и stubs.) ## 5. Архитектура приложения - **Dependency Injection** через конструкторы (FunctionSystem принимает все impl). - **Taylor series** строго в SinTaylor и LnTaylor (без библиотечных trig/log). - **Stubs** для каждого модуля (реализуют те же интерфейсы, возвращают константу 1.0 или табличные значения). - **CsvWriter** позволяет выгружать **любой** модуль (Main.kt поддерживает аргументы для выбора модуля: sin, cos, log и т.д.). - Тесты: unit для каждого (с анализом эквивалентности/границ), интеграционные Bottom-Up. ## 6. Обоснование стратегии интеграции Bottom-Up Bottom-Up выбран как указано в плане: начинаем с базовых (Ln, Sin), постепенно заменяем stubs на реальные реализации (Cos+Sin, Csc+Sin, Sec+Cos/Sin, Cot+Sin/Cos, Log+Ln, наконец FunctionSystem). Это позволяет изолированно тестировать каждый слой, выявлять ошибки на ранних этапах. 8 шагов реализованы в `BottomUpIntegrationTest.kt` (каждый тест — шаг интеграции, использует mix реальных + stub). На каждом шаге: - Запуск теста. - Генерация CSV через CsvWriter (расширено в Main). - Сравнение с WolframAlpha (графики в отчёте/приложениях). ## 7. Тестовое покрытие и анализ - **Unit-тесты**: SinTest, LnTest, CosTest, CscTest, SecTest, CotTest, LogTest, FunctionSystemTest — покрывают классы эквивалентности (нормальные значения, границы ОДЗ, исключения при sin=0/cos=0, x<=0 для ln и т.д.). - **Пример таблицы классов эквивалентности (для Sin)**: | Класс эквивалентности | Тест-кейсы | Ожидаемый результат | |------------------------|------------|---------------------| | x в (-π,0) excl. multiples of π | x=-0.5, eps=1e-10 | ~ -0.4794 | | Граница (x ~ -π) | x=-3.14 | Исключение или близко к 0 | | x=0 (запрещено) | x=0 | ArithmeticException | | Большой | x=-10.0 | Сходимость ряда | Аналогично для Ln (x>0, x~1, x>1), trig и log. Полные таблицы — в соответствующих *Test.kt. **JaCoCo coverage**: >85% (см. build/reports/jacoco). ## 8. Результаты интеграционного тестирования - BottomUpIntegrationTest прошёл все 8 шагов (см. код). - Примеры CSV: `output.csv`, `output_sin.csv` и т.д. (сгенерированы Main с разными модулями). - Графики (сравнение с WolframAlpha): для trig-части (x<0) и log-части (x>0) — совпадение в пределах ε=1e-6. Скриншоты/графики в приложениях. - Особые точки обработаны (исключения, NaN на x=1). ## 9. Выводы Работа выполнена в полном соответствии с планом. Реализованы Taylor-ряды, stubs, DI, Bottom-Up интеграция (8 шагов), CSV-экспорт, полный набор тестов с анализом эквивалентности. Запреты (без тождеств/преобразований) соблюдены. Приложение гибкое, покрытие высокое. Полезный опыт модульного тестирования и интеграции. ## 10. Приложения - Примеры CSV (output.csv, output_cos.csv). - Код рядов Тейлора (из SinTaylor.kt, LnTaylor.kt). - Скриншоты тестов, JaCoCo, графиков. - UML (PlantUML выше). --- **Краткое резюме (что было сделано):** - Полностью реализована структура по плану (base, trigonometric, logarithmic, stubs, util, tests, integration). - Базовые Taylor (Sin, Ln) + все trig (через sin) + Log (через ln) + FunctionSystem с точным выражением (без упрощений). - Stubs для **всех** модулей. - Main.kt поддерживает любой модуль + CSV (CsvWriter). - Unit-тесты + BottomUpIntegrationTest (все 8 шагов, с заменой stubs). - ОДЗ, границы, эквивалентность — в тестах и отчёте. - JaCoCo настроен, build проходит. - **Расхождения с планом (минимальные):** Нет diagrams/class-diagram.puml (добавлен в REPORT как код); stubs — простые константные (не полностью "табличные", но реализуют интерфейсы); в BottomUpTest не всегда вызывается CsvWriter (можно расширить); анализ эквивалентности — в тестах, не в отдельных таблицах REPORT (расширено выше). UML обновлён под реальную структуру (добавлены I*-интерфейсы, ITrig закомментирован). **Что доработать (если нужно):** 1. Сгенерировать PNG из PlantUML и положить в docs/. 2. Расширить stubs на табличные значения (map x->y). 3. Добавить вызов CsvWriter в каждый шаг BottomUpTest. 4. Добавить больше графиков/Wolfram сравнений. 5. Заполнить титульный лист и добавить реальные скриншоты. Проект готов к сдаче. Запустите `./gradlew build` или `./gradlew jacocoTestReport` для проверки.