コード例 #1
0
    def test_functions(self):
        global called
        global my_function_message
        global test_message

        called = False

        # check that we can call our weak reference
        def my_function(message):
            global called
            global my_function_message
            called = True
            return (my_function_message % message)

        self.assertFalse(called, "IMPOSSIBRU!")

        func_ref = WeakMethodReference(my_function)
        self.assertFalse(called, "Function called during weak ref creation")
        self.assertFalse(func_ref.is_dead(), "Function reference already dead")
        self.assertTrue(func_ref.is_alive(), "Function reference already dead")

        result_message = func_ref()(test_message)
        self.assertTrue(called, "Function not called")
        self.assertEqual(result_message, (my_function_message % test_message),
                         "Function arguements incorrect")
コード例 #2
0
    def test_methods(self):
        global called
        global my_function_message
        global test_message

        called = False

        class MyClass:
            my_method_message = 'my_method %s'

            def my_method(self, message):
                global called
                called = True
                return (MyClass.my_method_message % message)

        obj = MyClass()

        method_ref = WeakMethodReference(obj.my_method)
        self.assertFalse(called, "Method already at creation time")

        result_message = method_ref()(test_message)
        self.assertTrue(called, "Method not called")
        self.assertEqual(result_message,
                         (MyClass.my_method_message % test_message),
                         "Method arguments incorrect")
コード例 #3
0
    def test_collections(self):
        # check we can insert weak references
        # into lists, dicts, sets, etc
        # and find it through a new weak reference
        # to the same function
        global called
        global my_function_message
        global test_message

        called = False

        class MyClass:
            my_method_message = 'my_method %s'

            def my_method(self, message):
                global called
                called = True
                return (MyClass.my_method_message % message)

        obj = MyClass()

        method_ref = WeakMethodReference(obj.my_method)
        self.assertFalse(called, "Method already at creation time")

        # check functions work
        my_function_message = 'my_function %s'

        def my_function(message):
            global called
            global my_function_message
            called = True
            return (my_function_message % message)

        self.assertFalse(called, "IMPOSSIBRU!")

        func_ref = WeakMethodReference(my_function)

        collection = set()

        collection.add(func_ref)
        collection.add(method_ref)
        self.assertTrue(func_ref in collection,
                        "Function ref not found in collection")
        self.assertTrue(method_ref in collection,
                        "Method ref not found in collection")

        self.assertFalse(my_function in collection,
                         "Function found in collection instead of ref")
        self.assertFalse(obj.my_method in collection,
                         "Method found in collection instead of ref")

        func_ref2 = WeakMethodReference(my_function)
        method_ref2 = WeakMethodReference(obj.my_method)

        # check references are comparable
        self.assertEqual(func_ref, func_ref2, "Function refs not comparable")
        self.assertEqual(method_ref, method_ref2, "Method refs not comparable")
        self.assertNotEqual(func_ref, method_ref, "Different refs are equal")

        # check copying references still works for
        # comparison operators on collections
        self.assertTrue(func_ref2 in collection,
                        "Function ref not found in collection")
        self.assertTrue(method_ref2 in collection,
                        "Method ref not found in collection")

        # remove from collection
        collection.remove(func_ref2)
        self.assertFalse(func_ref in collection,
                         "Function ref still in collection")
        collection.remove(method_ref2)
        self.assertFalse(method_ref in collection,
                         "Method ref still in collection")

        # ensure dead
        obj = None
        self.assertTrue(method_ref.is_dead(),
                        "Method ref still alive after destruction")
        self.assertTrue(method_ref2.is_dead(),
                        "Copied Method ref still alive after destruction")