[Zope3-checkins] CVS: Zope3/src/zope/app/container/tests - __init__.py:1.1.2.1 baseizopeitemcontainer.py:1.1.2.1 test_containertraversable.py:1.1.2.1 test_containertraverser.py:1.1.2.1 test_find.py:1.1.2.1 test_icontainer.py:1.1.2.1 test_zopecontaineradpter.py:1.1.2.1

Jim Fulton jim@zope.com
Mon, 23 Dec 2002 14:31:30 -0500


Update of /cvs-repository/Zope3/src/zope/app/container/tests
In directory cvs.zope.org:/tmp/cvs-serv19908/zope/app/container/tests

Added Files:
      Tag: NameGeddon-branch
	__init__.py baseizopeitemcontainer.py 
	test_containertraversable.py test_containertraverser.py 
	test_find.py test_icontainer.py test_zopecontaineradpter.py 
Log Message:
Initial renaming before debugging

=== Added File Zope3/src/zope/app/container/tests/__init__.py ===
#
# This file is necessary to make this directory a package.


=== Added File Zope3/src/zope/app/container/tests/baseizopeitemcontainer.py ===
##############################################################################
#
# 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: baseizopeitemcontainer.py,v 1.1.2.1 2002/12/23 19:31:28 jim Exp $
"""

from zope.proxy.context.context import getWrapperContainer, getWrapperData
from zope.interface.common.tests.basemapping \
     import BaseTestIReadMapping, BaseTestIEnumerableMapping
from zope.app.event.tests.placelesssetup import getEvents
from zope.app.interfaces.event \
     import IObjectRemovedEvent, IObjectModifiedEvent, IObjectAddedEvent



class BaseTestIZopeItemContainer:
    
    def _sampleMapping(self):
        """Return a new instance to be tested
        """
        raise TypeError('_new was not implemented')

    def _sampleDict(self):
        """Return a sequence of items that should be in the container
        """
        raise TypeError('_newItems was not implemented')

    def _absentKeys(self):
        """This should return the keys not in the container
        """
        absent_key = ''
        for key, value in testItems:
            absent_key += key
        return [absent_key]    
        
    
    def test__getitem__(self):
        testOb = self._sampleMapping()
        testItems = self._sampleDict().items()
        testAd = self._sampleContainer()
        for key, value in testItems:
            stored = testOb[key]
            self.assertEqual(stored, value)
            self.assertEqual(getWrapperContainer(stored), testAd)

        for key in self._absentKeys():
            self.assertRaises(KeyError, testOb.__getitem__, key)        
    

class BaseTestIZopeSimpleReadContainer(BaseTestIZopeItemContainer,
                                       BaseTestIReadMapping):

    def _IReadMapping__sample(self):
        return self._sampleMapping()
    
    def _IReadMapping__stateDict(self):
        return self._sampleDict()
 
    def _IReadMapping__absentKeys(self):
        return self._absentKeys()

    def test_zope_get(self):
        testOb = self._sampleMapping()
        testItems = self._sampleDict().items()
        testAd = self._sampleContainer()
        for key, value in testItems:
            stored = testOb.get(key)
            self.assertEqual(stored, value)
            self.assertEqual(getWrapperContainer(stored), testAd)
            self.assertEqual(getWrapperData(stored)['name'], key)
       

class BaseTestIZopeReadContainer(BaseTestIZopeItemContainer,
                                 BaseTestIEnumerableMapping):
    
    def _IEnumerableMapping__sample(self):
        return self._sampleMapping()
    
    def _IEnumerableMapping__stateDict(self):
        return self._sampleDict()
 
    def _IEnumerableMapping__absentKeys(self):
        return self._absentKeys()


    
    def test_zope_values(self):
        testOb = self._sampleMapping()
        data = testOb.values()
        testAd = self._sampleContainer()
        for value in data:
            self.assertEqual(getWrapperContainer(value), testAd)
            getWrapperData(value)['name']
        

    def test_zope_items(self):
        testOb = self._sampleMapping()
        testItems = self._sampleDict().items()
        testAd = self._sampleContainer()
        for key, value in testItems:
            stored = testOb[key]
            self.assertEqual(getWrapperData(stored)['name'], key)
            self.assertEqual(value, stored)
        self.assertEqual(testOb.items(), getWrapperContainer(stored).items())


class BaseTestIZopeWriteContainer(BaseTestIZopeItemContainer):
    
    def _sample_newItem(self):
        """Return a new item key and value for testing addition

        The new item must not have a IAddNotifiable adapter
        or a IDeleteNotifyable adapter.    
        """
        raise TypeError("_sample_newItem was not implemented")
    
    def _sample_newItemHooked(self):
        """Return a new item key and value for testing addition

        The new item must implement IAddNotifiable 
        and IDeleteNotifyable, and must have a notified attribute that
        is incremented when manageAfterAdd is called and decremented
        when manage_beforeDelete is called.
        """
        raise TypeError("_sample_newItem was not implemented")

    def test_zope_setObject(self):
        key, value = self._sample_newItem().items()[0]
        testOb = self._sampleMapping()
        testAd = self._sampleContainer()
        newkey = testOb.setObject(key, value)
        self.assertEqual(testOb[newkey], value)


        self.failUnless(
            [event
             for event in getEvents(IObjectAddedEvent)
             if event.object == value]
             )
        
        self.failUnless(
            [event
             for event in getEvents(IObjectModifiedEvent)
             if event.object == testAd]
             )

        key, value = self._sample_newItemHooked().items()[0]
        oldnotified = value.notified +1
        newkey = testOb.setObject(key, value)
        self.assertEqual(value.notified , oldnotified)

        self.failUnless(
            [event
             for event in getEvents(IObjectAddedEvent)
             if event.object == value]
             )
        
        self.failUnless(
            [event
             for event in getEvents(IObjectModifiedEvent)
             if event.object == testAd]
             )



    def test__zope_delitem__(self):
        testOb = self._sampleMapping()
        testObHook = self._sample_newItemHooked()
        testAd = self._sampleContainer()
        self.assertRaises(KeyError, testOb.__delitem__, 'zc')
        key, value = self._sample_newItem()
        newkey = testOb.setObject(key, value)
        del testOb[key] 
        self.assertRaises(KeyError, testOb.__delitem__, key)
        

                    
        self.failUnless(
            [event
             for event in getEvents(IObjectRemovedEvent)
             if event.object == value]
             )

        self.failUnless(
            [event
             for event in getEvents(IObjectModifiedEvent)
             if event.object == testAd]
             )

        key, value = self._sample_newItemHooked().items()[0]
        newkey = testOb.setObject(key, value)
        oldnotified = value.notified - 1
        del testOb[key] 
        self.assertRaises(KeyError, testOb.__delitem__, key)

        self.assertEqual(value.notified , oldnotified)

        self.failUnless(
            [event
             for event in getEvents(IObjectRemovedEvent)
             if event.object == value]
             )

        self.failUnless(
            [event
             for event in getEvents(IObjectModifiedEvent)
             if event.object == testAd]
             )


=== Added File Zope3/src/zope/app/container/tests/test_containertraversable.py ===
##############################################################################
#
# 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.
#
##############################################################################
"""

