Skip to content

Commit

Permalink
[audiometadata] updated unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
janscience committed Apr 7, 2024
1 parent 08aebcd commit 6528b9d
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 21 deletions.
22 changes: 7 additions & 15 deletions audioio/audiometadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -634,20 +634,6 @@ def find_keys(metadata, keys):
elif isinstance(metadata[k], dict):
# keep searching within the next section:
return find_keys(metadata[k], keys[1:])
break
"""
if isinstance(metadata[k], dict):
if len(keys) > 1:
# keep searching within the next section:
return find_keys(metadata[k], keys[1:])
else:
# found section:
return True, metadata[k], None
elif len(keys) == 1:
# found key-value pair:
return True, metadata, k
break
"""
# search in subsections:
for k in metadata:
if isinstance(metadata[k], dict):
Expand Down Expand Up @@ -967,13 +953,17 @@ def get_bool(metadata, keys, sep='.', default=None, remove=False):
if not isinstance(keys, (list, tuple, np.ndarray)):
keys = (keys,)
val = default
mv = None
kv = None
for key in keys:
m, k = find_key(metadata, key, sep)
if k in m and not isinstance(m[k], dict):
vs = m[k]
v, _, _ = parse_number(vs)
if v is not None:
val = abs(v) > 1e-8
mv = m
kv = k
elif isinstance(vs, str):
if vs.upper() in ['TRUE', 'T', 'YES', 'Y']:
if remove:
Expand All @@ -983,6 +973,8 @@ def get_bool(metadata, keys, sep='.', default=None, remove=False):
if remove:
del m[k]
return False
if not mv is None and not kv is None and remove:
del mv[kv]
return val


Expand Down Expand Up @@ -1088,7 +1080,7 @@ def get_datetime(metadata, keys=default_starttime_keys,
mt, kt = find_key(metadata, keyp[1], sep)
if not kt in mt:
continue
if isinstance(mt[kt], dt.datetime):
if isinstance(mt[kt], dt.time):
time = mt[kt]
elif isinstance(mt[kt], str):
time = dt.time.fromisoformat(mt[kt])
Expand Down
62 changes: 56 additions & 6 deletions tests/test_audiometadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,10 +166,13 @@ def test_set_metadata():
md = dict(Recording=dict(Time='early'))
amd.set_metadata(md, ['Artist=John Doe',
'Recording.Time=late'])
print(md)
assert_equal(md['Recording']['Time'], 'late', 'set_metadata')
assert_equal(len(md), 1, 'set_metadata')
assert_equal(len(md['Recording']), 1, 'set_metadata')
assert_equal(md['Recording']['Time'], 'late')
amd.set_metadata(md, 'Time=very late')
assert_equal(md['Recording']['Time'], 'very late')
amd.set_metadata(None, 'Artist=John Doe')


def test_add_metadata():
Expand All @@ -182,6 +185,8 @@ def test_add_metadata():
assert_equal(md['Recording']['Quality'], 'amazing', 'add_metadata')
assert_equal(md['Artist'], 'John Doe', 'add_metadata')
assert_equal(md['Location']['Country'], 'Lummerland', 'add_metadata')
amd.add_metadata(md, 'Artist=John Doe')
amd.add_metadata(None, 'Artist=John Doe')


def test_move_metadata():
Expand All @@ -200,6 +205,8 @@ def test_move_metadata():
assert_equal(len(md['Recording']), 1, 'move_metadata()')
assert_true('Experimentalist' in md, 'move_metadata()')
assert_equal(md['Experimentalist'], 'John Doe', 'move_metadata()')
m = amd.move_metadata(None, md, 'xxxx')
assert_false(m, 'move_metadata()')


def test_parse_number():
Expand Down Expand Up @@ -243,6 +250,10 @@ def test_parse_number():
assert_equal(v, 42.1, 'parse float')
assert_equal(u, '', 'parse float')
assert_equal(n, 5, 'parse float')
v, u, n = amd.parse_number([42.3])
assert_equal(v, None, 'parse list')
assert_equal(u, '', 'parse list')
assert_equal(n, 0, 'parse list')


def test_change_unit():
Expand All @@ -264,6 +275,8 @@ def test_change_unit():
assert_equal(v, 150.0, 'change unit')
v = amd.change_unit(3600, 's', 'h')
assert_equal(v, 1.0, 'change unit')
v = amd.change_unit(5, '', '')
assert_equal(v, 5, 'change unit')


def test_get_number_unit():
Expand Down Expand Up @@ -354,29 +367,56 @@ def test_bool():
assert_equal(v, False, 'get boolean default')
v = amd.get_bool(None, 'ffff')
assert_equal(v, None, 'get None from None metadata')
v = amd.get_bool(md, 'cccc', remove=True)
assert_true(not 'cccc' in md)
v = amd.get_bool(md, 'bbbb', remove=True)
assert_true(not 'bbbb' in md)
v = amd.get_bool(md, 'aaaa', remove=True)
assert_true(not 'aaaa' in md)


def test_get_datetime():
md = dict(date='2024-03-02', time='10:42:24',
datetime='2023-04-15T22:10:00')
datetime='2023-04-15T22:10:00',
dtdate=dt.date.fromisoformat('2024-03-02'),
dttime=dt.time.fromisoformat('10:42:24'),
dtdatetime=dt.datetime.fromisoformat('2023-04-15T22:10:00'),
xdate=2024, xtime=10, xdatetime=2024)
v = amd.get_datetime(md, ('date', 'time'))
assert_equal(v, dt.datetime(2024, 3, 2, 10, 42, 24), 'get datetime with pair of date and time strings')
v = amd.get_datetime(md, ('dtdate', 'dttime'))
assert_equal(v, dt.datetime(2024, 3, 2, 10, 42, 24), 'get datetime with pair of date and time')
v = amd.get_datetime(md, ('datetime',))
assert_equal(v, dt.datetime(2023, 4, 15, 22, 10), 'get datetime with single datetime string')
v = amd.get_datetime(md, [('aaaa',), ('date', 'time')])
assert_equal(v, dt.datetime(2024, 3, 2, 10, 42, 24), 'get datetime with invalid key and pair of date and time')
v = amd.get_datetime(md, ('cccc',))
assert_equal(v, None, 'get datetime with invalid key')
v = amd.get_datetime(md, ('xdatetime',))
assert_equal(v, None, 'get datetime with invalid type')
v = amd.get_datetime(md, ('cccc', 'dddd'))
assert_equal(v, None, 'get date and time with invalid key')
v = amd.get_datetime(md, ('date', 'dddd'))
assert_equal(v, None, 'get date and time with invalid key')
v = amd.get_datetime(md, ('xdate', 'xtime'))
assert_equal(v, None, 'get date and time with invalid type')
v = amd.get_datetime(md, ('date', 'xtime'))
assert_equal(v, None, 'get date and time with invalid type')
v = amd.get_datetime(md, ('cccc', 'dddd'),
default=dt.datetime(2022, 2, 22, 22, 2, 12))
assert_equal(v, dt.datetime(2022, 2, 22, 22, 2, 12), 'get default datetime with invalid key')
v = amd.get_datetime(md, ('date', 'time'), remove=True)
assert_true(not 'date' in md)
assert_true(not 'time' in md)
v = amd.get_datetime(md, ('dtdate', 'dttime'), remove=True)
assert_true(not 'dtdate' in md)
assert_true(not 'dttime' in md)
v = amd.get_datetime(md, ('datetime',), remove=True)
assert_true(not 'datetime' in md)
v = amd.get_datetime(md, ('dtdatetime',), remove=True)
assert_true(not 'datetime' in md)
v = amd.get_datetime(None, 'ffff')
assert_equal(v, None, 'get None from None metadata')


