def test_length_reference(self): a1 = Field('a1', 8) a = Sequence('a', [a1]) b1 = Field('b1', LengthResult('a')) b = Sequence('b', [b1]) spec = Sequence('blah', [a,b]) vars = ExpressionParameters([spec]) self.assertEqual([Local('a length', _Integer())], vars.get_locals(spec)) self.assertFalse(vars.is_length_referenced(a1)) self.assertTrue(vars.is_length_referenced(a)) self.assertEqual([Param('a length', Param.OUT, EntryLengthType(a))], vars.get_params(a)) self.assertEqual([Param('a length', Param.IN, EntryLengthType(a))], vars.get_params(b))
def test_length_and_value_reference(self): # Test a length reference and a value reference to the same entry. a = Field('a', length=8) c = Field('c', length=parse('len{a}')) d = Field('d', length=parse('${a}')) b = Sequence('b', [a, c, d]) # Lets just try a quick decode to make sure we've specified it ok... #list(b.decode(Data('\x08cd'))) # Now test the parameters being passed around. lookup = ExpressionParameters([b]) self.assertEqual([Param('a', Param.OUT, _Integer()), Param('a length', Param.OUT, _Integer())], lookup.get_params(a)) self.assertEqual([Param('a', Param.OUT, _Integer()), Param('a length', Param.OUT, _Integer())], list(lookup.get_passed_variables(b, b.children[0]))) self.assertEqual([Param('a length', Param.IN, _Integer())], list(lookup.get_passed_variables(b, b.children[1]))) self.assertEqual([Param('a length', Param.IN, _Integer())], lookup.get_params(c)) self.assertEqual([Local('a', _Integer()), Local('a length', _Integer())], lookup.get_locals(b)) self.assertTrue(lookup.is_length_referenced(a))
def test_name_ends_in_length(self): a = Field('data length', 8, Field.INTEGER) b = Field('data', parse('${data length} * 8')) c = Sequence('c', [a, b]) params = ExpressionParameters([c]) self.assertEqual([Local('data length', _Integer())], params.get_locals(c)) self.assertEqual([], params.get_params(c)) self.assertEqual([Param('data length', Param.OUT, _Integer())], params.get_params(a)) self.assertEqual([Param('data length', Param.IN, _Integer())], params.get_params(b)) self.assertEqual(True, params.is_value_referenced(a)) self.assertEqual(False, params.is_length_referenced(a))