"""
Test memory leaks for dictionary classes used by pywbem.
"""

from __future__ import absolute_import, print_function

import sys
from collections import OrderedDict
try:
    from django.utils.datastructures import SortedDict as Django_SortedDict
except ImportError:
    Django_SortedDict = None
import pytest
import yagot

# pylint: disable=wrong-import-position, wrong-import-order, invalid-name
from ..utils import import_installed
pywbem = import_installed('pywbem')
from pywbem._cim_obj import NocaseDict  # noqa: E402
# pylint: enable=wrong-import-position, wrong-import-order, invalid-name


# collections.OrderedDict has fixed its ref.cycles starting with Python 3.2
ORDEREDDICT_LEAKFREE_VERSION = (3, 2)


@pytest.mark.xfail(
    sys.version_info < ORDEREDDICT_LEAKFREE_VERSION,
    reason="OrderedDict has reference cycles on py<3.2")
@yagot.garbage_checked()
def test_leaks_OrderedDict_empty():
    """
    Test function with empty OrderedDict object.

    Note: collections.OrderedDict has memory leaks on Python 2.7; see
    https://bugs.python.org/issue9825. That issue was fixed in Python 3.2, but
    the change in Python 2.7 apparently was not sufficient to remove the leak.
    """
    _ = OrderedDict()


@pytest.mark.skipif(
    Django_SortedDict is None,
    reason="django with SortedDict is not installed")
@yagot.garbage_checked()
def test_leaks_Django_SortedDict_empty():
    """
    Test function with empty django SortedDict object.

    Note: Django's SortedDict has been removed from the django package as of
    version 1.9. This test requires django<1.9 to be installed and is skipped
    otherwise.
    """
    _ = Django_SortedDict()


@pytest.mark.xfail(
    sys.version_info < ORDEREDDICT_LEAKFREE_VERSION,
    reason="NocaseDict uses OrderedDict")
@yagot.garbage_checked()
def test_leaks_NocaseDict_empty():
    """
    Test function with empty NocaseDict object.
    """
    _ = NocaseDict()


@pytest.mark.xfail(
    sys.version_info < ORDEREDDICT_LEAKFREE_VERSION,
    reason="NocaseDict uses OrderedDict")
@yagot.garbage_checked()
def test_leaks_NocaseDict_one():
    """
    Test function with NocaseDict object containing one string item.
    """
    _ = NocaseDict(a='b')