[Zope3-checkins] CVS: Zope3/src/zope/interface/tests - test_advice.py:1.4.4.1 test_declarations.py:1.4.2.1 test_type.py:1.6.8.1 test_verify.py:1.3.8.1 test_flatten.py:NONE test_implements.py:NONE test_visitimplements.py:NONE

Grégoire Weber zope@i-con.ch
Sun, 22 Jun 2003 10:24:16 -0400


Update of /cvs-repository/Zope3/src/zope/interface/tests
In directory cvs.zope.org:/tmp/cvs-serv24874/src/zope/interface/tests

Modified Files:
      Tag: cw-mail-branch
	test_declarations.py test_type.py test_verify.py 
Added Files:
      Tag: cw-mail-branch
	test_advice.py 
Removed Files:
      Tag: cw-mail-branch
	test_flatten.py test_implements.py test_visitimplements.py 
Log Message:
Synced up with HEAD

=== Added File Zope3/src/zope/interface/tests/test_advice.py ===

##############################################################################
#
# Copyright (c) 2003 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Tests for advice

This module was adapted from 'protocols.tests.advice', part of the Python
Enterprise Application Kit (PEAK).  Please notify the PEAK authors
(pje@telecommunity.com and tsarna@sarna.org) if bugs are found or
Zope-specific changes are required, so that the PEAK version of this module
can be kept in sync.

PEAK is a Python application framework that interoperates with (but does
not require) Zope 3 and Twisted.  It provides tools for manipulating UML
models, object-relational persistence, aspect-oriented programming, and more.
Visit the PEAK home page at http://peak.telecommunity.com for more information.

