1
0
mirror of https://github.com/JoelBender/bacpypes synced 2025-09-28 22:15:23 +08:00
bacpypes/tests/test_constructed_data/helpers.py
2017-11-04 23:56:00 -04:00

89 lines
2.5 KiB
Python

#!/usr/bin/python
"""
Helper classes for constructed data tests.
"""
from bacpypes.debugging import bacpypes_debugging, ModuleLogger, xtob
from bacpypes.errors import MissingRequiredParameter
from bacpypes.primitivedata import Boolean, Integer, Tag, TagList
from bacpypes.constructeddata import Element, Sequence
# some debugging
_debug = 0
_log = ModuleLogger(globals())
@bacpypes_debugging
class SequenceEquality:
"""
This mixin class adds an equality function for matching values for all of
the elements, even if they are optional. It will raise an exception for
missing elements, even if they are missing in both objects.
"""
def __eq__(self, other):
if _debug: SequenceEquality._debug("__eq__ %r", other)
# loop through this sequences elements
for element in self.sequenceElements:
self_value = getattr(self, element.name, None)
other_value = getattr(other, element.name, None)
if (not element.optional) and ((self_value is None) or (other_value is None)):
raise MissingRequiredParameter("%s is a missing required element of %s" % (element.name, self.__class__.__name__))
if not (self_value == other_value):
return False
# success
return True
@bacpypes_debugging
class EmptySequence(Sequence, SequenceEquality):
def __init__(self, *args, **kwargs):
if _debug: EmptySequence._debug("__init__ %r %r", args, kwargs)
Sequence.__init__(self, *args, **kwargs)
@bacpypes_debugging
class SimpleSequence(Sequence, SequenceEquality):
sequenceElements = [
Element('hydrogen', Boolean),
]
def __init__(self, *args, **kwargs):
if _debug: SimpleSequence._debug("__init__ %r %r", args, kwargs)
Sequence.__init__(self, *args, **kwargs)
@bacpypes_debugging
class CompoundSequence1(Sequence, SequenceEquality):
sequenceElements = [
Element('hydrogen', Boolean),
Element('helium', Integer),
]
def __init__(self, *args, **kwargs):
if _debug: CompoundSequence1._debug("__init__ %r %r", args, kwargs)
Sequence.__init__(self, *args, **kwargs)
@bacpypes_debugging
class CompoundSequence2(Sequence, SequenceEquality):
sequenceElements = [
Element('lithium', Boolean, optional=True),
Element('beryllium', Integer),
]
def __init__(self, *args, **kwargs):
if _debug: CompoundSequence2._debug("__init__ %r %r", args, kwargs)
Sequence.__init__(self, *args, **kwargs)