fwt_software/tests/test_testreport.cpp

89 lines
2.8 KiB
C++

#include <doctest/doctest.h>
#include "fgc/TestReport.h"
using namespace fgc;
namespace {
TestReport makeReport() {
TestReport r;
r.ts_ms = 1719312345678LL;
r.profile = "standard";
r.host = "towerpc";
r.fw = "fgc-1.2.3";
TestSection s;
s.id = "homing";
s.title = "homing reproducibility";
s.ran = true;
s.duration_ms = 1234;
TestMetric m1;
m1.name = "yaw_lim_neg_spread"; m1.value = 12; m1.unit = "counts";
m1.has_threshold = true; m1.threshold = 80; m1.pass = true;
s.metrics.push_back(m1);
TestMetric m2;
m2.name = "home_ms_mean"; m2.value = 8200.5; m2.unit = "ms"; m2.pass = true;
s.metrics.push_back(m2);
s.pass = true;
r.sections.push_back(s);
r.all_pass = true;
return r;
}
} // namespace
TEST_CASE("formatTestReport round-trips through parseTestReport") {
TestReport r = makeReport();
std::string text = formatTestReport(r);
TestReport back = parseTestReport(text);
CHECK(back.ts_ms == r.ts_ms);
CHECK(back.profile == "standard");
CHECK(back.host == "towerpc");
CHECK(back.fw == "fgc-1.2.3");
CHECK(back.all_pass == true);
REQUIRE(back.sections.size() == 1);
CHECK(back.sections[0].id == "homing");
const TestMetric* m = back.find("homing", "yaw_lim_neg_spread");
REQUIRE(m != nullptr);
CHECK(m->value == doctest::Approx(12));
CHECK(m->unit == "counts");
const TestMetric* m2 = back.find("homing", "home_ms_mean");
REQUIRE(m2 != nullptr);
CHECK(m2->value == doctest::Approx(8200.5));
}
TEST_CASE("applyComparison computes drift and flags regressions") {
TestReport baseline = makeReport(); // yaw_lim_neg_spread = 12
TestReport prev = makeReport();
prev.sections[0].metrics[0].value = 13;
TestReport cur = makeReport();
cur.sections[0].metrics[0].value = 18; // +50% vs baseline (12)
applyComparison(cur, &baseline, &prev, /*warn_pct=*/15, /*gates=*/true);
const TestMetric* m = cur.find("homing", "yaw_lim_neg_spread");
REQUIRE(m != nullptr);
CHECK(m->has_baseline);
CHECK(m->baseline == doctest::Approx(12));
CHECK(m->has_prev);
CHECK(m->prev == doctest::Approx(13));
CHECK(m->drift_pct == doctest::Approx(50.0));
CHECK(m->drift_flag == true);
CHECK(m->pass == false); // drift gate trips the metric
CHECK(cur.sections[0].pass == false);
CHECK(cur.all_pass == false);
}
TEST_CASE("applyComparison: improvement (lower is better) does not flag") {
TestReport baseline = makeReport(); // 12
TestReport cur = makeReport();
cur.sections[0].metrics[0].value = 6; // -50%, an improvement
applyComparison(cur, &baseline, nullptr, 15, true);
const TestMetric* m = cur.find("homing", "yaw_lim_neg_spread");
REQUIRE(m != nullptr);
CHECK(m->drift_flag == false);
CHECK(m->pass == true);
}