From 09cfd9bfc2146f22e2895b8e11248a74f594c81a Mon Sep 17 00:00:00 2001 From: Elena ``of Valhalla'' Grandi Date: Fri, 26 May 2017 16:24:02 +0200 Subject: Added tests and fixed code accordingly --- debdate | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 78 insertions(+), 7 deletions(-) diff --git a/debdate b/debdate index 707376d..45a1bdc 100755 --- a/debdate +++ b/debdate @@ -1,7 +1,9 @@ #!/usr/bin/env python3 +import argparse import datetime -import dateutil.relativedelta +from dateutil import relativedelta +import unittest # TODO: these will be read from some other file RELEASES = [ @@ -30,20 +32,89 @@ class DebDate: data['release'] = r[1] if day > epoch: break - delta = dateutil.relativedelta.relativedelta(day, epoch) - data['dody'] = 0 + if day < epoch: + raise OutsideTimeError( + "{day} happened before the beginning of time".format( + day=day, + ) + ) + delta = relativedelta.relativedelta(day, epoch) data['yodr'] = delta.years + 1 if delta.years == 0: - data['dody'] = datetime.timedelta(delta).days + data['dody'] = (day - epoch).days else: data['dody'] = day.timetuple().tm_yday return data - def main(self): + +class OutsideTimeError(ValueError): + """ + Exception raised before the beginning of time + """ + + +class TestDebDate(unittest.TestCase): + def setUp(self): + self.debdate = DebDate() + + def testFirstYearRelease(self): + r = RELEASES[-1] + d = r[0] + relativedelta.relativedelta(days=10) + data = self.debdate.get_release(d) + self.assertEqual(data['dody'], 10) + self.assertEqual(data['yodr'], 1) + self.assertEqual(data['release'], r[1]) + + def testSecondYearRelease(self): + r = RELEASES[-6] + d = r[0] + relativedelta.relativedelta(years=1) + data = self.debdate.get_release(d) + self.assertEqual(data['dody'], 227) + self.assertEqual(data['yodr'], 2) + self.assertEqual(data['release'], r[1]) + + def testPastLatestRelease(self): + r = RELEASES[0] + d = r[0] + relativedelta.relativedelta(years=5) + data = self.debdate.get_release(d) + # Day Of The Year will change depending on when is the latest + # release, so we do not check it + self.assertEqual(data['yodr'], 6) + self.assertEqual(data['release'], r[1]) + + def testBeforeBeginningOfTime(self): + r = RELEASES[-1] + d = r[0] + relativedelta.relativedelta(days=-1) + with self.assertRaises(OutsideTimeError): + self.debdate.get_release(d) + + +class Command: + def setup_parser(self): + self.parser = argparse.ArgumentParser(description='Debian Regnal Date') + self.parser.set_defaults(func=self.print_date) + self.subparsers = self.parser.add_subparsers() + self.test_parser = self.subparsers.add_parser( + 'test', + help='Run unit tests', + ) + self.test_parser.set_defaults(func=self.run_tests) + + def run_tests(self, args): + suite = unittest.TestLoader().loadTestsFromTestCase(TestDebDate) + unittest.TextTestRunner(verbosity=1).run(suite) + + def print_date(self, args): today = datetime.date.today() - data = self.get_release(today) + debdate = DebDate() + data = debdate.get_release(today) print(MSG.format(**data)) + def main(self): + self.setup_parser() + args = self.parser.parse_args() + args.func(args) + if __name__ == '__main__': - DebDate().main() + Command().main() -- cgit v1.2.3