# Aloe - Cucumber runner for Python based on Lettuce and Nose
# Copyright (C) <2015> Alexey Kotlyarov <a@koterpillar.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

"""
Test utility functions.
"""

from __future__ import unicode_literals
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
from future import standard_library
standard_library.install_aliases()

import sys
import unittest

from contextlib import contextmanager
from functools import wraps

from aloe.utils import (
    unwrap_function,
)


def my_function():
    """A function to test unwrapping on."""
    pass  # pragma: no cover


class UnwrapTest(unittest.TestCase):
    """
    Test unwrapping functions.
    """

    def test_plain_function(self):
        """Test unwrapping the raw function."""

        self.assertEqual(unwrap_function(my_function), my_function)

    def test_wraps(self):
        """Test unwrapping a function from a decorator using wraps."""

        if sys.version_info < (3, 0):
            # In Python 2, functools doesn't set enough information on the
            # wrapped function
            raise unittest.SkipTest(
                "Cannot unwrap @wraps in general case on Python 2.")

        @wraps(my_function)
        def decorated():
            """A decorated function."""
            return my_function()

        self.assertEqual(unwrap_function(decorated), my_function)

    def test_contextmanager(self):
        """Test unwrapping a context manager."""

        self.assertEqual(
            unwrap_function(contextmanager(my_function)),
            my_function
        )
