$ python3 -m unittest -v
test_empty (test_studylog.StudyLogTests.test_empty) ... ok
test_invalid_minutes (test_studylog.StudyLogTests.test_invalid_minutes) ... ok
test_invalid_records (test_studylog.StudyLogTests.test_invalid_records) ... 
  test_invalid_records (test_studylog.StudyLogTests.test_invalid_records) (value={'name': 4, 'minutes': 2}) ... FAIL
test_normalize_immutable (test_studylog.StudyLogTests.test_normalize_immutable) ... ok
test_summary (test_studylog.StudyLogTests.test_summary) ... ERROR
test_summary_immutable (test_studylog.StudyLogTests.test_summary_immutable) ... ERROR
test_summary_invalid (test_studylog.StudyLogTests.test_summary_invalid) ... ERROR
test_trim (test_studylog.StudyLogTests.test_trim) ... ok
test_zero (test_studylog.StudyLogTests.test_zero) ... ok

======================================================================
ERROR: test_summary (test_studylog.StudyLogTests.test_summary)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/private/tmp/ljc-jcode-r4nkualn/repo/test_studylog.py", line 15, in test_summary
    def test_summary(self): self.assertEqual(summarize([{"name":" Ada ","minutes":"2"},{"name":"ADA","minutes":3},{"name":"Bob","minutes":0}]),{"count":3,"minutes_by_name":{"ada":5,"bob":0}})
                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/private/tmp/ljc-jcode-r4nkualn/repo/summary.py", line 20, in summarize
    normalized = normalize_record(record)
                 ^^^^^^^^^^^^^^^^
NameError: name 'normalize_record' is not defined

======================================================================
ERROR: test_summary_immutable (test_studylog.StudyLogTests.test_summary_immutable)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/private/tmp/ljc-jcode-r4nkualn/repo/test_studylog.py", line 20, in test_summary_immutable
    r=[{"name":" Ada ","minutes":"2"}];old=[x.copy() for x in r];summarize(r);self.assertEqual(r,old)
                                                                 ^^^^^^^^^^^^
  File "/private/tmp/ljc-jcode-r4nkualn/repo/summary.py", line 20, in summarize
    normalized = normalize_record(record)
                 ^^^^^^^^^^^^^^^^
NameError: name 'normalize_record' is not defined

======================================================================
ERROR: test_summary_invalid (test_studylog.StudyLogTests.test_summary_invalid)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/private/tmp/ljc-jcode-r4nkualn/repo/test_studylog.py", line 18, in test_summary_invalid
    with self.assertRaises(ValueError): summarize([{"name":"Ada","minutes":-1}])
                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/private/tmp/ljc-jcode-r4nkualn/repo/summary.py", line 20, in summarize
    normalized = normalize_record(record)
                 ^^^^^^^^^^^^^^^^
NameError: name 'normalize_record' is not defined

======================================================================
FAIL: test_invalid_records (test_studylog.StudyLogTests.test_invalid_records) (value={'name': 4, 'minutes': 2})
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/private/tmp/ljc-jcode-r4nkualn/repo/test_studylog.py", line 12, in test_invalid_records
    with self.subTest(value=v), self.assertRaises(ValueError): normalize_record(v)
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: ValueError not raised

----------------------------------------------------------------------
Ran 9 tests in 0.005s

FAILED (failures=1, errors=3)

Exit code: 1