| Index: third_party/twisted_8_1/twisted/python/test/test_components.py
|
| diff --git a/third_party/twisted_8_1/twisted/python/test/test_components.py b/third_party/twisted_8_1/twisted/python/test/test_components.py
|
| deleted file mode 100644
|
| index 426923b7ed2105fda48de37ae126d0cb4327f130..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/python/test/test_components.py
|
| +++ /dev/null
|
| @@ -1,741 +0,0 @@
|
| -# Copyright (c) 2001-2007 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -
|
| -"""
|
| -Test cases for Twisted component architecture.
|
| -"""
|
| -
|
| -from zope.interface import Interface, implements, Attribute
|
| -
|
| -from twisted.trial import unittest
|
| -from twisted.python import components
|
| -from twisted.python.components import proxyForInterface
|
| -
|
| -
|
| -class InterfacesTestCase(unittest.TestCase):
|
| - """Test interfaces."""
|
| -
|
| -class Compo(components.Componentized):
|
| - num = 0
|
| - def inc(self):
|
| - self.num = self.num + 1
|
| - return self.num
|
| -
|
| -class IAdept(Interface):
|
| - def adaptorFunc():
|
| - raise NotImplementedError()
|
| -
|
| -class IElapsed(Interface):
|
| - def elapsedFunc():
|
| - """
|
| - 1!
|
| - """
|
| -
|
| -class Adept(components.Adapter):
|
| - implements(IAdept)
|
| - def __init__(self, orig):
|
| - self.original = orig
|
| - self.num = 0
|
| - def adaptorFunc(self):
|
| - self.num = self.num + 1
|
| - return self.num, self.original.inc()
|
| -
|
| -class Elapsed(components.Adapter):
|
| - implements(IElapsed)
|
| - def elapsedFunc(self):
|
| - return 1
|
| -
|
| -components.registerAdapter(Adept, Compo, IAdept)
|
| -components.registerAdapter(Elapsed, Compo, IElapsed)
|
| -
|
| -class AComp(components.Componentized):
|
| - pass
|
| -class BComp(AComp):
|
| - pass
|
| -class CComp(BComp):
|
| - pass
|
| -
|
| -class ITest(Interface):
|
| - pass
|
| -class ITest2(Interface):
|
| - pass
|
| -class ITest3(Interface):
|
| - pass
|
| -class ITest4(Interface):
|
| - pass
|
| -class Test(components.Adapter):
|
| - implements(ITest, ITest3, ITest4)
|
| - def __init__(self, orig):
|
| - pass
|
| -class Test2:
|
| - implements(ITest2)
|
| - temporaryAdapter = 1
|
| - def __init__(self, orig):
|
| - pass
|
| -
|
| -components.registerAdapter(Test, AComp, ITest)
|
| -components.registerAdapter(Test, AComp, ITest3)
|
| -components.registerAdapter(Test2, AComp, ITest2)
|
| -
|
| -
|
| -
|
| -
|
| -class ComponentizedTestCase(unittest.TestCase):
|
| - """Simple test case for caching in Componentized.
|
| - """
|
| - def testComponentized(self):
|
| - c = Compo()
|
| - assert c.getComponent(IAdept).adaptorFunc() == (1, 1)
|
| - assert c.getComponent(IAdept).adaptorFunc() == (2, 2)
|
| - assert IElapsed(IAdept(c)).elapsedFunc() == 1
|
| -
|
| - def testInheritanceAdaptation(self):
|
| - c = CComp()
|
| - co1 = c.getComponent(ITest)
|
| - co2 = c.getComponent(ITest)
|
| - co3 = c.getComponent(ITest2)
|
| - co4 = c.getComponent(ITest2)
|
| - assert co1 is co2
|
| - assert co3 is not co4
|
| - c.removeComponent(co1)
|
| - co5 = c.getComponent(ITest)
|
| - co6 = c.getComponent(ITest)
|
| - assert co5 is co6
|
| - assert co1 is not co5
|
| -
|
| - def testMultiAdapter(self):
|
| - c = CComp()
|
| - co1 = c.getComponent(ITest)
|
| - co2 = c.getComponent(ITest2)
|
| - co3 = c.getComponent(ITest3)
|
| - co4 = c.getComponent(ITest4)
|
| - assert co4 == None
|
| - assert co1 is co3
|
| -
|
| -
|
| - def test_getComponentDefaults(self):
|
| - """
|
| - Test that a default value specified to Componentized.getComponent if
|
| - there is no component for the requested interface.
|
| - """
|
| - componentized = components.Componentized()
|
| - default = object()
|
| - self.assertIdentical(
|
| - componentized.getComponent(ITest, default),
|
| - default)
|
| - self.assertIdentical(
|
| - componentized.getComponent(ITest, default=default),
|
| - default)
|
| - self.assertIdentical(
|
| - componentized.getComponent(ITest),
|
| - None)
|
| -
|
| -
|
| -
|
| -class AdapterTestCase(unittest.TestCase):
|
| - """Test adapters."""
|
| -
|
| - def testAdapterGetComponent(self):
|
| - o = object()
|
| - a = Adept(o)
|
| - self.assertRaises(components.CannotAdapt, ITest, a)
|
| - self.assertEquals(ITest(a, None), None)
|
| -
|
| -
|
| -
|
| -class IMeta(Interface):
|
| - pass
|
| -
|
| -class MetaAdder(components.Adapter):
|
| - implements(IMeta)
|
| - def add(self, num):
|
| - return self.original.num + num
|
| -
|
| -class BackwardsAdder(components.Adapter):
|
| - implements(IMeta)
|
| - def add(self, num):
|
| - return self.original.num - num
|
| -
|
| -class MetaNumber:
|
| - def __init__(self, num):
|
| - self.num = num
|
| -
|
| -class FakeAdder:
|
| - def add(self, num):
|
| - return num + 5
|
| -
|
| -class FakeNumber:
|
| - num = 3
|
| -
|
| -class ComponentNumber(components.Componentized):
|
| - def __init__(self):
|
| - self.num = 0
|
| - components.Componentized.__init__(self)
|
| -
|
| -class ComponentMeta(components.Adapter):
|
| - implements(IMeta)
|
| - def __init__(self, original):
|
| - components.Adapter.__init__(self, original)
|
| - self.num = self.original.num
|
| -
|
| -class ComponentAdder(ComponentMeta):
|
| - def add(self, num):
|
| - self.num += num
|
| - return self.num
|
| -
|
| -class ComponentDoubler(ComponentMeta):
|
| - def add(self, num):
|
| - self.num += (num * 2)
|
| - return self.original.num
|
| -
|
| -components.registerAdapter(MetaAdder, MetaNumber, IMeta)
|
| -components.registerAdapter(ComponentAdder, ComponentNumber, IMeta)
|
| -
|
| -class IAttrX(Interface):
|
| - def x():
|
| - pass
|
| -
|
| -class IAttrXX(Interface):
|
| - def xx():
|
| - pass
|
| -
|
| -class Xcellent:
|
| - implements(IAttrX)
|
| - def x(self):
|
| - return 'x!'
|
| -
|
| -class DoubleXAdapter:
|
| - num = 42
|
| - def __init__(self, original):
|
| - self.original = original
|
| - def xx(self):
|
| - return (self.original.x(), self.original.x())
|
| - def __cmp__(self, other):
|
| - return cmp(self.num, other.num)
|
| -
|
| -components.registerAdapter(DoubleXAdapter, IAttrX, IAttrXX)
|
| -
|
| -class TestMetaInterface(unittest.TestCase):
|
| -
|
| - def testBasic(self):
|
| - n = MetaNumber(1)
|
| - self.assertEquals(IMeta(n).add(1), 2)
|
| -
|
| - def testComponentizedInteraction(self):
|
| - c = ComponentNumber()
|
| - IMeta(c).add(1)
|
| - IMeta(c).add(1)
|
| - self.assertEquals(IMeta(c).add(1), 3)
|
| -
|
| - def testAdapterWithCmp(self):
|
| - # Make sure that a __cmp__ on an adapter doesn't break anything
|
| - xx = IAttrXX(Xcellent())
|
| - self.assertEqual(('x!', 'x!'), xx.xx())
|
| -
|
| -
|
| -class RegistrationTestCase(unittest.TestCase):
|
| - """
|
| - Tests for adapter registration.
|
| - """
|
| - def _registerAdapterForClassOrInterface(self, original):
|
| - adapter = lambda o: None
|
| - class TheInterface(Interface):
|
| - pass
|
| - components.registerAdapter(adapter, original, TheInterface)
|
| - self.assertIdentical(
|
| - components.getAdapterFactory(original, TheInterface, None),
|
| - adapter)
|
| -
|
| -
|
| - def test_registerAdapterForClass(self):
|
| - """
|
| - Test that an adapter from a class can be registered and then looked
|
| - up.
|
| - """
|
| - class TheOriginal(object):
|
| - pass
|
| - return self._registerAdapterForClassOrInterface(TheOriginal)
|
| -
|
| -
|
| - def test_registerAdapterForInterface(self):
|
| - """
|
| - Test that an adapter from an interface can be registered and then
|
| - looked up.
|
| - """
|
| - class TheOriginal(Interface):
|
| - pass
|
| - return self._registerAdapterForClassOrInterface(TheOriginal)
|
| -
|
| -
|
| - def _duplicateAdapterForClassOrInterface(self, original):
|
| - firstAdapter = lambda o: False
|
| - secondAdapter = lambda o: True
|
| - class TheInterface(Interface):
|
| - pass
|
| - components.registerAdapter(firstAdapter, original, TheInterface)
|
| - self.assertRaises(
|
| - ValueError,
|
| - components.registerAdapter,
|
| - secondAdapter, original, TheInterface)
|
| - # Make sure that the original adapter is still around as well
|
| - self.assertIdentical(
|
| - components.getAdapterFactory(original, TheInterface, None),
|
| - firstAdapter)
|
| -
|
| -
|
| - def test_duplicateAdapterForClass(self):
|
| - """
|
| - Test that attempting to register a second adapter from a class
|
| - raises the appropriate exception.
|
| - """
|
| - class TheOriginal(object):
|
| - pass
|
| - return self._duplicateAdapterForClassOrInterface(TheOriginal)
|
| -
|
| -
|
| - def test_duplicateAdapterForInterface(self):
|
| - """
|
| - Test that attempting to register a second adapter from an interface
|
| - raises the appropriate exception.
|
| - """
|
| - class TheOriginal(Interface):
|
| - pass
|
| - return self._duplicateAdapterForClassOrInterface(TheOriginal)
|
| -
|
| -
|
| - def _duplicateAdapterForClassOrInterfaceAllowed(self, original):
|
| - firstAdapter = lambda o: False
|
| - secondAdapter = lambda o: True
|
| - class TheInterface(Interface):
|
| - pass
|
| - components.registerAdapter(firstAdapter, original, TheInterface)
|
| - components.ALLOW_DUPLICATES = True
|
| - try:
|
| - components.registerAdapter(secondAdapter, original, TheInterface)
|
| - self.assertIdentical(
|
| - components.getAdapterFactory(original, TheInterface, None),
|
| - secondAdapter)
|
| - finally:
|
| - components.ALLOW_DUPLICATES = False
|
| -
|
| - # It should be rejected again at this point
|
| - self.assertRaises(
|
| - ValueError,
|
| - components.registerAdapter,
|
| - firstAdapter, original, TheInterface)
|
| -
|
| - self.assertIdentical(
|
| - components.getAdapterFactory(original, TheInterface, None),
|
| - secondAdapter)
|
| -
|
| - def test_duplicateAdapterForClassAllowed(self):
|
| - """
|
| - Test that when L{components.ALLOW_DUPLICATES} is set to a true
|
| - value, duplicate registrations from classes are allowed to override
|
| - the original registration.
|
| - """
|
| - class TheOriginal(object):
|
| - pass
|
| - return self._duplicateAdapterForClassOrInterfaceAllowed(TheOriginal)
|
| -
|
| -
|
| - def test_duplicateAdapterForInterfaceAllowed(self):
|
| - """
|
| - Test that when L{components.ALLOW_DUPLICATES} is set to a true
|
| - value, duplicate registrations from interfaces are allowed to
|
| - override the original registration.
|
| - """
|
| - class TheOriginal(Interface):
|
| - pass
|
| - return self._duplicateAdapterForClassOrInterfaceAllowed(TheOriginal)
|
| -
|
| -
|
| - def _multipleInterfacesForClassOrInterface(self, original):
|
| - adapter = lambda o: None
|
| - class FirstInterface(Interface):
|
| - pass
|
| - class SecondInterface(Interface):
|
| - pass
|
| - components.registerAdapter(adapter, original, FirstInterface, SecondInterface)
|
| - self.assertIdentical(
|
| - components.getAdapterFactory(original, FirstInterface, None),
|
| - adapter)
|
| - self.assertIdentical(
|
| - components.getAdapterFactory(original, SecondInterface, None),
|
| - adapter)
|
| -
|
| -
|
| - def test_multipleInterfacesForClass(self):
|
| - """
|
| - Test the registration of an adapter from a class to several
|
| - interfaces at once.
|
| - """
|
| - class TheOriginal(object):
|
| - pass
|
| - return self._multipleInterfacesForClassOrInterface(TheOriginal)
|
| -
|
| -
|
| - def test_multipleInterfacesForInterface(self):
|
| - """
|
| - Test the registration of an adapter from an interface to several
|
| - interfaces at once.
|
| - """
|
| - class TheOriginal(Interface):
|
| - pass
|
| - return self._multipleInterfacesForClassOrInterface(TheOriginal)
|
| -
|
| -
|
| - def _subclassAdapterRegistrationForClassOrInterface(self, original):
|
| - firstAdapter = lambda o: True
|
| - secondAdapter = lambda o: False
|
| - class TheSubclass(original):
|
| - pass
|
| - class TheInterface(Interface):
|
| - pass
|
| - components.registerAdapter(firstAdapter, original, TheInterface)
|
| - components.registerAdapter(secondAdapter, TheSubclass, TheInterface)
|
| - self.assertIdentical(
|
| - components.getAdapterFactory(original, TheInterface, None),
|
| - firstAdapter)
|
| - self.assertIdentical(
|
| - components.getAdapterFactory(TheSubclass, TheInterface, None),
|
| - secondAdapter)
|
| -
|
| -
|
| - def test_subclassAdapterRegistrationForClass(self):
|
| - """
|
| - Test that an adapter to a particular interface can be registered
|
| - from both a class and its subclass.
|
| - """
|
| - class TheOriginal(object):
|
| - pass
|
| - return self._subclassAdapterRegistrationForClassOrInterface(TheOriginal)
|
| -
|
| -
|
| - def test_subclassAdapterRegistrationForInterface(self):
|
| - """
|
| - Test that an adapter to a particular interface can be registered
|
| - from both an interface and its subclass.
|
| - """
|
| - class TheOriginal(Interface):
|
| - pass
|
| - return self._subclassAdapterRegistrationForClassOrInterface(TheOriginal)
|
| -
|
| -
|
| -
|
| -class IProxiedInterface(Interface):
|
| - """
|
| - An interface class for use by L{proxyForInterface}.
|
| - """
|
| -
|
| - ifaceAttribute = Attribute("""
|
| - An example declared attribute, which should be proxied.""")
|
| -
|
| - def yay(*a, **kw):
|
| - """
|
| - A sample method which should be proxied.
|
| - """
|
| -
|
| -class IProxiedSubInterface(IProxiedInterface):
|
| - """
|
| - An interface that derives from another for use with L{proxyForInterface}.
|
| - """
|
| -
|
| - def boo(self):
|
| - """
|
| - A different sample method which should be proxied.
|
| - """
|
| -
|
| -
|
| -
|
| -class Yayable(object):
|
| - """
|
| - A provider of L{IProxiedInterface} which increments a counter for
|
| - every call to C{yay}.
|
| -
|
| - @ivar yays: The number of times C{yay} has been called.
|
| - """
|
| - implements(IProxiedInterface)
|
| -
|
| - def __init__(self):
|
| - self.yays = 0
|
| - self.yayArgs = []
|
| -
|
| - def yay(self, *a, **kw):
|
| - """
|
| - Increment C{self.yays}.
|
| - """
|
| - self.yays += 1
|
| - self.yayArgs.append((a, kw))
|
| - return self.yays
|
| -
|
| -
|
| -class Booable(object):
|
| - """
|
| - An implementation of IProxiedSubInterface
|
| - """
|
| - implements(IProxiedSubInterface)
|
| - yayed = False
|
| - booed = False
|
| - def yay(self):
|
| - """
|
| - Mark the fact that 'yay' has been called.
|
| - """
|
| - self.yayed = True
|
| -
|
| -
|
| - def boo(self):
|
| - """
|
| - Mark the fact that 'boo' has been called.1
|
| - """
|
| - self.booed = True
|
| -
|
| -
|
| -
|
| -class IMultipleMethods(Interface):
|
| - """
|
| - An interface with multiple methods.
|
| - """
|
| -
|
| - def methodOne():
|
| - """
|
| - The first method. Should return 1.
|
| - """
|
| -
|
| - def methodTwo():
|
| - """
|
| - The second method. Should return 2.
|
| - """
|
| -
|
| -
|
| -
|
| -class MultipleMethodImplementor(object):
|
| - """
|
| - A precise implementation of L{IMultipleMethods}.
|
| - """
|
| -
|
| - def methodOne(self):
|
| - """
|
| - @return: 1
|
| - """
|
| - return 1
|
| -
|
| -
|
| - def methodTwo(self):
|
| - """
|
| - @return: 2
|
| - """
|
| - return 2
|
| -
|
| -
|
| -
|
| -class ProxyForInterfaceTests(unittest.TestCase):
|
| - """
|
| - Tests for L{proxyForInterface}.
|
| - """
|
| -
|
| - def test_original(self):
|
| - """
|
| - Proxy objects should have an C{original} attribute which refers to the
|
| - original object passed to the constructor.
|
| - """
|
| - original = object()
|
| - proxy = proxyForInterface(IProxiedInterface)(original)
|
| - self.assertIdentical(proxy.original, original)
|
| -
|
| -
|
| - def test_proxyMethod(self):
|
| - """
|
| - The class created from L{proxyForInterface} passes methods on an
|
| - interface to the object which is passed to its constructor.
|
| - """
|
| - klass = proxyForInterface(IProxiedInterface)
|
| - yayable = Yayable()
|
| - proxy = klass(yayable)
|
| - proxy.yay()
|
| - self.assertEquals(proxy.yay(), 2)
|
| - self.assertEquals(yayable.yays, 2)
|
| -
|
| -
|
| - def test_proxyAttribute(self):
|
| - """
|
| - Proxy objects should proxy declared attributes, but not other
|
| - attributes.
|
| - """
|
| - yayable = Yayable()
|
| - yayable.ifaceAttribute = object()
|
| - proxy = proxyForInterface(IProxiedInterface)(yayable)
|
| - self.assertIdentical(proxy.ifaceAttribute, yayable.ifaceAttribute)
|
| - self.assertRaises(AttributeError, lambda: proxy.yays)
|
| -
|
| -
|
| - def test_proxySetAttribute(self):
|
| - """
|
| - The attributes that proxy objects proxy should be assignable and affect
|
| - the original object.
|
| - """
|
| - yayable = Yayable()
|
| - proxy = proxyForInterface(IProxiedInterface)(yayable)
|
| - thingy = object()
|
| - proxy.ifaceAttribute = thingy
|
| - self.assertIdentical(yayable.ifaceAttribute, thingy)
|
| -
|
| -
|
| - def test_proxyDeleteAttribute(self):
|
| - """
|
| - The attributes that proxy objects proxy should be deletable and affect
|
| - the original object.
|
| - """
|
| - yayable = Yayable()
|
| - yayable.ifaceAttribute = None
|
| - proxy = proxyForInterface(IProxiedInterface)(yayable)
|
| - del proxy.ifaceAttribute
|
| - self.assertFalse(hasattr(yayable, 'ifaceAttribute'))
|
| -
|
| -
|
| - def test_multipleMethods(self):
|
| - """
|
| - [Regression test] The proxy should send its method calls to the correct
|
| - method, not the incorrect one.
|
| - """
|
| - multi = MultipleMethodImplementor()
|
| - proxy = proxyForInterface(IMultipleMethods)(multi)
|
| - self.assertEquals(proxy.methodOne(), 1)
|
| - self.assertEquals(proxy.methodTwo(), 2)
|
| -
|
| -
|
| - def test_subclassing(self):
|
| - """
|
| - It is possible to subclass the result of L{proxyForInterface}.
|
| - """
|
| -
|
| - class SpecializedProxy(proxyForInterface(IProxiedInterface)):
|
| - """
|
| - A specialized proxy which can decrement the number of yays.
|
| - """
|
| - def boo(self):
|
| - """
|
| - Decrement the number of yays.
|
| - """
|
| - self.original.yays -= 1
|
| -
|
| - yayable = Yayable()
|
| - special = SpecializedProxy(yayable)
|
| - self.assertEquals(yayable.yays, 0)
|
| - special.boo()
|
| - self.assertEquals(yayable.yays, -1)
|
| -
|
| -
|
| - def test_proxyName(self):
|
| - """
|
| - The name of a proxy class indicates which interface it proxies.
|
| - """
|
| - proxy = proxyForInterface(IProxiedInterface)
|
| - self.assertEquals(
|
| - proxy.__name__,
|
| - "(Proxy for "
|
| - "twisted.python.test.test_components.IProxiedInterface)")
|
| -
|
| -
|
| - def test_provides(self):
|
| - """
|
| - The resulting proxy provides the Interface that it proxies.
|
| - """
|
| - proxy = proxyForInterface(IProxiedInterface)
|
| - self.assertTrue(IProxiedInterface.providedBy(proxy))
|
| -
|
| -
|
| - def test_proxyDescriptorGet(self):
|
| - """
|
| - _ProxyDescriptor's __get__ method should return the appropriate
|
| - attribute of its argument's 'original' attribute if it is invoked with
|
| - an object. If it is invoked with None, it should return a false
|
| - class-method emulator instead.
|
| -
|
| - For some reason, Python's documentation recommends to define
|
| - descriptors' __get__ methods with the 'type' parameter as optional,
|
| - despite the fact that Python itself never actually calls the descriptor
|
| - that way. This is probably do to support 'foo.__get__(bar)' as an
|
| - idiom. Let's make sure that the behavior is correct. Since we don't
|
| - actually use the 'type' argument at all, this test calls it the
|
| - idiomatic way to ensure that signature works; test_proxyInheritance
|
| - verifies the how-Python-actually-calls-it signature.
|
| - """
|
| - class Sample:
|
| - called = False
|
| - def hello(self):
|
| - self.called = True
|
| - fakeProxy = Sample()
|
| - testObject = Sample()
|
| - fakeProxy.original = testObject
|
| - pd = components._ProxyDescriptor("hello", "original")
|
| - self.assertEquals(pd.__get__(fakeProxy), testObject.hello)
|
| - fakeClassMethod = pd.__get__(None)
|
| - fakeClassMethod(fakeProxy)
|
| - self.failUnless(testObject.called)
|
| -
|
| -
|
| - def test_proxyInheritance(self):
|
| - """
|
| - Subclasses of the class returned from L{proxyForInterface} should be
|
| - able to upcall methods by reference to their superclass, as any normal
|
| - Python class can.
|
| - """
|
| - class YayableWrapper(proxyForInterface(IProxiedInterface)):
|
| - """
|
| - This class does not override any functionality.
|
| - """
|
| -
|
| - class EnhancedWrapper(YayableWrapper):
|
| - """
|
| - This class overrides the 'yay' method.
|
| - """
|
| - wrappedYays = 1
|
| - def yay(self, *a, **k):
|
| - self.wrappedYays += 1
|
| - return YayableWrapper.yay(self, *a, **k) + 7
|
| -
|
| - yayable = Yayable()
|
| - wrapper = EnhancedWrapper(yayable)
|
| - self.assertEquals(wrapper.yay(3, 4, x=5, y=6), 8)
|
| - self.assertEquals(yayable.yayArgs,
|
| - [((3, 4), dict(x=5, y=6))])
|
| -
|
| -
|
| - def test_interfaceInheritance(self):
|
| - """
|
| - Proxies of subinterfaces generated with proxyForInterface should allow
|
| - access to attributes of both the child and the base interfaces.
|
| - """
|
| - proxyClass = proxyForInterface(IProxiedSubInterface)
|
| - booable = Booable()
|
| - proxy = proxyClass(booable)
|
| - proxy.yay()
|
| - proxy.boo()
|
| - self.failUnless(booable.yayed)
|
| - self.failUnless(booable.booed)
|
| -
|
| -
|
| - def test_attributeCustomization(self):
|
| - """
|
| - The original attribute name can be customized via the
|
| - C{originalAttribute} argument of L{proxyForInterface}: the attribute
|
| - should change, but the methods of the original object should still be
|
| - callable, and the attributes still accessible.
|
| - """
|
| - yayable = Yayable()
|
| - yayable.ifaceAttribute = object()
|
| - proxy = proxyForInterface(
|
| - IProxiedInterface, originalAttribute='foo')(yayable)
|
| - self.assertIdentical(proxy.foo, yayable)
|
| -
|
| - # Check the behavior
|
| - self.assertEquals(proxy.yay(), 1)
|
| - self.assertIdentical(proxy.ifaceAttribute, yayable.ifaceAttribute)
|
| - thingy = object()
|
| - proxy.ifaceAttribute = thingy
|
| - self.assertIdentical(yayable.ifaceAttribute, thingy)
|
| - del proxy.ifaceAttribute
|
| - self.assertFalse(hasattr(yayable, 'ifaceAttribute'))
|
| -
|
|
|