geopro/tests/app/test_contour_levels.cpp

85 lines
3.2 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <gtest/gtest.h>
#include <algorithm>
#include <vector>
#include "ContourLevels.hpp"
using geopro::app::ContourLevelParams;
using geopro::app::generateContourLevels;
namespace {
ContourLevelParams normal(double mn, double mx, double interval) {
ContourLevelParams p;
p.method = ContourLevelParams::Method::Normal;
p.minValue = mn;
p.maxValue = mx;
p.interval = interval;
return p;
}
} // namespace
// normallen=ceil((max-min)/间隔),等距升序,首=min末<max不含 max复刻原版
TEST(ContourLevels, NormalEvenSpacing) {
auto lv = generateContourLevels(normal(0.0, 10.0, 2.0), {});
ASSERT_EQ(lv.size(), 5u); // ceil(10/2)=5
EXPECT_DOUBLE_EQ(lv.front(), 0.0);
EXPECT_DOUBLE_EQ(lv[1], 2.0);
EXPECT_DOUBLE_EQ(lv.back(), 8.0); // 0,2,4,6,8不含 10
}
// normal不整除时向上取整层数。
TEST(ContourLevels, NormalCeilLayerCount) {
auto lv = generateContourLevels(normal(0.0, 10.0, 3.0), {});
EXPECT_EQ(lv.size(), 4u); // ceil(10/3)=4 → 0,3,6,9
EXPECT_DOUBLE_EQ(lv.back(), 9.0);
}
// normal 非法间隔 → 空。
TEST(ContourLevels, NormalInvalidIntervalEmpty) {
EXPECT_TRUE(generateContourLevels(normal(0.0, 10.0, 0.0), {}).empty());
EXPECT_TRUE(generateContourLevels(normal(10.0, 0.0, 2.0), {}).empty());
}
// logarithmic升序、末=max跨数量级细分。注原版会把 [A,1] 区间细分值(<min也压入
// 故 front 可能 < min此为复刻的真实行为仅校验升序 + 含 min + 末=max。
TEST(ContourLevels, LogarithmicSortedSpansRange) {
ContourLevelParams p;
p.method = ContourLevelParams::Method::Logarithmic;
p.minValue = 1.0;
p.maxValue = 1000.0;
p.logLinesCount = 4;
auto lv = generateContourLevels(p, {});
ASSERT_GE(lv.size(), 2u);
EXPECT_DOUBLE_EQ(lv.back(), 1000.0);
for (std::size_t i = 1; i < lv.size(); ++i) EXPECT_LE(lv[i - 1], lv[i]); // 升序
EXPECT_NE(std::find(lv.begin(), lv.end(), 1.0), lv.end()); // 含 min
}
// equalArea样本充足 → 分位(升序、个数=层数、覆盖到最大值)。
TEST(ContourLevels, EqualAreaQuantilesFromSamples) {
ContourLevelParams p;
p.method = ContourLevelParams::Method::EqualArea;
p.equalAreaLayerCount = 4;
std::vector<double> samples;
for (int i = 0; i < 100; ++i) samples.push_back(static_cast<double>(i)); // 0..99
auto lv = generateContourLevels(p, samples);
ASSERT_EQ(lv.size(), 4u); // 3 个分位 + 最大值
EXPECT_DOUBLE_EQ(lv.front(), 0.0); // 第 0 分位
EXPECT_DOUBLE_EQ(lv.back(), 99.0); // 含最大值
for (std::size_t i = 1; i < lv.size(); ++i) EXPECT_LE(lv[i - 1], lv[i]);
}
// equalArea样本不足 → 退化等距线性(复刻原版失败兜底)。
TEST(ContourLevels, EqualAreaFallbackLinearWhenSamplesScarce) {
ContourLevelParams p;
p.method = ContourLevelParams::Method::EqualArea;
p.equalAreaLayerCount = 5;
p.minValue = 0.0;
p.maxValue = 10.0;
auto lv = generateContourLevels(p, {1.0, 2.0}); // 仅 2 个样本 < 5
ASSERT_EQ(lv.size(), 5u);
EXPECT_DOUBLE_EQ(lv.front(), 0.0);
EXPECT_DOUBLE_EQ(lv[1], 2.0); // step=10/5=2
}