# Copyright 2009-2021 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::

    >>> from bidict import OrderedBidict, DuplicationError, RAISE, DROP_OLD, OnDup
    >>> b = OrderedBidict([(0, 1)])
    >>> b.update([(0, 2), (3, 4), (5, 4)])
    Traceback (most recent call last):
        ...
    ValueDuplicationError: 4
    >>> len(b.inv)
    1

    >>> b.putall([(2, 1), (2, 3)], OnDup(key=RAISE, val=DROP_OLD))
    Traceback (most recent call last):
        ...
    KeyDuplicationError: 2
    >>> 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')])

Test move_to_end here so it shows up in pytest's coverage report
(its hypothesis tests may not always hit all code paths,
and the doctests in the Sphinx docs don't get counted in the coverage report)::

    >>> b.move_to_end('NEW KEY')
    >>> b
    OrderedBidict([('NEWER KEY', 'NEWER VAL'), ('NEW KEY', 'SUCCESS!')])
    >>> b.move_to_end('NEW KEY', last=False)
    >>> b
    OrderedBidict([('NEW KEY', 'SUCCESS!'), ('NEWER KEY', 'NEWER VAL')])
    >>> b.move_to_end('NOT FOUND')
    Traceback (most recent call last):
        ...
    KeyError: 'NOT FOUND'