def test_update_starttime():
Expand Down Expand Up @@ -424,8 +464,14 @@ def test_gain():
f, u = amd.get_gain(md)
assert_equal(f, 1.42)
assert_equal(u, 'mV')
amd.update_gain(md, 2)
r = amd.update_gain(md, 2)
assert_true(r, 'update_gain()')
assert_equal(md['Gain'], '0.710mV')
r = amd.update_gain(md, 2, 'gain')
assert_true(r, 'update_gain()')
assert_equal(md['Gain'], '0.3550mV')
r = amd.update_gain(None, 2)
assert_false(r, 'update_gain()')

md = dict(Gain='1.42mV/V')
f, u = amd.get_gain(md)
Expand Down Expand Up @@ -494,14 +540,16 @@ def test_bext_history_str():


def test_add_history():
r = amd.add_history(None, 'just a snippet')
assert_false(r, 'add_history()')
md = dict(aaa='xyz', BEXT=dict(CodingHistory='original recordings'))
r = amd.add_history(md, 'just a snippet')
assert_equal(r, True, 'add_history()')
assert_true(r, 'add_history()')
assert_equal(md['BEXT']['CodingHistory'], 'original recordings\r\njust a snippet', 'added history')

md = dict(aaa='xyz', BEXT=dict(OriginationDate='2024-02-12'))
r = amd.add_history(md, 'just a snippet')
assert_equal(r, False, 'add_history() no field')
assert_false(r, 'add_history() no field')

r = amd.add_history(md, 'just a snippet', 'BEXT.CodingHistory')
assert_equal(r, True, 'add_history() added missing field')
Expand Down Expand Up @@ -539,7 +587,7 @@ def test_remove_metadata():
amd.remove_metadata(md, ('ccc',))
assert_true('ccc' not in md['bbbb'], 'remove metadata')
amd.remove_metadata(md, ('xxx',))
amd.remove_metadata(md, ('eee',))
amd.remove_metadata(md, 'eee')
assert_true('eee' not in md['bbbb'], 'remove metadata section')
amd.remove_metadata(None, ('ccc',))

Expand Down Expand Up @@ -573,6 +621,8 @@ def test_main():
amd.main('-f', 'test.wav')
amd.main('-m', 'test.wav')
amd.main('-c', 'test.wav')
amd.main('-t', 'test.wav')
amd.main('-t', 'test.wav', 'test.wav')
amd.main('-m', '-c', 'test.wav')
aw.write_audio(filename, data, rate, md, locs)
amd.main('test.wav')
Expand Down

0 comments on commit 6528b9d

Please sign in to comment.