@@ -746,6 +746,12 @@ def test_convert_iso_utc(self):
746746 """This tests that conversion to and from ISO date format UTC time works as expected."""
747747
748748 tests = [
749+ (Timestamp (62135596800 , 0 , - 1 ), "0001-01-01T00:00:00.000000000Z" ),
750+ (Timestamp (1 , 0 , - 1 ), "1969-12-31T23:59:59.000000000Z" ),
751+ (Timestamp (0 , 999999999 , - 1 ), "1969-12-31T23:59:59.000000001Z" ),
752+ (Timestamp (0 , 1 , - 1 ), "1969-12-31T23:59:59.999999999Z" ),
753+ (Timestamp (0 , 0 , 1 ), "1970-01-01T00:00:00.000000000Z" ),
754+
749755 (Timestamp (1424177663 , 102003 ), "2015-02-17T12:53:48.000102003Z" ),
750756
751757 # the leap second is 23:59:60
@@ -767,7 +773,8 @@ def test_convert_iso_utc(self):
767773 (Timestamp (1341100835 , 100000000 ), "2012-07-01T00:00:00.100000000Z" ),
768774 (Timestamp (1341100835 , 999999999 ), "2012-07-01T00:00:00.999999999Z" ),
769775
770- (Timestamp (283996818 , 0 ), "1979-01-01T00:00:00.000000000Z" ) # 1979
776+ (Timestamp (283996818 , 0 ), "1979-01-01T00:00:00.000000000Z" ), # 1979
777+ (Timestamp (253402300836 , 999999999 ), "9999-12-31T23:59:59.999999999Z" )
771778 ]
772779
773780 for t in tests :
@@ -843,9 +850,16 @@ def test_from_datetime(self):
843850 """Conversion from python's datetime object."""
844851
845852 tests = [
853+ (datetime (1 , 1 , 1 , 0 , 0 , 0 , 0 , tz .gettz ('UTC' )), Timestamp (62135596800 , 0 , - 1 )),
854+ (datetime (1969 , 12 , 31 , 23 , 59 , 59 , 0 , tz .gettz ('UTC' )), Timestamp (1 , 0 , - 1 )),
855+ (datetime (1969 , 12 , 31 , 23 , 59 , 59 , 1 , tz .gettz ('UTC' )), Timestamp (0 , 999999000 , - 1 )),
856+ (datetime (1969 , 12 , 31 , 23 , 59 , 59 , 999999 , tz .gettz ('UTC' )), Timestamp (0 , 1000 , - 1 )),
846857 (datetime (1970 , 1 , 1 , 0 , 0 , 0 , 0 , tz .gettz ('UTC' )), Timestamp (0 , 0 )),
847858 (datetime (1983 , 3 , 29 , 15 , 45 , 0 , 0 , tz .gettz ('UTC' )), Timestamp (417800721 , 0 )),
848859 (datetime (2017 , 12 , 5 , 16 , 33 , 12 , 196 , tz .gettz ('UTC' )), Timestamp (1512491629 , 196000 )),
860+ (datetime (2514 , 1 , 1 , 0 , 0 , 0 , 0 , tz .gettz ('UTC' )), Timestamp (17166988837 , 0 , 1 )),
861+ # Stopping around here because high datetime values have a floating point error.
862+ # See https://stackoverflow.com/a/75582241.
849863 ]
850864
851865 for t in tests :
@@ -855,10 +869,18 @@ def test_to_datetime(self):
855869 """Conversion to python's datetime object."""
856870
857871 tests = [
872+ (datetime (1 , 1 , 1 , 0 , 0 , 0 , 0 , tz .gettz ('UTC' )), Timestamp (62135596800 , 0 , - 1 )),
873+ (datetime (1969 , 12 , 31 , 23 , 59 , 59 , 0 , tz .gettz ('UTC' )), Timestamp (1 , 0 , - 1 )),
874+ (datetime (1969 , 12 , 31 , 23 , 59 , 59 , 1 , tz .gettz ('UTC' )), Timestamp (0 , 999999000 , - 1 )),
875+ (datetime (1969 , 12 , 31 , 23 , 59 , 59 , 999999 , tz .gettz ('UTC' )), Timestamp (0 , 1000 , - 1 )),
858876 (datetime (1970 , 1 , 1 , 0 , 0 , 0 , 0 , tz .gettz ('UTC' )), Timestamp (0 , 0 )),
877+ (datetime (1970 , 1 , 1 , 0 , 0 , 0 , 1 , tz .gettz ('UTC' )), Timestamp (0 , 1000 )),
859878 (datetime (1983 , 3 , 29 , 15 , 45 , 0 , 0 , tz .gettz ('UTC' )), Timestamp (417800721 , 0 )),
860879 (datetime (2017 , 12 , 5 , 16 , 33 , 12 , 196 , tz .gettz ('UTC' )), Timestamp (1512491629 , 196000 )),
861880 (datetime (2017 , 12 , 5 , 16 , 33 , 13 , 0 , tz .gettz ('UTC' )), Timestamp (1512491629 , 999999999 )),
881+ (datetime (2514 , 1 , 1 , 0 , 0 , 0 , 0 , tz .gettz ('UTC' )), Timestamp (17166988837 , 0 , 1 )),
882+ # Stopping around here because high datetime values have a floating point error.
883+ # See https://stackoverflow.com/a/75582241
862884 ]
863885
864886 for t in tests :
@@ -896,11 +918,34 @@ def test_get_leap_seconds(self):
896918 for t in tests :
897919 self .assertEqual (t [0 ].get_leap_seconds (), t [1 ])
898920
921+ def test_from_unix (self ):
922+ tests = [
923+ ((Timestamp .MAX_SECONDS - 1 , Timestamp .MAX_NANOSEC - 1 , - 1 , False ), # 0 leap seconds
924+ Timestamp (Timestamp .MAX_SECONDS - 1 , Timestamp .MAX_NANOSEC - 1 , - 1 )), # 0 leap seconds
925+ ((1000 , 0 , - 1 , False ), Timestamp (1000 , 0 , - 1 )), # 0 leap seconds
926+ ((63071999 , 999999999 , 1 , False ), Timestamp (63071999 , 999999999 )), # 0 leap seconds
927+ ((63071999 , 0 , 1 , True ), Timestamp (63072009 , 0 )), # 10 leap seconds at leap
928+ ((63072000 , 0 , 1 , False ), Timestamp (63072010 , 0 )), # 10 leap seconds
929+ ((63072008 , 999999999 , 1 , False ), Timestamp (63072018 , 999999999 )), # 10 leap seconds
930+ ((1512491592 , 0 , 1 , False ), Timestamp (1512491629 , 0 )), # 37 leap seconds
931+ ((Timestamp .MAX_SECONDS - 1 - 37 , Timestamp .MAX_NANOSEC - 1 , 1 , False ),
932+ Timestamp (Timestamp .MAX_SECONDS - 1 , Timestamp .MAX_NANOSEC - 1 )), # 37 leap seconds
933+ ]
934+
935+ for t in tests :
936+ self .assertEqual (Timestamp .from_unix (* t [0 ]), t [1 ])
937+
899938 def test_to_unix (self ):
900939 tests = [
901- (Timestamp (63072008 , 999999999 ), (63072008 , 999999999 , False )), # 0 leap seconds
902- (Timestamp (63072009 , 0 ), (63071999 , 0 , True )), # 10 leap seconds at leap
903- (Timestamp (1512491629 , 0 ), (1512491592 , 0 , False )), # 37 leap seconds
940+ (Timestamp (Timestamp .MAX_SECONDS - 1 , Timestamp .MAX_NANOSEC - 1 , - 1 ), # 0 leap seconds
941+ (Timestamp .MAX_SECONDS - 1 , Timestamp .MAX_NANOSEC - 1 , - 1 , False )), # 0 leap seconds
942+ (Timestamp (1000 , 0 , - 1 ), (1000 , 0 , - 1 , False )), # 0 leap seconds
943+ (Timestamp (63072008 , 999999999 ), (63072008 , 999999999 , 1 , False )), # 0 leap seconds
944+ (Timestamp (63072009 , 0 ), (63071999 , 0 , 1 , True )), # 10 leap seconds at leap
945+ (Timestamp (63072010 , 0 ), (63072000 , 0 , 1 , False )), # 10 leap seconds
946+ (Timestamp (1512491629 , 0 ), (1512491592 , 0 , 1 , False )), # 37 leap seconds
947+ (Timestamp (Timestamp .MAX_SECONDS - 1 , Timestamp .MAX_NANOSEC - 1 ),
948+ (Timestamp .MAX_SECONDS - 1 - 37 , Timestamp .MAX_NANOSEC - 1 , 1 , False )), # 37 leap seconds
904949 ]
905950
906951 for t in tests :
0 commit comments