# Copyright 2018 Joshua Bronson. All Rights Reserved.
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

Test for consistency in ordered bidicts after handling duplicate keys/values
(when passing python's -O flag, this would previously fail
due to reliance on side effects in assert statements)::

    >>> from bidict import OrderedBidict, DuplicationError, RAISE, OVERWRITE
    >>> b = OrderedBidict([(0, 1)])
    >>> exc = None
    >>> try:
    ...     b.update([(0, 2), (3, 4), (5, 4)])
    ... except DuplicationError as e:
    ...     exc = e
    >>> exc is not None
    True
    >>> len(b.inv)
    1

    >>> exc = None
    >>> try:
    ...     b.putall([(2, 1), (2, 3)], on_dup_key=RAISE, on_dup_val=OVERWRITE)
    ... except DuplicationError as e:
    ...     exc = e
    >>> exc is not None
    True
    >>> len(b)
    1

    >>> b.forceupdate([(0, 1), (2, 3), (0, 3)])
    >>> b
    OrderedBidict([(0, 3)])

Test for consistency updating an ordered bidict's inverse:

    >>> b.inv[3] = 'UPDATED KEY'
    >>> b
    OrderedBidict([('UPDATED KEY', 3)])
    >>> b.inv
    OrderedBidict([(3, 'UPDATED KEY')])

    >>> b.inv.forceput('UPDATED VAL', 'UPDATED KEY')
    >>> b
    OrderedBidict([('UPDATED KEY', 'UPDATED VAL')])
    >>> b.inv
    OrderedBidict([('UPDATED VAL', 'UPDATED KEY')])

    >>> b.inv['NEW VAL'] = 'NEW KEY'
    >>> b
    OrderedBidict([('UPDATED KEY', 'UPDATED VAL'), ('NEW KEY', 'NEW VAL')])
    >>> b.inv
    OrderedBidict([('UPDATED VAL', 'UPDATED KEY'), ('NEW VAL', 'NEW KEY')])

    >>> b.inv.forceput('NEW VAL', 'UPDATED KEY')
    >>> b
    OrderedBidict([('UPDATED KEY', 'NEW VAL')])
    >>> b.inv
    OrderedBidict([('NEW VAL', 'UPDATED KEY')])

    >>> b.inv.update([('NEWER VAL', 'NEWER KEY'), ('NEW VAL', 'NEW KEY'), ('FAIL!', 'NEW KEY')])
    Traceback (most recent call last):
        ...
    ValueDuplicationError: NEW KEY
    >>> b
    OrderedBidict([('UPDATED KEY', 'NEW VAL')])
    >>> b.inv
    OrderedBidict([('NEW VAL', 'UPDATED KEY')])

    >>> b.inv.forceupdate([('NEWER VAL', 'NEWER KEY'), ('NEW VAL', 'NEW KEY'), ('SUCCESS!', 'NEW KEY')])
    >>> b
    OrderedBidict([('NEW KEY', 'SUCCESS!'), ('NEWER KEY', 'NEWER VAL')])
    >>> b.inv
    OrderedBidict([('SUCCESS!', 'NEW KEY'), ('NEWER VAL', 'NEWER KEY')])
