#include #include #include #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:回调收到有效 VolumeGrid(nx>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 // volumeInfo:createVolume 后、loadVolume 前 → 返回 true,参数/名称正确,loaded=false、无测点数。 TEST(Api3dRepo, VolumeInfoBeforeLoad) { StubAsyncRepo dsRepo; auto frame = std::make_shared(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(22.0, 114.0); Api3dRepository repo(dsRepo, frame); Api3dRepository::VolumeInfo info; EXPECT_FALSE(repo.volumeInfo("not-a-volume", info)); }