+
+ def test_value(self):
+ orig_values = {
+ 'A': -1872,
+ 'B': 'salut',
+ 'C': 17.5,
+ 'D': 16497,
+ }
+ self.assertEqual(self._def, orig_values)
+
+ def test_set_value(self):
+ int_fc = bt2.IntegerFieldClass(32)
+ str_fc = bt2.StringFieldClass()
+ struct_fc = bt2.StructureFieldClass()
+ struct_fc.append_field(field_class=int_fc, name='an_int')
+ struct_fc.append_field(field_class=str_fc, name='a_string')
+ struct_fc.append_field(field_class=int_fc, name='another_int')
+ values = {
+ 'an_int': 42,
+ 'a_string': 'hello',
+ 'another_int': 66
+ }
+
+ struct = struct_fc()
+ struct.value = values
+ self.assertEqual(values, struct)
+
+ bad_type_values = copy.deepcopy(values)
+ bad_type_values['an_int'] = 'a string'
+ with self.assertRaises(TypeError):
+ struct.value = bad_type_values
+
+ unknown_key_values = copy.deepcopy(values)
+ unknown_key_values['unknown_key'] = 16546
+ with self.assertRaises(KeyError):
+ struct.value = unknown_key_values
+
+ def test_value_rollback(self):
+ int_fc = bt2.IntegerFieldClass(32)
+ str_fc = bt2.StringFieldClass()
+ struct_fc = bt2.StructureFieldClass()
+ struct_fc.append_field(field_class=int_fc, name='an_int')
+ struct_fc.append_field(field_class=str_fc, name='a_string')
+ struct_fc.append_field(field_class=int_fc, name='another_int')
+ values = {
+ 'an_int': 42,
+ 'a_string': 'hello',
+ 'another_int': 66
+ }
+
+ def test_is_set(self):
+ values = {
+ 'an_int': 42,
+ 'a_string': 'hello',
+ 'another_int': 66
+ }
+
+ int_fc = bt2.IntegerFieldClass(32)
+ str_fc = bt2.StringFieldClass()
+ struct_fc = bt2.StructureFieldClass()
+ struct_fc.append_field(field_class=int_fc, name='an_int')
+ struct_fc.append_field(field_class=str_fc, name='a_string')
+ struct_fc.append_field(field_class=int_fc, name='another_int')
+
+ struct = struct_fc()
+ self.assertFalse(struct.is_set)
+ struct.value = values
+ self.assertTrue(struct.is_set)
+
+ struct = struct_fc()
+ struct['an_int'].value = 42
+ self.assertFalse(struct.is_set)
+
+ def test_reset(self):
+ values = {
+ 'an_int': 42,
+ 'a_string': 'hello',
+ 'another_int': 66
+ }
+
+ int_fc = bt2.IntegerFieldClass(32)
+ str_fc = bt2.StringFieldClass()
+ struct_fc = bt2.StructureFieldClass()
+ struct_fc.append_field(field_class=int_fc, name='an_int')
+ struct_fc.append_field(field_class=str_fc, name='a_string')
+ struct_fc.append_field(field_class=int_fc, name='another_int')
+
+ struct = struct_fc()
+ struct.value = values
+ self.assertTrue(struct.is_set)
+ struct.reset()
+ self.assertEqual(struct_fc(), struct)
+
+ def test_str_op(self):
+ expected_string_found = False
+ s = str(self._def)
+ # Establish all permutations of the three expected matches since
+ # the order in which mappings are enumerated is not explicitly part of
+ # the API.
+ for p in itertools.permutations([(k, v) for k, v in self._def.items()]):
+ items = ['{}: {}'.format(repr(k), repr(v)) for k, v in p]
+ candidate = '{{{}}}'.format(', '.join(items))
+ if candidate == s:
+ expected_string_found = True
+ break
+
+ self.assertTrue(expected_string_found)
+
+ def test_str_op_unset(self):
+ self.assertEqual(str(self._fc()), 'Unset')
+
+
+@unittest.skip("this is broken")
+class VariantFieldTestCase(_TestCopySimple, unittest.TestCase):
+ def setUp(self):
+ self._tag_fc = bt2.EnumerationFieldClass(size=32)
+ self._tag_fc.add_mapping('corner', 23)
+ self._tag_fc.add_mapping('zoom', 17, 20)
+ self._tag_fc.add_mapping('mellotron', 1001)
+ self._tag_fc.add_mapping('giorgio', 2000, 3000)
+ self._fc0 = bt2.IntegerFieldClass(32, is_signed=True)
+ self._fc1 = bt2.StringFieldClass()
+ self._fc2 = bt2.FloatingPointNumberFieldClass()
+ self._fc3 = bt2.IntegerFieldClass(17)
+ self._fc = bt2.VariantFieldClass('salut', self._tag_fc)
+ self._fc.append_field('corner', self._fc0)
+ self._fc.append_field('zoom', self._fc1)
+ self._fc.append_field('mellotron', self._fc2)
+ self._fc.append_field('giorgio', self._fc3)
+ self._def = self._fc()
+
+ def tearDown(self):
+ del self._tag_fc
+ del self._fc0
+ del self._fc1
+ del self._fc2
+ del self._fc3
+ del self._fc
+ del self._def
+
+ def test_bool_op_true(self):
+ tag_field = self._tag_fc(1001)
+ self._def.field(tag_field).value = -17.34
+ self.assertTrue(self._def)
+
+ def test_bool_op_false(self):
+ self.assertFalse(self._def)
+
+ def test_tag_field_none(self):
+ self.assertIsNone(self._def.tag_field)
+
+ def test_tag_field(self):
+ tag_field = self._tag_fc(2800)
+ self._def.field(tag_field).value = 1847
+ self.assertEqual(self._def.tag_field, tag_field)
+ self.assertEqual(self._def.tag_field.addr, tag_field.addr)
+
+ def test_selected_field_none(self):
+ self.assertIsNone(self._def.selected_field)
+
+ def test_selected_field(self):
+ var_field1 = self._fc()
+ tag_field1 = self._tag_fc(1001)
+ var_field1.field(tag_field1).value = -17.34
+ self.assertEqual(var_field1.field(), -17.34)
+ self.assertEqual(var_field1.selected_field, -17.34)
+ var_field2 = self._fc()
+ tag_field2 = self._tag_fc(2500)
+ var_field2.field(tag_field2).value = 1921
+ self.assertEqual(var_field2.field(), 1921)
+ self.assertEqual(var_field2.selected_field, 1921)
+
+ def test_eq(self):
+ tag_fc = bt2.EnumerationFieldClass(size=32)
+ tag_fc.add_mapping('corner', 23)
+ tag_fc.add_mapping('zoom', 17, 20)
+ tag_fc.add_mapping('mellotron', 1001)
+ tag_fc.add_mapping('giorgio', 2000, 3000)
+ fc0 = bt2.IntegerFieldClass(32, is_signed=True)
+ fc1 = bt2.StringFieldClass()
+ fc2 = bt2.FloatingPointNumberFieldClass()
+ fc3 = bt2.IntegerFieldClass(17)
+ fc = bt2.VariantFieldClass('salut', tag_fc)
+ fc.append_field('corner', fc0)
+ fc.append_field('zoom', fc1)
+ fc.append_field('mellotron', fc2)
+ fc.append_field('giorgio', fc3)
+ field = fc()
+ field_tag = tag_fc(23)
+ def_tag = self._tag_fc(23)
+ field.field(field_tag).value = 1774
+ self._def.field(def_tag).value = 1774
+ self.assertEqual(self._def, field)
+
+ def test_eq_invalid_type(self):
+ self.assertNotEqual(self._def, 23)
+
+ def test_is_set(self):
+ self.assertFalse(self._def.is_set)
+ tag_field = self._tag_fc(2800)
+ self._def.field(tag_field).value = 684
+ self.assertTrue(self._def.is_set)
+
+ def test_reset(self):
+ tag_field = self._tag_fc(2800)
+ self._def.field(tag_field).value = 684
+ self._def.reset()
+ self.assertFalse(self._def.is_set)
+ self.assertIsNone(self._def.selected_field)
+ self.assertIsNone(self._def.tag_field)
+
+ def test_str_op_int(self):
+ v = self._fc()
+ v.field(self._tag_fc(23)).value = 42
+ f = self._fc0(42)
+ self.assertEqual(str(f), str(v))
+
+ def test_str_op_str(self):
+ v = self._fc()
+ v.field(self._tag_fc(18)).value = 'some test string'
+ f = self._fc1('some test string')
+ self.assertEqual(str(f), str(v))
+
+ def test_str_op_flt(self):
+ v = self._fc()
+ v.field(self._tag_fc(1001)).value = 14.4245
+ f = self._fc2(14.4245)
+ self.assertEqual(str(f), str(v))
+
+ def test_str_op_unset(self):
+ self.assertEqual(str(self._fc()), 'Unset')