    >>> from Products.CMFCore.utils import getToolByName
    >>> from collective.categorizing.interfaces import ICategory, ICategoryQuery, ICategoryHierarchy

    >>> portal = self.portal

Create CategoryCantainer
    >>> portal.invokeFactory('CategoryContainer', 'container')
    'container'
    >>> container = portal.container
    >>> container
    <CategoryContainer at /plone/container>

Create Category
    >>> portal.container.invokeFactory('Category', 'category01')
    'category01'
    >>> category01 = portal.container.category01
    >>> category01
    <Category at /plone/container/category01>

CategoryQuery Adapter
    >>> ICategoryQuery(category01).content_query()
    {'path': '/plone'}
    >>> ICategoryQuery(category01).subcategory_query()
    {'path': '/plone/container'}

CategoryHierarchy Adapter

Create some more Categories.
    >>> portal.container.invokeFactory('Category', 'category02')
    'category02'
    >>> category02 = portal.container.category02
    >>> portal.container.category01.invokeFactory('Category', 'category03')
    'category03'
    >>> category03 = category01.category03
    >>> portal.container.category02.invokeFactory('Category', 'category04')
    'category04'
    >>> category04 = category02.category04
    >>> category03.invokeFactory('Category', 'category05')
    'category05'
    >>> category05 = category03.category05
    >>> category03.invokeFactory('Category', 'category06')
    'category06'
    >>> category06 = category03.category06
    >>> category05.invokeFactory('Category', 'category07')
    'category07'
    >>> category07 = category05.category07
    >>> category06.invokeFactory('Category', 'category08')
    'category08'
    >>> category08 = category06.category08
    >>> category08.invokeFactory('Category', 'category09')
    'category09'
    >>> category09 = category08.category09
    >>> category08.invokeFactory('Category', 'category10')
    'category10'
    >>> category10 = category08.category10

Subcategorize Category03 to Category02
    >>> category02.setSubcategory([category03.UID()])
    >>> category02.subcategory
    [<Category at /plone/container/category01/category03>]

Subcategorize Category04 to Category01
    >>> category01.setSubcategory([category04.UID()])

Check if Categories are cataloged.
    >>> catalog = getToolByName(portal, 'portal_catalog')
    >>> len(catalog(object_provides=ICategory.__identifier__))
    10

CategoryHierarchy
#    >>> ICategoryHierarchy(category04)()
#    >>> ICategoryHierarchy(category03).direct_children(category03)
#    [<Category at /plone/container/category01/category03/category05>, <Category at /plone/container/category01/category03/category06>]
#    >>> [ICategoryHierarchy(category03).list_hierarchy_object(obj) for obj in ICategoryHierarchy(category03).direct_children(category03)]
#    [[[<Category at /plone/container/category01/category03/category05>, <Category at /plone/container/category01/category03/category05/category07>]], [[<Category at /plone/container/category01/category03/category06>, <Category at /plone/container/category01/category03/category06/category08>]]]
#    >>> [ICategoryHierarchy(category03).list_hierarchy_object(obj) for obj in ICategoryHierarchy(category03).direct_children(category08)]
#    [[<Category at /plone/container/category01/category03/category06/category08/category09>], [<Category at /plone/container/category01/category03/category06/category08/category10>]]

    >>> ICategoryHierarchy(category03)()
    [[<Category at /plone/container/category01/category03/category05>, <Category at /plone/container/category01/category03/category05/category07>], [<Category at /plone/container/category01/category03/category06>, <Category at /plone/container/category01/category03/category06/category08>, <Category at /plone/container/category01/category03/category06/category08/category09>], [<Category at /plone/container/category01/category03/category06>, <Category at /plone/container/category01/category03/category06/category08>, <Category at /plone/container/category01/category03/category06/category08/category10>]]
    >>> ICategoryHierarchy(category02).direct_children(category02)
    [<Category at /plone/container/category02/category04>, <Category at /plone/container/category01/category03>]
    >>> ICategoryHierarchy(category03).direct_children(category03)
    [<Category at /plone/container/category01/category03/category05>, <Category at /plone/container/category01/category03/category06>]
    >>> ICategoryHierarchy(category03)()
    [[<Category at /plone/container/category01/category03/category05>, <Category at /plone/container/category01/category03/category05/category07>], [<Category at /plone/container/category01/category03/category06>, <Category at /plone/container/category01/category03/category06/category08>, <Category at /plone/container/category01/category03/category06/category08/category09>], [<Category at /plone/container/category01/category03/category06>, <Category at /plone/container/category01/category03/category06/category08>, <Category at /plone/container/category01/category03/category06/category08/category10>]]
    >>> ICategoryHierarchy(category02)()
    [<Category at /plone/container/category02/category04>, [<Category at /plone/container/category01/category03>, <Category at /plone/container/category01/category03/category05>, <Category at /plone/container/category01/category03/category05/category07>], [<Category at /plone/container/category01/category03>, <Category at /plone/container/category01/category03/category06>, <Category at /plone/container/category01/category03/category06/category08>, <Category at /plone/container/category01/category03/category06/category08/category09>], [<Category at /plone/container/category01/category03>, <Category at /plone/container/category01/category03/category06>, <Category at /plone/container/category01/category03/category06/category08>, <Category at /plone/container/category01/category03/category06/category08/category10>]]
    >>> ICategoryHierarchy(category01)()
    [<Category at /plone/container/category02/category04>, [<Category at /plone/container/category01/category03>, <Category at /plone/container/category01/category03/category05>, <Category at /plone/container/category01/category03/category05/category07>], [<Category at /plone/container/category01/category03>, <Category at /plone/container/category01/category03/category06>, <Category at /plone/container/category01/category03/category06/category08>, <Category at /plone/container/category01/category03/category06/category08/category09>], [<Category at /plone/container/category01/category03>, <Category at /plone/container/category01/category03/category06>, <Category at /plone/container/category01/category03/category06/category08>, <Category at /plone/container/category01/category03/category06/category08/category10>]]

Exception should raise when one hierarchy has more than two same object.
    >>> category05.setSubcategory([category01.UID()])
    >>> ICategoryHierarchy(category01)()
    Traceback (most recent call last):
    ...
    SameObjectInHierarchyError: The same object already exists on the same hierarchy.
