/*
 * This content is released under the MIT License as specified in
 * https://raw.githubusercontent.com/gabime/spdlog/master/LICENSE
 */
#include "includes.h"
#include "test_sink.h"
#include "spdlog/sinks/callback_sink.h"
#include "spdlog/async.h"
#include "spdlog/common.h"

TEST_CASE("custom_callback_logger", "[custom_callback_logger]") {
    std::vector<std::string> lines;
    spdlog::pattern_formatter formatter;
    auto callback_logger =
        std::make_shared<spdlog::sinks::callback_sink_st>([&](const spdlog::details::log_msg &msg) {
            spdlog::memory_buf_t formatted;
            formatter.format(msg, formatted);
            auto eol_len = strlen(spdlog::details::os::default_eol);
            using diff_t =
                typename std::iterator_traits<decltype(formatted.end())>::difference_type;
            lines.emplace_back(formatted.begin(), formatted.end() - static_cast<diff_t>(eol_len));
        });
    std::shared_ptr<spdlog::sinks::test_sink_st> test_sink(new spdlog::sinks::test_sink_st);

    spdlog::logger logger("test-callback", {callback_logger, test_sink});

    logger.info("test message 1");
    logger.info("test message 2");
    logger.info("test message 3");

    std::vector<std::string> ref_lines = test_sink->lines();

    REQUIRE(lines[0] == ref_lines[0]);
    REQUIRE(lines[1] == ref_lines[1]);
    REQUIRE(lines[2] == ref_lines[2]);
    spdlog::drop_all();
}
