geopro/tests/data/test_3d_repo.cpp

125 lines
4.4 KiB
C++
Raw 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 <memory>
#include <string>
#include "api/Api3dRepository.hpp"
#include "geo/GeoLocalFrame.hpp"
#include "repo/I3dSceneRepository.hpp"
#include "repo/IAsyncDatasetRepository.hpp"
#include "repo/LocalSample3dRepository.hpp"
#include "repo/LocalSampleRepository.hpp"
#include "repo/VolumeBuildParams.hpp"
using namespace geopro::data;
static const std::string kDir =
"D:/Git/lanbingtech/geopro/docs/剖面网格数据的色阶数据2等文件/";
static const std::string kCrs = "EPSG:4547";
namespace {
DsRow rowWith(const std::string& ddCode) {
DsRow r;
r.ddCode = ddCode;
return r;
}
} // namespace
// dimensionOf各 ddCode → 维度映射同步纯函数spec §6.1)。
TEST(LocalSample3dRepo, DimensionOfMapsDdCode) {
LocalSampleRepository base(kDir);
LocalSample3dRepository repo(base, kCrs, 22.0, 114.0);
EXPECT_EQ(repo.dimensionOf(rowWith("dd_voxel")), DsDimension::Dim3D);
EXPECT_EQ(repo.dimensionOf(rowWith("dd_Structual3D")), DsDimension::Dim3D);
EXPECT_EQ(repo.dimensionOf(rowWith("dd_Property3D")), DsDimension::Dim3D);
EXPECT_EQ(repo.dimensionOf(rowWith("dd_section")), DsDimension::Dim3D);
EXPECT_EQ(repo.dimensionOf(rowWith("dd_inversion_data")), DsDimension::Dim3D);
EXPECT_EQ(repo.dimensionOf(rowWith("dd_slice")), DsDimension::Analysis3D);
EXPECT_EQ(repo.dimensionOf(rowWith("dd_trajectory_data")), DsDimension::Dim2D);
EXPECT_EQ(repo.dimensionOf(rowWith("dd_unknown_xyz")), DsDimension::Other);
}
// loadVolume回调收到有效 VolumeGridnx>0 且 vmax>vmin需 PROJ_DATA。
TEST(LocalSample3dRepo, LoadVolumeCallsBackWithValidGrid) {
LocalSampleRepository base(kDir);
LocalSample3dRepository repo(base, kCrs, 22.0, 114.0);
bool ok = false;
std::string err;
VolumeGrid got;
repo.loadVolume("voxel1",
[&](VolumeGrid g, geopro::core::ColorScale) { ok = true; got = std::move(g); },
[&](const std::string& m) { err = m; });
ASSERT_TRUE(ok) << "loadVolume onErr: " << err;
EXPECT_GT(got.vol.nx(), 0);
EXPECT_GT(got.vol.ny(), 0);
EXPECT_GT(got.vol.nz(), 0);
EXPECT_GT(got.vmax, got.vmin);
EXPECT_TRUE(got.valid());
}
// loadTerrainPaths回调收到 dem/image 绝对路径(非空)。
TEST(LocalSample3dRepo, LoadTerrainPathsCallsBack) {
LocalSampleRepository base(kDir);
LocalSample3dRepository repo(base, kCrs, 22.0, 114.0);
bool ok = false;
TerrainPaths got;
repo.loadTerrainPaths([&](TerrainPaths p) { ok = true; got = std::move(p); },
[&](const std::string&) {});
ASSERT_TRUE(ok);
EXPECT_FALSE(got.demPath.empty());
EXPECT_FALSE(got.imagePath.empty());
}
namespace {
// 极简桩volumeInfo/createVolume 不触碰 dsRepo_loadAsync 直接回空。
struct StubAsyncRepo : IAsyncDatasetRepository {
DetailLoad* loadAsync(const std::string&, const std::string&, int, int) override {
return nullptr;
}
};
} // namespace
// volumeInfocreateVolume 后、loadVolume 前 → 返回 true参数/名称正确loaded=false、无测点数。
TEST(Api3dRepo, VolumeInfoBeforeLoad) {
StubAsyncRepo dsRepo;
auto frame = std::make_shared<geopro::core::GeoLocalFrame>(22.0, 114.0);
Api3dRepository repo(dsRepo, frame);
VolumeBuildParams p;
p.sourceDatasetIds = {"src-a", "src-b"};
p.interpModel = VolumeBuildParams::Model::Idw;
p.cellXY = 2.0;
p.cellZ = 0.5;
p.power = 3.0;
p.maxDist = 5.0;
p.colorScaleId = "src-a";
const std::string id = repo.createVolume(p, "体A");
Api3dRepository::VolumeInfo info;
ASSERT_TRUE(repo.volumeInfo(id, info));
EXPECT_EQ(info.name, "体A");
EXPECT_FALSE(info.loaded);
EXPECT_EQ(info.pointCount, 0u);
ASSERT_EQ(info.params.sourceDatasetIds.size(), 2u);
EXPECT_EQ(info.params.sourceDatasetIds[0], "src-a");
EXPECT_DOUBLE_EQ(info.params.cellXY, 2.0);
EXPECT_DOUBLE_EQ(info.params.power, 3.0);
EXPECT_DOUBLE_EQ(info.params.maxDist, 5.0);
EXPECT_EQ(info.params.colorScaleId, "src-a");
}
// volumeInfo未知 dsId非三维体→ 返回 false不弹空对话框。
TEST(Api3dRepo, VolumeInfoUnknownIdReturnsFalse) {
StubAsyncRepo dsRepo;
auto frame = std::make_shared<geopro::core::GeoLocalFrame>(22.0, 114.0);
Api3dRepository repo(dsRepo, frame);
Api3dRepository::VolumeInfo info;
EXPECT_FALSE(repo.volumeInfo("not-a-volume", info));
}