$Id: test_advice.py,v 1.4.4.1 2003/06/22 14:23:45 gregweb Exp $
"""

from unittest import TestCase, makeSuite, TestSuite
from zope.interface.advice import *
from types import ClassType
import sys

def ping(log, value):

    def pong(klass):
        log.append((value,klass))
        return [klass]

    addClassAdvisor(pong)

class ClassicClass:
    __metaclass__ = ClassType
    classLevelFrameInfo = getFrameInfo(sys._getframe())

class NewStyleClass:
    __metaclass__ = type
    classLevelFrameInfo = getFrameInfo(sys._getframe())

moduleLevelFrameInfo = getFrameInfo(sys._getframe())

class FrameInfoTest(TestCase):

    classLevelFrameInfo = getFrameInfo(sys._getframe())

    def checkModuleInfo(self):
        kind, module, f_locals, f_globals = moduleLevelFrameInfo
        self.assertEquals(kind, "module")
        for d in module.__dict__, f_locals, f_globals:
            self.assert_(d is globals())

    def checkClassicClassInfo(self):
        kind, module, f_locals, f_globals = ClassicClass.classLevelFrameInfo
        self.assertEquals(kind, "class")

        self.assert_(f_locals is ClassicClass.__dict__)  # ???
        for d in module.__dict__, f_globals:
            self.assert_(d is globals())

    def checkNewStyleClassInfo(self):
        kind, module, f_locals, f_globals = NewStyleClass.classLevelFrameInfo
        self.assertEquals(kind, "class")

        for d in module.__dict__, f_globals:
            self.assert_(d is globals())

    def checkCallInfo(self):
        kind, module, f_locals, f_globals = getFrameInfo(sys._getframe())
        self.assertEquals(kind, "function call")
        self.assert_(f_locals is locals()) # ???
        for d in module.__dict__, f_globals:
            self.assert_(d is globals())


class AdviceTests(TestCase):

    def checkOrder(self):
        log = []
        class Foo:
            ping(log, 1)
            ping(log, 2)
            ping(log, 3)

        # Strip the list nesting
        for i in 1,2,3:
            self.assert_(isinstance(Foo, list))
            Foo, = Foo

        self.assertEquals(log, [(1, Foo), (2, [Foo]), (3, [[Foo]])])

    def XXXcheckOutside(self):
        # Disabled because the check does not work with doctest tests.
        try:
            ping([], 1)
        except SyntaxError:
            pass
        else:
            raise AssertionError(
                "Should have detected advice outside class body"
            )

    def checkDoubleType(self):
        if sys.hexversion >= 0x02030000:
            return  # you can't duplicate bases in 2.3
        class aType(type,type):
            ping([],1)
        aType, = aType
        self.assert_(aType.__class__ is type)

    def checkSingleExplicitMeta(self):

        class M(type):
            pass

        class C(M):
            __metaclass__ = M
            ping([],1)

        C, = C
        self.assert_(C.__class__ is M)


    def checkMixedMetas(self):

        class M1(type): pass
        class M2(type): pass

        class B1: __metaclass__ = M1
        class B2: __metaclass__ = M2

        try:
            class C(B1,B2):
                ping([],1)
        except TypeError:
            pass
        else:
            raise AssertionError("Should have gotten incompatibility error")

        class M3(M1,M2): pass

        class C(B1,B2):
            __metaclass__ = M3
            ping([],1)

        self.assert_(isinstance(C,list))
        C, = C
        self.assert_(isinstance(C,M3))

    def checkMetaOfClass(self):

        class metameta(type):
            pass

        class meta(type):
            __metaclass__ = metameta

        self.assertEquals(determineMetaclass((meta, type)), metameta)

TestClasses = (AdviceTests, FrameInfoTest)

def test_suite():
    return TestSuite([makeSuite(t,'check') for t in TestClasses])























=== Zope3/src/zope/interface/tests/test_declarations.py 1.4 => 1.4.2.1 ===
--- Zope3/src/zope/interface/tests/test_declarations.py:1.4	Sun May 18 13:53:06 2003
+++ Zope3/src/zope/interface/tests/test_declarations.py	Sun Jun 22 10:23:45 2003
@@ -152,11 +152,143 @@
                          [])
         
 
+def test_signature_w_no_class_interfaces():
+    """
+    >>> from zope.interface import *
+    >>> class C:
+    ...     pass
+    >>> c = C()
+    >>> providedBy(c).__signature__
+    ''
+    
+    >>> class I(Interface):
+    ...    pass
+    >>> directlyProvides(c, I)
+    >>> int(providedBy(c).__signature__
+    ...     == directlyProvidedBy(c).__signature__)
+    1
+    """
+
+def test_classImplement_on_deeply_nested_classes():
+    """This test is in response to a bug found, which is why it's a bit
+    contrived
+
+    >>> from zope.interface import *
+    >>> class B1:
+    ...     pass
+    >>> class B2(B1):
+    ...     pass
+    >>> class B3(B2):
+    ...     pass
+    >>> class D:
+    ...     implements()
+    >>> class S(B3, D):
+    ...     implements()
+
+    This failed due to a bug in the code for finding __providedBy__
+    descriptors for old-style classes.
+
+    """
+
+def test_computeSignature():
+    """Compute a specification signature
+
+    For example::
+
+      >>> from zope.interface import Interface
+      >>> class I1(Interface): pass
+      ...
+      >>> class I2(I1): pass
+      ...
+      >>> spec = InterfaceSpecification(I2)
+      >>> int(spec.__signature__ == "%s\\t%s\\t%s" % (
+      ...    I2.__identifier__, I1.__identifier__,
+      ...    Interface.__identifier__))
+      1
+
+    """
+
+def test_cant_pickle_plain_specs():
+    """
+    >>> from pickle import dumps
+    >>> dumps(InterfaceSpecification())
+    Traceback (most recent call last):
+    ...
+    TypeError: can't pickle InterfaceSpecification objects
+    >>> dumps(InterfaceSpecification(), 2)
+    Traceback (most recent call last):
+    ...
+    TypeError: can't pickle InterfaceSpecification objects
+    
+    """
+
+def test_pickle_provides_specs():
+    """
+    >>> from pickle import dumps, loads
+    >>> a = A()
+    >>> int(I2.isImplementedBy(a))
+    0
+    >>> directlyProvides(a, I2)
+    >>> int(I2.isImplementedBy(a))
+    1
+    >>> a2 = loads(dumps(a))
+    >>> int(I2.isImplementedBy(a2))
+    1
+    
+    """
+
+def test_pickle_implements_specs():
+    """
+    >>> from pickle import dumps, loads
+    >>> class A:
+    ...   implements(I1)
+    >>> class B(A):
+    ...   implements(I2)
+    >>> names =  [i.__name__ for i in implementedBy(B)]
+    >>> names
+    ['I2', 'I1']
+    >>> old = B.__dict__['__implements__']
+    >>> new = loads(dumps(old))
+    >>> names =  [i.__name__ for i in new]
+    >>> names
+    ['I2']
+    >>> classImplements(A, I3)
+    >>> B.__implements__ = new
+    >>> names =  [i.__name__ for i in implementedBy(B)]
+    >>> names
+    ['I2', 'I1', 'I3']
+    
+    """
+
+def test_pickle_only_specs():
+    """
+    >>> from pickle import dumps, loads
+    >>> class A:
+    ...   implements(I1)
+    >>> class B(A):
+    ...   implementsOnly(I2)
+    >>> names =  [i.__name__ for i in implementedBy(B)]
+    >>> names
+    ['I2']
+    >>> old = B.__dict__['__implements__']
+    >>> new = loads(dumps(old))
+    >>> names =  [i.__name__ for i in new]
+    >>> names
+    ['I2']
+    >>> classImplements(A, I3)
+    >>> B.__implements__ = new
+    >>> names =  [i.__name__ for i in implementedBy(B)]
+    >>> names
+    ['I2']
+    
+    """
+
 
 def test_suite():
     suite = unittest.TestSuite()
     suite.addTest(unittest.makeSuite(Test))
     suite.addTest(DocTestSuite("zope.interface.declarations"))
+    suite.addTest(DocTestSuite())
     
     return suite
 


=== Zope3/src/zope/interface/tests/test_type.py 1.6 => 1.6.8.1 ===
--- Zope3/src/zope/interface/tests/test_type.py:1.6	Thu May  1 15:35:44 2003
+++ Zope3/src/zope/interface/tests/test_type.py	Sun Jun 22 10:23:45 2003
@@ -19,7 +19,7 @@
 
 import unittest
 from zope.interface.type import TypeRegistry
-from zope.interface import Interface
+from zope.interface import Interface, implements
 
 def getAllForObject(reg, ob):
     all = list(reg.getAllForObject(ob))
@@ -52,9 +52,9 @@
         self.assertEqual(getTypesMatching(reg, I2), [I2])
         self.assertEqual(getTypesMatching(reg, I3), [])
 
-        class C1: __implements__ = I1
-        class C2: __implements__ = I2
-        class C3: __implements__ = I3
+        class C1: implements(I1)
+        class C2: implements(I2)
+        class C3: implements(I3)
         class C: pass
 
         self.assertEqual(getAllForObject(reg, C1()), [])
@@ -131,11 +131,11 @@
         class I2(I1): pass
         class I3(I1): pass
         class I4(I2, I3): pass
-        class C1: __implements__ = I1
-        class C2: __implements__ = I2
-        class C3: __implements__ = I3
-        class C4: __implements__ = I4
-        class C5: __implements__ = I1, I2, I3, I4
+        class C1: implements(I1)
+        class C2: implements(I2)
+        class C3: implements(I3)
+        class C4: implements(I4)
+        class C5: implements(I1, I2, I3, I4)
         class C: pass
 
         reg = TypeRegistry()


=== Zope3/src/zope/interface/tests/test_verify.py 1.3 => 1.3.8.1 ===
--- Zope3/src/zope/interface/tests/test_verify.py:1.3	Thu May  1 15:35:44 2003
+++ Zope3/src/zope/interface/tests/test_verify.py	Sun Jun 22 10:23:45 2003
@@ -18,7 +18,7 @@
 """
 
 
