~certify-web-dev/twisted/certify-trunk

« back to all changes in this revision

Viewing changes to twisted/test/test_components.py

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2007-01-17 14:52:35 UTC
  • mfrom: (1.1.5 upstream) (2.1.2 etch)
  • Revision ID: james.westby@ubuntu.com-20070117145235-btmig6qfmqfen0om
Tags: 2.5.0-0ubuntu1
New upstream version, compatible with python2.5.

Show diffs side-by-side

added added

removed removed

Lines of Context:
5
5
"""Test cases for Twisted component architecture."""
6
6
 
7
7
from zope import interface as zinterface
 
8
from zope.interface import Interface, implements
8
9
 
9
10
from twisted.trial import unittest, util
10
11
from twisted.python import components
11
12
import warnings
12
13
 
13
 
compWarn = {'category':components.ComponentsDeprecationWarning}
14
 
suppress = [util.suppress(**compWarn)]
15
 
 
16
 
# Also filter warnings generated by top-level code
17
 
warnings.filterwarnings('ignore', **compWarn)
18
 
 
19
 
class IAdder(components.Interface):
20
 
    """A sample interface that adds stuff."""
21
 
 
22
 
    def add(self, a, b):
23
 
        """Returns the sub of a and b."""
24
 
        raise NotImplementedError
25
 
 
26
 
class ISub(IAdder):
27
 
    """Sub-interface."""
28
 
 
29
 
class IMultiply(components.Interface):
30
 
    """Interface that multiplies stuff."""
31
 
 
32
 
    def multiply(self, a, b):
33
 
        """Multiply two items."""
34
 
        raise NotImplementedError
35
 
 
36
 
 
37
 
class IntAdder:
38
 
    """Class that implements IAdder interface."""
39
 
    
40
 
    zinterface.implements(IAdder)
41
 
 
42
 
    def add(self, a, b):
43
 
        return a + b
44
 
 
45
 
class Sub:
46
 
    """Class that implements ISub."""
47
 
 
48
 
    zinterface.implements(ISub)
49
 
 
50
 
    def add(self, a, b):
51
 
        return 3
52
 
 
53
 
 
54
 
class IntMultiplyWithAdder:
55
 
    """Multiply, using Adder object."""
56
 
 
57
 
    zinterface.implements(IMultiply)
58
 
 
59
 
    def __init__(self, adder):
60
 
        self.adder = adder
61
 
 
62
 
    def multiply(self, a, b):
63
 
        result = 0
64
 
        for i in range(a):
65
 
            result = self.adder.add(result, b)
66
 
        return result
67
 
 
68
 
components.registerAdapter(IntMultiplyWithAdder, IntAdder, IMultiply)
69
 
 
70
 
class MultiplyAndAdd:
71
 
    """Multiply and add."""
72
 
 
73
 
    zinterface.implements(IAdder, IMultiply)
74
 
 
75
 
    def add(self, a, b):
76
 
        return a + b
77
 
 
78
 
    def multiply(self, a, b):
79
 
        return a * b
80
 
 
81
 
class IFoo(ISub):
82
 
    pass
83
 
 
84
 
class FooAdapterForMAA:
85
 
 
86
 
    zinterface.implements(IFoo)
87
 
 
88
 
    def __init__(self, instance):
89
 
        self.instance = instance
90
 
 
91
 
    def add(self, a, b):
92
 
        return self.instance.add(a, b)
93
 
 
94
 
components.registerAdapter(FooAdapterForMAA, MultiplyAndAdd, IFoo)
95
 
 
96
 
 
97
14
class InterfacesTestCase(unittest.TestCase):
98
15
    """Test interfaces."""
99
16
 
100
 
    def testModules(self):
101
 
        self.assertEquals(components.Interface.__module__, "twisted.python.components")
102
 
        self.assertEquals(IAdder.__module__, "twisted.test.test_components")
103
 
        self.assertEquals(IFoo.__module__, "twisted.test.test_components")
