static void TestFix() { IGCExtensions extensions; extensions.clear(); IGCFix fix; ok1(!IGCParseFix("", extensions, fix)); ok1(!IGCParseFix("B1122385103117N00742367EA", extensions, fix)); ok1(!IGCParseFix("B1122385103117X00742367EA0049000487", extensions, fix)); ok1(!IGCParseFix("B1122385103117N00742367XA0049000487", extensions, fix)); ok1(!IGCParseFix("B1122389003117N00742367EA0049000487", extensions, fix)); ok1(!IGCParseFix("B1122385103117N18042367EA0049000487", extensions, fix)); ok1(!IGCParseFix("B1122385163117N00742367EA0049000487", extensions, fix)); ok1(!IGCParseFix("B1122385103117N00762367EA0049000487", extensions, fix)); ok1(IGCParseFix("B1122385103117N00742367EA0049000487", extensions, fix)); ok1(fix.time == BrokenTime(11, 22, 38)); ok1(equals(fix.location, 51.05195, 7.70611667)); ok1(fix.gps_valid); ok1(fix.pressure_altitude == 490); ok1(fix.gps_altitude == 487); ok1(IGCParseFix("B1122385103117N00742367EV0049000487", extensions, fix)); ok1(fix.time == BrokenTime(11, 22, 38)); ok1(equals(fix.location, 51.05195, 7.70611667)); ok1(!fix.gps_valid); ok1(fix.pressure_altitude == 490); ok1(fix.gps_altitude == 487); ok1(!IGCParseFix("B1122385103117N00742367EX0049000487", extensions, fix)); ok1(IGCParseFix("B1122435103117N00742367EA004900000000000", extensions, fix)); ok1(fix.time == BrokenTime(11, 22, 43)); ok1(fix.gps_valid); ok1(fix.pressure_altitude == 490); ok1(fix.gps_altitude == 0); ok1(IGCParseFix("B1122535103117S00742367WA104900000700000", extensions, fix)); ok1(fix.time == BrokenTime(11, 22, 53)); ok1(fix.gps_valid); ok1(equals(fix.location, -51.05195, -7.70611667)); ok1(fix.pressure_altitude == 10490); ok1(fix.gps_altitude == 7); }
static fixed Normalise(WrapClock &w, BrokenDate &date, unsigned hour, unsigned minute, unsigned second=0) { return w.Normalise(fixed(hour * 3600 + minute * 60 + second), date, BrokenTime(hour, minute, second)); }
BrokenTime BrokenTime::FromSecondOfDay(unsigned second_of_day) { assert(second_of_day < 3600u * 24u); unsigned hour = second_of_day / 3600u; unsigned second_of_hour = second_of_day % 3600u; return BrokenTime(hour, second_of_hour / 60u, second_of_hour % 60u); }
bool IGCParseTime(const char *buffer, BrokenTime &time) { unsigned hour, minute, second; if (sscanf(buffer, "%02u%02u%02u", &hour, &minute, &second) != 3) return false; time = BrokenTime(hour, minute, second); return time.IsPlausible(); }
static void TestFixTime() { BrokenTime time; ok1(!IGCParseTime("", time)); ok1(IGCParseTime("000000", time)); ok1(time == BrokenTime(00, 00, 00)); ok1(IGCParseTime("112238", time)); ok1(time == BrokenTime(11, 22, 38)); ok1(IGCParseTime("235959", time)); ok1(time == BrokenTime(23, 59, 59)); ok1(!IGCParseTime("235960", time)); ok1(!IGCParseTime("236059", time)); ok1(!IGCParseTime("240000", time)); ok1(IGCParseTime("0123375103117N00742367EV0049000487", time)); ok1(time == BrokenTime(01, 23, 37)); }
static void TestTime() { ok1(BrokenTime(12, 15).hour == 12); ok1(BrokenTime(12, 15).minute == 15); ok1(BrokenTime(12, 15).second == 0); ok1(BrokenTime(12, 15, 30).hour == 12); ok1(BrokenTime(12, 15, 30).minute == 15); ok1(BrokenTime(12, 15, 30).second == 30); ok1(BrokenTime(12, 15, 30) == BrokenTime(12, 15, 30)); ok1(!(BrokenTime(12, 15, 30) == BrokenTime(12, 15, 31))); ok1(!(BrokenTime(12, 15, 30) == BrokenTime(12, 16, 30))); ok1(!(BrokenTime(12, 15, 30) == BrokenTime(13, 15, 30))); ok1(!(BrokenTime(12, 15, 30) > BrokenTime(12, 15, 30))); ok1(!(BrokenTime(12, 15, 30) > BrokenTime(12, 15, 31))); ok1(BrokenTime(12, 15, 31) > BrokenTime(12, 15, 30)); ok1(!(BrokenTime(12, 15, 30) > BrokenTime(12, 15, 30))); ok1(!(BrokenTime(12, 15, 30) > BrokenTime(2010, 16, 30))); ok1(BrokenTime(12, 16, 30) > BrokenTime(12, 15, 30)); ok1(!(BrokenTime(12, 15, 30) > BrokenTime(12, 15, 30))); ok1(!(BrokenTime(12, 15, 30) > BrokenTime(13, 15, 30))); ok1(BrokenTime(13, 15, 30) > BrokenTime(12, 15, 30)); ok1(BrokenTime(23, 59, 59).Plausible()); ok1(BrokenTime(0, 0, 0).Plausible()); ok1(!BrokenTime(24, 0, 0).Plausible()); ok1(!BrokenTime(12, 60, 1).Plausible()); ok1(!BrokenTime(12, 15, 60).Plausible()); ok1(BrokenTime(12, 15, 30).GetSecondOfDay() == 44130); ok1(BrokenTime::FromSecondOfDay(44130) == BrokenTime(12, 15, 30)); ok1(BrokenTime::FromSecondOfDayChecked(130530) == BrokenTime(12, 15, 30)); ok1(BrokenTime(12, 15) + 120 == BrokenTime(12, 17)); ok1(BrokenTime(23, 59) + 120 == BrokenTime(0, 1)); ok1(BrokenTime(23, 59) + 120 == BrokenTime(0, 1)); ok1(BrokenTime(0, 1) - 120 == BrokenTime(23, 59)); ok1(BrokenTime(0, 1) - 120u == BrokenTime(23, 59)); }
/** * Returns an instance that fails the Plausible() check. */ constexpr static BrokenTime Invalid() { return BrokenTime(24, 60, 60); }
constexpr static BrokenTime Midnight() { return BrokenTime(0, 0); }
BrokenTime RasterWeatherStore::IndexToTime(unsigned index) { return BrokenTime(index / 2, index % 2 == 0 ? 0 : 30); }