def test_decode_sea_level_pressure_less_49_point_9(self):
     # Edge case for SLP < 50 should have 1,000 hPa added
     val = "SLP499"
     decoder = MetarDecoderDefault()
     decoder.decode_sea_level_pressure(val)
     res = decoder.decoded_metar["sea_level_pressure"][self.DECODED_KEY]
     assert_equals(res, "sea level pressure is 1,049.9 hPa")
 def test_decode_dewpoint_single_digit_degree_gets_leading_zero_stripped(self):
   val = "09"
   decoder = MetarDecoderDefault()
   decoder.decode_dewpoint(val)
   res = decoder.decoded_metar["dewpoint"][self.DECODED_KEY]
   degree_sign = u'\N{DEGREE SIGN}'
   assert_equals(res, "9%sC" % degree_sign)
 def test_decode_rvr_with_variation(self):
   val = "R25R/2000V4000FT"
   decoder = MetarDecoderDefault()
   decoder.decode_rvr(val)
   res = decoder.decoded_metar["rvr"][self.DECODED_KEY]
   assert_equals(res, "variable, from 2,000 to 4,000 feet " \
     "(runway 25R)")
 def test_decode_sea_level_pressure_less_49_point_9(self):
   # Edge case for SLP < 50 should have 1,000 hPa added
   val = "SLP499"
   decoder = MetarDecoderDefault()
   decoder.decode_sea_level_pressure(val)
   res = decoder.decoded_metar["sea_level_pressure"][self.DECODED_KEY]
   assert_equals(res, "sea level pressure is 1,049.9 hPa")
 def test_decode_rvr_with_variation(self):
     val = "R25R/2000V4000FT"
     decoder = MetarDecoderDefault()
     decoder.decode_rvr(val)
     res = decoder.decoded_metar["rvr"][self.DECODED_KEY]
     assert_equals(res, "variable, from 2,000 to 4,000 feet " \
       "(runway 25R)")
 def test_decode_sea_level_pressure_is_50(self):
   # SLP >= 50 should have 900 hPa added
   val = "SLP500"
   decoder = MetarDecoderDefault()
   decoder.decode_sea_level_pressure(val)
   res = decoder.decoded_metar["sea_level_pressure"][self.DECODED_KEY]
   assert_equals(res, "sea level pressure is 950.0 hPa")
 def test_decode_sky_condition_altitude_below_station(self):
     val = ["SCT///"]
     decoder = MetarDecoderDefault()
     decoder.decode_sky_condition(val)
     res = decoder.decoded_metar["sky_condition"][self.DECODED_KEY]
     assert_equals(res,
                   ["scattered clouds below reporting station elevation"])
 def test_decode_sky_condition_vertical_visibility(self):
     val = ["VV048"]
     decoder = MetarDecoderDefault()
     decoder.decode_sky_condition(val)
     res = decoder.decoded_metar["sky_condition"][self.DECODED_KEY]
     assert_equals(
         res, ["vertical visibility (indefinite ceiling) at 4,800 feet"])
 def test_decode_temp_single_digit_degree_gets_leading_zero_stripped(self):
     val = "09"
     decoder = MetarDecoderDefault()
     decoder.decode_temp(val)
     res = decoder.decoded_metar["temp"][self.DECODED_KEY]
     degree_sign = u'\N{DEGREE SIGN}'
     assert_equals(res, "9%sC" % degree_sign)
 def test_decode_temp(self):
     val = "10"
     decoder = MetarDecoderDefault()
     decoder.decode_temp(val)
     res = decoder.decoded_metar["temp"][self.DECODED_KEY]
     degree_sign = u'\N{DEGREE SIGN}'
     assert_equals(res, "10%sC" % degree_sign)
 def test_decode_dewpoint_negative(self):
     val = "M04"
     decoder = MetarDecoderDefault()
     decoder.decode_dewpoint(val)
     res = decoder.decoded_metar["dewpoint"][self.DECODED_KEY]
     degree_sign = u'\N{DEGREE SIGN}'
     assert_equals(res, "minus 4%sC" % degree_sign)
 def test_decode_dewpoint_negative(self):
   val = "M04"
   decoder = MetarDecoderDefault()
   decoder.decode_dewpoint(val)
   res = decoder.decoded_metar["dewpoint"][self.DECODED_KEY]
   degree_sign = u'\N{DEGREE SIGN}'
   assert_equals(res, "minus 4%sC" % degree_sign)
 def test_decode_sea_level_pressure_is_50(self):
     # SLP >= 50 should have 900 hPa added
     val = "SLP500"
     decoder = MetarDecoderDefault()
     decoder.decode_sea_level_pressure(val)
     res = decoder.decoded_metar["sea_level_pressure"][self.DECODED_KEY]
     assert_equals(res, "sea level pressure is 950.0 hPa")
 def test_decode_temp(self):
   val = "10"
   decoder = MetarDecoderDefault()
   decoder.decode_temp(val)
   res = decoder.decoded_metar["temp"][self.DECODED_KEY]
   degree_sign = u'\N{DEGREE SIGN}'
   assert_equals(res, "10%sC" % degree_sign)
 def test_decoded_wind_variation_missing(self):
     val = ""
     decoder = MetarDecoderDefault()
     decoder.decode_wind_dir_variation(val)
     # The decoder should handle an empty wind variation, and the keys
     # should exist in the decoded metar with empty values.
     res = decoder.decoded_metar["wind_dir_variation"][self.DECODED_KEY]
     assert_equals(res, "")
 def test_decode_obs_datetime(self):
   val = "290653Z"
   decoder = MetarDecoderDefault()
   decoder.decode_obs_datetime(val)
   res_date = decoder.decoded_metar["obs_datetime"][self.DECODED_KEY]["date"]
   res_time = decoder.decoded_metar["obs_datetime"][self.DECODED_KEY]["time"]
   assert_equals(res_date, "29")
   assert_equals(res_time, "0653")
 def test_decode_sky_condition_multiple_layers(self):
   val = ["SCT///", "FEW032", "OVC100TCU"]
   decoder = MetarDecoderDefault()
   decoder.decode_sky_condition(val)
   res = decoder.decoded_metar["sky_condition"][self.DECODED_KEY]
   assert_equals(res, ["scattered clouds below reporting station elevation",
                       "few clouds at 3,200 feet",
                       "overcast at 10,000 feet (towering cumulus)"])
 def test_decode_wx_phenomena_tornado_waterspout_special_case(self):
   # +FC is a special case for tornadoes and waterspouts - the
   # modifier '+' should be ignored.
   val = ["+FC"]
   decoder = MetarDecoderDefault()
   decoder.decode_wx_phenomena(val)
   res = decoder.decoded_metar["wx_phenomena"][self.DECODED_KEY]
   assert_equals(res, ["funnel cloud (tornado or waterspout)"])
 def test_decoded_wind_variation_missing(self):
   val = ""
   decoder = MetarDecoderDefault()
   decoder.decode_wind_dir_variation(val)
   # The decoder should handle an empty wind variation, and the keys
   # should exist in the decoded metar with empty values.
   res = decoder.decoded_metar["wind_dir_variation"][self.DECODED_KEY]
   assert_equals(res, "")
 def test_decode_wx_phenomena_tornado_waterspout_special_case(self):
     # +FC is a special case for tornadoes and waterspouts - the
     # modifier '+' should be ignored.
     val = ["+FC"]
     decoder = MetarDecoderDefault()
     decoder.decode_wx_phenomena(val)
     res = decoder.decoded_metar["wx_phenomena"][self.DECODED_KEY]
     assert_equals(res, ["funnel cloud (tornado or waterspout)"])
 def test_decode_hourly_temp_dewpoint_both_neg_eleven_point_one(self):
     val = "T11111111"
     decoder = MetarDecoderDefault()
     decoder.decode_hourly_temp_dewpoint(val)
     res = decoder.decoded_metar["hourly_temp_dewpoint"][self.DECODED_KEY]
     degree_sign = u'\N{DEGREE SIGN}'
     assert_equals(res, "hourly temperature is -11.1%sC, " \
                        "hourly dewpoint is -11.1%sC" % \
                        (degree_sign, degree_sign))
 def test_decode_hourly_temp_dewpoint_temp_neg_dewpoint_pos(self):
   val = "T10230012"
   decoder = MetarDecoderDefault()
   decoder.decode_hourly_temp_dewpoint(val)
   res = decoder.decoded_metar["hourly_temp_dewpoint"][self.DECODED_KEY]
   degree_sign = u'\N{DEGREE SIGN}'
   assert_equals(res, "hourly temperature is -2.3%sC, " \
                      "hourly dewpoint is 1.2%sC" % \
                      (degree_sign, degree_sign))
 def test_decode_hourly_temp_dewpoint_temp_neg_dewpoint_pos(self):
     val = "T10230012"
     decoder = MetarDecoderDefault()
     decoder.decode_hourly_temp_dewpoint(val)
     res = decoder.decoded_metar["hourly_temp_dewpoint"][self.DECODED_KEY]
     degree_sign = u'\N{DEGREE SIGN}'
     assert_equals(res, "hourly temperature is -2.3%sC, " \
                        "hourly dewpoint is 1.2%sC" % \
                        (degree_sign, degree_sign))
 def test_decode_hourly_temp_dewpoint_both_neg_eleven_point_one(self):
   val = "T11111111"
   decoder = MetarDecoderDefault()
   decoder.decode_hourly_temp_dewpoint(val)
   res = decoder.decoded_metar["hourly_temp_dewpoint"][self.DECODED_KEY]
   degree_sign = u'\N{DEGREE SIGN}'
   assert_equals(res, "hourly temperature is -11.1%sC, " \
                      "hourly dewpoint is -11.1%sC" % \
                      (degree_sign, degree_sign))
 def test_decode_hourly_temp_dewpoint_temp_pos_dewpoint_neg(self):
   val = "T00801010"
   decoder = MetarDecoderDefault()
   decoder.decode_hourly_temp_dewpoint(val)
   res = decoder.decoded_metar["hourly_temp_dewpoint"][self.DECODED_KEY]
   degree_sign = u'\N{DEGREE SIGN}'
   assert_equals(res, "hourly temperature is 8.0%sC, " \
                      "hourly dewpoint is -1.0%sC" % \
                      (degree_sign, degree_sign))
 def test_decode_hourly_temp_dewpoint_temp_pos_dewpoint_neg(self):
     val = "T00801010"
     decoder = MetarDecoderDefault()
     decoder.decode_hourly_temp_dewpoint(val)
     res = decoder.decoded_metar["hourly_temp_dewpoint"][self.DECODED_KEY]
     degree_sign = u'\N{DEGREE SIGN}'
     assert_equals(res, "hourly temperature is 8.0%sC, " \
                        "hourly dewpoint is -1.0%sC" % \
                        (degree_sign, degree_sign))
 def test_decode_sky_condition_multiple_layers(self):
     val = ["SCT///", "FEW032", "OVC100TCU"]
     decoder = MetarDecoderDefault()
     decoder.decode_sky_condition(val)
     res = decoder.decoded_metar["sky_condition"][self.DECODED_KEY]
     assert_equals(res, [
         "scattered clouds below reporting station elevation",
         "few clouds at 3,200 feet",
         "overcast at 10,000 feet (towering cumulus)"
     ])
 def test_decode_obs_datetime(self):
     val = "290653Z"
     decoder = MetarDecoderDefault()
     decoder.decode_obs_datetime(val)
     res_date = decoder.decoded_metar["obs_datetime"][
         self.DECODED_KEY]["date"]
     res_time = decoder.decoded_metar["obs_datetime"][
         self.DECODED_KEY]["time"]
     assert_equals(res_date, "29")
     assert_equals(res_time, "0653")
 def test_decode_wx_phenomena_modifiers(self):
     decoder = MetarDecoderDefault()
     # Light
     val = ["-PY"]
     decoder.decode_wx_phenomena(val)
     res = decoder.decoded_metar["wx_phenomena"][self.DECODED_KEY]
     assert_equals(res, ["light spray"])
     # Moderate
     val = ["PY"]
     decoder.decode_wx_phenomena(val)
     res = decoder.decoded_metar["wx_phenomena"][self.DECODED_KEY]
     assert_equals(res, ["moderate spray"])
     # Heavy
     val = ["+PY"]
     decoder.decode_wx_phenomena(val)
     res = decoder.decoded_metar["wx_phenomena"][self.DECODED_KEY]
     assert_equals(res, ["heavy spray"])
 def test_decode_wx_phenomena_modifiers(self):
   decoder = MetarDecoderDefault()
   # Light
   val = ["-PY"]
   decoder.decode_wx_phenomena(val)
   res = decoder.decoded_metar["wx_phenomena"][self.DECODED_KEY]
   assert_equals(res, ["light spray"])
   # Moderate
   val = ["PY"]
   decoder.decode_wx_phenomena(val)
   res = decoder.decoded_metar["wx_phenomena"][self.DECODED_KEY]
   assert_equals(res, ["moderate spray"])
   # Heavy
   val = ["+PY"]
   decoder.decode_wx_phenomena(val)
   res = decoder.decoded_metar["wx_phenomena"][self.DECODED_KEY]
   assert_equals(res, ["heavy spray"])
 def test_decode_stn_type_ao2(self):
     val = "AO2"
     decoder = MetarDecoderDefault()
     decoder.decode_stn_type(val)
     res = decoder.decoded_metar["stn_type"][self.DECODED_KEY]
     assert_equals(res, "automated station with precipitation sensor")
 def test_decode_altimeter(self):
     val = "2992"
     decoder = MetarDecoderDefault()
     decoder.decode_altimeter(val)
     res = decoder.decoded_metar["altimeter"][self.DECODED_KEY]
     assert_equals(res, "29.92\"Hg")
 def test_decode_wind_single_knot_speed_isnt_pluralized(self):
   val = "02001KT"
   decoder = MetarDecoderDefault()
   decoder.decode_wind_dir_speed(val)
   res = decoder.decoded_metar["wind_dir_speed"][self.DECODED_KEY]
   assert_equals(res, "from 020 degrees, at 1 knot")
 def test_decode_hourly_temp_dewpoint_missing(self):
   val = ""
   decoder = MetarDecoderDefault()
   decoder.decode_hourly_temp_dewpoint(val)
   res = decoder.decoded_metar["hourly_temp_dewpoint"][self.DECODED_KEY]
   assert_equals(res, "")
 def test_decode_sea_level_pressure_less_than_50(self):
     val = "SLP196"
     decoder = MetarDecoderDefault()
     decoder.decode_sea_level_pressure(val)
     res = decoder.decoded_metar["sea_level_pressure"][self.DECODED_KEY]
     assert_equals(res, "sea level pressure is 1,019.6 hPa")
 def test_decode_sea_level_pressure_greater_than_50(self):
   val = "SLP834"
   decoder = MetarDecoderDefault()
   decoder.decode_sea_level_pressure(val)
   res = decoder.decoded_metar["sea_level_pressure"][self.DECODED_KEY]
   assert_equals(res, "sea level pressure is 983.4 hPa")
 def test_decode_wind_dir_speed_with_gusts(self):
   val = "18014G18KT"
   decoder = MetarDecoderDefault()
   decoder.decode_wind_dir_speed(val)
   res = decoder.decoded_metar["wind_dir_speed"][self.DECODED_KEY]
   assert_equals(res, "from 180 degrees, at 14 knots gusting to 18 knots")
 def test_decode_sea_level_pressure_less_than_50(self):
   val = "SLP196"
   decoder = MetarDecoderDefault()
   decoder.decode_sea_level_pressure(val)
   res = decoder.decoded_metar["sea_level_pressure"][self.DECODED_KEY]
   assert_equals(res, "sea level pressure is 1,019.6 hPa")
 def test_decode_sea_level_pressure_is_garbage(self):
   val = "noSLPforyou"
   decoder = MetarDecoderDefault()
   decoder.decode_sea_level_pressure(val)
   res = decoder.decoded_metar["sea_level_pressure"][self.DECODED_KEY]
   assert_equals(res, "")
 def test_decode_wind_light_variable(self):
   val = "VRB004KT"
   decoder = MetarDecoderDefault()
   decoder.decode_wind_dir_speed(val)
   res = decoder.decoded_metar["wind_dir_speed"][self.DECODED_KEY]
   assert_equals(res, "variable, at 4 knots")
 def test_decode_stn_type_unknown(self):
     val = "thesearenotthestationsyourelookingfor"
     decoder = MetarDecoderDefault()
     decoder.decode_stn_type(val)
     res = decoder.decoded_metar["stn_type"][self.DECODED_KEY]
     assert_equals(res, "unknown station type '" + val + "'")
 def test_decode_wind_dir_speed_basic(self):
   val = "11013KT"
   decoder = MetarDecoderDefault()
   decoder.decode_wind_dir_speed(val)
   res = decoder.decoded_metar["wind_dir_speed"][self.DECODED_KEY]
   assert_equals(res, "from 110 degrees, at 13 knots")
 def test_decode_sea_level_pressure_greater_than_50(self):
     val = "SLP834"
     decoder = MetarDecoderDefault()
     decoder.decode_sea_level_pressure(val)
     res = decoder.decoded_metar["sea_level_pressure"][self.DECODED_KEY]
     assert_equals(res, "sea level pressure is 983.4 hPa")
 def test_decode_is_not_automated(self):
     val = False
     decoder = MetarDecoderDefault()
     decoder.decode_mod_auto(val)
     res = decoder.decoded_metar["mod_auto"][self.DECODED_KEY]
     assert_equals(res, False)
 def test_decode_temp_missing(self):
   val = ""
   decoder = MetarDecoderDefault()
   decoder.decode_temp(val)
   res = decoder.decoded_metar["temp"][self.DECODED_KEY]
   assert_equals(res, "(missing)")
 def test_decode_wind_dir_speed_with_gusts(self):
     val = "18014G18KT"
     decoder = MetarDecoderDefault()
     decoder.decode_wind_dir_speed(val)
     res = decoder.decoded_metar["wind_dir_speed"][self.DECODED_KEY]
     assert_equals(res, "from 180 degrees, at 14 knots gusting to 18 knots")
 def test_decode_sea_level_pressure_is_garbage(self):
     val = "noSLPforyou"
     decoder = MetarDecoderDefault()
     decoder.decode_sea_level_pressure(val)
     res = decoder.decoded_metar["sea_level_pressure"][self.DECODED_KEY]
     assert_equals(res, "")
 def test_decode_wind_single_knot_speed_isnt_pluralized(self):
     val = "02001KT"
     decoder = MetarDecoderDefault()
     decoder.decode_wind_dir_speed(val)
     res = decoder.decoded_metar["wind_dir_speed"][self.DECODED_KEY]
     assert_equals(res, "from 020 degrees, at 1 knot")
 def test_decode_no_sea_level_pressure(self):
     val = "SLPNO"
     decoder = MetarDecoderDefault()
     decoder.decode_sea_level_pressure(val)
     res = decoder.decoded_metar["sea_level_pressure"][self.DECODED_KEY]
     assert_equals(res, "sea level pressure unavailable")
 def test_decode_is_not_automated(self):
   val = False
   decoder = MetarDecoderDefault()
   decoder.decode_mod_auto(val)
   res = decoder.decoded_metar["mod_auto"][self.DECODED_KEY]
   assert_equals(res, False)
 def test_decode_stn_type_unknown(self):
   val = "thesearenotthestationsyourelookingfor"
   decoder = MetarDecoderDefault()
   decoder.decode_stn_type(val)
   res = decoder.decoded_metar["stn_type"][self.DECODED_KEY]
   assert_equals(res, "unknown station type '" + val + "'")
 def test_decode_wind_speed_calm(self):
   val = "00000KT"
   decoder = MetarDecoderDefault()
   decoder.decode_wind_dir_speed(val)
   res = decoder.decoded_metar["wind_dir_speed"][self.DECODED_KEY]
   assert_equals(res, "calm winds")
 def test_decode_hourly_temp_dewpoint_missing(self):
     val = ""
     decoder = MetarDecoderDefault()
     decoder.decode_hourly_temp_dewpoint(val)
     res = decoder.decoded_metar["hourly_temp_dewpoint"][self.DECODED_KEY]
     assert_equals(res, "")
 def test_decode_stn_type_ao2(self):
   val = "AO2"
   decoder = MetarDecoderDefault()
   decoder.decode_stn_type(val)
   res = decoder.decoded_metar["stn_type"][self.DECODED_KEY]
   assert_equals(res, "automated station with precipitation sensor")
 def test_decode_wind_dir_speed_basic(self):
     val = "11013KT"
     decoder = MetarDecoderDefault()
     decoder.decode_wind_dir_speed(val)
     res = decoder.decoded_metar["wind_dir_speed"][self.DECODED_KEY]
     assert_equals(res, "from 110 degrees, at 13 knots")
 def test_decode_altimeter(self):
   val = "2992"
   decoder = MetarDecoderDefault()
   decoder.decode_altimeter(val)
   res = decoder.decoded_metar["altimeter"][self.DECODED_KEY]
   assert_equals(res, "29.92\"Hg")
 def test_decode_wind_speed_calm(self):
     val = "00000KT"
     decoder = MetarDecoderDefault()
     decoder.decode_wind_dir_speed(val)
     res = decoder.decoded_metar["wind_dir_speed"][self.DECODED_KEY]
     assert_equals(res, "calm winds")
 def test_decode_icao_id(self):
   val = "KPDX"
   decoder = MetarDecoderDefault()
   decoder.decode_icao_id(val)
   res = decoder.decoded_metar["icao_id"][self.DECODED_KEY]
   assert_equals(res, "KPDX")
 def test_decode_wind_light_variable(self):
     val = "VRB004KT"
     decoder = MetarDecoderDefault()
     decoder.decode_wind_dir_speed(val)
     res = decoder.decoded_metar["wind_dir_speed"][self.DECODED_KEY]
     assert_equals(res, "variable, at 4 knots")
 def test_decode_no_sea_level_pressure(self):
   val = "SLPNO"
   decoder = MetarDecoderDefault()
   decoder.decode_sea_level_pressure(val)
   res = decoder.decoded_metar["sea_level_pressure"][self.DECODED_KEY]
   assert_equals(res, "sea level pressure unavailable")