"""Tests for the audio primitive.""" import xml.etree.ElementTree as et import pytest from blc2.functions.audio import Audio from blc2.constants import BXW from blc2.exceptions import LoadError def test_audio(aws): a = Audio(aws) a.fade_out = 1000 a.fade_out = 1000 a.fade_in = 1000 a.fade_in = 1000 a.filename = "nonexistant" assert a.audio_scope == {"nonexistant"} assert not a.scope assert a.duration == 0 assert a.actual_duration == 0 a.filename = "tests/silence.m4a" assert a.filename == "tests/silence.m4a" assert a.audio_scope == {"tests/silence.m4a"} assert a.duration == 2024 assert a.actual_duration == 3024 a.fade_out = 500 assert a.fade_out == 500 assert a.duration == 2524 assert a.actual_duration == 3024 lc, ac, _ = a.render(0) assert not lc assert len(ac) == 1 assert ac[0][1:] == ("tests/silence.m4a", 0, 1000, 2524, 500) _, ac2, _ = a.render(3000) assert ac2 == ac _, ac, _ = a.render(5000) assert not ac with pytest.raises(ValueError): _ = Audio(aws, id_=101, fade_in=-10) assert 101 not in aws.functions fout = a.fade_out with pytest.raises(ValueError): a.fade_out = -50 assert a.fade_out == fout fin = a.fade_in with pytest.raises(ValueError): a.fade_in = -50 assert a.fade_in == fin a._set_duration(10000) assert a.copy_data(a.get_data()) is None a.filename = None assert a.duration == 0 assert a.actual_duration == 0 def test_audio_serialize(aws, test_xml_eq): a1 = Audio(aws, id_=123, name="Test Audio 1", fade_out=100, filename="test.wav") a2 = Audio(aws, id_=124, name="Test Audio 2", filename=None) test = (a1, a2) success = [ """""", """""" ] for case, s in zip(test, success): s = s.replace('\n', "").format(BXW.strip("{}")) assert test_xml_eq(case.serialize(), s) def test_audio_deserialize(aws, test_xml_eq): fail = [ """""", """""", """""", """""", """""", ] for case in fail: case = case.format('"'+BXW.strip("{}")+'"') with pytest.raises(LoadError): Audio.deserialize(aws, et.fromstring(case)) case = """""" case = case.format('"'+BXW.strip("{}")+'"') s = Audio.deserialize(aws, et.fromstring(case)) assert test_xml_eq(s.serialize(), case)