# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 Rickard Lindberg, Roger Lindberg
#
# This file is part of Timeline.
#
# Timeline is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Timeline is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Timeline. If not, see <http://www.gnu.org/licenses/>.
from timelinelib.calendar.gregorian.time import GregorianDelta
from timelinelib.calendar.gregorian.time import GregorianTime
from timelinelib.canvas.data import TimePeriod
from timelinelib.test.cases.unit import UnitTestCase
from timelinelib.test.utils import TIME_PERIOD_MODIFIERS
[docs]class time_period_spec(UnitTestCase):
[docs] def test_creating_period_with_end_before_start_should_fail(self):
self.assertRaises(ValueError, TimePeriod, ATime(50), ATime(10))
[docs] def test_inside_should_return_true_if_time_is_inside_period(self):
tp = TimePeriod(ATime(0), ATime(4))
self.assertTrue(tp.inside(ATime(3)))
[docs] def test_inside_should_return_true_if_time_is_on_lower_edge(self):
tp = TimePeriod(ATime(0), ATime(4))
self.assertTrue(tp.inside(ATime(0)))
[docs] def test_inside_should_return_true_if_time_is_on_higher_edge(self):
tp = TimePeriod(ATime(0), ATime(4))
self.assertTrue(tp.inside(ATime(4)))
[docs] def test_inside_should_return_false_if_time_is_outside_period(self):
tp = TimePeriod(ATime(0), ATime(4))
self.assertFalse(tp.inside(ATime(5)))
[docs] def test_delta_should_return_time_specific_delta(self):
tp = TimePeriod(ATime(0), ATime(4))
self.assertEqual(ADelta(4), tp.delta())
[docs] def test_mean_time_should_return_time_specific_time(self):
tp = TimePeriod(ATime(0), ATime(4))
self.assertEqual(ATime(2), tp.mean_time())
[docs] def test_center_should_center_period_around_time(self):
tp = TimePeriod(ATime(0), ATime(4))
self.assertEqual(
tp.center(ATime(5)),
TimePeriod(ATime(3), ATime(7)))
[docs] def test_move_moves_1_10th_forward(self):
time_period = TimePeriod(ATime(0), ATime(10))
self.assertEqual(
time_period.move(1),
TimePeriod(ATime(1), ATime(11)))
[docs] def test_move_moves_1_10th_backward(self):
time_period = TimePeriod(ATime(20), ATime(30))
self.assertEqual(
time_period.move(-1),
TimePeriod(ATime(19), ATime(29)))
[docs] def test_zoom_in_removes_1_10th_on_each_side(self):
time_period = TimePeriod(ATime(10), ATime(20))
self.assertEqual(
time_period.zoom(1),
TimePeriod(ATime(11), ATime(19)))
[docs] def test_zoom_out_adds_1_10th_on_each_side(self):
time_period = TimePeriod(ATime(10), ATime(20))
self.assertEqual(
time_period.zoom(-1),
TimePeriod(ATime(9), ATime(21)))
[docs] def test_move_delta_moves_the_period_that_delta(self):
time_period = TimePeriod(ATime(10), ATime(20))
self.assertEqual(
time_period.move_delta(ADelta(-10)),
TimePeriod(ATime(0), ATime(10)))
[docs] def test_can_be_compared(self):
def a_time_period():
return TimePeriod(ATime(50), ATime(60))
self.assertEqNeImplementationIsCorrect(a_time_period, TIME_PERIOD_MODIFIERS)
[docs] def test_overlaps(self):
p = TimePeriod(ATime(10), ATime(20))
self.assertFalse(p.overlaps(TimePeriod(ATime(0), ATime(9))))
self.assertFalse(p.overlaps(TimePeriod(ATime(0), ATime(10))))
self.assertTrue(p.overlaps(TimePeriod(ATime(0), ATime(11))))
self.assertTrue(p.overlaps(TimePeriod(ATime(11), ATime(19))))
self.assertTrue(p.overlaps(TimePeriod(ATime(19), ATime(30))))
self.assertFalse(p.overlaps(TimePeriod(ATime(20), ATime(30))))
self.assertFalse(p.overlaps(TimePeriod(ATime(21), ATime(30))))
[docs] def test_inside_period(self):
p = TimePeriod(ATime(10), ATime(20))
self.assertFalse(p.inside_period(TimePeriod(ATime(0), ATime(9))))
self.assertTrue(p.inside_period(TimePeriod(ATime(0), ATime(10))))
self.assertTrue(p.inside_period(TimePeriod(ATime(0), ATime(11))))
self.assertTrue(p.inside_period(TimePeriod(ATime(11), ATime(19))))
self.assertTrue(p.inside_period(TimePeriod(ATime(19), ATime(30))))
self.assertTrue(p.inside_period(TimePeriod(ATime(20), ATime(30))))
self.assertFalse(p.inside_period(TimePeriod(ATime(21), ATime(30))))
[docs] def test_get_time_at_percent(self):
period_100 = TimePeriod(ATime(0), ATime(100))
self.assertEqual(period_100.get_time_at_percent(0), ATime(0))
self.assertEqual(period_100.get_time_at_percent(0.5), ATime(50))
self.assertEqual(period_100.get_time_at_percent(1), ATime(100))
[docs]def ATime(num):
return GregorianTime(num, 0)
[docs]def ADelta(num):
return GregorianDelta(num*60*60*24)