104
 
    
105
 
    def testClasses(self):
106
 
        components.fixClassImplements(Sub)
107
 
        components.fixClassImplements(MultiplyAndAdd)
108
 
        self.assert_( IMultiply.implementedBy(MultiplyAndAdd) )
109
 
        self.assert_( IAdder.implementedBy(MultiplyAndAdd) )
110
 
        self.assert_( IAdder.implementedBy(Sub) )
111
 
        self.assert_( ISub.implementedBy(Sub) )
112
 
 
113
 
    def testInstances(self):
114
 
        o = MultiplyAndAdd()
115
 
        self.assert_( IMultiply.providedBy(o) )
116
 
        self.assert_( IMultiply.providedBy(o) )
117
 
 
118
 
        o = Sub()
119
 
        self.assert_( IAdder.providedBy(o) )
120
 
        self.assert_( ISub.providedBy(o) )
121
 
 
122
 
    def testOther(self):
123
 
        self.assert_( not ISub.providedBy(3) )
124
 
        self.assert_( not ISub.providedBy("foo") )
125
 
 
126
 
 
127
17
class Compo(components.Componentized):
128
18
    num = 0
129
19
    def inc(self):
130
20
        self.num = self.num + 1
131
21
        return self.num
132
22
 
133
 
class IAdept(components.Interface):
134
 
    def adaptorFunc(self):
 
23
class IAdept(Interface):
 
24
    def adaptorFunc():
135
25
        raise NotImplementedError()
136
26
 
137
 
class IElapsed(components.Interface):
138
 
    def elapsedFunc(self):
 
27
class IElapsed(Interface):
 
28
    def elapsedFunc():
139
29
        """
140
30
        1!
141
31
        """
142
32
 
143
33
class Adept(components.Adapter):
144
 
    zinterface.implements(IAdept)
 
34
    implements(IAdept)
145
35
    def __init__(self, orig):
146
36
        self.original = orig
147
37
        self.num = 0
150
40
        return self.num, self.original.inc()
151
41
 
152
42
class Elapsed(components.Adapter):
153
 
    zinterface.implements(IElapsed)
 
43
    implements(IElapsed)
154
44
    def elapsedFunc(self):
155
45
        return 1
156
46
 
164
54
class CComp(BComp):
165
55
    pass
166
56
 
167
 
class ITest(components.Interface):
168
 
    pass
169
 
class ITest2(components.Interface):
170
 
    pass
171
 
class ITest3(components.Interface):
172
 
    pass
173
 
class ITest4(components.Interface):
 
57
class ITest(Interface):
 
58
    pass
 
59
class ITest2(Interface):
 
60
    pass
 
61
class ITest3(Interface):
 
62
    pass
 
63
class ITest4(Interface):
174
64
    pass
175
65
class Test(components.Adapter):
176
 
    zinterface.implements(ITest, ITest3, ITest4)
 
66
    implements(ITest, ITest3, ITest4)
177
67
    def __init__(self, orig):
178
68
        pass
179
69
class Test2:
180
 
    zinterface.implements(ITest2)
 
70
    implements(ITest2)
181
71
    temporaryAdapter = 1
182
72
    def __init__(self, orig):
183
73
        pass
221
111
        assert co4 == None
222
112
        assert co1 is co3
223
113
 
 
114
 
 
115
    def test_getComponentDefaults(self):
 
116
        """
 
117
        Test that a default value specified to Componentized.getComponent if
 
118
        there is no component for the requested interface.
 
119
        """
 
120
        componentized = components.Componentized()
 
121
        default = object()
 
122
        self.assertIdentical(
 
123
            componentized.getComponent(ITest, default),
 
124
            default)
 
125
        self.assertIdentical(
 
126
            componentized.getComponent(ITest, default=default),
 
127
            default)
 
128
        self.assertIdentical(
 
129
            componentized.getComponent(ITest),
 
130
            None)
 
