Beispiel #1
0
    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))
Beispiel #2
0
    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))
Beispiel #3
0
 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))