$Id: test_containertraversable.py,v 1.1.2.1 2002/12/23 19:31:28 jim Exp $
"""

import unittest, sys
from zope.app.container.traversal import ContainerTraversable
from zope.exceptions import NotFoundError
from zope.app.interfaces.container import IContainer
from zope.testing.cleanup import CleanUp


class Container:

    __implements__ = IContainer

    def __init__(self, attrs={}, objs={}):
        for attr,value in attrs.iteritems():
            setattr(self, attr, value)

        self.__objs = {}
        for name,value in objs.iteritems():
            self.__objs[name] = value


    def __getitem__(self, name):
        return self.__objs[name]

    def get(self, name, default=None):
        return self.__objs.get(name, default)

    def __contains__(self, name):
        return self.__objs.has_key(name)


class Test(CleanUp, unittest.TestCase):
    def testAttr(self):
        # test container path traversal
        foo = Container()
        bar = Container()
        baz = Container()
        c   = Container( {'foo':foo}, {'bar':bar, 'foo':baz} )

        T = ContainerTraversable(c)
        self.failUnless(T.traverse('foo', (), 'foo', []) is baz)
        self.failUnless(T.traverse('bar', (), 'bar', []) is bar)

        self.assertRaises(NotFoundError , T.traverse,
                          'morebar', (), 'morebar', [])


def test_suite():
    loader = unittest.TestLoader()
    return loader.loadTestsFromTestCase(Test)


if __name__ == '__main__':
    unittest.TextTestRunner().run(test_suite())


=== Added File Zope3/src/zope/app/container/tests/test_containertraverser.py ===
##############################################################################
#
# 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.
#
##############################################################################
"""

