    >>> from decimal import Decimal
    >>> from collective.cart.core.interfaces import (
    ...     ICart,
    ...     ICartProduct,
    ...     IPortal,
    ...     IProduct,
    ... )
    >>> doc00 = portal.doc00
    >>> product00 = IProduct(doc00)
    >>> product00.stock
    0
    >>> uid = doc00.UID()
    >>> quantity = '2'
    >>> form = dict(uid=uid, quantity=quantity)
    >>> IPortal(doc00).add_to_cart(form)
    >>> product00.stock
    0
    >>> cart = IPortal(doc00).cart
    >>> cart
    <Cart at /plone/cfolder/1>
    >>> cart.totals == {'products_cost': Decimal('200.00')}
    True
    >>> cart.total_cost == Decimal('200.00')
    True
    >>> ICart(cart).products
    [<CartProduct at /plone/cfolder/1/1>]
    >>> ICart(cart).product(uid)
    <CartProduct at /plone/cfolder/1/1>
    >>> product = ICart(cart).product(uid)
    >>> product.uid == uid
    True
    >>> product.title
    'Product00'
    >>> product.quantity
    2
    >>> product.price == Decimal('100.00')
    True
    >>> product.subtotal == Decimal('200.00')
    True
    >>> ICartProduct(product).max_quantity
    5
    >>> ICartProduct(product).select_quantity
    '<select id="quantity" name="quantity"><option value="1">1</option><option value="2" selected="selected">2</option><option value="3">3</option><option value="4">4</option><option value="5">5</option></select>'
    >>> ICartProduct(product).input_quantity
    '<input type="text "id="quantity" name="quantity" size="3" value="2" />'
    >>> ICartProduct(product).html_quantity == ICartProduct(product).select_quantity
    True
    >>> portal.cfolder.quantity_method = 'Input'
    >>> ICartProduct(product).html_quantity == ICartProduct(product).input_quantity
    True
    >>> original = ICartProduct(product).product
    >>> original
    <collective.cart.core.adapter.product.Product object at ...>
    >>> original.stock
    0
    >>> ICart(cart).subtotal == Decimal('200.00')
    True
    >>> ICart(cart).total_cost == Decimal('200.00')
    True

Add product00 again.
--------------------
    >>> IPortal(doc00).add_to_cart(form)
    >>> product00.stock
    0
    >>> cart = IPortal(doc00).cart
    >>> cart
    <Cart at /plone/cfolder/1>
    >>> ICart(cart).products
    [<CartProduct at /plone/cfolder/1/1>]
    >>> ICart(cart).product(uid)
    <CartProduct at /plone/cfolder/1/1>
    >>> product = ICart(cart).product(uid)
    >>> product.uid == uid
    True
    >>> product.title
    'Product00'
    >>> product.quantity
    4
    >>> product.price == Decimal('100.00')
    True
    >>> product.subtotal == Decimal('400.00')
    True
    >>> ICartProduct(product).max_quantity
    5
    >>> original = ICartProduct(product).product
    >>> original
    <collective.cart.core.adapter.product.Product object at ...>
    >>> original.stock
    0
    >>> cart.totals == {'products_cost': Decimal('400.00')}
    True
    >>> cart.total_cost == Decimal('400.00')
    True
    >>> ICart(cart).subtotal == Decimal('400.00')
    True
    >>> ICart(cart).total_cost == Decimal('400.00')
    True

Add product00 again more than 5.
---------------------------------
    >>> IPortal(doc00).add_to_cart(form)
    >>> product00.stock
    0
    >>> cart = IPortal(doc00).cart
    >>> cart
    <Cart at /plone/cfolder/1>
    >>> ICart(cart).products
    [<CartProduct at /plone/cfolder/1/1>]
    >>> ICart(cart).product(uid)
    <CartProduct at /plone/cfolder/1/1>
    >>> product = ICart(cart).product(uid)
    >>> product.uid == uid
    True
    >>> product.title
    'Product00'
    >>> product.quantity
    5
    >>> product.price == Decimal('100.00')
    True
    >>> product.subtotal == Decimal('500.00')
    True
    >>> ICartProduct(product).max_quantity
    5
    >>> original = ICartProduct(product).product
    >>> original
    <collective.cart.core.adapter.product.Product object at ...>
    >>> original.stock
    0
    >>> cart.totals == {'products_cost': Decimal('500.00')}
    True
    >>> cart.total_cost == Decimal('500.00')
    True
    >>> ICart(cart).subtotal == Decimal('500.00')
    True
    >>> ICart(cart).total_cost == Decimal('500.00')
    True

