50 lines
1.9 KiB
C++
50 lines
1.9 KiB
C++
#include "io/gpr/IprbReader.hpp"
|
||
#include "io/gpr/IprHeader.hpp"
|
||
#include <gtest/gtest.h>
|
||
#include <fstream>
|
||
#include <cstdio>
|
||
namespace {
|
||
std::string writeTmp(const std::vector<int16_t>& v) {
|
||
std::string p = std::tmpnam(nullptr);
|
||
std::ofstream f(p, std::ios::binary);
|
||
f.write(reinterpret_cast<const char*>(v.data()),
|
||
static_cast<std::streamsize>(v.size()*sizeof(int16_t)));
|
||
return p;
|
||
}
|
||
}
|
||
using namespace geopro::io::gpr;
|
||
TEST(IprbReader, ReadsInt16AndLayout) {
|
||
std::vector<int16_t> raw{0,1,2, 10,11,12, 20,21,22, 30,31,32}; // 4 道×3 采样
|
||
auto path = writeTmp(raw);
|
||
IprHeader h{}; h.samples = 3; h.lastTrace = 3; // traces = 4
|
||
auto b = readIprb(path, h);
|
||
EXPECT_EQ(b.samples, 3);
|
||
EXPECT_EQ(b.traces, 4);
|
||
EXPECT_EQ(b.data.size(), 12u);
|
||
EXPECT_EQ(b.data[1*3 + 2], 12); // 第1道第2采样
|
||
std::remove(path.c_str());
|
||
}
|
||
TEST(IprbReader, ThrowsOnSizeMismatch) {
|
||
std::vector<int16_t> raw{0,1,2,3,4}; // 5 个,非 samples 整数倍 → 抛
|
||
auto path = writeTmp(raw);
|
||
IprHeader h{}; h.samples = 3; h.lastTrace = 3; // 5*2=10, 10%6!=0
|
||
EXPECT_THROW(readIprb(path, h), std::runtime_error);
|
||
std::remove(path.c_str());
|
||
}
|
||
// 真实数据规律:LAST TRACE=N 但文件恰含 N 道(非 N+1)。
|
||
// 文件大小为权威 → traces 应等于文件实含道数 N,而非 N+1。
|
||
TEST(IprbReader, FileSizeIsAuthoritativeNotLastTracePlusOne) {
|
||
// 4 道×3 采样 = 12 个 int16,文件恰含 4 道。
|
||
std::vector<int16_t> raw{0,1,2, 10,11,12, 20,21,22, 30,31,32};
|
||
auto path = writeTmp(raw);
|
||
IprHeader h{}; h.samples = 3; h.lastTrace = 4; // 假设 +1 会得 5 道(错)
|
||
auto b = readIprb(path, h);
|
||
EXPECT_EQ(b.traces, 4); // 以文件大小为准 → 4,复刻真实数据 traces==lastTrace 规律
|
||
EXPECT_EQ(b.data.size(), 12u);
|
||
std::remove(path.c_str());
|
||
}
|
||
TEST(IprbReader, ThrowsOnMissingFile) {
|
||
IprHeader h{}; h.samples = 3; h.lastTrace = 3;
|
||
EXPECT_THROW(readIprb("____no_such_file____.iprb", h), std::runtime_error);
|
||
}
|