85 lines
3.2 KiB
C++
85 lines
3.2 KiB
C++
#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
|
||
|
||
// normal:len=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
|
||
}
|