Add product01.
--------------------
    >>> doc01 = portal.doc01
    >>> product01 = IProduct(doc01)
    >>> product01.stock
    50
    >>> uid = doc01.UID()
    >>> quantity = '2'
    >>> form = dict(uid=uid, quantity=quantity)
    >>> IPortal(doc01).add_to_cart(form)
    >>> product01.stock
    48
    >>> cart = IPortal(doc01).cart
    >>> cart
    <Cart at /plone/cfolder/1>
    >>> ICart(cart).products
    [<CartProduct at /plone/cfolder/1/1>, <CartProduct at /plone/cfolder/1/2>]
    >>> product = ICart(cart).product(uid)
    >>> product
    <CartProduct at /plone/cfolder/1/2>
    >>> product.quantity
    2
    >>> product.price == Decimal('10.00')
    True
    >>> product.subtotal == Decimal('20.00')
    True
    >>> ICartProduct(product).max_quantity
    30
    >>> original = ICartProduct(product).product
    >>> original
    <collective.cart.core.adapter.product.Product object at ...>
    >>> original.stock
    48
    >>> cart.totals == {'products_cost': Decimal('520.00')}
    True
    >>> cart.total_cost == Decimal('520.00')
    True
    >>> ICart(cart).subtotal == Decimal('520.00')
    True
    >>> ICart(cart).total_cost == Decimal('520.00')
    True

Add product01 again.
--------------------
    >>> quantity = '8'
    >>> form = dict(uid=uid, quantity=quantity)
    >>> IPortal(doc01).add_to_cart(form)
    >>> product01.stock
    40
    >>> ICart(cart).products
    [<CartProduct at /plone/cfolder/1/1>, <CartProduct at /plone/cfolder/1/2>]
    >>> product.quantity
    10
    >>> product.price == Decimal('10.00')
    True
    >>> product.subtotal == Decimal('100.00')
    True
    >>> original.stock
    40
    >>> cart.totals == {'products_cost': Decimal('600.00')}
    True
    >>> cart.total_cost == Decimal('600.00')
    True
    >>> ICart(cart).subtotal == Decimal('600.00')
    True
    >>> ICart(cart).total_cost == Decimal('600.00')
    True
    >>> ICartProduct(product).max_quantity
    30

Add more than what is in max_quantity.
--------------------------------
    >>> quantity = '21'
    >>> form = dict(uid=uid, quantity=quantity)
    >>> IPortal(doc01).add_to_cart(form)
    >>> product01.stock
    20
    >>> ICart(cart).products
    [<CartProduct at /plone/cfolder/1/1>, <CartProduct at /plone/cfolder/1/2>]
    >>> product.quantity
    30
    >>> product.price == Decimal('10.00')
    True
    >>> product.subtotal == Decimal('300.00')
    True
    >>> original.stock
    20
    >>> cart.totals == {'products_cost': Decimal('800.00')}
    True
    >>> cart.total_cost == Decimal('800.00')
    True
    >>> ICart(cart).subtotal == Decimal('800.00')
    True
    >>> ICart(cart).total_cost == Decimal('800.00')
    True

Add product02.
--------------------
    >>> doc02 = portal.doc02
    >>> product02 = IProduct(doc02)
    >>> product02.stock
    20
    >>> uid = doc02.UID()
    >>> quantity = '21'
    >>> form = dict(uid=uid, quantity=quantity)
    >>> IPortal(doc02).add_to_cart(form)
    >>> product02.stock
    0
    >>> cart = IPortal(doc02).cart
    >>> cart
    <Cart at /plone/cfolder/1>
    >>> ICart(cart).products
    [<CartProduct at /plone/cfolder/1/1>, <CartProduct at /plone/cfolder/1/2>, <CartProduct at /plone/cfolder/1/3>]
    >>> product = ICart(cart).product(uid)
    >>> product
    <CartProduct at /plone/cfolder/1/3>
    >>> product.quantity
    20
    >>> product.price == Decimal('5.00')
    True
    >>> product.subtotal == Decimal('100.00')
    True
    >>> ICartProduct(product).max_quantity
    20
    >>> original = ICartProduct(product).product
    >>> original
    <collective.cart.core.adapter.product.Product object at ...>
    >>> original.stock
    0
    >>> cart.totals == {'products_cost': Decimal('900.00')}
    True
    >>> cart.total_cost == Decimal('900.00')
    True
    >>> ICart(cart).subtotal == Decimal('900.00')
    True
    >>> ICart(cart).total_cost == Decimal('900.00')
    True