131
 
 
132
 
 
133
 
224
134
class AdapterTestCase(unittest.TestCase):
225
135
    """Test adapters."""
226
136
 
227
 
    def testNoAdapter(self):
228
 
        o = Sub()
229
 
        multiplier = IMultiply(o, None)
230
 
        self.assertEquals(multiplier, None)
231
 
 
232
 
    def testSelfIsAdapter(self):
233
 
        o = IntAdder()
234
 
        adder = IAdder(o, None)
235
 
        self.assert_( o is adder )
236
 
 
237
 
    def testGetAdapter(self):
238
 
        o = IntAdder()
239
 
        self.assertEquals(o.add(3, 4), 7)
240
 
 
241
 
        # get an object implementing IMultiply
242
 
        multiplier = IMultiply(o, None)
243
 
 
244
 
        # check that it complies with the IMultiply interface
245
 
        self.assertEquals(multiplier.multiply(3, 4), 12)
246
 
 
247
 
    def testGetAdapterClass(self):
248
 
        mklass = components.getAdapterClass(IntAdder, IMultiply, None)
249
 
        self.assertEquals(mklass, IntMultiplyWithAdder)
250
 
 
251
 
    def testGetSubAdapter(self):
252
 
        o = MultiplyAndAdd()
253
 
        self.assert_( not IFoo.providedBy(o) )
254
 
        foo = IFoo(o, None)
255
 
        self.assert_( isinstance(foo, FooAdapterForMAA) )
256
 
 
257
 
    def testParentInterface(self):
258
 
        o = Sub()
259
 
        adder = IAdder(o, None)
260
 
        self.assertIdentical(o, adder)
261
 
 
262
 
    def testBadRegister(self):
263
 
        # should fail because we already registered an IMultiply adapter for IntAdder
264
 
        self.assertRaises(ValueError, components.registerAdapter, IntMultiplyWithAdder, IntAdder, IMultiply)
265
 
    
266
 
    def testAllowDuplicates(self):
267
 
        components.ALLOW_DUPLICATES = 1
268
 
        try: 
269
 
            components.registerAdapter(IntMultiplyWithAdder, IntAdder,
270
 
                                       IMultiply)
271
 
        except ValueError:
272
 
            self.fail("Should have allowed re-registration")
273
 
            
274
 
        # should fail because we already registered an IMultiply adapter
275
 
        # for IntAdder
276
 
        components.ALLOW_DUPLICATES = 0
277
 
        self.assertRaises(ValueError, components.registerAdapter,
278
 
                          IntMultiplyWithAdder, IntAdder, IMultiply)
279
 
    
280
137
    def testAdapterGetComponent(self):
281
138
        o = object()
282
139
        a = Adept(o)
283
 
        self.assertRaises(components.CannotAdapt, IAdder, a)
284
 
        self.assertEquals(IAdder(a, default=None), None)
285
 
 
286
 
    def testMultipleInterfaceRegistration(self):
287
 
        class IMIFoo(components.Interface):
288
 
            pass
289
 
        class IMIBar(components.Interface):
290
 
            pass
291
 
        class MIFooer(components.Adapter):
292
 
            zinterface.implements(IMIFoo, IMIBar)
293
 
        class Blegh:
294
 
            pass
295
 
        components.registerAdapter(MIFooer, Blegh, IMIFoo, IMIBar)
296
 
        self.assert_(isinstance(IMIFoo(Blegh()), MIFooer))
297
 
        self.assert_(isinstance(IMIBar(Blegh()), MIFooer))
298
 
 
299
 
class IMeta(components.Interface):
 
140
        self.assertRaises(components.CannotAdapt, ITest, a)
 
141
        self.assertEquals(ITest(a, None), None)
 
142
 
 
143
 
 
144
 
 
145
class IMeta(Interface):
300
146
    pass
301
147
 
302
148
class MetaAdder(components.Adapter):
303
 
    zinterface.implements(IMeta)
 
