В selftest от SoFCheck есть одна небольшая проблема: он полностью рассчитан на псевдолегальный генератор, и поэтому он пишет в лог все псевдолегальные ходы. Это не годится для сравнения с другими шахматными крейтами на Rust, поскольку они генерируют только полностью легальные ходы. Поэтому реализацию selftest пришлось сначала немного переписать, а потом уже портировать на Rust
Еще одна проблема — selftest полагается на функцию наподобие is_cell_attacked, которая проверяет, правда ли поле пробивается противником. В крейте chess такой функции не оказалось (там есть только проверка на шах королю), поэтому пришлось дописать ее руками, а также добавить возможность собрать selftest без использования этой функции
Как я писал выше в канале, selftest позволяет запускать произвольный код для каждой доски, чтобы можно было проверять всякие внутренние инварианты. Эта возможность теперь есть и в owlchess :)
Еще один шаг: добавил запуск selftest'ов в CI, чтобы при коммитах убеждаться, что я не поломал реализацию. В CI все работает просто: я скачиваю репозиторий
chess_bench (в котором и реализован selftest), подменяю пакет owlchess на локальный и запускаю тесты. Правда, selftest'ы бегут примерно 12 минут (в SoFCheck'е, напомню, они работали примерно 5 минут). И дело не в том, что Rust принципиально медленнее: просто owlchess проверяет больше инвариантов. Например, он пробует сконвертировать все ходы в SAN и обратно, чтобы убедиться, что чтение и запись SAN — взаимообратные операции