how to measure sleep duration: tests and solution¶
tests¶
the code in sleep_duration/tests/test_sleep_duration.py from how to measure sleep duration
1import datetime
2import random
3import src.sleep_duration
4import unittest
5
6def random_number(start, end, digits=2):
7 return f'{random.randint(start, end):0{digits}}'
8
9def get_random_timestamp():
10 return (
11 f'{random_number(0,9999,4)}/'
12 f'{random_number(1,12)}/'
13 f'{random_number(1,31)} '
14 f'{random_number(0,23)}:'
15 f'{random_number(0,59)}'
16 )
17
18
19def random_timestamp():
20 result = get_random_timestamp()
21 try:
22 src.sleep_duration.get_datetime(result)
23 except ValueError:
24 return random_timestamp()
25 else:
26 return result
27
28
29class TestSleepDuration(unittest.TestCase):
30
31 def assertWakeTimeEarlier(
32 self, wake_time=None, sleep_time=None
33 ):
34 with self.assertRaisesRegex(
35 ValueError,
36 f'wake_time: "{wake_time}"'
37 ' is earlier than '
38 f'sleep_time: "{sleep_time}"'
39 ):
40 src.sleep_duration.duration(
41 sleep_time=sleep_time,
42 wake_time=wake_time
43 )
44
45 def test_get_datetime(self):
46 timestamp = random_timestamp()
47 self.assertEqual(
48 src.sleep_duration.get_datetime(
49 timestamp
50 ),
51 datetime.datetime.strptime(
52 timestamp,
53 '%Y/%m/%d %H:%M'
54 )
55 )
56
57 def test_duration(self):
58 sleep_time = random_timestamp()
59 wake_time = random_timestamp()
60
61 while wake_time < sleep_time:
62 self.assertWakeTimeEarlier(
63 wake_time=wake_time,
64 sleep_time=sleep_time
65 )
66 wake_time = random_timestamp()
67 else:
68 self.assertEqual(
69 src.sleep_duration.duration(
70 sleep_time=sleep_time,
71 wake_time=wake_time
72 ),
73 str(
74 src.sleep_duration.get_datetime(
75 wake_time
76 )
77 - src.sleep_duration.get_datetime(
78 sleep_time
79 )
80 )
81 )
82
83
84# Exceptions Encountered
85# AssertionError
86# TypeError
87# NameError
88# AttributeError
89# ValueError
solution¶
the solution in sleep_duration/src/sleep_duration.py from how to measure sleep duration
1import datetime
2
3
4def get_datetime(timestamp):
5 return datetime.datetime.strptime(
6 timestamp, "%Y/%m/%d %H:%M"
7 )
8
9
10def duration(wake_time=None, sleep_time=None):
11 if wake_time < sleep_time:
12 raise ValueError(
13 f'wake_time: "{wake_time}"'
14 " is earlier than "
15 f'sleep_time: "{sleep_time}"'
16 )
17 else:
18 return str(
19 get_datetime(wake_time)
20 - get_datetime(sleep_time)
21 )