149
    implements(IMeta)
304
150
    def add(self, num):
305
151
        return self.original.num + num
306
152
 
307
153
class BackwardsAdder(components.Adapter):
308
 
    zinterface.implements(IMeta)
 
154
    implements(IMeta)
309
155
    def add(self, num):
310
156
        return self.original.num - num
311
157
 
326
172
        components.Componentized.__init__(self)
327
173
 
328
174
class ComponentMeta(components.Adapter):
329
 
    zinterface.implements(IMeta)
 
175
    implements(IMeta)
330
176
    def __init__(self, original):
331
177
        components.Adapter.__init__(self, original)
332
178
        self.num = self.original.num
344
190
components.registerAdapter(MetaAdder, MetaNumber, IMeta)
345
191
components.registerAdapter(ComponentAdder, ComponentNumber, IMeta)
346
192
 
347
 
class IAttrX(components.Interface):
348
 
    def x(self):
 
193
class IAttrX(Interface):
 
194
    def x():
349
195
        pass
350
196
 
351
 
class IAttrXX(components.Interface):
352
 
    def xx(self):
 
197
class IAttrXX(Interface):
 
198
    def xx():
353
199
        pass
354
200
 
355
201
class Xcellent:
356
 
    zinterface.implements(IAttrX)
 
202
    implements(IAttrX)
357
203
    def x(self):
358
204
        return 'x!'
359
205
 
386
232
        self.assertEqual(('x!', 'x!'), xx.xx())
387
233
 
388
234
 
389
 
class IISource1(components.Interface): pass
390
 
class IISource2(components.Interface): pass
391
 
class IIDest1(components.Interface): pass
392
 
 
393
 
class Dest1Impl(components.Adapter):
394
 
    zinterface.implements(IIDest1)
395
 
 
396
 
class Dest1Impl2(components.Adapter):
397
 
    zinterface.implements(IIDest1)
398
 
 
399
 
class Source12:
400
 
    zinterface.implements(IISource1, IISource2)
401
 
 
402
 
class Source21:
403
 
    zinterface.implements(IISource2, IISource1)
404
 
 
405
 
components.registerAdapter(Dest1Impl, IISource1, IIDest1)
406
 
components.registerAdapter(Dest1Impl2, IISource2, IIDest1)
407
 
 
408
 
class TestInterfaceInterface(unittest.TestCase):
409
 
 
410
 
    def testBasic(self):
411
 
        s12 = Source12()
412
 
        d = IIDest1(s12)
413
 
        self.failUnless(isinstance(d, Dest1Impl), str(s12))
414
 
        s21 = Source21()
415
 
        d = IIDest1(s21)
416
 
        self.failUnless(isinstance(d, Dest1Impl2), str(s21))
417
 
 
418
 
 
419
 
class IZope(zinterface.Interface):
420
 
    def amethod(a, b):
421
 
        pass
422
 
 
423
 
class Zopeable:
424
 
    pass
425
 
 
426
 
components.registerAdapter(lambda o: id(o), Zopeable, IZope)
427
 
 
428
 
class TestZope(unittest.TestCase):
429
 
 
430
 
    def testAdapter(self):
431
 
        x = Zopeable()
432
 
        self.assertEquals(id(x), IZope(x))
433
 
 
434
 
    def testSignatureString(self):
435
 
        # Make sure it cuts off the self from old t.p.c signatures.
436
 
        self.assertEquals(IAdder['add'].getSignatureString(), "(a, b)")
437
 
        self.assertEquals(IZope['amethod'].getSignatureString(), "(a, b)")
438
 
 
439
 
    def testClassIsGCd(self):
440
 
        import weakref, gc
441
 
        class Test(object):
442
 
            zinterface.implements(IZope)
443
 
        # Do some stuff with it
444
 
        components.backwardsCompatImplements(Test)
445
 
        IZope(Test())
