композиции приложения потребовал
F[_] : Concurrent: Timer
Собственно с тестированием таймера возникли сложности. Единственное что пришло в голову это сделать таймер для тестов у которого sleep будет просто инкрементить приватный внутренний атомик. Но есть у меня сильное подозрение, что идея эта очень такая себе.
Я как раз сейчас работаю над похожей штукой
Идея симулировать конкурентные эффекты в SyncIO, все задачи кидать в глобальную очередь. Вручную следить за набором работающих файберов и обрабатывать синхронно же брекеты. И держать приоритетную очередь задач на пробуждение после sleep. Ну и когда все файберы в режиме ожидания и задач в очереди нет - брать ближайшую задачу на пробуждение в определённый момент и сдвигать "глобальное время" на этот момент. Т.е. будут такие моковые инстансы Concurrent, ContextShift и Timer. В конце можно получить конечное время, но можно и дедлок
Можно попробовать заюзать TestContext из cats-laws https://github.com/typelevel/cats-effect/blob/fffb01758a29870f62146e22d1020c14a71db79b/laws/shared/src/main/scala/cats/effect/laws/util/TestContext.scala
сделать реализацию с виртуальным временем. Внутри - long а-ля текущее время и очередь засабмиченных тасок с временем их выполнения
Обсуждают сегодня