[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