# -*- coding: utf-8 -*-
# TODO: Add test for ObjectDelegate
import unittest
import Python.Test as Test
import System
from Python.Test import DelegateTest, StringDelegate
from _compat import DictProxyType
from utils import HelloClass, hello_func, MultipleHandler
class DelegateTests(unittest.TestCase):
"""Test CLR delegate support."""
def test_delegate_standard_attrs(self):
"""Test standard delegate attributes."""
from Python.Test import PublicDelegate
self.assertTrue(PublicDelegate.__name__ == 'PublicDelegate')
self.assertTrue(PublicDelegate.__module__ == 'Python.Test')
self.assertTrue(isinstance(PublicDelegate.__dict__, DictProxyType))
self.assertTrue(PublicDelegate.__doc__ is None)
def test_global_delegate_visibility(self):
"""Test visibility of module-level delegates."""
from Python.Test import PublicDelegate
self.assertTrue(PublicDelegate.__name__ == 'PublicDelegate')
self.assertTrue(Test.PublicDelegate.__name__ == 'PublicDelegate')
with self.assertRaises(ImportError):
from Python.Test import InternalDelegate
_ = InternalDelegate
with self.assertRaises(AttributeError):
_ = Test.InternalDelegate
def test_nested_delegate_visibility(self):
"""Test visibility of nested delegates."""
ob = DelegateTest.PublicDelegate
self.assertTrue(ob.__name__ == 'PublicDelegate')
ob = DelegateTest.ProtectedDelegate
self.assertTrue(ob.__name__ == 'ProtectedDelegate')
with self.assertRaises(AttributeError):
_ = DelegateTest.InternalDelegate
with self.assertRaises(AttributeError):
_ = DelegateTest.PrivateDelegate
def test_delegate_from_function(self):
"""Test delegate implemented with a Python function."""
d = StringDelegate(hello_func)
ob = DelegateTest()
self.assertTrue(ob.CallStringDelegate(d) == "hello")
self.assertTrue(d() == "hello")
ob.stringDelegate = d
self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello")
self.assertTrue(ob.stringDelegate() == "hello")
def test_delegate_from_method(self):
"""Test delegate implemented with a Python instance method."""
inst = HelloClass()
d = StringDelegate(inst.hello)
ob = DelegateTest()
self.assertTrue(ob.CallStringDelegate(d) == "hello")
self.assertTrue(d() == "hello")
ob.stringDelegate = d
self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello")
self.assertTrue(ob.stringDelegate() == "hello")
def test_delegate_from_unbound_method(self):
"""Test failure mode for unbound methods."""
with self.assertRaises(TypeError):
d = StringDelegate(HelloClass.hello)
d()
def test_delegate_from_static_method(self):
"""Test delegate implemented with a Python static method."""
d = StringDelegate(HelloClass.s_hello)
ob = DelegateTest()
self.assertTrue(ob.CallStringDelegate(d) == "hello")
self.assertTrue(d() == "hello")
ob.stringDelegate = d
self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello")
self.assertTrue(ob.stringDelegate() == "hello")
inst = HelloClass()
d = StringDelegate(inst.s_hello)
ob = DelegateTest()
self.assertTrue(ob.CallStringDelegate(d) == "hello")
self.assertTrue(d() == "hello")
ob.stringDelegate = d
self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello")
self.assertTrue(ob.stringDelegate() == "hello")
def test_delegate_from_class_method(self):
"""Test delegate implemented with a Python class method."""
d = StringDelegate(HelloClass.c_hello)
ob = DelegateTest()
self.assertTrue(ob.CallStringDelegate(d) == "hello")
self.assertTrue(d() == "hello")
ob.stringDelegate = d
self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello")
self.assertTrue(ob.stringDelegate() == "hello")
inst = HelloClass()
d = StringDelegate(inst.c_hello)
ob = DelegateTest()
self.assertTrue(ob.CallStringDelegate(d) == "hello")
self.assertTrue(d() == "hello")
ob.stringDelegate = d
self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello")
self.assertTrue(ob.stringDelegate() == "hello")
def test_delegate_from_callable(self):
"""Test delegate implemented with a Python callable object."""
inst = HelloClass()
d = StringDelegate(inst)
ob = DelegateTest()
self.assertTrue(ob.CallStringDelegate(d) == "hello")
self.assertTrue(d() == "hello")
ob.stringDelegate = d
self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello")
self.assertTrue(ob.stringDelegate() == "hello")
def test_delegate_from_managed_instance_method(self):
"""Test delegate implemented with a managed instance method."""
ob = DelegateTest()
d = StringDelegate(ob.SayHello)
self.assertTrue(ob.CallStringDelegate(d) == "hello")
self.assertTrue(d() == "hello")
ob.stringDelegate = d
self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello")
self.assertTrue(ob.stringDelegate() == "hello")
def test_delegate_from_managed_static_method(self):
"""Test delegate implemented with a managed static method."""
d = StringDelegate(DelegateTest.StaticSayHello)
ob = DelegateTest()
self.assertTrue(ob.CallStringDelegate(d) == "hello")
self.assertTrue(d() == "hello")
ob.stringDelegate = d
self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello")
self.assertTrue(ob.stringDelegate() == "hello")
def test_delegate_from_delegate(self):
"""Test delegate implemented with another delegate."""
d1 = StringDelegate(hello_func)
d2 = StringDelegate(d1)
ob = DelegateTest()
self.assertTrue(ob.CallStringDelegate(d2) == "hello")
self.assertTrue(d2() == "hello")
ob.stringDelegate = d2
self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello")
self.assertTrue(ob.stringDelegate() == "hello")
def test_delegate_with_invalid_args(self):
"""Test delegate instantiation with invalid (non-callable) args."""
with self.assertRaises(TypeError):
_ = StringDelegate(None)
with self.assertRaises(TypeError):
_ = StringDelegate("spam")
with self.assertRaises(TypeError):
_ = StringDelegate(1)
def test_multicast_delegate(self):
"""Test multicast delegates."""
inst = MultipleHandler()
d1 = StringDelegate(inst.count)
d2 = StringDelegate(inst.count)
md = System.Delegate.Combine(d1, d2)
ob = DelegateTest()
self.assertTrue(ob.CallStringDelegate(md) == "ok")
self.assertTrue(inst.value == 2)
self.assertTrue(md() == "ok")
self.assertTrue(inst.value == 4)
def test_subclass_delegate_fails(self):
"""Test that subclassing of a delegate type fails."""
from Python.Test import PublicDelegate
with self.assertRaises(TypeError):
class Boom(PublicDelegate):
pass
_ = Boom
def test_delegate_equality(self):
"""Test delegate equality."""
d = StringDelegate(hello_func)
ob = DelegateTest()
ob.stringDelegate = d
self.assertTrue(ob.stringDelegate == d)
def test_bool_delegate(self):
"""Test boolean delegate."""
from Python.Test import BoolDelegate
def always_so_negative():
return 0
d = BoolDelegate(always_so_negative)
ob = DelegateTest()
ob.CallBoolDelegate(d)
self.assertTrue(not d())
self.assertTrue(not ob.CallBoolDelegate(d))
# test async delegates
# test multicast delegates
# test explicit op_
# test sig mismatch, both on managed and Python side
# test return wrong type
def test_suite():
return unittest.makeSuite(DelegateTests)