[Zope-Checkins] CVS: Zope/lib/python/Interface/tests - IFoo.py:1.2 __init__.py:1.2 dummy.py:1.2 framework.py:1.2 testDocument.py:1.2 testImplements.py:1.2 testInterface.py:1.2 testVerify.py:1.2 testVisitImplements.py:1.2 unitfixtures.py:1.2

Jim Fulton jim@zope.com
Fri, 7 Jun 2002 13:18:30 -0400


Update of /cvs-repository/Zope/lib/python/Interface/tests
In directory cvs.zope.org:/tmp/cvs-serv24067/lib/python/Interface/tests

Added Files:
	IFoo.py __init__.py dummy.py framework.py testDocument.py 
	testImplements.py testInterface.py testVerify.py 
	testVisitImplements.py unitfixtures.py 
Log Message:
Backported Zope 3 Interface package to Python 2.1 and Zope 2.  Some
modifications were needed in Zope (only two files). A lot of unused
(or rarely) features were removed from the Interface package. Slightly
deeper imports are needed.


=== Zope/lib/python/Interface/tests/IFoo.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 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.
+# 
+##############################################################################
+from Interface import Interface
+
+class IFoo( Interface ):
+    """
+        Dummy interface for unit tests.
+    """
+
+    def bar( baz ):
+        """
+            Just a note.
+        """


=== Zope/lib/python/Interface/tests/__init__.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 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.
+# 
+##############################################################################
+""" Packagize. """


=== Zope/lib/python/Interface/tests/dummy.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 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.
+# 
+##############################################################################
+from Interface.tests.IFoo import IFoo
+
+__implements__ = IFoo
+
+def bar( baz ):
+    pass


=== Zope/lib/python/Interface/tests/framework.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 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.
+# 
+##############################################################################
+if not sys.modules.has_key('Testing'):
+    p0 = sys.path[0]
+    if p0 and __name__ == '__main__':
+        os.chdir(p0)
+        p0 = ''
+    p = d = os.path.abspath(os.curdir)
+    while d:
+        if os.path.isdir(os.path.join(p, 'Testing')):
+            sys.path[:1] = [p0, os.pardir, p]
+            break
+        p, d = os.path.split(p)
+    else:
+        print 'Unable to locate Testing package.'
+        sys.exit(1)
+
+import Testing, unittest
+execfile(os.path.join(os.path.split(Testing.__file__)[0], 'common.py'))
+
+


