test: add Logger implementation and test coverage

This commit is contained in:
user
2026-07-18 23:41:00 +04:00
parent 428d74aeb3
commit f3b0f449b1
6 changed files with 412 additions and 0 deletions
+7
View File
@@ -0,0 +1,7 @@
#pragma once
namespace logger {
enum class LogLevel { Debug = 0, Info = 1, Error = 2 };
} // namespace logger
+122
View File
@@ -0,0 +1,122 @@
#pragma once
#include <string>
#include "log_level.hpp"
#include "result.hpp"
namespace logger {
/**
* @brief Класс для ведения журналов (логирования) в файл.
*
* Logger предоставляет интерфейс для записи сообщений с различными
* уровнями важности.
*
* Объект Logger владеет своим ресурсом и не может быть скопирован или
* перемещён, чтобы исключить неоднозначность владения журналом.
*
* Методы with* используют неизменяемый подход:
* они создают новый экземпляр Logger с изменённой конфигурацией.
*/
class Logger {
public:
/**
* @brief Создаёт объект логгера.
*
* @param fileName Имя файла, в который будут записываться сообщения.
* @param defaultLevel Уровень логирования по умолчанию.
*/
Logger(const std::string &fileName, LogLevel defaultLevel);
/**
* @brief Освобождает ресурсы, используемые логгером.
*/
~Logger();
/**
* @brief Запрещает создание копии Logger.
*
* Logger управляет уникальным ресурсом и не может иметь
* несколько владельцев.
*/
Logger(const Logger &) = delete;
/**
* @brief Запрещает копирующее присваивание.
*/
Logger &operator=(const Logger &) = delete;
/**
* @brief Запрещает перемещение Logger.
*/
Logger(Logger &&) = delete;
/**
* @brief Запрещает перемещающее присваивание.
*/
Logger &operator=(Logger &&) = delete;
/**
* @brief Записывает сообщение в журнал.
*
* В случае успешной записи возвращается успешный Status.
* При ошибке открытия файла или записи возвращается Status
* с описанием ошибки.
*
* @param level Уровень важности сообщения.
* @param message Текст сообщения.
*
* @return Статус выполнения операции.
*/
core::Status writeLog(LogLevel level, const std::string &message);
/**
* @brief Создаёт новый Logger с изменённым уровнем логирования.
*
* Текущий объект не изменяется.
*
* @param level Новый уровень логирования.
*
* @return Новый объект Logger.
*/
Logger withLogLevel(LogLevel level) const;
/**
* @brief Создаёт новый Logger с изменённым именем файла.
*
* Текущий объект не изменяется.
*
* @param fileName Новое имя файла журнала.
*
* @return Новый объект Logger.
*/
Logger withFileName(const std::string &fileName) const;
/**
* @brief Возвращает текущий уровень логирования.
*
* @return Уровень логирования.
*/
LogLevel getLogLevel() const;
/**
* @brief Возвращает имя файла журнала.
*
* @return Имя файла.
*/
const std::string &getFileName() const;
private:
/**
* @brief Имя файла журнала.
*/
std::string fileName_;
/**
* @brief Уровень логирования по умолчанию.
*/
LogLevel defaultLevel_;
};
} // namespace logger
+29
View File
@@ -0,0 +1,29 @@
// logger.cpp
#include "logger.hpp"
namespace logger {
Logger::Logger(const std::string &fileName, LogLevel defaultLevel)
: fileName_(fileName), defaultLevel_(defaultLevel) {}
Logger::~Logger() = default;
core::Status Logger::writeLog(LogLevel /*level*/,
const std::string & /*message*/) {
return core::Status::Success(true);
}
Logger Logger::withLogLevel(LogLevel level) const {
return Logger(fileName_, level);
}
Logger Logger::withFileName(const std::string &fileName) const {
return Logger(fileName, defaultLevel_);
}
LogLevel Logger::getLogLevel() const { return defaultLevel_; }
const std::string &Logger::getFileName() const { return fileName_; }
} // namespace logger