答案:時間帯重複チェック
お題:時間帯重複チェック - No Programming, No Lifeより。
お題をみてすぐにdatetimeモジュールが思い浮かんだのですが、他の答案では使用していませんねぇ。何か理由があんのかな?
unittestモジュールによるテストファーストを実践。どうせテストケースはあとで考えなあかんから、最初に考えといて試験しながら作ったほうが結果的に工数は減るんかなと思った。
Pythonは「○○以上××以下」などがシンプルに書けるから好き。not演算子も好き。
# -*- coding: utf-8 -*- # http://d.hatena.ne.jp/fumokmm/20110326/1301146382 import datetime import unittest class TimeDuplecationCheckTestCase(unittest.TestCase): def testTimeDuplicationCheck(self): self.assertRaises(ValueError, timeDuplicationCheck, (-1, 0, 0, 0), (0, 0, 0, 0)) self.assertRaises(ValueError, timeDuplicationCheck, (25, 0, 0, 0), (0, 0, 0, 0)) self.assertRaises(ValueError, timeDuplicationCheck, (0, -1, 0, 0), (0, 0, 0, 0)) self.assertRaises(ValueError, timeDuplicationCheck, (0, 60, 0, 0), (0, 0, 0, 0)) self.assertRaises(ValueError, timeDuplicationCheck, (24, 1, 0, 0), (0, 0, 0, 0)) self.assertRaises(ValueError, timeDuplicationCheck, (0, 0, -1, 0), (0, 0, 0, 0)) self.assertRaises(ValueError, timeDuplicationCheck, (0, 0, 25, 0), (0, 0, 0, 0)) self.assertRaises(ValueError, timeDuplicationCheck, (0, 0, 0, -1), (0, 0, 0, 0)) self.assertRaises(ValueError, timeDuplicationCheck, (0, 0, 0, 60), (0, 0, 0, 0)) self.assertRaises(ValueError, timeDuplicationCheck, (0, 0, 24, 1), (0, 0, 0, 0)) self.assertRaises(ValueError, timeDuplicationCheck, (0, 0, 0, 0), (-1, 0, 0, 0)) self.assertRaises(ValueError, timeDuplicationCheck, (0, 0, 0, 0), (25, 0, 0, 0)) self.assertRaises(ValueError, timeDuplicationCheck, (0, 0, 0, 0), (0, -1, 0, 0)) self.assertRaises(ValueError, timeDuplicationCheck, (0, 0, 0, 0), (0, 60, 0, 0)) self.assertRaises(ValueError, timeDuplicationCheck, (0, 0, 0, 0), (24, 1, 0, 0)) self.assertRaises(ValueError, timeDuplicationCheck, (0, 0, 0, 0), (0, 0, -1, 0)) self.assertRaises(ValueError, timeDuplicationCheck, (0, 0, 0, 0), (0, 0, 25, 0)) self.assertRaises(ValueError, timeDuplicationCheck, (0, 0, 0, 0), (0, 0, 0, -1)) self.assertRaises(ValueError, timeDuplicationCheck, (0, 0, 0, 0), (0, 0, 0, 60)) self.assertRaises(ValueError, timeDuplicationCheck, (0, 0, 0, 0), (0, 0, 24, 1)) self.assertRaises(ValueError, timeDuplicationCheck, (0, 1, 0, 0), (0, 0, 0, 0)) self.assertRaises(ValueError, timeDuplicationCheck, (0, 0, 0, 0), (0, 1, 0, 0)) self.assertFalse(timeDuplicationCheck((0, 0, 24, 0), (24, 0, 24, 0))) self.assertTrue(timeDuplicationCheck((0, 0, 24, 0), (0, 1, 23, 59))) self.assertFalse(timeDuplicationCheck((1, 0, 5, 30), (9, 0, 23, 0))) self.assertFalse(timeDuplicationCheck((1, 0, 2, 0), (2, 0, 3, 0))) self.assertTrue(timeDuplicationCheck((1, 0, 2, 1), (1, 59, 3, 0))) return def timeDuplicationCheck(period1, period2): validatePeriod(period1) validatePeriod(period2) time1 = createTime(period1[2], period1[3]) time2 = createTime(period2[0], period2[1]) return time2 < time1 def createTime(hour, minute): today = datetime.datetime.today() if hour == 24 and minute == 0: tomorrow = today + datetime.timedelta(days=1) return datetime.datetime(tomorrow.year, tomorrow.month, tomorrow.day, 0, 0) return datetime.datetime(today.year, today.month, today.day, hour, minute) def validatePeriod(period): if not isinstance(period, tuple): raise ValueError if not 4 == len(period): raise ValueError for value in period: if not isinstance(value, int): raise ValueError if not 0 <= period[0] <= 24: raise ValueError if not 0 <= period[1] <= 59: raise ValueError if not 0 <= period[2] <= 24: raise ValueError if not 0 <= period[3] <= 59: raise ValueError if 24 == period[0] and not 0 == period[1]: raise ValueError if 24 == period[2] and not 0 == period[3]: raise ValueError time1 = createTime(period[0], period[1]) time2 = createTime(period[2], period[3]) if time2 < time1: raise ValueError return def main(): unittest.main() if __name__ == '__main__': main()
24時0分に対応できていないかも。かったので修正。