def test_typing(self):
        def f(a: detonator[int]):
            pass

        self.assertEqual(1, accrocchio.how_many())
        self.assertEqual(1, detonator.how_many())
        f(1)
        self.assertEqual(1, accrocchio.how_many())
        self.assertEqual(1, detonator.how_many())
    def test_one_shot_accrocchi(self):
        self.assertEqual(0, accrocchio.how_many())
        [this_is_an(accrocchio) for _ in range(3)]
        self.assertEqual(3, accrocchio.how_many())
        accrocchio.reset()
        self.assertEqual(0, accrocchio.how_many())
        [this_is_an(accrocchio) for _ in range(3)]

        accrocchio.reset()
        self.assertEqual(0, accrocchio.how_many())
        self.assertEqual(0, detonator.how_many())
        self.assertEqual(0, epoxy.how_many())
        [this_is_a(detonator) for _ in range(3)]
        [this_is_an(epoxy) for _ in range(4)]
        self.assertEqual(7, accrocchio.how_many())
        self.assertEqual(3, detonator.how_many())
        self.assertEqual(4, epoxy.how_many())
        accrocchio.reset()
        self.assertEqual(0, accrocchio.how_many())
        self.assertEqual(0, detonator.how_many())  # We expect it to have detonators being reset as well
        self.assertEqual(0, epoxy.how_many())

        [this_is_a(detonator) for _ in range(3)]
        [this_is_an(epoxy) for _ in range(4)]
        epoxy.reset()
        self.assertEqual(7, accrocchio.how_many())
        self.assertEqual(3, detonator.how_many())
        self.assertEqual(0, epoxy.how_many())
    def test_context(self):
        with accrocchio:
            pass

        with detonator:
            with detonator:
                pass

        self.assertEqual(3, accrocchio.how_many())
        self.assertEqual(2, detonator.how_many())
    def test_class_decorator(self):
        @accrocchio
        class AccrocchioClass:
            pass

        @compromise
        class CompromiseClass:
            def a_method(self):
                pass

        @blinder
        class BlinderClass:
            pass

        self.assertEqual(3, accrocchio.how_many())
        self.assertEqual(1, compromise.how_many())
        self.assertEqual(1, blinder.how_many())
        self.assertEqual(0, epoxy.how_many())
        AccrocchioClass()
        self.assertEqual(4, accrocchio.how_many())
        self.assertEqual(1, compromise.how_many())
        self.assertEqual(1, blinder.how_many())
        self.assertEqual(0, epoxy.how_many())
        c = CompromiseClass()
        self.assertEqual(5, accrocchio.how_many())
        self.assertEqual(2, compromise.how_many())
        self.assertEqual(1, blinder.how_many())
        self.assertEqual(0, epoxy.how_many())
        c.a_method()
        self.assertEqual(5, accrocchio.how_many())
        self.assertEqual(2, compromise.how_many())
        self.assertEqual(1, blinder.how_many())
        self.assertEqual(0, epoxy.how_many())
        CompromiseClass()
        self.assertEqual(6, accrocchio.how_many())
        self.assertEqual(3, compromise.how_many())
        self.assertEqual(1, blinder.how_many())
        self.assertEqual(0, epoxy.how_many())
    def test_metaclass(self):
        class AccrocchioClass(metaclass=accrocchio):
            pass

        class CompromiseClass(metaclass=compromise):
            pass

        class BlinderClass(metaclass=blinder):
            pass

        self.assertEqual(3, accrocchio.how_many())
        self.assertEqual(1, compromise.how_many())
        self.assertEqual(1, blinder.how_many())
        self.assertEqual(0, epoxy.how_many())
        AccrocchioClass()
        self.assertEqual(4, accrocchio.how_many())
        self.assertEqual(1, compromise.how_many())
        self.assertEqual(1, blinder.how_many())
        self.assertEqual(0, epoxy.how_many())
        CompromiseClass()
        self.assertEqual(5, accrocchio.how_many())
        self.assertEqual(2, compromise.how_many())
        self.assertEqual(1, blinder.how_many())
        self.assertEqual(0, epoxy.how_many())
    def test(self):
        # noinspection PyUnusedLocal
        @accrocchio
        def accrocchio_fun(a, b):
            pass

        # noinspection PyUnusedLocal
        @detonator
        def detonator_fun(a, b):
            pass

        # noinspection PyUnusedLocal
        @epoxy
        def epoxy_fun(a, b):
            pass

        self.assertEqual(0, accrocchio.how_many())
        [accrocchio_fun(1, 2) for _ in range(3)]
        self.assertEqual(3, accrocchio.how_many())
        accrocchio.reset()
        self.assertEqual(0, accrocchio.how_many())
        [accrocchio_fun(1, 2) for _ in range(3)]

        accrocchio.reset()
        self.assertEqual(0, accrocchio.how_many())
        self.assertEqual(0, detonator.how_many())
        self.assertEqual(0, epoxy.how_many())
        [detonator_fun(1, 2) for _ in range(3)]
        [epoxy_fun(1, 2) for _ in range(4)]
        self.assertEqual(7, accrocchio.how_many())
        self.assertEqual(3, detonator.how_many())
        self.assertEqual(4, epoxy.how_many())
        accrocchio.reset()
        self.assertEqual(0, accrocchio.how_many())
        self.assertEqual(0, detonator.how_many())  # We expect it to have detonators being reset as well
        self.assertEqual(0, epoxy.how_many())

        [detonator_fun(1, 2) for _ in range(3)]
        [epoxy_fun(1, 2) for _ in range(4)]
        epoxy.reset()
        self.assertEqual(7, accrocchio.how_many())
        self.assertEqual(3, detonator.how_many())
        self.assertEqual(0, epoxy.how_many())
 def setUp(self):
     accrocchio.reset()
     assert accrocchio.how_many() == 0