'An unordered sequence specific comparison. It asserts that
expected_seq and actual_seq contain the same elements. It is
the equivalent of::
self.assertEqual(sorted(expected_seq), sorted(actual_seq))
Raises with an error message listing which elements of expected_seq
are missing from actual_seq and vice versa if any.
Asserts that each element has the same count in both sequences.
Example:
- [0, 1, 1] and [1, 0, 1] compare equal.
- [0, 0, 1] and [0, 1] compare unequal.'

def assertItemsEqual(self, expected_seq, actual_seq, msg=None):

    try:
        expected = sorted(expected_seq)
        actual = sorted(actual_seq)
    except TypeError:
        expected = list(expected_seq)
        actual = list(actual_seq)
        (missing, unexpected) = unorderable_list_difference(expected, actual, ignore_duplicate=False)
    else:
        return self.assertSequenceEqual(expected, actual, msg=msg)
    errors = []
    if missing:
        errors.append(('Expected,    but    missing:\n                %s' % safe_repr(missing)))
    if unexpected:
        errors.append(('Unexpected,    but    present:\n                %s' % safe_repr(unexpected)))
    if errors:
        standardMsg = '\n'.join(errors)
        self.fail(self._formatMessage(msg, standardMsg))