$Id: test_containertraverser.py,v 1.1.2.1 2002/12/23 19:31:28 jim Exp $
"""

import unittest, sys
from zope.component.tests.request import Request
from zope.component import getService
from zope.app.container.traversal import ContainerTraverser
from zope.interface import Interface
from zope.exceptions import NotFoundError
from zope.app.interfaces.container import IContainer
from zope.app.tests.placelesssetup import PlacelessSetup

class I(Interface):
    pass


class Container:
    __implements__ = IContainer

    def __init__(self, **kw):
        for k in kw:
            setattr(self, k , kw[k])

    def get(self, name, default=None):
        return getattr(self, name, default)



class Request(Request):
    def getEffectiveURL(self):
        return ''


class View:
    def __init__(self, comp, request):
        self._comp = comp


class Test(PlacelessSetup, unittest.TestCase):
    def testAttr(self):
        # test container traver
        foo = Container()
        c   = Container( foo=foo )
        req = Request( I, '')

        T = ContainerTraverser(c, req)
        self.failUnless(T.publishTraverse(req,'foo') is foo)

        self.assertRaises(NotFoundError , T.publishTraverse, req ,'morebar')


    def testView(self):
        # test getting a view
        foo = Container()
        c   = Container( foo=foo )
        req = Request( I, '')

        T = ContainerTraverser(c, req)
        getService(None,'Views').provideView(IContainer, 'viewfoo', I, [View])

        self.failUnless(T.publishTraverse(req,'viewfoo').__class__ is View )
        self.failUnless(T.publishTraverse(req,'foo') is foo)

        self.assertRaises(NotFoundError , T.publishTraverse, req, 'morebar')
        self.assertRaises(NotFoundError , T.publishTraverse, req,
                          '@@morebar')


def test_suite():
    loader = unittest.TestLoader()
    return loader.loadTestsFromTestCase(Test)


if __name__ == '__main__':
    unittest.TextTestRunner().run(test_suite())


=== Added File Zope3/src/zope/app/container/tests/test_find.py ===
##############################################################################
#
# 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: test_find.py,v 1.1.2.1 2002/12/23 19:31:28 jim Exp $
"""

from unittest import TestCase, TestSuite, main, makeSuite
from zope.app.interfaces.container import IReadContainer
from zope.app.interfaces.container.find import IObjectFindFilter
from zope.app.container.find\
     import FindAdapter, SimpleIdFindFilter

class FakeContainer:
    __implements__ = IReadContainer
    
    def __init__(self, id, objects):
        self._id = id
        self._objects = objects

    def keys(self):
        return [object._id for object in self._objects]

    def values(self):
        return self._objects

    def items(self):
        return [(object._id, object) for object in self._objects]

    def __getitem__(self, id):
        for object in self._objects:
            if object._id == id:
                return object
        raise KeyError, "Could not find %s" % id

    def get(self, id, default=None):
        for object in self._objects:
            if object._id == id:
                return object

        return default

    def __contains__(self, id):
        for object in self._objects:
            if object.id == id:
                return 1
        return 0

    def __len__(self):
        return len(self._objects)

class TestObjectFindFilter(object):
    __implements__ = IObjectFindFilter

    def __init__(self, count):
        self._count = count
        
    def matches(self, object):
        if IReadContainer.isImplementedBy(object):
            return len(object) == self._count
        else:
            return 0
        