updata_cart
-----------
    >>> uid = doc00.UID()
    >>> product00
    <collective.cart.core.adapter.product.Product object at ...>
    >>> product00.stock
    0
    >>> product00.unlimited_stock
    True
    >>> product00.max_addable_quantity
    5
    >>> product = ICart(cart).product(uid)
    >>> product
    <CartProduct at /plone/cfolder/1/1>
    >>> product.quantity
    5
    >>> quantity = '1'
    >>> form = dict(uid=uid, quantity=quantity)
    >>> IPortal(doc00).update_cart(form)
    >>> product00.stock
    0
    >>> product.quantity
    1
    >>> product.price == Decimal('100.00')
    True
    >>> product.subtotal == Decimal('100.00')
    True
    >>> quantity = '6'
    >>> form = dict(uid=uid, quantity=quantity)
    >>> IPortal(doc00).update_cart(form)
    >>> product00.stock
    0
    >>> product.quantity
    5

    >>> uid = doc01.UID()
    >>> product01.stock
    20
    >>> product01.unlimited_stock
    False
    >>> product01.max_addable_quantity
    30
    >>> product = ICart(cart).product(uid)
    >>> product
    <CartProduct at /plone/cfolder/1/2>
    >>> product.quantity
    30
    >>> quantity = '1'
    >>> form = dict(uid=uid, quantity=quantity)
    >>> IPortal(doc01).update_cart(form)
    >>> product01.stock
    49
    >>> product.quantity
    1
    >>> quantity = '31'
    >>> form = dict(uid=uid, quantity=quantity)
    >>> IPortal(doc01).update_cart(form)
    >>> product01.stock
    20
    >>> product.quantity
    30
    >>> product.price == Decimal('10.00')
    True
    >>> product.subtotal == Decimal('300.00')
    True

    >>> quantity = '10'
    >>> form = dict(uid=uid, quantity=quantity)
    >>> IPortal(doc01).update_cart(form)
    >>> product01.stock
    40
    >>> product.quantity
    10
    >>> product.subtotal == Decimal('100.00')
    True

    >>> product01.max_addable_quantity = 51
    >>> quantity = '60'
    >>> form = dict(uid=uid, quantity=quantity)
    >>> IPortal(doc01).update_cart(form)
    >>> product01.stock
    0
    >>> product.quantity
    50
    >>> product.subtotal == Decimal('500.00')
    True

    >>> quantity = '5'
    >>> form = dict(uid=uid, quantity=quantity)
    >>> IPortal(doc01).update_cart(form)
    >>> product01.stock
    45
    >>> product.quantity
    5
    >>> product.subtotal == Decimal('50.00')
    True


delete_product
--------------
    >>> ICart(cart).products
    [<CartProduct at /plone/cfolder/1/1>, <CartProduct at /plone/cfolder/1/2>, <CartProduct at /plone/cfolder/1/3>]
    >>> ICart(cart).delete_product(uid)
    >>> ICart(cart).products
    [<CartProduct at /plone/cfolder/1/1>, <CartProduct at /plone/cfolder/1/3>]
    >>> product01.stock
    50
    >>> quantity = '1'
    >>> form = dict(uid=uid, quantity=quantity)
    >>> IPortal(doc02).add_to_cart(form)
    >>> ICart(cart).products
    [<CartProduct at /plone/cfolder/1/1>, <CartProduct at /plone/cfolder/1/3>, <CartProduct at /plone/cfolder/1/2>]
    >>> product01.stock
    49
    >>> product = ICart(cart).product(uid)
    >>> ICartProduct(product).quantity
    1
    >>> ICart(cart).delete_product(uid)
    >>> product01.stock
    50
    >>> uid = doc00.UID()
    >>> product00.stock
    0
    >>> ICart(cart).delete_product(uid)
    >>> product00.stock
    0
    >>> uid = doc02.UID()
    >>> form = dict(uid=uid)
    >>> IPortal(doc02).delete_product(form)
    >>> product02.stock
    20
    >>> ICart(cart).products
    []
    >>> product02.unlimited_stock
    False
    >>> product02.max_addable_quantity
    50
    >>> form = dict(uid=uid, quantity=quantity)
    >>> IPortal(doc02).add_to_cart(form)
    >>> ICart(cart).products
    [<CartProduct at /plone/cfolder/1/1>]
    >>> product = ICart(cart).product(uid)
    >>> ICartProduct(product).quantity
    1
    >>> product02.stock
    19
