68 lines
2.0 KiB
C++
68 lines
2.0 KiB
C++
#include "fesa/analysis/analysis.h"
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
#include <filesystem>
|
|
#include <memory>
|
|
#include <type_traits>
|
|
#include <utility>
|
|
|
|
namespace {
|
|
|
|
using RunSignature =
|
|
fesa::Status (fesa::Analysis::*)(const fesa::AnalysisRequest&);
|
|
|
|
static_assert(std::has_virtual_destructor_v<fesa::Analysis>);
|
|
static_assert(std::is_abstract_v<fesa::Analysis>);
|
|
static_assert(std::is_same_v<decltype(&fesa::Analysis::Run), RunSignature>);
|
|
|
|
class StatusAnalysis final : public fesa::Analysis {
|
|
public:
|
|
StatusAnalysis(bool& destroyed, fesa::Status result)
|
|
: destroyed_{destroyed}, result_{std::move(result)} {}
|
|
|
|
~StatusAnalysis() override { destroyed_ = true; }
|
|
|
|
fesa::Status Run(const fesa::AnalysisRequest& request) override {
|
|
request_ = request;
|
|
return result_;
|
|
}
|
|
|
|
const fesa::AnalysisRequest& Request() const noexcept { return request_; }
|
|
|
|
private:
|
|
bool& destroyed_;
|
|
fesa::Status result_;
|
|
fesa::AnalysisRequest request_;
|
|
};
|
|
|
|
} // namespace
|
|
|
|
TEST(Analysis, PropagatesStatusAndDestroysThroughMinimalAnalysis) {
|
|
bool destroyed = false;
|
|
const fesa::AnalysisRequest request{"model.inp", "results.h5"};
|
|
const fesa::Status failure = fesa::Status::Failure(
|
|
fesa::FailureCategory::kSolver,
|
|
{{fesa::Severity::kError,
|
|
"analysis-test-failure",
|
|
{},
|
|
"ANALYSIS",
|
|
"",
|
|
"The concrete procedure failure must propagate unchanged."}});
|
|
|
|
auto concrete = std::make_unique<StatusAnalysis>(destroyed, failure);
|
|
StatusAnalysis* const concrete_observer = concrete.get();
|
|
std::unique_ptr<fesa::Analysis> analysis = std::move(concrete);
|
|
|
|
const fesa::Status status = analysis->Run(request);
|
|
ASSERT_FALSE(status.IsOk());
|
|
EXPECT_EQ(status.Category(), fesa::FailureCategory::kSolver);
|
|
ASSERT_EQ(status.Diagnostics().size(), 1U);
|
|
EXPECT_EQ(status.Diagnostics()[0U].code, "analysis-test-failure");
|
|
EXPECT_EQ(concrete_observer->Request().input_path, request.input_path);
|
|
EXPECT_EQ(concrete_observer->Request().output_path, request.output_path);
|
|
|
|
analysis.reset();
|
|
EXPECT_TRUE(destroyed);
|
|
}
|