class Test(TestCase):        
    def test_idFind(self):
        alpha = FakeContainer('alpha', [])
        delta = FakeContainer('delta', [])
        beta = FakeContainer('beta', [delta])
        gamma = FakeContainer('gamma', [])
        tree = FakeContainer(
            'tree',
            [alpha, beta, gamma])
        find = FindAdapter(tree)
        # some simple searches
        result = find.find([SimpleIdFindFilter(['beta'])])
        self.assertEquals([beta], result)
        result = find.find([SimpleIdFindFilter(['gamma'])])
        self.assertEquals([gamma], result)
        result = find.find([SimpleIdFindFilter(['delta'])])
        self.assertEquals([delta], result)
        # we should not find the container we search on
        result = find.find([SimpleIdFindFilter(['tree'])])
        self.assertEquals([], result)
        # search for multiple ids
        result = find.find([SimpleIdFindFilter(['alpha', 'beta'])])
        self.assertEquals([alpha, beta], result)
        result = find.find([SimpleIdFindFilter(['beta', 'delta'])])
        self.assertEquals([beta, delta], result)
        # search without any filters, find everything
        result = find.find([])
        self.assertEquals([alpha, beta, delta, gamma], result)
        # search for something that doesn't exist
        result = find.find([SimpleIdFindFilter(['foo'])])
        self.assertEquals([], result)
        # find for something that has two ids at the same time,
        # can't ever be the case
        result = find.find([SimpleIdFindFilter(['alpha']),
                            SimpleIdFindFilter(['beta'])])
        self.assertEquals([], result)

    def test_objectFind(self):
        alpha = FakeContainer('alpha', [])
        delta = FakeContainer('delta', [])
        beta = FakeContainer('beta', [delta])
        gamma = FakeContainer('gamma', [])
        tree = FakeContainer(
            'tree',
            [alpha, beta, gamma])
        find = FindAdapter(tree)
        result = find.find(object_filters=[TestObjectFindFilter(0)])
        self.assertEquals([alpha, delta, gamma], result)
        result = find.find(object_filters=[TestObjectFindFilter(1)])
        self.assertEquals([beta], result)
        result = find.find(object_filters=[TestObjectFindFilter(2)])
        self.assertEquals([], result)

    def test_combinedFind(self):
        alpha = FakeContainer('alpha', [])
        delta = FakeContainer('delta', [])
        beta = FakeContainer('beta', [delta])
        gamma = FakeContainer('gamma', [])
        tree = FakeContainer(
            'tree',
            [alpha, beta, gamma])
        find = FindAdapter(tree)
        result = find.find(id_filters=[SimpleIdFindFilter(['alpha'])],
                           object_filters=[TestObjectFindFilter(0)])
        self.assertEquals([alpha], result)
        
        result = find.find(id_filters=[SimpleIdFindFilter(['alpha'])],
                           object_filters=[TestObjectFindFilter(1)])
        self.assertEquals([], result)

def test_suite():
    return makeSuite(Test)

if __name__=='__main__':
    main(defaultTest='test_suite')


