LINUX.ORG.RU

Как ненапряжно автоматизировать тестирование static_assert?

 ,


0

2

Хочется покрыть тестами static_assert. Но без жести с ручным раскомментированием строк тестирования, анализом выхлопа компилятора и т.п.

Вот пример темплейта со статическими ассертами:

    template<typename Func>
    void addMethod(const std::string& name, Func func) {
        using traits = jrcpd::function_traits<decltype(func)>;
        using Ret = typename traits::return_type;
        using ArgsTuple = typename traits::argument_types;

        static_assert(!std::is_same<Ret, void>::value, "void functions not supported");

        static_assert(jrcpd::is_supported_type<Ret>::value, "Return type is not allowed");
        static_assert(jrcpd::check_all_types_supported<ArgsTuple>(), "Argument type is not allowed");

        functions[name] = [func](const JsonArray& args) -> std::string {
            try {
                if (args.size() != std::tuple_size<ArgsTuple>::value) {
                    throw std::runtime_error("Number of arguments mismatch");
                }

                // Check if each argument in JsonArray can hold the appropriate type from ArgsTuple
                if (!jrcpd::TypeChecker<ArgsTuple>::check(args)) {
                    throw std::runtime_error("Argument type mismatch");
                }

                auto tpl_args = jrcpd::from_json<ArgsTuple>(args);
                Ret result = jrcpd::apply(func, tpl_args);
                return jrcpd::generate_response(true, result);
            } catch (const std::exception& e) {
                return jrcpd::generate_response(false, e.what());
            }
        };
    }

Посоветуйте, как сейчас принято такое тестировать.

★★★★★

Для того чтобы оставить комментарий войдите или зарегистрируйтесь.