diff --git a/app/src/androidTest/assets/expected.txt b/app/src/androidTest/assets/expected.txt new file mode 100644 index 0000000..b337941 --- /dev/null +++ b/app/src/androidTest/assets/expected.txt @@ -0,0 +1,97 @@ +расписание идет так: день недели, дата в скобках, расписание под каждую пару конкретно по времени. в одной паре может быть несколько под разные подгруппы. я их разделил знаком ";", в приложении они должны быть разделены перегородкой. все пары находятся в одной строке по времени. вместо <пусто> должно быть пустое место соответственно. выглядит типичное расписание как: День недели, Дата, Время пар - Название пары (Группа, Название, Тип, Преподаватель, Кабинет); Название пары ... + +Факультет автоматики и вычислительной техники (ОРУ) +Группа: ИВТб-3304-05-00 + +Понедельник (14.09.26): <пусто, пар нет> +Вторник (15.09.26): 08:20-09:50 - <пусто> + 10:00-11:30 - ИВТб-3304-05-00 Объектно-ориентированный анализ и проектирование Лекция Преподаватель -.П. 2-202; ИВТб-3304-05-00 Разработка Web-приложений Лекция Преподаватель -.П. 1-236 + 11:45-13:15 - ИВТб-3304-05-00 Инструментальные средства проектирования компонентов вычислительной техники Лекция Семеновых В.И. 2-201; ИВТб-3304-05-00 Предметно-ориентированные автоматизированные информационные системы Лекция Прозорова Ю.А. 1-313; ИВТб-3304-05-00 Сценарное и функциональное программирование Лекция Преподаватель -.П. 1-311 + 14:00-15:30 - ИВТб-3304-05-00 Инструментальные средства проектирования компонентов вычислительной техники Лабораторная работа Семеновых В.И. 2-201; ИВТб-3304-05-00 Предметно-ориентированные автоматизированные информационные системы Лабораторная работа Прозорова Ю.А. 1-236; ИВТб-3304-05-00 Сценарное и функциональное программирование Лабораторная работа Преподаватель -.П. 1-114 + 15:45-17:15 - ИВТб-3304-05-00 Инструментальные средства проектирования компонентов вычислительной техники Лабораторная работа Семеновых В.И. 2-201; ИВТб-3304-05-00 Предметно-ориентированные автоматизированные информационные системы Лабораторная работа Прозорова Ю.А. 1-236; ИВТб-3304-05-00 Сценарное и функциональное программирование Лабораторная работа Преподаватель -.П. 1-114 + 17:20-18:50 - <пусто> + 18:55-20:25 - <пусто> +Среда (16.09.26): 08:20-09:50 - Введение в архитектуру ЭВМ Лекция Страбыкин Д.А. 1-242 + 10:00-11:30 - Теория компиляторов и формальные грамматики Лекция Мельцов В.Ю. 1-242 + 11:45-13:15 - <пусто> + 14:00-15:30 - <пусто> + 15:45-17:15 - <пусто> + 17:20-18:50 - <пусто> + 18:55-20:25 - <пусто> +Четверг (17.09.26): 08:20-09:50 - <пусто> + 10:00-11:30 - <пусто> + 11:45-13:15 - ИВТб-3304-05-00, 01 подгруппа Элективные дисциплины (модули) по физической культуре и спорту Практическое занятие (11 131) Практическое занятие Трушкова Е.Л. 9-115; ИВТб-3304-05-00, 01 подгруппа Элективные дисциплины (модули) по физической культуре и спорту Практическое занятие (11 039) Практическое занятие Салопин О.М. 9-301 ИВТб-3304-05-00, 02 подгруппа Элективные дисциплины (модули) по физической культуре и спорту Практическое занятие (11 039) Практическое занятие Салопин О.М. 9-301; ИВТб-3304-05-00, 02 подгруппа Элективные дисциплины (модули) по физической культуре и спорту Практическое занятие (21 285) Практическое занятие Хвостенко С.Ю. 9-209.; ИВТб-3304-05-00, 01 подгруппа Элективные дисциплины (модули) по физической культуре и спорту Практическое занятие (11 124) Практическое занятие Пластинина В.Б. 9-208 + 14:00-15:30 - Архитектура операционных систем и сервисное программное обеспечение Лекция Преподаватель -.П. 1-439 + 15:45-17:15 - <пусто> + 17:20-18:50 - <пусто> + 18:55-20:25 - <пусто> +Пятница (18.09.26): 08:20-09:50 - ИВТб-3304-05-00, 01 подгруппа Введение в архитектуру ЭВМ Лабораторная работа Страбыкин Д.А. 1-117; ИВТб-3304-05-00, 02 подгруппа Введение в архитектуру ЭВМ Лабораторная работа Страбыкин Д.А. 1-117_ + 10:00-11:30 - ИВТб-3304-05-00, 01 подгруппа Введение в архитектуру ЭВМ Лабораторная работа Страбыкин Д.А. 1-117; ИВТб-3304-05-00, 02 подгруппа Введение в архитектуру ЭВМ Лабораторная работа Страбыкин Д.А. 1-117_ + 11:45-13:15 - Введение в архитектуру ЭВМ Практическое занятие Страбыкин Д.А. 2-207 + 14:00-15:30 - Философия Практическое занятие Коротышева Н.Н. 2-407 + 15:45-17:15 - <пусто> + 17:20-18:50 - <пусто> + 18:55-20:25 - <пусто> +Суббота (19.09.26): 08:20-09:50 - <пусто> + 10:00-11:30 - <пусто> + 11:45-13:15 - <пусто> + 14:00-15:30 - <пусто> + 15:45-17:15 - <пусто> + 17:20-18:50 - <пусто> + 18:55-20:25 - <пусто> +Воскресенье (20.09.26): 08:20-09:50 - <пусто> + 10:00-11:30 - <пусто> + 11:45-13:15 - <пусто> + 14:00-15:30 - <пусто> + 15:45-17:15 - <пусто> + 17:20-18:50 - <пусто> + 18:55-20:25 - <пусто> +Понедельник (21.09.26): 08:20-09:50 - <пусто> + 10:00-11:30 - ИВТб-3304-05-00, 01 подгруппа Теория компиляторов и формальные грамматики Лабораторная работа Караваева О.В. 2-308; ИВТб-3304-05-00, 02 подгруппа Теория компиляторов и формальные грамматики Лабораторная работа Караваева О.В. 2-308 + 11:45-13:15 - ИВТб-3304-05-00, 01 подгруппа Теория компиляторов и формальные грамматики Лабораторная работа Караваева О.В. 2-308; ИВТб-3304-05-00, 02 подгруппа Теория компиляторов и формальные грамматики Лабораторная работа Караваева О.В. 2-308_ + 14:00-15:30 - <пусто> + 15:45-17:15 - <пусто> + 17:20-18:50 - <пусто> + 18:55-20:25 - <пусто> +Вторник (22.09.26): 08:20-09:50 - Объектно-ориентированный анализ и проектирование Практическое занятие Шмакова Н.А. 2-202 + 10:00-11:30 - ИВТб-3304-05-00 Инструментальные средства проектирования компонентов вычислительной техники Лекция Семеновых В.И. 2-201; ИВТб-3304-05-00 Предметно-ориентированные автоматизированные информационные системы Лекция Прозорова Ю.А. 1-313; ИВТб-3304-05-00 Сценарное и функциональное программирование Лекция Преподаватель -.П. 1-311 + 11:45-13:15 - ИВТб-3304-05-00 Объектно-ориентированный анализ и проектирование Лекция Преподаватель -.П. 2-202; ИВТб-3304-05-00 Проектирование систем на ПЛИС Лекция Крутиков А.К. 1-313; ИВТб-3304-05-00 Разработка Web-приложений Лекция Преподаватель -.П. 1-236 + 14:00-15:30 - ИВТб-3304-05-00 Проектирование систем на ПЛИС Практическое занятие Крутиков А.К. 1-109; ИВТб-3304-05-00 Разработка Web-приложений Практическое занятие Пащенко Д.Э. 1-116 + 15:45-17:15 - <пусто> + 17:20-18:50 - <пусто> + 18:55-20:25 - <пусто> +Среда (23.09.26): 08:20-09:50 - Теория компиляторов и формальные грамматики Практическое занятие Караваева О.В. 2-201 + 10:00-11:30 - Введение в архитектуру ЭВМ Лекция Страбыкин Д.А. 1-242 + 11:45-13:15 - Архитектура операционных систем и сервисное программное обеспечение Лекция Преподаватель -.П. 1-242 + 14:00-15:30 - <пусто> + 15:45-17:15 - <пусто> + 17:20-18:50 - <пусто> + 18:55-20:25 - <пусто> +Четверг (24.09.26): 08:20-09:50 - <пусто> + 10:00-11:30 - <пусто> + 11:45-13:15 - ИВТб-3304-05-00, 01 подгруппа Элективные дисциплины (модули) по физической культуре и спорту Практическое занятие (11 131) Практическое занятие Трушкова Е.Л. 9-115; ИВТб-3304-05-00, 01 подгруппа Элективные дисциплины (модули) по физической культуре и спорту Практическое занятие (11 039) Практическое занятие Салопин О.М. 9-301 ИВТб-3304-05-00, 02 подгруппа Элективные дисциплины (модули) по физической культуре и спорту Практическое занятие (11 039) Практическое занятие Салопин О.М. 9-301; ИВТб-3304-05-00, 02 подгруппа Элективные дисциплины (модули) по физической культуре и спорту Практическое занятие (21 285) Практическое занятие Хвостенко С.Ю. 9-101; ИВТб-3304-05-00, 01 подгруппа Элективные дисциплины (модули) по физической культуре и спорту Практическое занятие (11 124) Практическое занятие Пластинина В.Б. 9-208 + 14:00-15:30 - ИВТб-3304-05-00 Объектно-ориентированный анализ и проектирование Лабораторная работа Шмакова Н.А. 2-202; ИВТб-3304-05-00 Проектирование систем на ПЛИС Лабораторная работа Крутиков А.К. 1-239; ИВТб-3304-05-00 Разработка Web-приложений Лабораторная работа Пащенко Д.Э. 1-109 + 15:45-17:15 - ИВТб-3304-05-00 Объектно-ориентированный анализ и проектирование Лабораторная работа Шмакова Н.А. 2-202; ИВТб-3304-05-00 Проектирование систем на ПЛИС Лабораторная работа Крутиков А.К. 1-239; ИВТб-3304-05-00 Разработка Web-приложений Лабораторная работа Пащенко Д.Э. 1-109 + 17:20-18:50 - <пусто> + 18:55-20:25 - <пусто> +Пятница (25.09.26): 08:20-09:50 - <пусто> + 10:00-11:30 - <пусто> + 11:45-13:15 - <пусто> + 14:00-15:30 - Теория компиляторов и формальные грамматики Лекция Мельцов В.Ю. 1-242 + 15:45-17:15 - Архитектура операционных систем и сервисное программное обеспечение Лабораторная работа Караваева О.В. 2-201 + 17:20-18:50 - Архитектура операционных систем и сервисное программное обеспечение Лабораторная работа Караваева О.В. 2-201 + 18:55-20:25 - <пусто> +Суббота (26.09.26): 08:20-09:50 - <пусто> + 10:00-11:30 - <пусто> + 11:45-13:15 - <пусто> + 14:00-15:30 - <пусто> + 15:45-17:15 - <пусто> + 17:20-18:50 - <пусто> + 18:55-20:25 - <пусто> +Воскресенье (27.09.26): 08:20-09:50 - <пусто> + 10:00-11:30 - <пусто> + 11:45-13:15 - <пусто> + 14:00-15:30 - <пусто> + 15:45-17:15 - <пусто> + 17:20-18:50 - <пусто> + 18:55-20:25 - <пусто> diff --git a/app/src/androidTest/assets/schedule.pdf b/app/src/androidTest/assets/schedule.pdf new file mode 100644 index 0000000..f2eae9f Binary files /dev/null and b/app/src/androidTest/assets/schedule.pdf differ diff --git a/app/src/test/java/agzam/vyatsu/domain/ScheduleDatesTest.kt b/app/src/test/java/agzam/vyatsu/domain/ScheduleDatesTest.kt new file mode 100644 index 0000000..5d63d8d --- /dev/null +++ b/app/src/test/java/agzam/vyatsu/domain/ScheduleDatesTest.kt @@ -0,0 +1,82 @@ +package agzam.vyatsu.domain + +import agzam.vyatsu.domain.model.Season +import org.junit.Assert.assertEquals +import org.junit.Assert.assertThrows +import org.junit.Test +import java.time.LocalDate +import java.time.format.DateTimeParseException + +class ScheduleDatesTest { + + private val firstMonday = "14092026" + + @Test + fun asDate_parsesDdMmYyyy() { + assertEquals(LocalDate.of(2026, 9, 14), ScheduleDates.asDate("14092026")) + assertEquals(LocalDate.of(2026, 9, 1), ScheduleDates.asDate("01092026")) + } + + @Test + fun asDate_wrongFormat_throws() { + assertThrows(DateTimeParseException::class.java) { + ScheduleDates.asDate("2026-09-14") + } + } + + @Test + fun dayIndexes_mondayOfFirstWeek_isZeroZero() { + assertEquals(0 to 0, ScheduleDates.dayIndexes(firstMonday, LocalDate.of(2026, 9, 14))) + } + + @Test + fun dayIndexes_tuesdayToSaturday_areSameWeek() { + assertEquals(0 to 1, ScheduleDates.dayIndexes(firstMonday, LocalDate.of(2026, 9, 15))) + assertEquals(0 to 2, ScheduleDates.dayIndexes(firstMonday, LocalDate.of(2026, 9, 16))) + assertEquals(0 to 3, ScheduleDates.dayIndexes(firstMonday, LocalDate.of(2026, 9, 17))) + assertEquals(0 to 4, ScheduleDates.dayIndexes(firstMonday, LocalDate.of(2026, 9, 18))) + assertEquals(0 to 5, ScheduleDates.dayIndexes(firstMonday, LocalDate.of(2026, 9, 19))) + } + + @Test + fun dayIndexes_sunday_movesToNextMonday() { + assertEquals(1 to 0, ScheduleDates.dayIndexes(firstMonday, LocalDate.of(2026, 9, 20))) + } + + @Test + fun dayIndexes_secondWeek() { + assertEquals(1 to 0, ScheduleDates.dayIndexes(firstMonday, LocalDate.of(2026, 9, 21))) + assertEquals(1 to 1, ScheduleDates.dayIndexes(firstMonday, LocalDate.of(2026, 9, 22))) + assertEquals(1 to 5, ScheduleDates.dayIndexes(firstMonday, LocalDate.of(2026, 9, 26))) + } + + @Test + fun dayIndexes_thirdCalendarWeek_wrapsToFirstScheduleWeek() { + assertEquals(0 to 0, ScheduleDates.dayIndexes(firstMonday, LocalDate.of(2026, 9, 28))) + } + + @Test + fun dayIndexes_dateBeforeFirstMonday_isSecondScheduleWeek() { + assertEquals(1 to 0, ScheduleDates.dayIndexes(firstMonday, LocalDate.of(2026, 9, 7))) + } + + @Test + fun dateByIndexes_composesFromFirstDate() { + assertEquals(LocalDate.of(2026, 9, 14), ScheduleDates.dateByIndexes(firstMonday, 0, 0)) + assertEquals(LocalDate.of(2026, 9, 15), ScheduleDates.dateByIndexes(firstMonday, 0, 1)) + assertEquals(LocalDate.of(2026, 9, 21), ScheduleDates.dateByIndexes(firstMonday, 1, 0)) + assertEquals(LocalDate.of(2026, 9, 27), ScheduleDates.dateByIndexes(firstMonday, 1, 6)) + } + + @Test + fun currentSeason_augustToDecember_isAutumn() { + assertEquals(Season.AUTUMN, ScheduleDates.currentSeason(LocalDate.of(2026, 8, 1))) + assertEquals(Season.AUTUMN, ScheduleDates.currentSeason(LocalDate.of(2026, 12, 31))) + } + + @Test + fun currentSeason_januaryToJuly_isSpring() { + assertEquals(Season.SPRING, ScheduleDates.currentSeason(LocalDate.of(2026, 1, 1))) + assertEquals(Season.SPRING, ScheduleDates.currentSeason(LocalDate.of(2026, 7, 31))) + } +}