446
 
 
447
 
        # Make a weakref to it, then ensure the weakref goes away
448
 
        r = weakref.ref(Test)
449
 
        del Test
450
 
        gc.collect()
451
 
        self.assertEquals(r(), None)
452
 
        
453
 
warnings.filterwarnings('default', **compWarn)
 
235
class RegistrationTestCase(unittest.TestCase):
 
236
    """
 
237
    Tests for adapter registration.
 
238
    """
 
239
    def _registerAdapterForClassOrInterface(self, original):
 
240
        adapter = lambda o: None
 
241
        class TheInterface(Interface):
 
242
            pass
 
243
        components.registerAdapter(adapter, original, TheInterface)
 
244
        self.assertIdentical(
 
245
            components.getAdapterFactory(original, TheInterface, None),
 
246
            adapter)
 
247
 
 
248
 
 
249
    def test_registerAdapterForClass(self):
 
250
        """
 
251
        Test that an adapter from a class can be registered and then looked
 
252
        up.
 
253
        """
 
254
        class TheOriginal(object):
 
255
            pass
 
256
        return self._registerAdapterForClassOrInterface(TheOriginal)
 
257
 
 
258
 
 
259
    def test_registerAdapterForInterface(self):
 
260
        """
 
261
        Test that an adapter from an interface can be registered and then
 
262
        looked up.
 
263
        """
 
264
        class TheOriginal(Interface):
 
265
            pass
 
266
        return self._registerAdapterForClassOrInterface(TheOriginal)
 
267
 
 
268
 
 
269
    def _duplicateAdapterForClassOrInterface(self, original):
 
270
        firstAdapter = lambda o: False
 
271
        secondAdapter = lambda o: True
 
272
        class TheInterface(Interface):
 
273
            pass
 
274
        components.registerAdapter(firstAdapter, original, TheInterface)
 
275
        self.assertRaises(
 
276
            ValueError,
 
277
            components.registerAdapter,
 
278
            secondAdapter, original, TheInterface)
 
279
        # Make sure that the original adapter is still around as well
 
280
        self.assertIdentical(
 
281
            components.getAdapterFactory(original, TheInterface, None),
 
282
            firstAdapter)
 
283
 
 
284
 
 
285
    def test_duplicateAdapterForClass(self):
 
286
        """
 
287
        Test that attempting to register a second adapter from a class
 
288
        raises the appropriate exception.
 
289
        """
 
290
        class TheOriginal(object):
 
291
            pass
 
292
        return self._duplicateAdapterForClassOrInterface(TheOriginal)
 
293
 
 
294
 
 
295
    def test_duplicateAdapterForInterface(self):
 
296
        """
 
297
        Test that attempting to register a second adapter from an interface
 
298
        raises the appropriate exception.
 
299
        """
 
300
        class TheOriginal(Interface):
 
301
            pass
 
302
        return self._duplicateAdapterForClassOrInterface(TheOriginal)
 
303
 
 
304
 
 
305
    def _duplicateAdapterForClassOrInterfaceAllowed(self, original):
 
306
        firstAdapter = lambda o: False
 
307
        secondAdapter = lambda o: True
 
308
        class TheInterface(Interface):
 
309
            pass
 
310
        components.registerAdapter(firstAdapter, original, TheInterface)
 
311
        components.ALLOW_DUPLICATES = True
 
312
        try:
 
313
            components.registerAdapter(secondAdapter, original, TheInterface)
 
314
            self.assertIdentical(
 
315
                components.getAdapterFactory(original, TheInterface, None),
 
316
                secondAdapter)
 
317
        finally:
 
318
            components.ALLOW_DUPLICATES = False
 
319
 
 
320
        # It should be rejected again at this point
 
321
        self.assertRaises(
 
322
            ValueError,
 
323
            components.registerAdapter,
 
324
            firstAdapter, original, TheInterface)
 
