Этот репозиторий содержит пошаговую учебную задачу по теме «Классы» в C#. Вы будете моделировать рост томатов на кусте, последовательно реализуя функционал и проверяя его с помощью юнит-тестов.
- ✍️ Реализуйте код: Откройте проект
Appи найдите классыTomatoиBush. Ваша задача — реализовать методы, которые сейчас выбрасываютNotImplementedException. - 🧪 Запустите тесты: Откройте проект
App.Tests. После реализации каждого этапа запускайте соответствующие тесты — они должны стать «зелёными». - ➡️ Двигайтесь поэтапно: Не пытайтесь сделать всё сразу. Реализуйте Этап 1, добейтесь прохождения его тестов, и только потом переходите к Этапу 2.
💡 Важно: Изначально все тесты падают. Это ожидаемое поведение. Ваша цель — последовательно "починить" их своей реализацией.
Ниже описаны все этапы задачи. Разворачивайте каждый этап по мере готовности к его реализации.
Этап 1 (Обязательный) — Базовые классы Tomato и Bush
- Свойство:
State(типint) — состояние зрелости томата. Начальное значение —1. - Метод:
Grow()— увеличиваетStateна 1. Если состояние достигло5, оно больше не меняется. - Метод:
ToString()— должен возвращать JSON-подобную строку, например:{ "state": 1 }.
- Свойство:
Tomatoes— список томатов на кусте. - Метод:
Grow()— запускает рост всего куста. - Приватный метод:
GrowAll()— вызывает методGrow()у каждого томата в спискеTomatoes. Должен вызываться из публичного методаGrow(). - Метод:
ToString()— должен возвращать строку со списком всех томатов, например:{ "tomatoes": [ { "state": 1 }, { "state": 2 } ] }.
Этап 2 (Обязательный) — Появление новых томатов
- Приватный метод:
NewTomato()— с вероятностью 30% добавляет в списокTomatoesновый томат (new Tomato()). Этот метод также должен вызываться изGrow().
Примечание о тестируемости: Для предсказуемости тестов класс
Bushполучает зависимостьIRandom. В тестах мы подменяем её фейковым генератором, который всегда выдаёт нужные значения.
Этап 3 (Обязательный) — Сбор урожая
- Изменить логику
Grow(): Состояния томата теперь меняются по схеме1-2-3-4-5-5-5-6. Томат "задерживается" на состоянии5три полных цикла роста, прежде чем перейти в состояние6.
- Приватный метод:
RemoveTomatoes()— удаляет из спискаTomatoesвсе томаты, которые достигли состояния6(созрели для сбора). Этот метод также должен вызываться изGrow().
⭐ Этап 4 (Дополнительный) — Случайный рост
- Приватный метод:
RandomGrow()— реализует более сложную логику роста:- За один вызов
Grow()должен вырасти не весь куст, а случайное количество случайных томатов. - Если на кусте
Nтоматов, должно вырасти от1доNштук. - Один и тот же томат не может быть выбран для роста дважды за один вызов.
- За один вызов
- Изменить логику
Grow(): вызовRandomGrow()должен заменить собой вызовGrowAll().
/App
/Tomato.cs # Класс томата (здесь вы работаете)
/Bush.cs # Класс куста (и здесь)
/IRandom.cs # Интерфейс для тестируемости
/App.Tests
/Stage1_Tests.cs # Тесты для Этапа 1
/Stage2_Tests.cs # Тесты для Этапа 2
# ... и так далее