|
| 1 | +#!/usr/bin/env python |
| 2 | +# coding:utf-8 |
| 3 | +# Author: ASU --<[email protected]> |
| 4 | +# Purpose: |
| 5 | +# Created: 8/4/2021 |
| 6 | + |
| 7 | +__author__ = 'ASU' |
| 8 | + |
| 9 | +import unittest |
| 10 | +from datetime import datetime |
| 11 | +from unittest import TestCase |
| 12 | + |
| 13 | +import pytz |
| 14 | +from dateutil import tz |
| 15 | + |
| 16 | +from tsx import TS, TSMsec |
| 17 | + |
| 18 | + |
| 19 | +class TestTS(TestCase): |
| 20 | + INT_BASE_TS = 1519855200 |
| 21 | + INT_BASE_ROUND_MS_TS = 1519855200000 |
| 22 | + INT_BASE_MS_TS = 1519855200123 |
| 23 | + FLOAT_MS_TS = 1519855200.123856 |
| 24 | + STR_SEC_TS = "2018-02-28T22:00:00Z" |
| 25 | + AS_FILE_SEC_TS = "20180228-220000" |
| 26 | + STR_MSEC_TS = "2018-02-28T22:00:00.123000Z" |
| 27 | + |
| 28 | + def _get_tz_delta(self, dt: datetime) -> float: |
| 29 | + return tz.tzlocal().utcoffset(dt).total_seconds() |
| 30 | + |
| 31 | + def test_from_ms(self): |
| 32 | + ts = TS(ts=self.INT_BASE_ROUND_MS_TS + 500, prec="ms") |
| 33 | + self.assertEqual(ts, self.INT_BASE_TS + 0.5) |
| 34 | + # round up |
| 35 | + ts = TS(ts=self.INT_BASE_ROUND_MS_TS + 501, prec="ms") |
| 36 | + self.assertEqual(ts, self.INT_BASE_TS + 0.501) |
| 37 | + |
| 38 | + def test_from_ms_str(self): |
| 39 | + ts = TS(ts=str(self.INT_BASE_ROUND_MS_TS + 500), prec="ms") |
| 40 | + self.assertEqual(ts, self.INT_BASE_TS + 0.5) |
| 41 | + # round up |
| 42 | + ts = TS(ts=self.INT_BASE_ROUND_MS_TS + 501, prec="ms") |
| 43 | + self.assertEqual(ts, self.INT_BASE_TS + 0.501) |
| 44 | + |
| 45 | + def test_TSMsec_nominal(self): |
| 46 | + ts = TSMsec(ts=str(self.INT_BASE_ROUND_MS_TS + 500)) |
| 47 | + self.assertEqual(ts, self.INT_BASE_TS + 0.5) |
| 48 | + # round up |
| 49 | + ts = TS(ts=self.INT_BASE_ROUND_MS_TS + 501, prec="ms") |
| 50 | + self.assertEqual(ts, self.INT_BASE_TS + 0.501) |
| 51 | + |
| 52 | + def test_from_float_str(self): |
| 53 | + ts = TS(ts="1519855200.123856", prec="s") |
| 54 | + self.assertEqual(ts, self.FLOAT_MS_TS) |
| 55 | + |
| 56 | + def test_from_int_str(self): |
| 57 | + ts = TS(ts="1519855200") |
| 58 | + self.assertEqual(ts, 1519855200) |
| 59 | + |
| 60 | + def test_to_int(self): |
| 61 | + ts = TS(ts=self.INT_BASE_ROUND_MS_TS + 500, prec="ms") |
| 62 | + self.assertEqual(int(ts), self.INT_BASE_TS) |
| 63 | + # round up |
| 64 | + ts = TS(ts=self.INT_BASE_ROUND_MS_TS + 501, prec="ms") |
| 65 | + self.assertEqual(int(ts), self.INT_BASE_TS + 1) |
| 66 | + |
| 67 | + def test_as_iso(self): |
| 68 | + ts = TS(ts=self.INT_BASE_TS) |
| 69 | + self.assertEqual(ts.as_iso, self.STR_SEC_TS) |
| 70 | + |
| 71 | + def test_as_iso_tz_standard(self): |
| 72 | + ts = TS("2018-03-01T00:00:00Z") |
| 73 | + res = ts.as_iso_tz(pytz.timezone("Europe/Bucharest")) |
| 74 | + self.assertEqual(res, "2018-03-01T02:00:00+02:00") |
| 75 | + res = ts.as_iso_tz("Europe/Bucharest") |
| 76 | + self.assertEqual(res, "2018-03-01T02:00:00+02:00") |
| 77 | + |
| 78 | + def test_as_iso_tz_DST(self): |
| 79 | + ts = TS("2020-06-01T10:00:00Z") |
| 80 | + res = ts.as_iso_tz(pytz.timezone("Europe/Bucharest")) |
| 81 | + self.assertEqual(res, "2020-06-01T13:00:00+03:00") |
| 82 | + |
| 83 | + def test_as_file_ts(self): |
| 84 | + ts = TS(ts=self.INT_BASE_TS) |
| 85 | + self.assertEqual(ts.as_file_ts, self.AS_FILE_SEC_TS) |
| 86 | + |
| 87 | + def test_to_str(self): |
| 88 | + ts = TS(ts=self.INT_BASE_TS) |
| 89 | + self.assertEqual(str(ts), str(self.INT_BASE_TS)) |
| 90 | + float_ts = TS(ts=self.FLOAT_MS_TS) |
| 91 | + self.assertEqual(str(float_ts), str(self.FLOAT_MS_TS)) |
| 92 | + |
| 93 | + def test_input_float_rounds(self): |
| 94 | + # round down |
| 95 | + ts = TS(ts=1519855200.123456) |
| 96 | + self.assertEqual(ts.as_ms, 1519855200123) |
| 97 | + # round up |
| 98 | + ts = TS(ts=1519855200.123856) |
| 99 | + self.assertEqual(ts.as_ms, 1519855200124) |
| 100 | + |
| 101 | + def test_as_str_ms(self): |
| 102 | + ts = TS(ts=self.INT_BASE_MS_TS, prec="ms") |
| 103 | + self.assertEqual(ts.as_iso, self.STR_MSEC_TS) |
| 104 | + |
| 105 | + def test_convert_from_str(self): |
| 106 | + ts = TS(ts="2018-02-28T22:00:00Z") |
| 107 | + self.assertEqual(ts, self.INT_BASE_TS) |
| 108 | + ts = TS(ts="2018-02-28T22:00:00+00:00") |
| 109 | + self.assertEqual(ts, self.INT_BASE_TS) |
| 110 | + |
| 111 | + def test_convert_from_str_with_TZ_2(self): |
| 112 | + ts = TS(ts="2018-02-28T22:00:00+01:30") |
| 113 | + self.assertEqual(ts, self.INT_BASE_TS - 1.5 * 3600) |
| 114 | + |
| 115 | + def test_convert_from_ms_str_local_time(self): |
| 116 | + tz_delta_in_sec = self._get_tz_delta(datetime(2018, 2, 28)) |
| 117 | + ts = TS(ts="2018-02-28T22:00:00.123") + tz_delta_in_sec |
| 118 | + utc_ms_ts = TS("2018-02-28T22:00:00.123Z") |
| 119 | + self.assertEqual(utc_ms_ts, ts) |
| 120 | + |
| 121 | + def test_convert_from_ms_str_with_TZ_0(self): |
| 122 | + ts = TS(ts="2018-02-28T22:00:00.123+00:00") |
| 123 | + self.assertEqual(ts, self.INT_BASE_MS_TS / 1000) |
| 124 | + |
| 125 | + ts = TS(ts="2018-02-28T22:00:00.123Z") |
| 126 | + self.assertEqual(ts, self.INT_BASE_MS_TS / 1000) |
| 127 | + |
| 128 | + def test_math_ops(self): |
| 129 | + ts = TS(ts=1519855200) |
| 130 | + self.assertEqual((ts + 20).as_ms, 1519855220000) |
| 131 | + self.assertEqual(TS(20 + ts).as_ms, 1519855220000) |
| 132 | + self.assertEqual((ts - 0.5).as_ms, 1519855199500) |
| 133 | + |
| 134 | + def test_as_iso_date(self): |
| 135 | + ts = TS(ts=self.INT_BASE_TS) |
| 136 | + self.assertEqual(ts.as_iso_date, "2018-02-28") |
| 137 | + |
| 138 | + def test_repr(self): |
| 139 | + ts = TS(ts=self.INT_BASE_TS) |
| 140 | + self.assertEqual(repr(ts), "TS('2018-02-28T22:00:00Z')") |
| 141 | + |
| 142 | + |
| 143 | +if __name__ == '__main__': |
| 144 | + unittest.main() |
0 commit comments