Imports and Defines
====
    >>> from mock import Mock
    >>> from zope.component import getMultiAdapter, getUtility, provideAdapter, provideUtility
    >>> from zope.interface import alsoProvides, implements
    >>> from OFS.interfaces import IItem

IShippingMethod
====
    >>> from collective.cart.shipping.interfaces import IShippingMethodAnnotations
    >>> smethod = Mock()
    >>> alsoProvides(smethod, IShippingMethodAnnotations)
    >>> from collective.cart.shipping.interfaces import IShippingMethod
    >>> from collective.cart.shipping.adapter.shipping import ShippingMethodAdapter
    >>> provideAdapter(ShippingMethodAdapter)
    >>> sma = IShippingMethod(smethod)
    >>> sma
    <collective.cart.shipping.adapter.shipping.ShippingMethodAdapter object at ...>
    >>> smethod.base_charge = 0.0
    >>> smethod.weight_charge = 0.0
    >>> smethod.fuel_rate = 0.0
    >>> smethod.insurance_base = 0.0
    >>> smethod.insurance_rate = 0.0
    >>> smethod.risk_rate = 0.0
    >>> sma.shipping_cost(0, 0)
    0.0
    >>> smethod.base_charge = 5.0
    >>> sma.shipping_cost(0, 0)
    5.0
    >>> sma.shipping_cost(10, 0)
    5.0
    >>> smethod.weight_charge = 0.1
    >>> sma.shipping_cost(10, 0)
    6.0
    >>> smethod.fuel_rate = 50.0
    >>> sma.shipping_cost(10, 0)
    9.0
    >>> smethod.risk_rate = 100.0
    >>> sma.shipping_cost(10, 0)
    18.0
    >>> smethod.insurance_base = 2.0
    >>> sma.shipping_cost(10, 0)
    20.0
    >>> smethod.insurance_rate = 25.0
    >>> sma.shipping_cost(10, 0)
    20.0
    >>> sma.shipping_cost(10, 10)
    22.5
    >>> sma.shipping_cost(0, 10)
    19.5


IProduct
====
    >>> from zope.annotation.interfaces import IAnnotations
    >>> from zope.annotation.attribute import AttributeAnnotations
    >>> provideAdapter(AttributeAnnotations)
    >>> from collective.cart.core.interfaces import IAddableToCart
    >>> class Document(object):
    ...     implements(IAddableToCart, IItem)
    ...     def __init__(self, **kwargs):
    ...         for k, v in kwargs.items(): setattr(self, k, v)
    ...     def UID(self):
    ...         return self.uid
    ...     def Title(self):
    ...         return self.title
    ...     def absolute_url(self):
    ...         return self.url
    >>> doc = Document(
    ...     id='doc01',
    ...     uid='uid01',
    ...     title="Document01",
    ...     url='doc01_url',
    ... )
    >>> alsoProvides(doc, IAddableToCart)
    >>> IAddableToCart.providedBy(doc)
    True
    >>> from collective.cart.shipping.interfaces import IProduct
    >>> from collective.cart.shipping.adapter.product import Product
    >>> provideAdapter(Product)
    >>> product = IProduct(doc)
    >>> product
    <collective.cart.shipping.adapter.product.Product object at ...>
    >>> product.weight_unit
    'g'
    >>> product.weight
    0
    >>> product.height
    0
    >>> product.width
    0
    >>> product.depth
    0
    >>> from collective.cart.shipping.content.product import ProductAnnotations
    >>> IAnnotations(doc)['collective.cart.shipping'] = ProductAnnotations()
    >>> cannotasions = IAnnotations(doc)['collective.cart.shipping']
    >>> product.weight_unit
    'g'
    >>> product.weight_unit = 'kg'
    >>> product.weight_unit == 'kg'
    True
    >>> cannotasions.weight_unit == 'kg'
    True
    >>> product.weight
    0
    >>> product.weight = 10
    >>> product.weight
    10
    >>> cannotasions.weight
    10
    >>> product.height = 2
    >>> product.height
    2
    >>> cannotasions.height
    2
    >>> product.width = 3
    >>> product.width
    3
    >>> cannotasions.width
    3
    >>> product.depth = 4
    >>> product.depth
    4
    >>> cannotasions.depth
    4
