def test_valid_pack(self):
        """Test packing valid enum values."""

        test_bitfield = BitField(SimpleEnum)

        field = ('a', 'b', test_bitfield)  # signed byte: -128, 127
        out = ElementBitField.valid(field)
        self.assertTrue(out)

        elem = ElementBitField(field)
        test_values = [
            ({'a': 2}, b'\x02'),
            ({'a': []}, b'\x00'),
            ({'a': None}, b'\x00'),
            ({'a': 0}, b'\x00'),  # 0 is treated the same as None or an empty list
            ({'a': [SimpleEnum.one]}, b'\x01'),
            ({'a': ['one']}, b'\x01'),
            ({'a': [SimpleEnum.two]}, b'\x02'),
            ({'a': [SimpleEnum.one, SimpleEnum.two]}, b'\x03'),
            ({'a': [1, SimpleEnum.two]}, b'\x03'),
            ({'a': [1, SimpleEnum.two, 'four']}, b'\x07'),
        ]
        for (in_val, out_val) in test_values:
            with self.subTest((out_val, in_val)):  # pylint: disable=no-member
                ret = elem.pack(in_val)
                self.assertEqual(ret, out_val)
    def test_out_of_range_values_pack(self):
        """Test packing invalid enum values."""

        test_bitfield = BitField(SimpleEnum)

        field = ('a', 'b', test_bitfield)  # signed byte: -128, 127
        out = ElementBitField.valid(field)
        self.assertTrue(out)

        elem = ElementBitField(field)
        test_values = [
            ({'a': -1}, -1),
            ({'a': 3}, 3),
            ({'a': [0, SimpleEnum.one]}, 0),
            ({'a': [SimpleEnum.one, -1]}, -1),
            ({'a': [SimpleEnum.two, 3]}, 3),
            ({'a': ['TWO']}, 'TWO'),
        ]

        msg = '{} is not a valid {}'
        for (in_val, bad_val) in test_values:
            with self.subTest((in_val, bad_val)):  # pylint: disable=no-member
                with self.assertRaises(ValueError) as cm:
                    elem.pack(in_val)
                self.assertEqual(str(cm.exception), msg.format(bad_val, 'SimpleEnum'))
    def test_unpack(self):
        """Test unpacking valid enum values."""

        test_bitfield = BitField(SimpleEnum)

        field = ('a', 'b', test_bitfield)  # signed byte: -128, 127
        out = ElementBitField.valid(field)
        self.assertTrue(out)
        elem = ElementBitField(field)
        test_values = [
            (b'\x00', frozenset([])),
            (b'\xF8', frozenset([])),
            (b'\x01', frozenset([SimpleEnum.one])),
            (b'\x02', frozenset([SimpleEnum.two])),
            (b'\x03', frozenset([SimpleEnum.one, SimpleEnum.two])),
            (b'\xFF', frozenset([SimpleEnum.one, SimpleEnum.two, SimpleEnum.four])),
            (b'\xAA', frozenset([SimpleEnum.two])),
        ]
        for (in_val, out_val) in test_values:
            with self.subTest((in_val, out_val)):  # pylint: disable=no-member
                (ret, unused) = elem.unpack({}, in_val)
                self.assertEqual(unused, b'')
                self.assertEqual(ret, out_val)