11 #include "eckit/io/Buffer.h"
12 #include "eckit/io/DataHandle.h"
13 #include "eckit/io/MemoryHandle.h"
14 #include "eckit/testing/Test.h"
23 using namespace eckit::testing;
55 columns_[0]->name(
"a-col");
57 columns_[0]->hasMissing(
false);
62 double*
data() {
return &data_; }
65 if (nRows_ == 0)
return false;
67 if (nRows_ == 0) noMore_ =
true;
106 CASE(
"The constant integer codec stores a constant integer") {
110 eckit::Buffer buf(4096);
112 eckit::MemoryHandle writeDH(buf);
125 eckit::MemoryHandle dh(buf.data(),
static_cast<size_t>(writeDH.position()));
132 EXPECT(it->
columns()[0]->name() ==
"a-col");
135 for ( ; it != end; ++it) {
144 EXPECT(it->
columns()[0]->coder().name() ==
"constant");
150 CASE(
"The constant codec can also store strings") {
154 eckit::Buffer buf(4096);
156 eckit::MemoryHandle writeDH(buf);
169 eckit::MemoryHandle dh(buf.data(),
static_cast<size_t>(writeDH.position()));
176 EXPECT(it->
columns()[0]->name() ==
"a-col");
179 for ( ; it != end; ++it) {
180 double val = (*it)[0];
188 EXPECT(it->
columns()[0]->coder().name() ==
"constant_string");
194 CASE(
"The constant codec can also store doubles") {
196 const double constant_value = -987654321.4321e-34;
202 for (
size_t i = 0;
i < 2;
i++) {
208 eckit::Buffer buf(4096);
210 eckit::MemoryHandle writeDH(buf);
221 (*outit)[0] = constant_value;
229 eckit::MemoryHandle dh(buf.data(),
static_cast<size_t>(writeDH.position()));
236 EXPECT(it->
columns()[0]->name() ==
"abcdefg");
239 for ( ; it != end; ++it) {
240 double val = (*it)[0];
241 EXPECT(
val == constant_value);
248 EXPECT(it->
columns()[0]->coder().name() ==
"constant");
255 CASE(
"Missing values are encoded and decoded correctly") {
259 typedef std::map<std::string, std::pair<double, int> > MapType;
260 MapType codec_value_map;
262 codec_value_map[
"short_real"] = std::make_pair(
odc::MDI::realMDI(),
sizeof(
float));
263 codec_value_map[
"short_real2"] = std::make_pair(
odc::MDI::realMDI(),
sizeof(
float));
264 codec_value_map[
"long_real"] = std::make_pair(
odc::MDI::realMDI(),
sizeof(
double));
268 for (MapType::const_iterator it = codec_value_map.begin(); it != codec_value_map.end(); ++it) {
270 const std::string& codec_name(it->first);
272 int encoded_size = it->second.second;
278 EXPECT(
c->name() == codec_name);
282 unsigned char buffer[256];
286 EXPECT((next_pos - buffer) == encoded_size);
291 c->setDataStream(ds);
296 ASSERT(ds.
position() == eckit::Offset(encoded_size));
304 int main(
int argc,
char* argv[]) {
305 return run_tests(argc, argv);
static void count(void *counter, const double *data, size_t n)
odc::core::MetaData & columns()
odc::core::MetaData columns_
MockReadIterator(odc::api::ColumnType type, double data)
odc::api::ColumnType type_
static double integerMDI()
void setNumberOfColumns(size_t n)
unsigned long pass1(T b, const T e)
const core::MetaData & columns() const
int setColumn(size_t index, const std::string &name, api::ColumnType type)
static CodecFactory & instance()
eckit::Offset position() const
const char * const_string_1
const long the_const_value
const int num_rows_to_write
MockReadIteratorConstInt()
MockReadIteratorConstString1()
int main(int argc, char *argv[])
CASE("The constant integer codec stores a constant integer")