import unittest


class TestEnum(unittest.TestCase):
    """
    Verifies the repl() and str() behaviour of an example Enum
    Enums represent configuration values such as digitalio.Direction, digitalio.Pull etc.
    """

    def setUp(self):
        """Create an example Enum, mocking __module__ and __qualname__"""
        import adafruit_blinka

        class Cls(adafruit_blinka.Enum):
            pass

        Cls.one = Cls()
        Cls.two = Cls()
        # class refs would be implicitly populated correctly in a real module
        Cls.__module__ = "ho.hum"
        Cls.__qualname__ = "Example"
        self.Cls = Cls

    def test_iteritems(self):
        """A subtype of Enum can list all attributes of its own type"""
        items = list(self.Cls.iteritems())
        self.assertEqual(
            items,
            [
                ("one", self.Cls.one),
                ("two", self.Cls.two),
            ],
        )

    def test_repr(self):
        """A repr() call on an Enum gives its fully-qualified name"""
        name = "one"
        actual = repr(getattr(self.Cls, name))
        expected = "{}.{}.{}".format(self.Cls.__module__, self.Cls.__qualname__, name)
        self.assertEqual(actual, expected)

    def test_str(self):
        """A str() call on an Enum performs the same as repr()"""
        self.assertEqual(str(self.Cls.one), repr(self.Cls.one))


class TestDigitalInOut(unittest.TestCase):
    def test_context_manager(self):
        import digitalio
        from testing.board import default_pin

        """Deinitialisation is triggered by __exit__() and should dispose machine.pin reference"""
        dio = digitalio.DigitalInOut(default_pin)
        self.assertIsNotNone(dio._pin)
        with dio:
            pass
        self.assertIsNone(dio._pin)
