"""Tests for scene primitive."""
import xml.etree.ElementTree as et
import pytest
from blc2.functions.scene import Scene
from blc2.constants import INFTY, BXW
from blc2.exceptions import LoadError
def test_scene(aws):
"""Test creation and modification of scenes."""
c1, c2, c3, c4 = aws.fixtures[0].channels
s1 = Scene(aws)
assert s1.scope == frozenset()
assert s1.scope == frozenset()
values = {c1: 0, c2: 1, c3: 2, c4: 4}
s1.values = values
assert s1.values == values
assert s1.scope == frozenset(values.keys())
s1.update({c1: 10})
assert s1.values[c1] == 10
assert s1.scope == frozenset(values.keys())
for c, v in values.items():
if c == c1:
continue
assert v == s1.values[c]
s1.set(values)
assert s1.values == values
assert s1.scope == frozenset(values.keys())
del s1[c1]
assert s1.scope == {c2, c3, c4}
assert c1 not in s1.values
assert s1[c1] is None
s1[c1] = 10
assert s1.scope == frozenset(values.keys())
assert s1[c1] == 10
assert s1.duration == INFTY
assert s1.actual_duration == INFTY
assert s1.fade_in == 0
assert s1.fade_out == 0
assert not s1.audio_scope
with pytest.raises(Exception):
s1.duration = 0
with pytest.raises(Exception):
s1.actual_duration = 0
with pytest.raises(Exception):
s1.fade_in = 0
with pytest.raises(Exception):
s1.fade_out = 0
with pytest.raises(Exception):
s1.scope = frozenset()
with pytest.raises(Exception):
s1.audio_scope = frozenset()
s1.set(values)
lc, ac, _ = s1.render(0)
assert ac == ()
assert dict(lc) == values
lc, ac, _ = s1.render(1234567890)
assert ac == ()
assert dict(lc) == values
s1[c1] = 10
lc, ac, _ = s1.render(1)
assert dict(lc)[c1] == 10
assert False not in (v == values[c] for c, v in lc if c != c1)
with pytest.raises(ValueError):
s1[c1] = -10
assert s1[c1] == 10
with pytest.raises(ValueError):
s1[c1] = -256
assert s1[c1] == 10
assert s1.copy_data(None) is None
del s1[c4]
del s1[c4]
def test_scene_serialize(aws, test_xml_eq):
c1, c2, c3, c4 = aws.fixtures[0].channels
s = Scene(aws, id_=123, name="Test Scene", values={c1: 1, c2: 2, c3: 3, c4: 4})
(f1, i1), (f2, i2), (f3, i3), (f4, i4) = ((i.f.id, i.id) for i in (c1, c2, c3, c4))
e = s.serialize()
expected = """
1
2
3
4
""".format(bxw=BXW.strip("{}"), f1=f1, f2=f2, f3=f3, f4=f4, i1=i1,i2=i2,i3=i3,i4=i4).replace("\n", "")
et.register_namespace("", BXW)
assert test_xml_eq(e, expected)
def test_scene_deserialize(aws, test_xml_eq):
fail = [
"""""",
"""""",
"""""",
"""
""",
"""
""",
"""
""",
"""
""",
"""
""",
]
for case in fail:
case = case.format('"'+BXW.strip("{}")+'"')
with pytest.raises(LoadError):
Scene.deserialize(aws, et.fromstring(case))
case = """
123"""
case = case.format('"'+BXW.strip("{}")+'"').replace('\n', "")
s = Scene.deserialize(aws, et.fromstring(case))
assert test_xml_eq(s.serialize(), case)