Как стать автором
Обновить

Комментарии 17

Начал использовать Catch только благодаря header-only. Ваша реализация тоже выглядит достойно, возможно попробую.

isEquals — это странное название. Либо isEqual либо Equals

Согласен, промашка вышла, поправлю.
А чем так Google Test сложен? Ведь достаточно применить один раз применить скрипт:
fuse_gtest_files.py, он создаст 2 файла: cpp, hpp и можно подключать gtest к проекту станет достаточно простым делом.
Да, можно собрать и подключать в проекты, но остается вопрос простого добавления сериализатора, например, в тот же JSON. Здесь же я сделал максимально просто, чтобы можно было выдать данные в каком угодно формате. Можно или только по этой статье написать сразу простейший сериализатор, или заглянуть в один из готовых — там короткие примеры, в которых легко будет и новичку разобраться.

А почему не… ?


std::cout << serializer << core().collect() << std::endl;

collect() принимает сериализатор и говорит ему какой массив нужно преобразовать, поэтому синтаксис выше будет некорректным или просто странноватым. Как вариант, можно задать сериализатор и сделать std::cout << core() << std::endl;, но это, на мой взгляд, как-то не удобно.


Возможно, стоит переименовать метод во что-то более говорящее, но в голову не пришло такое слово.

Так меня именно это и удивляет. Почему вдруг collect() принимает сериализатор? Где core и где сериализатор? Зачем они так тесно связаны? У core должен быть некий метод, который отдаёт голенькие данные. И вот эти вот данные уже ловит сериализатор, к которому в результате выполнения первого << уже прилип std::cout. Т.е. на тот момент, когда в сериализатор попадают данные из core, он уже готов выводить их в конкретный поток. Более того, из метода, собирающего данные, можно возвращать не сразу сами данные, а просто фьючер со ссылкой на них. При раскрытии этого фьючера внутри сериализатора автоматом произойдёт отложенный сбор данных.

А, понял задумку. Хорошая идея, попробую завтра поиграться.

На почему макрос DOCK_MODULE сделан вызываемым внутри параметров лямбда функции? Почему, чисто по причине удобства (не люблю писать скобочки), не сделать вот так:

Module(u8"Some module 2", DOCK_MODULE {
    //some code
});


А сам макрос DOCK_MODULE не сделать таким:

DOCK_MODULE [](dock::_internal::Module* _dock_module)


Конечно никто мне не мешает самому написать подобную обертку, просто интересует причина подобного решения. Может быть это как-то используется, но не показано в статье?

Пробовал так делать изначально, оставались вообще фигурные скобки и то, что внутри (Module тоже ведь макрос, поэтому я могу сразу в нем все скрыть):


Module(u8"Module name", {
    // ... 
});

Но в таком варианте почему-то ломались автоотступы в VS2015/VS2017, т.е. все блоки Test были без отступов вообще. Чтобы не раздражало пришлось перейти на менее читабельный и компактный вид.

Тут просто статистика по тесту типа прошел/не прошел и все?
По моему, этого обычно мало.
Зачастую тест содержит не один ассерт, а несколько. Как понять, кто из них сработал?
Как понять, какие значения ожидались, а какие там были на самом деле?
Как вывести дополнительную информацию о контексте ассерта?

Так только старт же, по мере необходимости буду добавлять фичи :) Пока что мне нужно было что-то очень простое, что может выдавать результат в json, и эта потребность у меня закрылась. Может быть, кому-то еще пригодится такой простой движок, поэтому я и поделился им.

В итоге, это «что-то простое» превратится в большой кусок кода, который делает много вещей.
Иначе он будет мало полезен остальным.
Тогда встанет вопрос — пользоваться Вашим кодом, или протестированной либой с историей, тестами и поддержкой разных платформ, от крупного сообщества.

В любом случае, Вам — удачи, но я бы задумался над тем, чтобы попробовать заслать в апстрим то, что было нужно вместо велосипедостроения.
GTest, например, не так уж плоха.
static void isTrue(std::function<bool()> fcn);


чтобы все было пареллельно и перпендикулярно — надо позволить пользователю вычислять значение из тестируемого контекста, а не просто брать из ниоткуда?

templatestatic void isTrue(const T v, std::function<bool(const T&)> fcn = defaultIsTrueFunction());

Для std::function контекст можно и с помощью std::bind задать, но я из конкретно этого метода уже убрал std::function, оставил просто bool.

Не пойму как сделать следующее:
1. Пометить тест как skiped?
2. Запустить только те что упали в прошлый раз?
3. Запустить тесты в рандомном порядке?
4. Запустить тесты несколько раз?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории