33import pendulum
44from datetime import datetime
55from pendulum import timezone
6+ from pendulum .tz .exceptions import NonExistingTime , AmbiguousTime
67
78from .. import AbstractTestCase
89
@@ -41,6 +42,27 @@ def test_skipped_time(self):
4142 self .assertEqual (7200 , dt .tzinfo .offset )
4243 self .assertTrue (dt .tzinfo .is_dst )
4344
45+ def test_skipped_time_with_pre_rule (self ):
46+ dt = datetime (2013 , 3 , 31 , 2 , 30 , 45 , 123456 )
47+ tz = timezone ('Europe/Paris' )
48+ dt = tz .convert (dt , dst_rule = tz .PRE_TRANSITION )
49+
50+ self .assertEqual (2013 , dt .year )
51+ self .assertEqual (3 , dt .month )
52+ self .assertEqual (31 , dt .day )
53+ self .assertEqual (2 , dt .hour )
54+ self .assertEqual (30 , dt .minute )
55+ self .assertEqual (45 , dt .second )
56+ self .assertEqual (123456 , dt .microsecond )
57+ self .assertEqual ('Europe/Paris' , dt .tzinfo .tz .name )
58+ self .assertEqual (3600 , dt .tzinfo .offset )
59+ self .assertFalse (dt .tzinfo .is_dst )
60+
61+ def test_skipped_time_with_error (self ):
62+ dt = datetime (2013 , 3 , 31 , 2 , 30 , 45 , 123456 )
63+ tz = timezone ('Europe/Paris' )
64+ self .assertRaises (NonExistingTime , tz .convert , dt , tz .TRANSITION_ERROR )
65+
4466 def test_repeated_time (self ):
4567 dt = datetime (2013 , 10 , 27 , 2 , 30 , 45 , 123456 )
4668 tz = timezone ('Europe/Paris' )
@@ -57,6 +79,27 @@ def test_repeated_time(self):
5779 self .assertEqual (3600 , dt .tzinfo .offset )
5880 self .assertFalse (dt .tzinfo .is_dst )
5981
82+ def test_repeated_time_pre_rule (self ):
83+ dt = datetime (2013 , 10 , 27 , 2 , 30 , 45 , 123456 )
84+ tz = timezone ('Europe/Paris' )
85+ dt = tz .convert (dt , dst_rule = tz .PRE_TRANSITION )
86+
87+ self .assertEqual (2013 , dt .year )
88+ self .assertEqual (10 , dt .month )
89+ self .assertEqual (27 , dt .day )
90+ self .assertEqual (2 , dt .hour )
91+ self .assertEqual (30 , dt .minute )
92+ self .assertEqual (45 , dt .second )
93+ self .assertEqual (123456 , dt .microsecond )
94+ self .assertEqual ('Europe/Paris' , dt .tzinfo .tz .name )
95+ self .assertEqual (7200 , dt .tzinfo .offset )
96+ self .assertTrue (dt .tzinfo .is_dst )
97+
98+ def test_repeated_time_with_error (self ):
99+ dt = datetime (2013 , 10 , 27 , 2 , 30 , 45 , 123456 )
100+ tz = timezone ('Europe/Paris' )
101+ self .assertRaises (AmbiguousTime , tz .convert , dt , tz .TRANSITION_ERROR )
102+
60103 def test_pendulum_create_basic (self ):
61104 dt = pendulum .create (2016 , 6 , 1 , 12 , 34 , 56 , 123456 , 'Europe/Paris' )
62105
@@ -235,3 +278,34 @@ def test_convert_accept_pendulum_instance(self):
235278
236279 self .assertIsInstanceOfPendulum (new )
237280 self .assertPendulum (new , 2016 , 8 , 7 , 14 , 53 , 54 )
281+
282+ def test_add_time_to_new_transition_does_not_use_transition_rule (self ):
283+ pendulum .set_transition_rule (pendulum .TRANSITION_ERROR )
284+ dt = pendulum .create (2013 , 3 , 31 , 1 , 59 , 59 , 999999 , 'Europe/Paris' )
285+
286+ self .assertPendulum (dt , 2013 , 3 , 31 , 1 , 59 , 59 , 999999 )
287+ self .assertEqual ('Europe/Paris' , dt .timezone_name )
288+ self .assertEqual (3600 , dt .offset )
289+ self .assertFalse (dt .is_dst )
290+
291+ dt = dt .add (microseconds = 1 )
292+
293+ self .assertPendulum (dt , 2013 , 3 , 31 , 3 , 0 , 0 , 0 )
294+ self .assertEqual ('Europe/Paris' , dt .timezone_name )
295+ self .assertEqual (7200 , dt .offset )
296+ self .assertTrue (dt .is_dst )
297+
298+ def test_create_uses_transition_rule (self ):
299+ pendulum .set_transition_rule (pendulum .PRE_TRANSITION )
300+ dt = pendulum .create (2013 , 3 , 31 , 2 , 30 , 45 , 123456 , 'Europe/Paris' )
301+
302+ self .assertEqual (2013 , dt .year )
303+ self .assertEqual (3 , dt .month )
304+ self .assertEqual (31 , dt .day )
305+ self .assertEqual (2 , dt .hour )
306+ self .assertEqual (30 , dt .minute )
307+ self .assertEqual (45 , dt .second )
308+ self .assertEqual (123456 , dt .microsecond )
309+ self .assertEqual ('Europe/Paris' , dt .timezone_name )
310+ self .assertEqual (3600 , dt .offset )
311+ self .assertFalse (dt .is_dst )
0 commit comments