=== Added File Zope3/src/zope/app/container/tests/test_icontainer.py ===
##############################################################################
#
# 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: test_icontainer.py,v 1.1.2.1 2002/12/23 19:31:28 jim Exp $
"""

from unittest import TestCase, main, makeSuite
from zope.app.interfaces.container import IContainer
from zope.interface.verify import verifyObject

class BaseTestIContainer:
    """Base test cases for containers.

    Subclasses need to define a method, '_Test__new', that
    takes no arguments and that returns a new empty test container.
    """

    def __setUp(self):
        self.__container = container = self._Test__new()
        for k,v in [('3', '0'), ('2', '1'), ('4', '2'), ('6', '3'), ('0', '4'),
                    ('5', '5'), ('1', '6'), ('8', '7'), ('7', '8'), ('9', '9')]:
            container.setObject(k, v)
        return container

    ############################################################
    # Interface-driven tests:

    def testIContainerVerify(self):
        verifyObject(IContainer, self._Test__new())

    def test_keys(self):
        # See interface IReadContainer
        container = self._Test__new()
        data = container.keys()
        self.assertEqual(list(data), [])

        container = self.__setUp()
        data = container.keys()
        # convert to sorted list
        data = list(data)
        data.sort()
        self.assertEqual(data, map(str, range(10)))

    def test_get(self):
        # See interface IReadContainer
        container = self._Test__new()
        self.assertRaises(KeyError, container.__getitem__, '1')
        self.assertEqual(container.get('1', '99'), '99')

        container = self.__setUp()
        self.assertRaises(KeyError, container.__getitem__, '100')
        self.assertEqual(container.get('100', '99'), '99')
        self.assertEqual(container.get('1', '99'), '6')
        self.assertEqual(container['7'], '8')
        self.assertEqual(container['0'], '4')
        self.assertEqual(container['9'], '9')

    def test_values(self):
        # See interface IReadContainer
        container = self._Test__new()
        data = container.values()
        self.assertEqual(list(data), [])

        container = self.__setUp()
        data = container.values()
        data = list(data); data.sort() # convert to sorted list
        self.assertEqual(data, map(str, range(10)))

    def test_len(self):
        # See interface IReadContainer
        container = self._Test__new()
        self.assertEqual(len(container), 0)

        container = self.__setUp()
        self.assertEqual(len(container), 10)

    def test_items(self):
        # See interface IReadContainer
        container = self._Test__new()
        data = container.items()
        self.assertEqual(list(data), [])

        container = self.__setUp()
        data = container.items()
        # convert to sorted list
        data = list(data)
        data.sort()
        self.assertEqual(data, [
            ('0', '4'), ('1', '6'), ('2', '1'), ('3', '0'), ('4', '2'),
            ('5', '5'), ('6', '3'), ('7', '8'), ('8', '7'), ('9', '9')
            ])

    def test___contains__(self):
        # See interface IReadContainer
        container = self._Test__new()
        self.assertEqual(not not ('1' in container), 0)

        container = self.__setUp()
        self.assertEqual(not not ('100' in container), 0)
        self.assertEqual(not not ('1' in container), 1)
        self.assertEqual(not not ('0' in container), 1)
        self.assertEqual(not not ('9' in container), 1)

    def test_delObject(self):
        # See interface IWriteContainer
        container = self._Test__new()
        self.assertRaises(KeyError, container.__delitem__, '1')

        container = self.__setUp()
        self.assertRaises(KeyError, container.__delitem__, '100')
        del container['1']
        del container['9']
        self.assertRaises(KeyError, container.__getitem__, '1')
        self.assertRaises(KeyError, container.__getitem__, '9')
        self.assertEqual(container.get('1', '99'), '99')
        self.assertEqual(container['7'], '8')
        self.assertEqual(container['0'], '4')
        self.assertEqual(container.get('9', '88'), '88')

    ############################################################
    # Tests from Folder

    def testEmpty(self):
        folder = self._Test__new()
        self.failIf(folder.keys())
        self.failIf(folder.values())
        self.failIf(folder.items())
        self.failIf(len(folder))
        self.failIf('foo' in folder)

        self.assertEquals(folder.get('foo', None), None)
        self.assertRaises(KeyError, folder.__getitem__, 'foo')

        self.assertRaises(KeyError, folder.__delitem__, 'foo')

    def testBadKeyTypes(self):
        folder = self._Test__new()
        value = []
        self.assertRaises(TypeError, folder.setObject, None, value)
        self.assertRaises(TypeError, folder.setObject, ['foo'], value)

    def testOneItem(self):
        folder = self._Test__new()
        foo = []
        folder.setObject('foo', foo)

        self.assertEquals(len(folder.keys()), 1)
        self.assertEquals(folder.keys()[0], 'foo')
        self.assertEquals(len(folder.values()), 1)
        self.assertEquals(folder.values()[0], foo)
        self.assertEquals(len(folder.items()), 1)
        self.assertEquals(folder.items()[0], ('foo', foo))
        self.assertEquals(len(folder), 1)

        self.failUnless('foo' in folder)
        self.failIf('bar' in folder)

        self.assertEquals(folder.get('foo', None), foo)
        self.assertEquals(folder['foo'], foo)

        self.assertRaises(KeyError, folder.__getitem__, 'qux')

        foo2 = []
        folder.setObject('foo2', foo)

        self.assertEquals(len(folder.keys()), 2)
        self.assertEquals(folder.keys()[1], 'foo2')
        self.assertEquals(len(folder.values()), 2)
        self.assertEquals(folder.values()[1], foo2)
        self.assertEquals(len(folder.items()), 2)
        self.assertEquals(folder.items()[1], ('foo2', foo2))
        self.assertEquals(len(folder), 2)

        del folder['foo']
        del folder['foo2']

        self.failIf(folder.keys())
        self.failIf(folder.values())
        self.failIf(folder.items())
        self.failIf(len(folder))
        self.failIf('foo' in folder)

        self.assertRaises(KeyError, folder.__getitem__, 'foo')
        self.assertEquals(folder.get('foo', None), None)
        self.assertRaises(KeyError, folder.__delitem__, 'foo')

    def testManyItems(self):
        folder = self._Test__new()
        objects = [ [0], [1], [2], [3] ]
        folder.setObject('foo', objects[0])
        folder.setObject('bar', objects[1])
        folder.setObject('baz', objects[2])
        folder.setObject('bam', objects[3])

        self.assertEquals(len(folder.keys()), len(objects))
        self.failUnless('foo' in folder.keys())
        self.failUnless('bar' in folder.keys())
        self.failUnless('baz' in folder.keys())
        self.failUnless('bam' in folder.keys())

        self.assertEquals(len(folder.values()), len(objects))
        self.failUnless(objects[0] in folder.values())
        self.failUnless(objects[1] in folder.values())
        self.failUnless(objects[2] in folder.values())
        self.failUnless(objects[3] in folder.values())

        self.assertEquals(len(folder.items()), len(objects))
        self.failUnless(('foo', objects[0]) in folder.items())
        self.failUnless(('bar', objects[1]) in folder.items())
        self.failUnless(('baz', objects[2]) in folder.items())
        self.failUnless(('bam', objects[3]) in folder.items())

        self.assertEquals(len(folder), len(objects))

        self.failUnless('foo' in folder)
        self.failUnless('bar' in folder)
        self.failUnless('baz' in folder)
        self.failUnless('bam' in folder)
        self.failIf('qux' in folder)

        self.assertEquals(folder.get('foo', None), objects[0])
        self.assertEquals(folder['foo'], objects[0])
        self.assertEquals(folder.get('bar', None), objects[1])
        self.assertEquals(folder['bar'], objects[1])
        self.assertEquals(folder.get('baz', None), objects[2])
        self.assertEquals(folder['baz'], objects[2])
        self.assertEquals(folder.get('bam', None), objects[3])
        self.assertEquals(folder['bam'], objects[3])

        self.assertEquals(folder.get('qux', None), None)
        self.assertRaises(KeyError, folder.__getitem__, 'qux')

        del folder['foo']
        self.assertEquals(len(folder), len(objects) - 1)
        self.failIf('foo' in folder)
        self.failIf('foo' in folder.keys())

        self.failIf(objects[0] in folder.values())
        self.failIf(('foo', objects[0]) in folder.items())

        self.assertEquals(folder.get('foo', None), None)
        self.assertRaises(KeyError, folder.__getitem__, 'foo')

        self.assertRaises(KeyError, folder.__delitem__, 'foo')

        del folder['bar']
        del folder['baz']
        del folder['bam']

        self.failIf(folder.keys())
        self.failIf(folder.values())
        self.failIf(folder.items())
        self.failIf(len(folder))
        self.failIf('foo' in folder)
        self.failIf('bar' in folder)
        self.failIf('baz' in folder)
        self.failIf('bam' in folder)


class Test(BaseTestIContainer, TestCase):
    def _Test__new(self):
        from zope.app.container.sample import SampleContainer
        return SampleContainer()

def test_suite():
    return makeSuite(Test)

if __name__=='__main__':
    main(defaultTest='test_suite')


=== Added File Zope3/src/zope/app/container/tests/test_zopecontaineradpter.py ===
##############################################################################
#
# 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.
#
##############################################################################
"""XXX short summary goes here.