325
 
 
326
        self.assertIdentical(
 
327
            components.getAdapterFactory(original, TheInterface, None),
 
328
            secondAdapter)
 
329
 
 
330
    def test_duplicateAdapterForClassAllowed(self):
 
331
        """
 
332
        Test that when L{components.ALLOW_DUPLICATES} is set to a true
 
333
        value, duplicate registrations from classes are allowed to override
 
334
        the original registration.
 
335
        """
 
336
        class TheOriginal(object):
 
337
            pass
 
338
        return self._duplicateAdapterForClassOrInterfaceAllowed(TheOriginal)
 
339
 
 
340
 
 
341
    def test_duplicateAdapterForInterfaceAllowed(self):
 
342
        """
 
343
        Test that when L{components.ALLOW_DUPLICATES} is set to a true
 
344
        value, duplicate registrations from interfaces are allowed to
 
345
        override the original registration.
 
346
        """
 
347
        class TheOriginal(Interface):
 
348
            pass
 
349
        return self._duplicateAdapterForClassOrInterfaceAllowed(TheOriginal)
 
350
 
 
351
 
 
352
    def _multipleInterfacesForClassOrInterface(self, original):
 
353
        adapter = lambda o: None
 
354
        class FirstInterface(Interface):
 
355
            pass
 
356
        class SecondInterface(Interface):
 
357
            pass
 
358
        components.registerAdapter(adapter, original, FirstInterface, SecondInterface)
 
359
        self.assertIdentical(
 
360
            components.getAdapterFactory(original, FirstInterface, None),
 
361
            adapter)
 
362
        self.assertIdentical(
 
363
            components.getAdapterFactory(original, SecondInterface, None),
 
364
            adapter)
 
365
 
 
366
 
 
367
    def test_multipleInterfacesForClass(self):
 
368
        """
 
369
        Test the registration of an adapter from a class to several
 
370
        interfaces at once.
 
371
        """
 
372
        class TheOriginal(object):
 
373
            pass
 
374
        return self._multipleInterfacesForClassOrInterface(TheOriginal)
 
375
 
 
376
 
 
377
    def test_multipleInterfacesForInterface(self):
 
378
        """
 
379
        Test the registration of an adapter from an interface to several
 
380
        interfaces at once.
 
381
        """
 
382
        class TheOriginal(Interface):
 
383
            pass
 
384
        return self._multipleInterfacesForClassOrInterface(TheOriginal)
 
385
 
 
386
 
 
387
    def _subclassAdapterRegistrationForClassOrInterface(self, original):
 
388
        firstAdapter = lambda o: True
 
389
        secondAdapter = lambda o: False
 
390
        class TheSubclass(original):
 
391
            pass
 
392
        class TheInterface(Interface):
 
393
            pass
 
394
        components.registerAdapter(firstAdapter, original, TheInterface)
 
395
        components.registerAdapter(secondAdapter, TheSubclass, TheInterface)
 
396
        self.assertIdentical(
 
397
            components.getAdapterFactory(original, TheInterface, None),
 
398
            firstAdapter)
 
399
        self.assertIdentical(
 
400
            components.getAdapterFactory(TheSubclass, TheInterface, None),
 
401
            secondAdapter)
 
402
 
 
403
 
 
404
    def test_subclassAdapterRegistrationForClass(self):
 
405
        """
 
406
        Test that an adapter to a particular interface can be registered
 
407
        from both a class and its subclass.
 
408
        """
 
409
        class TheOriginal(object):
 
410
            pass
 
411
        return self._subclassAdapterRegistrationForClassOrInterface(TheOriginal)
 
412
 
 
413
 
 
414
    def test_subclassAdapterRegistrationForInterface(self):
 
415
        """
 
416
        Test that an adapter to a particular interface can be registered
 
417
        from both an interface and its subclass.
 
418
        """
 
419
        class TheOriginal(Interface):
 
420
            pass
 
421
        return self._subclassAdapterRegistrationForClassOrInterface(TheOriginal)