Блог пользователя freepvps

Автор freepvps, 10 лет назад, По-русски

Предыстория

Не так давно мне потребовалось запустить несколько контестов, да вот беда: пишу я преимущественно на C#, а каждый раз писать уйму кода для генератора тестов, чекера и валидатора под каждую задачу — идея так себе.

У проблемы я видел два решения: писать все на C++ или писать свой testlib. Первый вариант я решил не использовать(хотя и знаю C++), так как не нравится мне идея перепрыгивать на другой язык ради всего-лишь одной библиотеки. Вообщем, было решено изобрести велосипед, но из другого материала. Написано все было за пару вечеров, но в итоге библиотека свою задачу выполняла, а мне этого на тот момент хватало за глаза.

Затем хорошие люди меня поддержали меня и порекомендовали опубликовать этот проект на Codeforces.

Описание библиотеки

Библиотеку можно разбить на три раздела:

  • Delegates

  • IO

  • Testing

Delegates содержит в себе множество, вообщем-то, делегатов, используемых для всяких разных целей. Ничего примечательного в этом разделе нет, разве что можно выделить CompactReadDelegate

public delegate CompactReadDelegate<T> CompactReadDelegate<T>(out T value);

Это универсальный делегат, добавленный ради эксперимента. Он используется в единственной функции

public CompactReadDelegate<T> r<T>(out T value)
{
    // r(out a)(out b)(out c) - читаем данные в переменные одного типа a, b, c
    value = ReadData<T>();
    return r;
}

IO — наверное наиболее интересный раздел, в располагаются классы Input и Output. Эти классы — надстройка над TextReader и TextWriter, позволяющая читать не только текст, но и любые другие данные, пропуская при этом белое пространство(white space — пробелы, переносы строк и прочие невидимые символы). Вообщем-то ради них все и затевалось.

Testing — все, что связано с тестами и тестированием. Тут я хочу выделить такие классы, как TestChecker, TestGenerator и Checkers

TestChecker — небольшая обертка над функцией-чекером-валидатором. Да-да, я решил не использовать валидатор отдельно от чекера, ведь можно просто в процессе проверки ответа перехватить исключение и вернуть PE в по завершению(хотя из-за этого возник небольшой костыль, который в будущем планирую исправить)

TestGenerator — принимает функцию-генератор тесты и функцию-решение. Затем генерирует тест по каким-то входным данным, генерирует на основе теста решение и записывает по заданному заранее паттерну в соответствующие файлы.

Checkers — шаблоны для сравнения пары данных какого-либо типа, а так же пары массивов данных какого-либо типа.

Планы на будущее

Больших планов пока нет, хочу лишь переписать TestGenerator и избавиться от концепции "одна программа — множество тестов". Так же хочу услышать рекомендации и советы сообщества.

GitHub

Полный текст и комментарии »

  • Проголосовать: нравится
  • +8
  • Проголосовать: не нравится