1
2 #ifdef HAVE_CONFIG_H
3 # include <simgear_config.h>
4 #endif
5
6 #include <simgear/compiler.h>
7 #include <simgear/misc/test_macros.hxx>
8
9 #include <iostream>
10 #include <cstdlib>
11 #include <cstdio>
12
13 #ifdef _MSC_VER
14 # define random rand
15 #endif
16
17 #include <simgear/misc/sg_dir.hxx>
18 #include <simgear/structure/exception.hxx>
19
20 #include "metar.hxx"
21
22 using std::cout;
23 using std::cerr;
24 using std::endl;
25 using std::string;
26
27
28 const double TEST_EPSILON = 1e-9;
29
test_basic()30 void test_basic()
31 {
32 SGMetar m1("2011/10/20 11:25 EHAM 201125Z 27012KT 240V300 9999 VCSH FEW025CB SCT048 10/05 Q1025 TEMPO VRB03KT");
33 SG_CHECK_EQUAL(m1.getYear(), 2011);
34 SG_CHECK_EQUAL(m1.getMonth(), 10);
35 SG_CHECK_EQUAL(m1.getDay(), 20);
36 SG_CHECK_EQUAL(m1.getHour(), 11);
37 SG_CHECK_EQUAL(m1.getMinute(), 25);
38 SG_CHECK_EQUAL(m1.getReportType(), -1); // should default to NIL?
39
40 SG_CHECK_EQUAL(m1.getWindDir(), 270);
41 SG_CHECK_EQUAL_EP2(m1.getWindSpeed_kt(), 12, TEST_EPSILON);
42
43 SG_CHECK_EQUAL(m1.getWeather().size(), 1);
44 SG_CHECK_EQUAL(m1.getClouds().size(), 2);
45
46 SG_CHECK_EQUAL_EP2(m1.getTemperature_C(), 10, TEST_EPSILON);
47 SG_CHECK_EQUAL_EP2(m1.getDewpoint_C(), 5, TEST_EPSILON);
48 SG_CHECK_EQUAL_EP2(m1.getPressure_hPa(), 1025, TEST_EPSILON);
49 }
50
test_sensor_failure_weather()51 void test_sensor_failure_weather()
52 {
53 SGMetar m1("2011/10/20 11:25 EHAM 201125Z 27012KT 240V300 9999 // FEW025CB SCT048 10/05 Q1025");
54 SG_CHECK_EQUAL(m1.getWindDir(), 270);
55 SG_CHECK_EQUAL_EP2(m1.getWindSpeed_kt(), 12, TEST_EPSILON);
56
57 SG_CHECK_EQUAL(m1.getWeather().size(), 0);
58 SG_CHECK_EQUAL(m1.getClouds().size(), 2);
59
60 SG_CHECK_EQUAL_EP2(m1.getTemperature_C(), 10, TEST_EPSILON);
61 SG_CHECK_EQUAL_EP2(m1.getDewpoint_C(), 5, TEST_EPSILON);
62 SG_CHECK_EQUAL_EP2(m1.getPressure_hPa(), 1025, TEST_EPSILON);
63 }
64
test_sensor_failure_cloud()65 void test_sensor_failure_cloud()
66 {
67 SGMetar m1("2011/10/20 11:25 EHAM 201125Z 27012KT 240V300 9999 FEW025CB/// SCT048/// 10/05 Q1025");
68 SG_CHECK_EQUAL(m1.getWindDir(), 270);
69 SG_CHECK_EQUAL_EP2(m1.getWindSpeed_kt(), 12, TEST_EPSILON);
70
71 SG_CHECK_EQUAL(m1.getWeather().size(), 0);
72 SG_CHECK_EQUAL(m1.getClouds().size(), 2);
73
74 SG_CHECK_EQUAL_EP2(m1.getTemperature_C(), 10, TEST_EPSILON);
75 SG_CHECK_EQUAL_EP2(m1.getDewpoint_C(), 5, TEST_EPSILON);
76 SG_CHECK_EQUAL_EP2(m1.getPressure_hPa(), 1025, TEST_EPSILON);
77 }
78
test_sensor_failure_wind()79 void test_sensor_failure_wind()
80 {
81 SGMetar m1("2020/10/23 16:55 LIVD 231655Z /////KT 9999 OVC025 10/08 Q1020 RMK OVC VIS MIN 9999 BLU");
82 SG_CHECK_EQUAL(m1.getWindDir(), -1);
83 SG_CHECK_EQUAL_EP2(m1.getWindSpeed_kt(), -1, TEST_EPSILON);
84
85 SGMetar m2("2020/10/21 16:55 LIVD 211655Z /////KT CAVOK 07/03 Q1023 RMK SKC VIS MIN 9999 BLU");
86 SG_CHECK_EQUAL(m2.getWindDir(), -1);
87 SG_CHECK_EQUAL_EP2(m2.getWindSpeed_kt(), -1, TEST_EPSILON);
88
89 SGMetar m3("2020/11/17 16:00 CYAZ 171600Z 14040G//KT 10SM -RA OVC012 12/11 A2895 RMK NS8 VIA CYXY SLP806 DENSITY ALT 900FT");
90 SG_CHECK_EQUAL(m3.getWindDir(), 140);
91 SG_CHECK_EQUAL_EP2(m3.getWindSpeed_kt(), 40, TEST_EPSILON);
92 SG_CHECK_EQUAL_EP2(m3.getGustSpeed_kt(), SGMetarNaN, TEST_EPSILON);
93 }
94
test_wind_unit_not_specified()95 void test_wind_unit_not_specified()
96 {
97 SGMetar m1("2020/10/23 11:58 KLSV 231158Z 05010G14 10SM CLR 16/M04 A2992 RMK SLPNO WND DATA ESTMD ALSTG/SLP ESTMD 10320 20124 5//// $");
98 SG_CHECK_EQUAL(m1.getWindDir(), 50);
99 SG_CHECK_EQUAL_EP2(m1.getWindSpeed_kt(), 10.0, TEST_EPSILON);
100 SG_CHECK_EQUAL_EP2(m1.getGustSpeed_kt(), 14.0, TEST_EPSILON);
101 }
102
main(int argc,char * argv[])103 int main(int argc, char* argv[])
104 {
105 try {
106 test_basic();
107 test_sensor_failure_weather();
108 test_sensor_failure_cloud();
109 test_sensor_failure_wind();
110 test_wind_unit_not_specified();
111 } catch (sg_exception& e) {
112 cerr << "got exception:" << e.getMessage() << endl;
113 return -1;
114 }
115
116 return 0;
117 }
118