[Checkins] SVN: grokcore.content/trunk/src/grokcore/content/tests/ Added existing tests from grok. removed the container_model test that made no sense here.
Souheil CHELFOUH
souheil at chelfouh.com
Sun Jan 3 12:52:37 EST 2010
Log message for revision 107597:
Added existing tests from grok. removed the container_model test that made no sense here.
Changed:
A grokcore.content/trunk/src/grokcore/content/tests/__init__.py
A grokcore.content/trunk/src/grokcore/content/tests/container/
A grokcore.content/trunk/src/grokcore/content/tests/container/__init__.py
A grokcore.content/trunk/src/grokcore/content/tests/container/container.py
A grokcore.content/trunk/src/grokcore/content/tests/container/orderedcontainer.py
A grokcore.content/trunk/src/grokcore/content/tests/container/orderedcontainerfiresevent.py
A grokcore.content/trunk/src/grokcore/content/tests/test_all.py
-=-
Added: grokcore.content/trunk/src/grokcore/content/tests/__init__.py
===================================================================
--- grokcore.content/trunk/src/grokcore/content/tests/__init__.py (rev 0)
+++ grokcore.content/trunk/src/grokcore/content/tests/__init__.py 2010-01-03 17:52:37 UTC (rev 107597)
@@ -0,0 +1 @@
+# make this directory a package
Added: grokcore.content/trunk/src/grokcore/content/tests/container/__init__.py
===================================================================
--- grokcore.content/trunk/src/grokcore/content/tests/container/__init__.py (rev 0)
+++ grokcore.content/trunk/src/grokcore/content/tests/container/__init__.py 2010-01-03 17:52:37 UTC (rev 107597)
@@ -0,0 +1 @@
+# this is a package
Added: grokcore.content/trunk/src/grokcore/content/tests/container/container.py
===================================================================
--- grokcore.content/trunk/src/grokcore/content/tests/container/container.py (rev 0)
+++ grokcore.content/trunk/src/grokcore/content/tests/container/container.py 2010-01-03 17:52:37 UTC (rev 107597)
@@ -0,0 +1,39 @@
+"""
+
+The grokcore.content.Container is a a model that is also a container.
+It has a dictionary API. It in fact stores its information in a BTree so
+you can store a lot of items in a scalable way.
+
+ >>> from zope.container.interfaces import IContainer
+ >>> bag = BoneBag()
+ >>> IContainer.providedBy(bag)
+ True
+
+ >>> from zope.container.btree import BTreeContainer
+ >>> isinstance(bag, BTreeContainer)
+ True
+
+We had problems when switching to grokcore.content.Container
+with the __parent__ attribute being set, we better make sure
+this doesn't happen again:
+
+ >>> skull = Bone()
+ >>> print skull.__parent__
+ None
+ >>> print skull.__name__
+ None
+ >>> bag['skull'] = skull
+ >>> skull.__parent__
+ <grokcore.content.tests.container.container.BoneBag object at 0x...>
+ >>> skull.__name__
+ u'skull'
+
+"""
+
+from grokcore.content import Model, Container
+
+class BoneBag(Container):
+ pass
+
+class Bone(Model):
+ pass
Added: grokcore.content/trunk/src/grokcore/content/tests/container/orderedcontainer.py
===================================================================
--- grokcore.content/trunk/src/grokcore/content/tests/container/orderedcontainer.py (rev 0)
+++ grokcore.content/trunk/src/grokcore/content/tests/container/orderedcontainer.py 2010-01-03 17:52:37 UTC (rev 107597)
@@ -0,0 +1,77 @@
+"""
+
+The grokcore.content.OrderedContainer is a a model that is also a container.
+Unlike plain grokcore.content Containers, OrderedContainers keep the mapping
+keys in the order items were added. It has a dictionary API. It in fact
+stores its information in a BTree so you can store a lot of items in a
+scalable way.
+
+ >>> from zope.container.interfaces import IContainer
+ >>> bones = OrderedBones()
+ >>> IContainer.providedBy(bones)
+ True
+ >>> from zope.container.interfaces import IOrderedContainer
+ >>> IOrderedContainer.providedBy(bones)
+ True
+ >>> from zope.container.btree import BTreeContainer
+ >>> isinstance(bones, BTreeContainer)
+ True
+
+Order is initially determined by the sequence in which items were added (mind
+that there is a subscriber to the containermodified event in order to
+illustrate an ordered container fires events just like normal containers)::
+
+ >>> bones['thigh'] = Bone('Thigh Bone')
+ >>> bones['knee'] = Bone('Knee Cap')
+ >>> bones['shin'] = Bone('Shin Bone')
+ >>> bones['ankle'] = Bone('Ankle Joint')
+ >>> bones.keys()
+ ['thigh', 'knee', 'shin', 'ankle']
+
+Now change the order::
+
+ >>> bones.updateOrder(order=['ankle', 'shin', 'knee', 'thigh'])
+ >>> bones.keys()
+ ['ankle', 'shin', 'knee', 'thigh']
+
+ >>> list(bones.items())
+ [('ankle', <grokcore.content.tests.container.orderedcontainer.Bone object at ...>),
+ ('shin', <grokcore.content.tests.container.orderedcontainer.Bone object at ...>),
+ ('knee', <grokcore.content.tests.container.orderedcontainer.Bone object at ...>),
+ ('thigh', <grokcore.content.tests.container.orderedcontainer.Bone object at ...>)]
+
+ >>> [bone.name for bone in bones.values()]
+ ['Ankle Joint', 'Shin Bone', 'Knee Cap', 'Thigh Bone']
+
+ >>> del bones['knee']
+ >>> bones.keys()
+ ['ankle', 'shin', 'thigh']
+
+ >>> bones['toe'] = Bone('Toe')
+ >>> bones.keys()
+ ['ankle', 'shin', 'thigh', 'toe']
+
+Adding a new object under an existing key, raises a DuplicationError::
+
+ >>> bones['shin'] = Bone('Another Shin Bone')
+ Traceback (most recent call last):
+ ...
+ KeyError: u'shin'
+
+Reordering with a wrong set of keys should fail::
+
+ >>> bones.updateOrder(order=['ankle', 'shin', 'knee', 'thigh'])
+ Traceback (most recent call last):
+ ...
+ ValueError: Incompatible key set.
+
+"""
+
+from grokcore.content import Model, OrderedContainer
+
+class OrderedBones(OrderedContainer):
+ pass
+
+class Bone(Model):
+ def __init__(self, name):
+ self.name = name
Added: grokcore.content/trunk/src/grokcore/content/tests/container/orderedcontainerfiresevent.py
===================================================================
--- grokcore.content/trunk/src/grokcore/content/tests/container/orderedcontainerfiresevent.py (rev 0)
+++ grokcore.content/trunk/src/grokcore/content/tests/container/orderedcontainerfiresevent.py 2010-01-03 17:52:37 UTC (rev 107597)
@@ -0,0 +1,41 @@
+"""
+Mind that there is a subscriber to the containermodified event in order to
+illustrate an ordered container fires events just like normal containers::
+
+ >>> from grokcore.component import testing
+ >>> testing.grok(__name__)
+ >>> bones = OrderedBones()
+
+Add an item::
+
+ >>> bones['thigh'] = Bone('Thigh Bone')
+ Container has changed!
+
+Now change the order::
+
+ >>> bones.updateOrder(order=['thigh'])
+ Container has changed!
+
+Delete an item::
+
+ >>> del bones['thigh']
+ Container has changed!
+ >>> bones.keys()
+ []
+
+"""
+
+from grokcore.component import subscribe
+from grokcore.content import Model, OrderedContainer
+from zope.container.interfaces import IContainerModifiedEvent
+
+class OrderedBones(OrderedContainer):
+ pass
+
+class Bone(Model):
+ def __init__(self, name):
+ self.name = name
+
+ at subscribe(OrderedBones, IContainerModifiedEvent)
+def container_changed(object, event):
+ print 'Container has changed!'
Added: grokcore.content/trunk/src/grokcore/content/tests/test_all.py
===================================================================
--- grokcore.content/trunk/src/grokcore/content/tests/test_all.py (rev 0)
+++ grokcore.content/trunk/src/grokcore/content/tests/test_all.py 2010-01-03 17:52:37 UTC (rev 107597)
@@ -0,0 +1,40 @@
+import unittest
+from pkg_resources import resource_listdir
+from zope.testing import doctest, cleanup
+import zope.component.eventtesting
+
+def setUpZope(test):
+ zope.component.eventtesting.setUp(test)
+
+def cleanUpZope(test):
+ cleanup.cleanUp()
+
+def suiteFromPackage(name):
+ files = resource_listdir(__name__, name)
+ suite = unittest.TestSuite()
+ for filename in files:
+ if not filename.endswith('.py'):
+ continue
+ if filename.endswith('_fixture.py'):
+ continue
+ if filename == '__init__.py':
+ continue
+
+ dottedname = 'grokcore.content.tests.%s.%s' % (name, filename[:-3])
+ test = doctest.DocTestSuite(dottedname,
+ setUp=setUpZope,
+ tearDown=cleanUpZope,
+ optionflags=doctest.ELLIPSIS+
+ doctest.NORMALIZE_WHITESPACE)
+
+ suite.addTest(test)
+ return suite
+
+def test_suite():
+ suite = unittest.TestSuite()
+ for name in ['container',]:
+ suite.addTest(suiteFromPackage(name))
+ return suite
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='test_suite')
More information about the checkins
mailing list