Python bt2: add reset and is_set to fields
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 14 Sep 2017 15:44:51 +0000 (11:44 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Sat, 16 Sep 2017 02:22:39 +0000 (22:22 -0400)
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
bindings/python/bt2/bt2/fields.py
bindings/python/bt2/bt2/native_btfields.i
tests/bindings/python/bt2/test_fields.py

index 13c6a68335393c200f6f473b4189ef326f486b35..e40a86c67bb3969f7a13d20a28cd6dbc19c8d3dd 100644 (file)
@@ -58,6 +58,15 @@ class _Field(object._Object, metaclass=abc.ABCMeta):
     def field_type(self):
         return self._field_type
 
+    @property
+    def is_set(self):
+        is_set = native_bt.ctf_field_value_is_set(self._ptr)
+        return is_set > 0
+
+    def reset(self):
+        ret = native_bt.ctf_field_reset_value(self._ptr)
+        utils._handle_ret(ret, "cannot reset field object's value")
+
 
 @functools.total_ordering
 class _NumericField(_Field):
index 883bec3b0271d1383b7cef4556163aac5ccc723a..c651122dd6b696bb00adc367d155af5729931fd1 100644 (file)
@@ -31,6 +31,8 @@ struct bt_ctf_field *bt_ctf_field_create(
 struct bt_ctf_field_type *bt_ctf_field_get_type(
                struct bt_ctf_field *field);
 struct bt_ctf_field *bt_ctf_field_copy(struct bt_ctf_field *field);
+bt_bool bt_ctf_field_value_is_set(struct bt_ctf_field *field);
+int bt_ctf_field_reset_value(struct bt_ctf_field *field);
 
 /* Integer field functions */
 int bt_ctf_field_signed_integer_get_value(struct bt_ctf_field *integer,
index b60ed44d1c5a348f2017e0d66ef257f7ac31bbfd..5a776ea7d4146c4a8d43fa420325e6eb2aa042db 100644 (file)
@@ -516,6 +516,23 @@ class _TestNumericField(_TestCopySimple):
     def test_ne_none(self):
         self.assertTrue(self._def != None)
 
+    def test_is_set(self):
+        raw = self._def_value
+        field = self._ft()
+        self.assertFalse(field.is_set)
+        field.value = raw
+        self.assertTrue(field.is_set)
+
+    def test_reset(self):
+        raw = self._def_value
+        field = self._ft()
+        field.value = raw
+        self.assertTrue(field.is_set)
+        field.reset()
+        self.assertFalse(field.is_set)
+        other = self._ft()
+        self.assertEqual(other, field)
+
 
 _BINOPS = (
     ('lt', operator.lt),
@@ -1003,6 +1020,23 @@ class StringFieldTestCase(_TestCopySimple, unittest.TestCase):
         self._def_value += to_append
         self.assertEqual(self._def, self._def_value)
 
+    def test_is_set(self):
+        raw = self._def_value
+        field = self._ft()
+        self.assertFalse(field.is_set)
+        field.value = raw
+        self.assertTrue(field.is_set)
+
+    def test_reset(self):
+        raw = self._def_value
+        field = self._ft()
+        field.value = raw
+        self.assertTrue(field.is_set)
+        field.reset()
+        self.assertFalse(field.is_set)
+        other = self._ft()
+        self.assertEqual(other, field)
+
 
 class _TestArraySequenceFieldCommon(_TestCopySimple):
     def _modify_def(self):
@@ -1144,6 +1178,24 @@ class _TestArraySequenceFieldCommon(_TestCopySimple):
         with self.assertRaises(TypeError):
             array.value = values
 
+    def test_is_set(self):
+        raw = self._def_value
+        field = self._ft()
+        self.assertFalse(field.is_set)
+        field.value = raw
+        self.assertTrue(field.is_set)
+
+    def test_reset(self):
+        raw = self._def_value
+        field = self._ft()
+        field.value = raw
+        self.assertTrue(field.is_set)
+        field.reset()
+        self.assertFalse(field.is_set)
+        other = self._ft()
+        self.assertEqual(other, field)
+
+
 class ArrayFieldTestCase(_TestArraySequenceFieldCommon, unittest.TestCase):
     def setUp(self):
         self._elem_ft = bt2.IntegerFieldType(32)
@@ -1397,6 +1449,48 @@ class StructureFieldTestCase(_TestCopySimple, unittest.TestCase):
             'another_int': 66
         }
 
+    def test_is_set(self):
+        values = {
+            'an_int': 42,
+            'a_string': 'hello',
+            'another_int': 66
+        }
+
+        int_ft = bt2.IntegerFieldType(32)
+        str_ft = bt2.StringFieldType()
+        struct_ft = bt2.StructureFieldType()
+        struct_ft.append_field(field_type=int_ft, name='an_int')
+        struct_ft.append_field(field_type=str_ft, name='a_string')
+        struct_ft.append_field(field_type=int_ft, name='another_int')
+
+        struct = struct_ft()
+        self.assertFalse(struct.is_set)
+        struct.value = values
+        self.assertTrue(struct.is_set)
+
+        struct = struct_ft()
+        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_ft = bt2.IntegerFieldType(32)
+        str_ft = bt2.StringFieldType()
+        struct_ft = bt2.StructureFieldType()
+        struct_ft.append_field(field_type=int_ft, name='an_int')
+        struct_ft.append_field(field_type=str_ft, name='a_string')
+        struct_ft.append_field(field_type=int_ft, name='another_int')
+
+        struct = struct_ft()
+        struct.value = values
+        self.assertTrue(struct.is_set)
+        struct.reset()
+        self.assertEqual(struct_ft(), struct)
 
 
 class VariantFieldTestCase(_TestCopySimple, unittest.TestCase):
@@ -1482,3 +1576,17 @@ class VariantFieldTestCase(_TestCopySimple, unittest.TestCase):
 
     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_ft(2800)
+        self._def.field(tag_field).value = 684
+        self.assertTrue(self._def.is_set)
+
+    def test_reset(self):
+        tag_field = self._tag_ft(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)
This page took 0.027191 seconds and 4 git commands to generate.