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