=== Zope/lib/python/Interface/tests/testDocument.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 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.
+# 
+##############################################################################
+"""
+
+Revision information:
+$Id$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+from Interface import Interface
+from Interface.Attribute import Attribute
+
+class Test(TestCase):
+
+    def testBlech(self):
+        from Interface.Document import asStructuredText
+
+        self.assertEqual(asStructuredText(I2), '''\
+I2
+
+ I2 doc
+
+ This interface extends:
+
+  o _I1
+
+ Attributes:
+
+  a1 -- no documentation
+
+  a2 -- a2 doc
+
+ Methods:
+
+  f21() -- f21 doc
+
+  f22() -- no documentation
+
+  f23() -- f23 doc
+
+''')
+  
+
+def test_suite():
+    return TestSuite((
+        makeSuite(Test),
+        ))
+
+class _I1(Interface):
+    def f11(): pass
+    def f12(): pass
+
+class I2(_I1):
+    "I2 doc"
+
+    a1 = Attribute('a1')
+    a2 = Attribute('a2', 'a2 doc')
+    
+    def f21(): "f21 doc"
+    def f22(): pass
+    def f23(): "f23 doc"
+
+if __name__=='__main__':
+    main(defaultTest='test_suite')


=== Zope/lib/python/Interface/tests/testImplements.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 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.
+# 
+##############################################################################
+from __future__ import nested_scopes
+from Interface import Interface
+from Interface.Implements import implements
+from Interface.Exceptions import DoesNotImplement, BrokenImplementation
+from Interface.Exceptions import BrokenMethodImplementation
+
+import unittest, sys
+
+class Test(unittest.TestCase):
+
+    def testSimple(self):
+
+        class I(Interface):
+            def f(): pass
+
+        class C: pass
+
+        self.assertRaises(BrokenImplementation, implements, C, I)
+
+        C.f=lambda self: None
+
+        implements(C, I)
+
+        self.assertEqual(C.__implements__, I)
+
+    def testAdd(self):
+
+        class I(Interface):
+            def f(): pass
+
+        class I2(Interface):
+            def g(): pass
+
+        class C:
+            __implements__=I2
+
+        self.assertRaises(BrokenImplementation, implements, C, I)
+        self.assertRaises(BrokenImplementation, implements, C, I2)
+
+        C.f=lambda self: None
+
+        implements(C, I)
+
+        self.assertEqual(C.__implements__, (I2, I))
+        self.assertRaises(BrokenImplementation, implements, C, I2)
+
+        C.g=C.f
+        implements(C, I)
+        implements(C, I2)
+
+
+def test_suite():
+    loader=unittest.TestLoader()
+    return loader.loadTestsFromTestCase(Test)
+
+if __name__=='__main__':
+    unittest.TextTestRunner().run(test_suite())


=== Zope/lib/python/Interface/tests/testInterface.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 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.
+# 
+##############################################################################
+
+import unittest
+import Interface
+from unitfixtures import *  # hehehe
+from Interface.Exceptions import BrokenImplementation
+from Interface.Implements import instancesOfObjectImplements
+from Interface.Implements import objectImplements
+from Interface import Interface
+from Interface.Attribute import Attribute
+
+class InterfaceTests(unittest.TestCase):
+
+    def setUp(self):
+        pass
+
+    def tearDown(self):
+        pass
+
+    def testClassImplements(self):
+        assert IC.isImplementedByInstancesOf(C)
+        
+        assert I1.isImplementedByInstancesOf(A)
+        assert I1.isImplementedByInstancesOf(B)
+        assert not I1.isImplementedByInstancesOf(C)
+        assert I1.isImplementedByInstancesOf(D)
+        assert I1.isImplementedByInstancesOf(E)
+
+        assert not I2.isImplementedByInstancesOf(A)
+        assert I2.isImplementedByInstancesOf(B)
+        assert not I2.isImplementedByInstancesOf(C)
+        assert not I2.isImplementedByInstancesOf(D)
+        assert not I2.isImplementedByInstancesOf(E)
+
+    def testUtil(self):
+        f = instancesOfObjectImplements
+        assert IC in f(C)
+        assert I1 in f(A)
+        assert not I1 in f(C)
+        assert I2 in f(B)
+        assert not I2 in f(C)
+
+        f = objectImplements
+        assert IC in f(C())
+        assert I1 in f(A())
+        assert not I1 in f(C())
+        assert I2 in f(B())
+        assert not I2 in f(C())
+
+
+    def testObjectImplements(self):
+        assert IC.isImplementedBy(C())
+        
+        assert I1.isImplementedBy(A())
+        assert I1.isImplementedBy(B())
+        assert not I1.isImplementedBy(C())
+        assert I1.isImplementedBy(D())
+        assert I1.isImplementedBy(E())
+
+        assert not I2.isImplementedBy(A())
+        assert I2.isImplementedBy(B())
+        assert not I2.isImplementedBy(C())
+        assert not I2.isImplementedBy(D())
+        assert not I2.isImplementedBy(E())
+
+    def testDeferredClass(self):
+        a = A()
+        self.assertRaises(BrokenImplementation, a.ma)
+
+
+    def testInterfaceExtendsInterface(self):
+        assert BazInterface.extends(BobInterface)
+        assert BazInterface.extends(BarInterface)
+        assert BazInterface.extends(FunInterface)
+        assert not BobInterface.extends(FunInterface)
+        assert not BobInterface.extends(BarInterface)
+        assert BarInterface.extends(FunInterface)
+        assert not BarInterface.extends(BazInterface)
+
+    def testVerifyImplementation(self):
+        from Interface.Verify import verifyClass
+        assert verifyClass(FooInterface, Foo)
+        assert Interface.isImplementedBy(I1)
+
+    def test_names(self):
+        names = list(_I2.names()); names.sort()
+        self.assertEqual(names, ['f21', 'f22', 'f23'])
+        names = list(_I2.names(1)); names.sort()
+        self.assertEqual(names, ['a1', 'f11', 'f12', 'f21', 'f22', 'f23'])
+
+    def test_namesAndDescriptions(self):
+        names = [nd[0] for nd in _I2.namesAndDescriptions()]; names.sort()
+        self.assertEqual(names, ['f21', 'f22', 'f23'])
+        names = [nd[0] for nd in _I2.namesAndDescriptions(1)]; names.sort()
+        self.assertEqual(names, ['a1', 'f11', 'f12', 'f21', 'f22', 'f23'])
+
+        for name, d in _I2.namesAndDescriptions(1):
+            self.assertEqual(name, d.__name__)
+
+    def test_getDescriptionFor(self):
+        self.assertEqual(_I2.getDescriptionFor('f11').__name__, 'f11')
+        self.assertEqual(_I2.getDescriptionFor('f22').__name__, 'f22')
+        self.assertEqual(_I2.queryDescriptionFor('f33', self), self)
+        self.assertRaises(KeyError, _I2.getDescriptionFor, 'f33')
+
+    def testAttr(self):
+        description = _I2.getDescriptionFor('a1')
+        self.assertEqual(description.__name__, 'a1')
+        self.assertEqual(description.__doc__, 'This is an attribute')
+    
+
+class _I1(Interface):
+
+    a1 = Attribute("This is an attribute")
+    
+    def f11(): pass
+    def f12(): pass
+
+class _I2(_I1):
+    def f21(): pass
+    def f22(): pass
+    def f23(): pass
+
+def test_suite():
+    return unittest.makeSuite(InterfaceTests)
+
+def main():
+    unittest.TextTestRunner().run(test_suite())
+
+if __name__=="__main__":
+    main()
+


=== Zope/lib/python/Interface/tests/testVerify.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 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.
+# 
+##############################################################################
+"""
+
+Revision information:
+$Id$
+"""
+from __future__ import nested_scopes
+
+
+from Interface import Interface
+from Interface.Verify import verifyClass, verifyObject
+from Interface.Exceptions import DoesNotImplement, BrokenImplementation
+from Interface.Exceptions import BrokenMethodImplementation
+
+import unittest, sys
+
+class Test(unittest.TestCase):
+
+    def testNotImplemented(self):
+
+        class C: pass
+
+        class I(Interface): pass
+
+        self.assertRaises(DoesNotImplement, verifyClass, I, C)
+
+        C.__implements__=I
+
+        verifyClass(I, C)
+
+    def testMissingAttr(self):
+
+        class I(Interface):
+            def f(): pass
+
+        class C: 
+
+            __implements__=I
+
+        self.assertRaises(BrokenImplementation, verifyClass, I, C)
+
+        C.f=lambda self: None
+
+        verifyClass(I, C)
+
+    def testWrongArgs(self):
+
+        class I(Interface):
+            def f(a): pass
+
+        class C:
+
+            def f(self, b): pass 
+
+            __implements__=I
+
+        # We no longer require names to match.
+        #self.assertRaises(BrokenMethodImplementation, verifyClass, I, C)
+
+        C.f=lambda self, a: None
+
+        verifyClass(I, C)
+
+        C.f=lambda self, **kw: None
+
+        self.assertRaises(BrokenMethodImplementation, verifyClass, I, C)
+
+        C.f=lambda self, a, *args: None
+
+        verifyClass(I, C)
+
+        C.f=lambda self, a, *args, **kw: None
+
+        verifyClass(I, C)
+
+        C.f=lambda self, *args: None
+
+        verifyClass(I, C)
+
+    def testExtraArgs(self):
+
+        class I(Interface):
+            def f(a): pass
+
+        class C:
+
+            def f(self, a, b): pass 
+
+            __implements__=I
+
+        self.assertRaises(BrokenMethodImplementation, verifyClass, I, C)
+
+        C.f=lambda self, a: None
+
+        verifyClass(I, C)
+
+        C.f=lambda self, a, b=None: None
+
+        verifyClass(I, C)
+
+    def testNoVar(self):
+
+        class I(Interface):
+            def f(a, *args): pass
+
+        class C:
+
+            def f(self, a): pass 
+
+            __implements__=I
+
+        self.assertRaises(BrokenMethodImplementation, verifyClass, I, C)
+
+        C.f=lambda self, a, *foo: None
+
+        verifyClass(I, C)
+
+    def testNoKW(self):
+
+        class I(Interface):
+            def f(a, **args): pass
+
+        class C:
+
+            def f(self, a): pass 
+
+            __implements__=I
+
+        self.assertRaises(BrokenMethodImplementation, verifyClass, I, C)
+
+        C.f=lambda self, a, **foo: None
+
+        verifyClass(I, C)
+
+    def testModule(self):
+
+        from Interface.tests.IFoo import IFoo
+        from Interface.tests import dummy
+
+        verifyObject(IFoo, dummy)
+        
+
+
+def test_suite():
+    loader=unittest.TestLoader()
+    return loader.loadTestsFromTestCase(Test)
+
+if __name__=='__main__':
+    unittest.TextTestRunner().run(test_suite())


=== Zope/lib/python/Interface/tests/testVisitImplements.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 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.
+# 
+##############################################################################
+import unittest, sys
+
+from Interface.Implements import visitImplements
+from Interface import Interface
+from Interface.Exceptions import BadImplements
+
+class I1(Interface): pass
+class I2(Interface): pass
+class I3(Interface): pass
+
+class Test(unittest.TestCase):
+
+    def testSimpleImplements(self):
+        data=[]
+        visitImplements(I1, None, data.append)
+        self.assertEqual(data, [I1])
+
+    def testSimpleBadImplements(self):
+        data=[]
+        self.assertRaises(BadImplements,
+                          visitImplements, unittest, None, data.append)
+        
+    def testComplexImplements(self):
+        data=[]
+        visitImplements((I1, (I2, I3)), None, data.append)
+        data = map(lambda i: i.__name__, data)
+        self.assertEqual(data, ['I1', 'I2', 'I3'])
+
+    def testComplexBadImplements(self):
+        data=[]
+        self.assertRaises(BadImplements,
+                          visitImplements, (I1, (I2, unittest)),
+                          None, data.append)
+
+
+def test_suite():
+    loader=unittest.TestLoader()
+    return loader.loadTestsFromTestCase(Test)
+
+if __name__=='__main__':
+    unittest.TextTestRunner().run(test_suite())


=== Zope/lib/python/Interface/tests/unitfixtures.py 1.1 => 1.2 ===
+#
+# Copyright (c) 2001, 2002 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.
+# 
+##############################################################################
+from Interface import Interface
+from Interface.Attribute import Attribute
+
+class mytest(Interface):
+    pass
+
+class C:
+    def m1(self, a, b):
+        "return 1"
+        return 1
+
+    def m2(self, a, b):
+        "return 2"
+        return 2
+
+# testInstancesOfClassImplements
+
+
+
+
+#  YAGNI IC=Interface.impliedInterface(C)
+class IC(Interface):
+    def m1(a, b):
+        "return 1"
+
+    def m2(a, b):
+        "return 2"
+    
+
+
+C.__implements__=IC
+
+class I1(Interface):
+    def ma():
+        "blah"
+
+class I2(I1): pass
+
+class I3(Interface): pass
+
+class I4(Interface): pass
+
+class A(I1.deferred()):
+    __implements__=I1
+
+class B:
+    __implements__=I2, I3
+
+class D(A, B): pass
+
+class E(A, B):
+    __implements__ = A.__implements__, C.__implements__
+
+
+class FooInterface(Interface):
+    """ This is an Abstract Base Class """
+
+    foobar = Attribute("fuzzed over beyond all recognition")
+
+    def aMethod(foo, bar, bingo):
+        """ This is aMethod """
+
+    def anotherMethod(foo=6, bar="where you get sloshed", bingo=(1,3,)):
+        """ This is anotherMethod """
+
+    def wammy(zip, *argues):
+        """ yadda yadda """
+
+    def useless(**keywords):
+        """ useless code is fun! """
+
+class Foo:
+    """ A concrete class """
+
+    __implements__ = FooInterface,
+
+    foobar = "yeah"
+
+    def aMethod(self, foo, bar, bingo):
+        """ This is aMethod """
+        return "barf!"
+
+    def anotherMethod(self, foo=6, bar="where you get sloshed", bingo=(1,3,)):
+        """ This is anotherMethod """
+        return "barf!"
+
+    def wammy(self, zip, *argues):
+        """ yadda yadda """
+        return "barf!"
+
+    def useless(self, **keywords):
+        """ useless code is fun! """
+        return "barf!"
+
+foo_instance = Foo()
+
+class Blah:
+    pass
+
+new = Interface.__class__
+FunInterface = new('FunInterface')
+BarInterface = new('BarInterface', [FunInterface])
+BobInterface = new('BobInterface')
+BazInterface = new('BazInterface', [BobInterface, BarInterface])