XXX longer description goes here.

$Id: test_zopecontaineradpter.py,v 1.1.2.1 2002/12/23 19:31:28 jim Exp $
"""

from unittest import TestCase, TestSuite, main, makeSuite
from zope.app.interfaces.container import IAddNotifiable
from zope.app.interfaces.container import IDeleteNotifiable
from zope.app.container.tests.baseizopeitemcontainer \
     import BaseTestIZopeItemContainer, BaseTestIZopeSimpleReadContainer,\
            BaseTestIZopeReadContainer, BaseTestIZopeWriteContainer
from Zope.App.Traversing import getParent
from zope.proxy.context.context import ContextWrapper
from zope.app.tests.placelesssetup import PlacelessSetup
class C: pass

class H:
    __implements__ = IAddNotifiable, IDeleteNotifiable
    notified = 0
    def manage_beforeDelete(self, object, container):
        self.notified -= 1
        

    def manage_afterAdd(self, object, container):
        self.notified += 1

class Test(PlacelessSetup,
           BaseTestIZopeSimpleReadContainer,
           BaseTestIZopeReadContainer,
           BaseTestIZopeWriteContainer,
           TestCase):

    def setUp(self):
        PlacelessSetup.setUp(self)
        from zope.app.container.sample import SampleContainer
        self.__container = SampleContainer()
        
    def _sampleMapping(self):
        from zope.app.container.zope \
            import ZopeContainerAdapter
        container = self.__container
        for k, v in self._sampleDict().items():
            container.setObject(k, v)
        return ZopeContainerAdapter(container)        
        
    def _sampleContainer(self):
        return self.__container
    
    __sample = {'Z': C(), 'O': C(),'P': C()}
    def _sampleDict(self):
        return self.__sample
             

    def _absentKeys(self):
        return 'zc', 'ny'
    
    __newItem = {'A': C(), 'B':C()}
    def _sample_newItem(self):
        return self.__newItem
    
    __newItemHooked = {'B': H(), 'E':H()}
    def _sample_newItemHooked(self):
        return self.__newItemHooked



def test_suite():
    return TestSuite((
        makeSuite(Test),
        ))

if __name__=='__main__':
    main(defaultTest='test_suite')