-from zope.interface import Interface
+from zope.interface import Interface, implements, classImplements
 from zope.interface.verify import verifyClass, verifyObject
 from zope.interface.exceptions import DoesNotImplement, BrokenImplementation
 from zope.interface.exceptions import BrokenMethodImplementation
@@ -35,7 +35,7 @@
 
         self.assertRaises(DoesNotImplement, verifyClass, I, C)
 
-        C.__implements__=I
+        classImplements(C, I)
 
         verifyClass(I, C)
 
@@ -45,8 +45,7 @@
             def f(): pass
 
         class C:
-
-            __implements__=I
+            implements(I)
 
         self.assertRaises(BrokenImplementation, verifyClass, I, C)
 
@@ -65,7 +64,7 @@
 
         class C:
 
-            __implements__=I
+            implements(I)
 
         self.assertRaises(BrokenImplementation, verifyClass, I, C)
 
@@ -82,7 +81,7 @@
 
             def f(self, b): pass
 
-            __implements__=I
+            implements(I)
 
         # We no longer require names to match.
         #self.assertRaises(BrokenMethodImplementation, verifyClass, I, C)
@@ -116,7 +115,7 @@
 
             def f(self, a, b): pass
 
-            __implements__=I
+            implements(I)
 
         self.assertRaises(BrokenMethodImplementation, verifyClass, I, C)
 
@@ -137,7 +136,7 @@
 
             def f(self, a): pass
 
-            __implements__=I
+            implements(I)
 
         self.assertRaises(BrokenMethodImplementation, verifyClass, I, C)
 
@@ -154,7 +153,7 @@
 
             def f(self, a): pass
 
-            __implements__=I
+            implements(I)
 
         self.assertRaises(BrokenMethodImplementation, verifyClass, I, C)
 

=== Removed File Zope3/src/zope/interface/tests/test_flatten.py ===

=== Removed File Zope3/src/zope/interface/tests/test_implements.py ===

=== Removed File Zope3/src/zope/interface/tests/test_visitimplements.py ===