[Checkins] SVN: grokcore.content/trunk/src/grokcore/content/tests/ Changed a bit the testing : we have few tests, we don't need folders.
Souheil CHELFOUH
souheil at chelfouh.com
Sun Jan 3 18:32:44 EST 2010
Log message for revision 107608:
Changed a bit the testing : we have few tests, we don't need folders.
Added a verification of the interfaces on the container classes.
Changed:
D grokcore.content/trunk/src/grokcore/content/tests/container/
D grokcore.content/trunk/src/grokcore/content/tests/test_all.py
A grokcore.content/trunk/src/grokcore/content/tests/test_container.py
A grokcore.content/trunk/src/grokcore/content/tests/test_container_event.py
A grokcore.content/trunk/src/grokcore/content/tests/test_orderedcontainer.py
A grokcore.content/trunk/src/grokcore/content/tests/test_verify_containers.py
-=-
Deleted: grokcore.content/trunk/src/grokcore/content/tests/test_all.py
===================================================================
--- grokcore.content/trunk/src/grokcore/content/tests/test_all.py 2010-01-03 23:06:24 UTC (rev 107607)
+++ grokcore.content/trunk/src/grokcore/content/tests/test_all.py 2010-01-03 23:32:43 UTC (rev 107608)
@@ -1,40 +0,0 @@
-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')
Added: grokcore.content/trunk/src/grokcore/content/tests/test_container.py
===================================================================
--- grokcore.content/trunk/src/grokcore/content/tests/test_container.py (rev 0)
+++ grokcore.content/trunk/src/grokcore/content/tests/test_container.py 2010-01-03 23:32:43 UTC (rev 107608)
@@ -0,0 +1,48 @@
+"""
+
+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.test_container.BoneBag object at 0x...>
+ >>> skull.__name__
+ u'skull'
+
+"""
+
+from grokcore.content import Model, Container
+
+class BoneBag(Container):
+ pass
+
+class Bone(Model):
+ pass
+
+
+
+def test_suite():
+ from zope.testing import doctest
+ suite = doctest.DocTestSuite(
+ optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS
+ )
+ return suite
Added: grokcore.content/trunk/src/grokcore/content/tests/test_container_event.py
===================================================================
--- grokcore.content/trunk/src/grokcore/content/tests/test_container_event.py (rev 0)
+++ grokcore.content/trunk/src/grokcore/content/tests/test_container_event.py 2010-01-03 23:32:43 UTC (rev 107608)
@@ -0,0 +1,55 @@
+"""
+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!'
+
+
+def test_suite():
+ import zope.component.eventtesting
+ from zope.testing import doctest, cleanup
+
+ def cleanUp(test):
+ cleanup.cleanUp()
+
+ suite = doctest.DocTestSuite(
+ setUp=zope.component.eventtesting.setUp, tearDown=cleanUp,
+ optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS
+ )
+ return suite
Added: grokcore.content/trunk/src/grokcore/content/tests/test_orderedcontainer.py
===================================================================
--- grokcore.content/trunk/src/grokcore/content/tests/test_orderedcontainer.py (rev 0)
+++ grokcore.content/trunk/src/grokcore/content/tests/test_orderedcontainer.py 2010-01-03 23:32:43 UTC (rev 107608)
@@ -0,0 +1,85 @@
+"""
+
+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.test_orderedcontainer.Bone object at ...>),
+ ('shin', <grokcore.content.tests.test_orderedcontainer.Bone object at ...>),
+ ('knee', <grokcore.content.tests.test_orderedcontainer.Bone object at ...>),
+ ('thigh', <grokcore.content.tests.test_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
+
+
+def test_suite():
+ from zope.testing import doctest
+ suite = doctest.DocTestSuite(
+ optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS
+ )
+ return suite
Added: grokcore.content/trunk/src/grokcore/content/tests/test_verify_containers.py
===================================================================
--- grokcore.content/trunk/src/grokcore/content/tests/test_verify_containers.py (rev 0)
+++ grokcore.content/trunk/src/grokcore/content/tests/test_verify_containers.py 2010-01-03 23:32:43 UTC (rev 107608)
@@ -0,0 +1,45 @@
+"""
+ >>> from grokcore.content import Container, OrderedContainer
+ >>> from grokcore.content import IContainer, IOrderedContainer
+ >>> from zope.interface.verify import verifyClass
+
+A grokcore.content.Container verifies the interface IContainer::
+
+ >>> class Cave(Container):
+ ... pass
+
+ >>> verifyClass(IContainer, Cave)
+ True
+
+It also implements the IContext interface, allowing it to be taken as the
+default context of a grok module::
+
+ >>> from grokcore.component.interfaces import IContext
+ >>> IContext.implementedBy(Cave)
+ True
+
+A grokcore.content.OrderedContainer verifies both the interface IContainer
+and IOrderedContainer::
+
+ >>> class CleanCave(OrderedContainer):
+ ... pass
+
+ >>> verifyClass(IContainer, CleanCave)
+ True
+
+ >>> verifyClass(IOrderedContainer, CleanCave)
+ True
+
+Like the grokcore.content.Container, the OrderedContainer is an IContext::
+
+ >>> IContext.implementedBy(CleanCave)
+ True
+
+"""
+
+def test_suite():
+ from zope.testing import doctest
+ suite = doctest.DocTestSuite(
+ optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS
+ )
+ return suite
More information about the checkins
mailing list