class ConditionalTemplate(_Template): has_length = False type = 'Conditional' def __init__(self, condition, name, parent): self.condition = ConditionParser(condition) _Template.__init__(self, name, parent) def encode(self, message_params, parent=None, name=None, little_endian=False): conditional = self._get_struct(name, parent) if conditional.exists: self._encode_fields(conditional, self._get_params_sub_tree(message_params, name), little_endian=little_endian) return conditional def decode(self, data, parent=None, name=None, little_endian=False): if self.condition.evaluate(parent): return _Template.decode(self, data, parent, name, little_endian) else: return self._get_struct(name, parent) def validate(self, parent, message_fields, name=None): name = name or self.name message = parent[name] if message.exists: return _Template.validate(self, message, self._get_params_sub_tree(message_fields, name)) return [] def _get_struct(self, name, parent): conditional = Conditional(name or self.name) conditional._parent = parent conditional.exists = self.condition.evaluate(parent) return conditional
def condition_evaluate_exception(self, cond, msg_param): parent = create_message(msg_param) conditionparser = ConditionParser(cond) self.assertRaises(IllegalConditionException, conditionparser.evaluate, parent)
def condition(self, cond, msg_param, status): parent = create_message(msg_param) conditionparser = ConditionParser(cond) condition = conditionparser.evaluate(parent) self.assertEquals(condition, status)
def __init__(self, condition, name, parent): self.condition = ConditionParser(condition) _Template.__init__(self, name, parent)