1 #ifndef DBALLE_TESTS_WR_EXPORT_H
2 #define DBALLE_TESTS_WR_EXPORT_H
10 typedef dballe::tests::MessageTweaker Tweaker;
16 auto_ptr<Bulletin> exported;
17 msg::Importer::Options input_opts;
18 msg::Exporter::Options output_opts;
19 vector<Tweaker*> tweaks;
20 vector<Tweaker*> ecmwf_tweaks;
21 vector<Tweaker*> wmo_tweaks;
24 bool do_ignore_context_attrs;
25 bool do_round_geopotential;
30 for (
typename vector<Tweaker*>::iterator i = tweaks.begin();
31 i != tweaks.end(); ++i)
34 for (
typename vector<Tweaker*>::iterator i = ecmwf_tweaks.begin();
35 i != ecmwf_tweaks.end(); ++i)
38 for (
typename vector<Tweaker*>::iterator i = wmo_tweaks.begin();
39 i != wmo_tweaks.end(); ++i)
44 ReimportTest(
const std::string& fname, Encoding type=BUFR)
45 : fname(fname), type(type), do_ecmwf_tweaks(false), do_wmo_tweaks(false),
46 do_ignore_context_attrs(false), do_round_geopotential(false), verbose(false)
48 ecmwf_tweaks.push_back(
new StripQCAttrs());
49 wmo_tweaks.push_back(
new RoundLegacyVars());
56 void do_test(
const dballe::tests::Location& loc,
const char* tname1,
const char* tname2=NULL)
58 if (verbose) cerr <<
"Running test " << loc.locstr() << endl;
60 std::auto_ptr<msg::Importer> importer(msg::Importer::create(type, input_opts));
63 if (verbose) cerr <<
"Importing " << fname <<
" " << input_opts.to_string() << endl;
64 msgs1 = inner_read_msgs_opts(fname.c_str(), type, input_opts);
65 inner_ensure(msgs1->size() > 0);
68 for (
typename vector<Tweaker*>::iterator i = tweaks.begin(); i != tweaks.end(); ++i)
70 if (verbose) cerr <<
"Running tweak " << (*i)->desc() << endl;
74 for (
typename vector<Tweaker*>::iterator i = ecmwf_tweaks.begin(); i != ecmwf_tweaks.end(); ++i)
76 if (verbose) cerr <<
"Running ecmwf tweak " << (*i)->desc() << endl;
80 for (
typename vector<Tweaker*>::iterator i = wmo_tweaks.begin(); i != wmo_tweaks.end(); ++i)
82 if (verbose) cerr <<
"Running wmo tweak " << (*i)->desc() << endl;
87 exported.reset(B::create().release());
90 output_opts.template_name = tname1;
92 output_opts.template_name.clear();
93 if (verbose) cerr <<
"Exporting " << output_opts.to_string() << endl;
94 std::auto_ptr<msg::Exporter> exporter(msg::Exporter::create(type, output_opts));
95 exporter->to_bulletin(*msgs1, *exported);
96 }
catch (std::exception& e) {
97 dballe::tests::dump(
"bul1", *exported);
98 dballe::tests::dump(
"msg1", *msgs1);
99 throw tut::failure(loc.msg(
string(
"exporting to bulletin (first template): ") + e.what()));
105 exported->encode(rawmsg);
107 }
catch (std::exception& e) {
108 dballe::tests::dump(
"bul1", *exported);
109 dballe::tests::dump(
"msg1", *msgs1);
110 throw tut::failure(loc.msg(
string(
"encoding to rawmsg (first template): ") + e.what()));
114 if (verbose) cerr <<
"Reimporting " << input_opts.to_string() << endl;
115 msgs2.reset(
new Msgs);
117 importer->from_rawmsg(rawmsg, *msgs2);
118 }
catch (std::exception& e) {
119 dballe::tests::dump(
"msg1", *msgs1);
120 dballe::tests::dump(
"msg", rawmsg);
121 throw tut::failure(loc.msg(
string(
"importing from rawmsg (first template): ") + e.what()));
124 auto_ptr<Msgs> msgs3;
128 auto_ptr<Bulletin> bulletin(B::create());
130 output_opts.template_name = tname2;
131 if (verbose) cerr <<
"Reexporting " << output_opts.to_string() << endl;
132 std::auto_ptr<msg::Exporter> exporter(msg::Exporter::create(type, output_opts));
133 exporter->to_bulletin(*msgs2, *bulletin);
134 }
catch (std::exception& e) {
135 dballe::tests::dump(
"bul2", *bulletin);
136 dballe::tests::dump(
"msg2", *msgs1);
137 throw tut::failure(loc.msg(
string(
"exporting to bulletin (second template): ") + e.what()));
143 bulletin->encode(rawmsg);
145 }
catch (std::exception& e) {
146 dballe::tests::dump(
"bul2", *bulletin);
147 dballe::tests::dump(
"msg2", *msgs1);
148 throw tut::failure(loc.msg(
string(
"encoding to rawmsg (second template): ") + e.what()));
152 msgs3.reset(
new Msgs);
154 if (verbose) cerr <<
"Reimporting " << input_opts.to_string() << endl;
155 importer->from_rawmsg(rawmsg, *msgs3);
156 }
catch (std::exception& e) {
157 dballe::tests::dump(
"msg2", *msgs2);
158 dballe::tests::dump(
"raw2", rawmsg);
159 throw tut::failure(loc.msg(
string(
"importing from rawmsg (first template): ") + e.what()));
166 for (
typename vector<Tweaker*>::iterator i = tweaks.begin(); i != tweaks.end(); ++i)
167 (*i)->clean_second(*msgs3);
169 if (do_ignore_context_attrs)
171 StripContextAttrs sca;
174 if (do_round_geopotential)
176 RoundGeopotential rg;
183 notes::Collect c(str);
184 int diffs = msgs1->diff(*msgs3);
187 dballe::tests::dump(
"msg1", *msgs1);
189 dballe::tests::dump(
"msg2", *msgs2);
190 dballe::tests::dump(
"msg3", *msgs3);
191 dballe::tests::dump(
"msg", rawmsg);
192 dballe::tests::dump(
"diffs", str.str(),
"details of differences");
193 throw tut::failure(loc.msg(str::fmtf(
"found %d differences", diffs)));
197 #define inner_do_test(name, ...) do_test(wibble::tests::Location(loc, __FILE__, __LINE__, name), __VA_ARGS__)
198 void do_ecmwf(
const dballe::tests::Location& loc,
const char* template_type=
"synop")
200 string ecmwf_template_name = string(template_type) +
"-ecmwf";
201 string wmo_template_name = string(template_type) +
"-wmo";
202 do_wmo_tweaks =
false;
204 input_opts.simplified =
true;
205 do_round_geopotential =
false;
207 do_ecmwf_tweaks =
false;
208 inner_do_test(
"simp-ecmwf-through-auto", NULL);
209 inner_do_test(
"simp-ecmwf-through-ecmwf", ecmwf_template_name.c_str());
211 do_ecmwf_tweaks =
true;
212 do_round_geopotential =
true;
213 inner_do_test(
"simp-ecmwf-through-wmo", wmo_template_name.c_str());
215 input_opts.simplified =
false;
216 do_round_geopotential =
false;
218 do_ecmwf_tweaks =
false;
219 inner_do_test(
"real-ecmwf-through-auto", NULL);
220 inner_do_test(
"real-ecmwf-through-ecmwf", ecmwf_template_name.c_str());
222 do_ecmwf_tweaks =
true;
223 do_round_geopotential =
true;
224 inner_do_test(
"real-ecmwf-through-wmo", wmo_template_name.c_str());
226 void do_wmo(
const dballe::tests::Location& loc,
const char* template_type=
"synop")
228 string ecmwf_template_name = string(template_type) +
"-ecmwf";
229 string wmo_template_name = string(template_type) +
"-wmo";
230 do_ecmwf_tweaks =
false;
232 input_opts.simplified =
true;
233 do_round_geopotential =
false;
235 do_wmo_tweaks =
false;
236 inner_do_test(
"simp-wmo-through-auto", NULL);
237 inner_do_test(
"simp-wmo-through-wmo", wmo_template_name.c_str());
239 do_wmo_tweaks =
true;
240 do_ignore_context_attrs =
true;
241 do_round_geopotential =
true;
242 inner_do_test(
"simp-wmo-through-ecmwf", ecmwf_template_name.c_str());
243 do_ignore_context_attrs =
false;
245 input_opts.simplified =
false;
246 do_round_geopotential =
false;
248 do_wmo_tweaks =
false;
249 inner_do_test(
"real-wmo-through-auto", NULL);
250 inner_do_test(
"real-wmo-through-wmo", wmo_template_name.c_str());
258 typedef ReimportTest<BufrBulletin> BufrReimportTest;
259 typedef ReimportTest<CrexBulletin> CrexReimportTest;
260 #define run_test(obj, meth, ...) obj.meth(wibble::tests::Location(__FILE__, __LINE__, (obj.fname + " " #__VA_ARGS__).c_str()), __VA_ARGS__)