From: <ti...@us...> - 2003-10-27 20:41:56
|
Update of /cvsroot/archetypes/Archetypes/tests In directory sc8-pr-cvs1:/tmp/cvs-serv12357/tests Modified Files: Tag: tiran-zopetestcase-branch common.py test_interfaces.py Log Message: renamed some methods added support for testing instances Index: common.py =================================================================== RCS file: /cvsroot/archetypes/Archetypes/tests/Attic/common.py,v retrieving revision 1.1.2.7 retrieving revision 1.1.2.8 diff -u -d -r1.1.2.7 -r1.1.2.8 --- common.py 22 Oct 2003 17:27:39 -0000 1.1.2.7 +++ common.py 27 Oct 2003 20:35:45 -0000 1.1.2.8 @@ -46,13 +46,15 @@ return True def getImplementsOfInstances(object): return () + def getImplements(object): + return () def flattenInterfaces(interfaces, remove_duplicates=1): return () class BrokenImplementation(Execption): pass class DoesNotImplement(Execption): pass class BrokenMethodImplementation(Execption): pass else: - from Interface.Implements import getImplementsOfInstances, flattenInterfaces + from Interface.Implements import getImplementsOfInstances, getImplements, flattenInterfaces from Interface.Verify import verifyClass, verifyObject from Interface.Exceptions import BrokenImplementation, DoesNotImplement from Interface.Exceptions import BrokenMethodImplementation @@ -68,7 +70,7 @@ have failed: '%s' " % (self.test, self.precondition) __all__ = ('ZopeTestCase', 'ArchetypesTestCase', 'ArcheSiteTestCase', 'Xprint', - 'verifyClass', 'verifyObject', 'BrokenImplementation', + 'verifyClass', 'verifyObject', 'getImplements', 'BrokenImplementation', 'DoesNotImplement', 'BrokenMethodImplementation', 'getImplementsOfInstances', 'flattenInterfaces', 'newSecurityManager', 'noSecurityManager', Index: test_interfaces.py =================================================================== RCS file: /cvsroot/archetypes/Archetypes/tests/Attic/test_interfaces.py,v retrieving revision 1.1.2.4 retrieving revision 1.1.2.5 diff -u -d -r1.1.2.4 -r1.1.2.5 --- test_interfaces.py 22 Oct 2003 17:30:18 -0000 1.1.2.4 +++ test_interfaces.py 27 Oct 2003 20:35:45 -0000 1.1.2.5 @@ -34,15 +34,18 @@ from Products.Archetypes.Storage import Storage, ReadOnlyStorage, \ StorageLayer, AttributeStorage, ObjectManagedStorage, MetadataStorage from Products.Archetypes.Validators import DateValidator +from Products.Archetypes.ExtensibleMetadata import ExtensibleMetadata def className(klass): """ get the short class name """ - return str(klass).split('.')[-1].split(' ')[0] + # remove <> + name = str(klass)[1:-1] + return name.split('.')[-1].split(' ')[0] # list of tests tests = [] -class InterfaceTest(ArchetypesTestCase): +class InterfaceTest(ZopeTestCase.ZopeTestCase): """general interface testing class klass - the class object to test @@ -58,43 +61,79 @@ """ klass = None # test this class + instance = None # test this instance forcedImpl = () # class must implement this tuple of interfaces - def _testInterfaceImplementation(self, klass, interface): + def interfaceImplementedByInstanceOf(self, klass, interface): """ tests if the klass implements the interface in the right way """ # is the class really implemented by the given interface? self.failUnless(interface.isImplementedByInstancesOf(klass), - '%s does not implement %s' % (className(klass), className(interface))) + 'The class %s does not implement %s' % (className(klass), className(interface))) # verify if the implementation is correct try: verifyClass(interface, klass) except (BrokenImplementation, DoesNotImplement, BrokenMethodImplementation), errmsg: - self.fail('%s does not implement %s correctly: \n%s' + self.fail('The class %s does not implement %s correctly: \n%s' % (className(klass), className(interface), errmsg)) - def _getImplements(self, klass): + def interfaceImplementedBy(self, instance, interface): + """ tests if the instance implements the interface in the right way """ + # is the class really implemented by the given interface? + self.failUnless(interface.isImplementedBy(instance), + 'The instance of %s does not implement %s' % (className(instance), className(interface))) + # verify if the implementation is correct + try: + verifyObject(interface, instance) + except (BrokenImplementation, DoesNotImplement, + BrokenMethodImplementation), errmsg: + self.fail('The instance of %s does not implement %s correctly: \n%s' + % (className(instance), className(interface), errmsg)) + + def getImplementsOfInstanceOf(self, klass): """ returns the interfaces implemented by the klass (flat)""" impl = getImplementsOfInstances(klass) if type(impl) is not TupleType: impl = (impl,) if impl: return flattenInterfaces(impl) + + def getImplementsOf(self, instance): + """ returns the interfaces implemented by the instance (flat)""" + impl = getImplements(instance) + if type(impl) is not TupleType: + impl = (impl,) + if impl: + return flattenInterfaces(impl) - def _doesImplement(self, klass, interfaces): + def doesImplementByInstanceOf(self, klass, interfaces): """ make shure that the klass implements at least these interfaces""" if type(interfaces) is not TupleType: interfaces = (interfaces) - impl = self._getImplements(klass) - for iface in interfaces: - self.failUnless(iface in impl, '%s does not implement %s' % (className(klass), className(iface))) + impl = self.getImplementsOfInstanceOf(klass) + for interface in interfaces: + self.failUnless(interface in impl, 'The class %s does not implement %s' % (className(klass), className(interface))) + + def doesImplementBy(self, instance, interfaces): + """ make shure that the klass implements at least these interfaces""" + if type(interfaces) is not TupleType: + interfaces = (interfaces) + impl = self.getImplementsOf(instance) + for interface in interfaces: + self.failUnless(interface in impl, 'The instance of %s does not implement %s' % (className(instance), className(interface))) def _testStuff(self): - """ test self.klass """ - if self.forcedImpl: - self._doesImplement(self.klass, self.forcedImpl) - for iface in self._getImplements(self.klass): - self._testInterfaceImplementation(self.klass, iface) + """ test self.klass and self.instance """ + if self.klass: + if self.forcedImpl: + self.doesImplementByInstanceOf(self.klass, self.forcedImpl) + for iface in self.getImplementsOfInstanceOf(self.klass): + self.interfaceImplementedByInstanceOf(self.klass, iface) + if self.instance: + if self.forcedImpl: + self.doesImplementBy(self.instance, self.forcedImpl) + for iface in self.getImplementsOf(self.instance): + self.interfaceImplementedBy(self.instance, iface) ############################################################################### ### testing starts here ### @@ -109,20 +148,17 @@ def testFieldInterface(self): for fieldname in Field.__all__: klass = getattr(Field, fieldname) - self._doesImplement(klass, self.forcedImpl) - for iface in self._getImplements(klass): - self._testInterfaceImplementation(klass, iface) + self.doesImplementByInstanceOf(klass, self.forcedImpl) + for iface in self.getImplementsOfInstanceOf(klass): + self.interfaceImplementedByInstanceOf(klass, iface) tests.append(FieldInterfaceTest) # format: (class object, (list interface objects)) testClasses = [ (BaseObject, ()), - (BaseContent, ()), (I18NBaseContent, ()), - (BaseFolder, ()), (I18NBaseFolder, ()), (newBaseUnit, ()), (oldBaseUnit, ()), (Marshaller, ()), (PrimaryFieldMarshaller, ()), (RFC822Marshaller, ()), - (OrderedBaseFolder, ()), (Schema, ()), (Storage, ()), (ReadOnlyStorage, ()), (StorageLayer, ()), (AttributeStorage, ()), (ObjectManagedStorage, ()), @@ -131,7 +167,18 @@ (PostgreSQLStorage, ()), (DateValidator, ()), ] - + +# format: (instance object, (list interface objects)) +# take care: you must provide an instance, not a class! +testInstances = [ + (ExtensibleMetadata(), ()), + (BaseContent('test'), ()), (I18NBaseContent('test'), ()), + (BaseFolder('test'), ()), + # XXX this instance breaks badly :( + #(I18NBaseFolder('test'), ()), + (OrderedBaseFolder('test'), ()), +] + for testClass in testClasses: klass, forcedImpl = testClass name = className(klass) @@ -144,8 +191,21 @@ # add the testing method to the class to get a nice name setattr(KlassInterfaceTest, funcName, lambda self: self._testStuff()) - tests.append(KlassInterfaceTest) - + tests.append(KlassInterfaceTest) + +for testInstance in testInstances: + instance, forcedImpl = testInstance + name = className(instance) + funcName = 'test%sInterface' % name + + class InstanceInterfaceTest(InterfaceTest): + """ implementation for %s """ % name + instance = instance + forcedImpl = forcedImpl + + # add the testing method to the class to get a nice name + setattr(InstanceInterfaceTest, funcName, lambda self: self._testStuff()) + tests.append(InstanceInterfaceTest) if __name__ == '__main__': framework() |