stacktach-timex/tests/test_expression.py

395 lines
17 KiB
Python

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
#
# Copyright © 2014 Rackspace Hosting.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import datetime
# for Python2.6 compatability.
import unittest2 as unittest
from timex import expression
class TestTimestamp(unittest.TestCase):
def setUp(self):
super(TestTimestamp, self).setUp()
self.dt = datetime.datetime(2014, 8, 1, 2, 10, 23, 550)
self.other_dt = datetime.datetime(2014, 8, 7, 2, 0, 0, 0)
self.timestamp = expression.Timestamp(self.dt)
def test_timestamp_properties(self):
self.assertEqual(self.dt, self.timestamp.begin)
self.assertEqual(self.dt, self.timestamp.end)
self.assertEqual(self.dt, self.timestamp.timestamp)
def test_match(self):
self.assertTrue(self.timestamp.match(self.dt))
self.assertFalse(self.timestamp.match(self.other_dt))
def test_in(self):
self.assertTrue(self.dt in self.timestamp)
self.assertFalse(self.other_dt in self.timestamp)
def test_add(self):
expected = datetime.datetime(2014, 8, 1, 2, 10, 23, 560)
res = self.timestamp + expression.Duration(microsecond=10)
self.assertEqual(res.timestamp, expected)
expected = datetime.datetime(2014, 8, 1, 2, 10, 33, 550)
res = self.timestamp + expression.Duration(second=10)
self.assertEqual(res.timestamp, expected)
expected = datetime.datetime(2014, 8, 1, 2, 17, 23, 550)
res = self.timestamp + expression.Duration(minute=7)
self.assertEqual(res.timestamp, expected)
expected = datetime.datetime(2014, 8, 1, 3, 10, 23, 550)
res = self.timestamp + expression.Duration(hour=1)
self.assertEqual(res.timestamp, expected)
expected = datetime.datetime(2014, 8, 3, 2, 10, 23, 550)
res = self.timestamp + expression.Duration(day=2)
self.assertEqual(res.timestamp, expected)
expected = datetime.datetime(2015, 2, 1, 2, 10, 23, 550)
res = self.timestamp + expression.Duration(month=6)
self.assertEqual(res.timestamp, expected)
expected = datetime.datetime(2017, 8, 1, 2, 10, 23, 550)
res = self.timestamp + expression.Duration(year=3)
self.assertEqual(res.timestamp, expected)
def test_sub(self):
expected = datetime.datetime(2014, 8, 1, 2, 10, 23, 540)
res = self.timestamp - expression.Duration(microsecond=10)
self.assertEqual(res.timestamp, expected)
expected = datetime.datetime(2014, 8, 1, 2, 10, 13, 550)
res = self.timestamp - expression.Duration(second=10)
self.assertEqual(res.timestamp, expected)
expected = datetime.datetime(2014, 8, 1, 2, 3, 23, 550)
res = self.timestamp - expression.Duration(minute=7)
self.assertEqual(res.timestamp, expected)
expected = datetime.datetime(2014, 8, 1, 1, 10, 23, 550)
res = self.timestamp - expression.Duration(hour=1)
self.assertEqual(res.timestamp, expected)
expected = datetime.datetime(2014, 7, 30, 2, 10, 23, 550)
res = self.timestamp - expression.Duration(day=2)
self.assertEqual(res.timestamp, expected)
expected = datetime.datetime(2014, 2, 1, 2, 10, 23, 550)
res = self.timestamp - expression.Duration(month=6)
self.assertEqual(res.timestamp, expected)
expected = datetime.datetime(2011, 8, 1, 2, 10, 23, 550)
res = self.timestamp - expression.Duration(year=3)
self.assertEqual(res.timestamp, expected)
def test_replace(self):
expected = datetime.datetime(2014, 8, 2, 2, 10, 23, 550)
res = self.timestamp % expression.Duration(day=2)
self.assertEqual(res.timestamp, expected)
expected = datetime.datetime(2014, 6, 1, 2, 10, 23, 550)
res = self.timestamp % expression.Duration(month=6)
self.assertEqual(res.timestamp, expected)
expected = datetime.datetime(2017, 8, 1, 2, 10, 23, 550)
res = self.timestamp % expression.Duration(year=2017)
self.assertEqual(res.timestamp, expected)
expected = datetime.datetime(2014, 8, 1, 0, 0, 0, 0)
res = self.timestamp % expression.Duration(hour=0, minute=0, second=0,
microsecond=0)
self.assertEqual(res.timestamp, expected)
def test_handle_ambig_duration(self):
d = expression.Duration(hour=10, unknown=2)
self.assertRaises(expression.TimexExpressionError,
self.timestamp.__add__, d)
self.assertRaises(expression.TimexExpressionError,
self.timestamp.__sub__, d)
self.assertRaises(expression.TimexExpressionError,
self.timestamp.__mod__, d)
def test_total_seconds(self):
self.assertFalse(self.timestamp.is_range)
self.assertEqual(self.timestamp.total_seconds(), 0)
class TestTimeRange(unittest.TestCase):
def setUp(self):
super(TestTimeRange, self).setUp()
self.begin_dt = datetime.datetime(2014, 8, 1, 2, 10, 23, 550)
self.end_dt = datetime.datetime(2014, 8, 2, 2, 10, 23, 550)
self.middle_dt = datetime.datetime(2014, 8, 1, 17, 30, 10, 25)
self.other_dt = datetime.datetime(2014, 8, 7, 2, 0, 0, 0)
self.timerange = expression.TimeRange(self.begin_dt, self.end_dt)
def test_timerange_properties(self):
self.assertEqual(self.begin_dt, self.timerange.begin)
self.assertEqual(self.end_dt, self.timerange.end)
self.assertEqual(self.begin_dt, self.timerange.timestamp)
def test_match(self):
# ranges include the beginning.
self.assertTrue(self.timerange.match(self.begin_dt))
self.assertTrue(self.timerange.match(self.middle_dt))
# ranges *don`t* include the end.
self.assertFalse(self.timerange.match(self.end_dt))
self.assertFalse(self.timerange.match(self.other_dt))
def test_in(self):
# ranges include the beginning.
self.assertTrue(self.begin_dt in self.timerange)
self.assertTrue(self.middle_dt in self.timerange)
# ranges *don`t* include the end.
self.assertFalse(self.end_dt in self.timerange)
self.assertFalse(self.other_dt in self.timerange)
def test_add(self):
expected_begin = datetime.datetime(2014, 8, 1, 2, 10, 23, 560)
expected_end = datetime.datetime(2014, 8, 2, 2, 10, 23, 560)
res = self.timerange + expression.Duration(microsecond=10)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
expected_begin = datetime.datetime(2014, 8, 1, 2, 10, 33, 550)
expected_end = datetime.datetime(2014, 8, 2, 2, 10, 33, 550)
res = self.timerange + expression.Duration(second=10)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
expected_begin = datetime.datetime(2014, 8, 1, 2, 17, 23, 550)
expected_end = datetime.datetime(2014, 8, 2, 2, 17, 23, 550)
res = self.timerange + expression.Duration(minute=7)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
expected_begin = datetime.datetime(2014, 8, 1, 3, 10, 23, 550)
expected_end = datetime.datetime(2014, 8, 2, 3, 10, 23, 550)
res = self.timerange + expression.Duration(hour=1)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
expected_begin = datetime.datetime(2014, 8, 3, 2, 10, 23, 550)
expected_end = datetime.datetime(2014, 8, 4, 2, 10, 23, 550)
res = self.timerange + expression.Duration(day=2)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
expected_begin = datetime.datetime(2015, 2, 1, 2, 10, 23, 550)
expected_end = datetime.datetime(2015, 2, 2, 2, 10, 23, 550)
res = self.timerange + expression.Duration(month=6)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
expected_begin = datetime.datetime(2017, 8, 1, 2, 10, 23, 550)
expected_end = datetime.datetime(2017, 8, 2, 2, 10, 23, 550)
res = self.timerange + expression.Duration(year=3)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
def test_sub(self):
expected_begin = datetime.datetime(2014, 8, 1, 2, 10, 23, 540)
expected_end = datetime.datetime(2014, 8, 2, 2, 10, 23, 540)
res = self.timerange - expression.Duration(microsecond=10)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
expected_begin = datetime.datetime(2014, 8, 1, 2, 10, 13, 550)
expected_end = datetime.datetime(2014, 8, 2, 2, 10, 13, 550)
res = self.timerange - expression.Duration(second=10)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
expected_begin = datetime.datetime(2014, 8, 1, 2, 3, 23, 550)
expected_end = datetime.datetime(2014, 8, 2, 2, 3, 23, 550)
res = self.timerange - expression.Duration(minute=7)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
expected_begin = datetime.datetime(2014, 8, 1, 1, 10, 23, 550)
expected_end = datetime.datetime(2014, 8, 2, 1, 10, 23, 550)
res = self.timerange - expression.Duration(hour=1)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
expected_begin = datetime.datetime(2014, 7, 30, 2, 10, 23, 550)
expected_end = datetime.datetime(2014, 7, 31, 2, 10, 23, 550)
res = self.timerange - expression.Duration(day=2)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
expected_begin = datetime.datetime(2014, 2, 1, 2, 10, 23, 550)
expected_end = datetime.datetime(2014, 2, 2, 2, 10, 23, 550)
res = self.timerange - expression.Duration(month=6)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
expected_begin = datetime.datetime(2011, 8, 1, 2, 10, 23, 550)
expected_end = datetime.datetime(2011, 8, 2, 2, 10, 23, 550)
res = self.timerange - expression.Duration(year=3)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
def test_replace(self):
expected_begin = datetime.datetime(2014, 8, 1, 6, 10, 23, 550)
expected_end = datetime.datetime(2014, 8, 2, 6, 10, 23, 550)
res = self.timerange % expression.Duration(hour=6)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
expected_begin = datetime.datetime(2014, 6, 1, 2, 10, 23, 550)
expected_end = datetime.datetime(2014, 6, 2, 2, 10, 23, 550)
res = self.timerange % expression.Duration(month=6)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
expected_begin = datetime.datetime(2017, 8, 1, 2, 10, 23, 550)
expected_end = datetime.datetime(2017, 8, 2, 2, 10, 23, 550)
res = self.timerange % expression.Duration(year=2017)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
expected_begin = datetime.datetime(2014, 8, 1, 0, 0, 0, 0)
expected_end = datetime.datetime(2014, 8, 2, 0, 0, 0, 0)
res = self.timerange % expression.Duration(hour=0, minute=0, second=0,
microsecond=0)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
def test_handle_ambig_duration(self):
d = expression.Duration(unknown=1)
expected_begin = datetime.datetime(2014, 8, 1, 3, 10, 23, 550)
expected_end = datetime.datetime(2014, 8, 2, 3, 10, 23, 550)
res = self.timerange + d
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
expected_begin = datetime.datetime(2014, 8, 1, 1, 10, 23, 550)
expected_end = datetime.datetime(2014, 8, 2, 1, 10, 23, 550)
res = self.timerange - d
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
expected_begin = datetime.datetime(2014, 8, 1, 1, 10, 23, 550)
expected_end = datetime.datetime(2014, 8, 2, 1, 10, 23, 550)
res = self.timerange % d
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
def test_total_seconds(self):
self.assertTrue(self.timerange.is_range)
self.assertEqual(self.timerange.total_seconds(), 24 * 60 * 60)
class TestPinnedTimeRange(unittest.TestCase):
def setUp(self):
super(TestPinnedTimeRange, self).setUp()
self.begin_dt = datetime.datetime(2014, 8, 1, 1, 0, 0, 0)
self.end_dt = datetime.datetime(2014, 8, 2, 1, 0, 0, 0)
self.middle_dt = datetime.datetime(2014, 8, 1, 17, 30, 10, 25)
self.other_dt = datetime.datetime(2014, 8, 7, 2, 0, 0, 0)
self.timerange = expression.PinnedTimeRange(self.begin_dt,
self.end_dt,
self.middle_dt,
'day')
def test_add(self):
expected_begin = datetime.datetime(2014, 8, 1, 2, 0, 0, 0)
expected_end = datetime.datetime(2014, 8, 2, 2, 0, 0, 0)
res = self.timerange + expression.Duration(hour=1)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
expected_begin = datetime.datetime(2014, 7, 31, 19, 0, 0, 0)
expected_end = datetime.datetime(2014, 8, 1, 19, 0, 0, 0)
res = self.timerange + expression.Duration(hour=18)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
def test_sub(self):
expected_begin = datetime.datetime(2014, 8, 1, 0, 0, 0, 0)
expected_end = datetime.datetime(2014, 8, 2, 0, 0, 0, 0)
res = self.timerange - expression.Duration(hour=1)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
expected_begin = datetime.datetime(2014, 8, 1, 17, 0, 0, 0)
expected_end = datetime.datetime(2014, 8, 2, 17, 0, 0, 0)
res = self.timerange - expression.Duration(hour=8)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
def test_replace(self):
expected_begin = datetime.datetime(2014, 8, 1, 2, 0, 0, 0)
expected_end = datetime.datetime(2014, 8, 2, 2, 0, 0, 0)
res = self.timerange % expression.Duration(hour=2)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
expected_begin = datetime.datetime(2014, 7, 31, 18, 0, 0, 0)
expected_end = datetime.datetime(2014, 8, 1, 18, 0, 0, 0)
res = self.timerange % expression.Duration(hour=18)
self.assertEqual(res.begin, expected_begin)
self.assertEqual(res.end, expected_end)
class TestDuration(unittest.TestCase):
def setUp(self):
super(TestDuration, self).setUp()
self.second = expression.Duration(second=1)
self.minute = expression.Duration(minute=1)
self.hour = expression.Duration(hour=1)
self.day = expression.Duration(day=1)
self.month = expression.Duration(month=1)
self.year = expression.Duration(year=1)
def test_gt(self):
self.assertTrue(self.hour > self.second)
self.assertFalse(self.second > self.hour)
def test_lt(self):
self.assertTrue(self.second < self.hour)
self.assertFalse(self.hour < self.second)
def test_add(self):
d = self.second + self.hour + self.day
self.assertEqual(d.second, 1)
self.assertEqual(d.hour, 1)
self.assertEqual(d.day, 1)
self.assertIsNone(d.microsecond)
self.assertIsNone(d.minute)
self.assertIsNone(d.month)
self.assertIsNone(d.year)
self.assertIsNone(d.unknown)
def test_as_dict(self):
d = expression.Duration(second=1, hour=1, day=1)
dd = d.as_dict
for unit in ('second', 'hour', 'day'):
self.assertIn(unit, dd)
self.assertEqual(dd[unit], 1)
for unit in ('microsecond', 'minute', 'month', 'year', 'unknown'):
self.assertNotIn(unit, dd)