Два года назад я вкидывал в сообщество идею о библиотеке, которая умеет генерировать разные клёвые тесты. Я долго крутил идею в голове и наконец попытался что-то написать. Реализовано пока далеко не всё из того, что хочется, но то, что уже есть, я активно использую в своих задачах.
Итак, встречайте: https://github.com/ifsmirnov/jngen. Саму библиотеку (точнее, единственный хедер jngen.h) можно скачать тут.
Jngen умеет работать с массивами, деревьями и графами, а также генерировать немного строк и геометрии. Есть парсер опций командной строки и клёвая SVG-рисовалка. Можно делать, например, так.
cout << Array::id(10).shuffled().add1() << endl; // permutation of elements from 1 to 10
cout << Tree::random(100000, 20) << endl; // "long" tree with elongation 20
pair<string, string> test = rnds.antiHash({{mod1, base1}, {mod2, base2}}, "a-z", 10000); // should be self-describing :)
cout << rndg.convexPolygon(1000, 1e9) << endl;
cout << Graph::random(100000, 200000).connected() << endl;
cout << rndm.randomPrime(1e18, 1e18 - 10000000) << endl;
Практически по всему коду есть документация, есть парочка примеров.
Начать работать очень просто: если от testlib.h вы используете в генераторах только registerGen и rnd.next, то можете заменить #include "testlib.h"
на #include "jngen.h"
и не заметить разницы. Компилируется чуть дольше, но это обходится, и в итоге получается даже быстрее, чем с testlib.
Буду рад, если потыкаетесь, поделитесь ощущениями и фидбеком. Как говорится, каждый считает свой код и интерфейс идеальным, пока не покажет его публике.
Пока что в библиотеке гораздо больше "базовых" вещей и примитивов, чем "контента" – собственно стандартных тестов к задачам. Мы работаем над этим: в ближайших планах – добавление "наборов тестов", чтобы к своей задаче на, допустим, LCA-like запросы, вы могли сделать разумный тестсет буквально за несколько строк.
Кстати, большое спасибо zemen, Endagorion и Errichto за советы и обсуждения, Endagorion, GlebsHP и CherryTree за возможность потырить код посмотреть на существующие библиотеки и MikeMirzayanov за testlib, из исходников которого на первых порах зачерпнулось немало вдохновения.
Теперь не придется каждый раз писать тест генератор. А планируется ли добавить это в полигон?
казалось бы, можно её заливать в файлы с задачей и оттуда подключать.
adamant всё верно сказал, можно загрузить в Полигон в раздел resources и пользоваться. В файлы по умолчанию пока добавлять не планируется, у меня прав недостаточно :)
After a couple of requests I've added a Getting started section to the readme.
It would be better if someone builds a website based on this :)
Great work!
I already have. Checkout CF Stress
I mean, is it also possible to generate random graph testcases from CF Stress?
It is. But it's tied to a problem, since each problem will have different restrictions.
ohk got it, I was just looking for generating testcases of own requirement. But Thanks a lot for creating this awesome website.