Skip to content

Commit 483b931

Browse files
committed
improved behavior (preserve numerical type if gathering native levelist) + tests
1 parent 3e3b89c commit 483b931

File tree

5 files changed

+100
-8
lines changed

5 files changed

+100
-8
lines changed

src/metkit/codes/GRIBDecoder.cc

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,22 +57,23 @@ void GRIBDecoder::getMetadata(const eckit::message::Message& msg, eckit::message
5757
continue;
5858
}
5959

60-
if (k.name() == "levelist") {
61-
eckit::Translator<double, std::string> t;
62-
gather.setValue(name, t(k.getDouble()));
63-
continue;
64-
}
65-
6660
switch (options.valueRepresentation) {
6761
case eckit::message::ValueRepresentation::String: {
68-
gather.setValue(name, k.getString());
62+
if (k.name() == "levelist") {
63+
eckit::Translator<double, std::string> t;
64+
gather.setValue(name, t(k.getDouble()));
65+
}
66+
else { gather.setValue(name, k.getString()); }
6967
break;
7068
}
7169
case eckit::message::ValueRepresentation::Native: {
7270
std::visit(
7371
[&](auto&& v) {
7472
using Type = std::decay_t<decltype(v)>;
75-
if constexpr (std::is_same_v<Type, std::string> || std::is_arithmetic_v<Type>) {
73+
if (k.name() == "levelist") {
74+
gather.setValue(name, k.getDouble());
75+
}
76+
else if constexpr (std::is_same_v<Type, std::string> || std::is_arithmetic_v<Type>) {
7677
gather.setValue(name, std::forward<decltype(v)>(v));
7778
}
7879
else if constexpr (std::is_same_v<Type, std::vector<uint8_t>>) {

tests/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ ecbuild_get_test_multidata( TARGET metkit_get_odb_data
2525
multiodb2.odb
2626
NOCHECK )
2727

28+
configure_file(pl.grib pl.grib COPYONLY)
29+
configure_file(sol.grib sol.grib COPYONLY)
30+
2831
add_custom_target(soft_link_expand_test_data ALL
2932
COMMAND ${CMAKE_COMMAND} -E create_symlink "${CMAKE_CURRENT_SOURCE_DIR}/expand" "${CMAKE_CURRENT_BINARY_DIR}/expand")
3033

tests/pl.grib

3.05 KB
Binary file not shown.

tests/sol.grib

7.03 KB
Binary file not shown.

tests/test_codes_decoder.cc

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <vector>
1717

1818
#include "eckit/config/LocalConfiguration.h"
19+
#include "eckit/io/FileHandle.h"
1920
#include "eckit/io/MemoryHandle.h"
2021
#include "eckit/message/Message.h"
2122
#include "eckit/message/Reader.h"
@@ -454,6 +455,93 @@ CASE("test codessplitter unstr_latlot.tmpl String") {
454455
}
455456
}
456457

458+
CASE("test levelist String") {
459+
eckit::FileHandle f("pl.grib");
460+
461+
eckit::message::Reader reader(f);
462+
eckit::message::Message msg;
463+
464+
std::vector<std::string> expect{"0", "0.02", "0.2", "2", "20", "200"};
465+
for (size_t i = 0; i < expect.size(); ++i) {
466+
msg = reader.next();
467+
EXPECT(msg);
468+
469+
MetadataSetter md;
470+
eckit::message::TypedSetter<MetadataSetter> gatherer{md};
471+
eckit::message::GetMetadataOptions mdOpts{};
472+
mdOpts.valueRepresentation = eckit::message::ValueRepresentation::String;
473+
msg.getMetadata(gatherer, mdOpts);
474+
{ MD_EXPECT_STRING(md, "levelist", expect[i]); }
475+
}
476+
msg = reader.next();
477+
EXPECT(!msg);
478+
}
479+
480+
CASE("test levelist Native") {
481+
eckit::FileHandle f("pl.grib");
482+
483+
eckit::message::Reader reader(f);
484+
eckit::message::Message msg;
485+
486+
std::vector<double> expect{0, 0.02, 0.2, 2, 20, 200};
487+
for (size_t i = 0; i < expect.size(); ++i) {
488+
msg = reader.next();
489+
EXPECT(msg);
490+
491+
MetadataSetter md;
492+
eckit::message::TypedSetter<MetadataSetter> gatherer{md};
493+
eckit::message::GetMetadataOptions mdOpts{};
494+
mdOpts.valueRepresentation = eckit::message::ValueRepresentation::Native;
495+
msg.getMetadata(gatherer, mdOpts);
496+
{ MD_EXPECT_DOUBLE(md, "levelist", expect[i]); }
497+
}
498+
msg = reader.next();
499+
EXPECT(!msg);
500+
}
501+
502+
CASE("test levelist String") {
503+
eckit::FileHandle f("sol.grib");
504+
505+
eckit::message::Reader reader(f);
506+
eckit::message::Message msg;
507+
508+
std::vector<std::string> expect{"0.02", "0.2", "2", "20"};
509+
for (size_t i = 0; i < expect.size(); ++i) {
510+
msg = reader.next();
511+
EXPECT(msg);
512+
513+
MetadataSetter md;
514+
eckit::message::TypedSetter<MetadataSetter> gatherer{md};
515+
eckit::message::GetMetadataOptions mdOpts{};
516+
mdOpts.valueRepresentation = eckit::message::ValueRepresentation::String;
517+
msg.getMetadata(gatherer, mdOpts);
518+
{ MD_EXPECT_STRING(md, "levelist", expect[i]); }
519+
}
520+
msg = reader.next();
521+
EXPECT(!msg);
522+
}
523+
524+
CASE("test levelist Native") {
525+
eckit::FileHandle f("sol.grib");
526+
527+
eckit::message::Reader reader(f);
528+
eckit::message::Message msg;
529+
530+
std::vector<double> expect{0.02, 0.2, 2, 20};
531+
for (size_t i = 0; i < expect.size(); ++i) {
532+
msg = reader.next();
533+
EXPECT(msg);
534+
535+
MetadataSetter md;
536+
eckit::message::TypedSetter<MetadataSetter> gatherer{md};
537+
eckit::message::GetMetadataOptions mdOpts{};
538+
mdOpts.valueRepresentation = eckit::message::ValueRepresentation::Native;
539+
msg.getMetadata(gatherer, mdOpts);
540+
{ MD_EXPECT_DOUBLE(md, "levelist", expect[i]); }
541+
}
542+
msg = reader.next();
543+
EXPECT(!msg);
544+
}
457545

458546
//----------------------------------------------------------------------------------------------------------------------
459547

0 commit comments

Comments
 (0)