#!/usr/bin/env python3

from __future__ import division
from __future__ import print_function

import unittest

from tail import tail


class TailTests(unittest.TestCase):
    """
    Tests for tail.
    """

    def test_simple_string(self):
        self.assertEqual(tail("abcd", 2), ["c", "d"])

    def test_simple_tuple(self):
        self.assertEqual(tail((1, 2, 3, 4), 3), [2, 3, 4])

    def test_simple_list(self):
        self.assertEqual(tail([1, 2, 3, 4], 2), [3, 4])

    def test_empty_sequence(self):
        self.assertEqual(tail([], 3), [])

    def test_zero(self):
        self.assertEqual(tail([1, 2, 3], 0), [])

    def test_one(self):
        self.assertEqual(tail([1, 2, 3], 1), [3])

    def test_two(self):
        self.assertEqual(tail([1, 2, 3], 2), [2, 3])

    def test_n_bigger_that_sequence(self):
        self.assertEqual(tail("abcde", 30), ["a", "b", "c", "d", "e"])

    def test_no_recursion(self):
        self.assertEqual(tail("a" * 10000000, 3), ["a", "a", "a"])

    # Comment the following line to force the check the bonus code
    @unittest.expectedFailure
    def test_negative_number(self):
        self.assertEqual(tail([1, 2, 3], -1), [])

    # Comment the following line to force the check the bonus code
    @unittest.expectedFailure
    def test_any_type_of_iterable(self):
        squares = (n**2 for n in [1, 2, 3, 4])
        self.assertEqual(tail(squares, -1), [])  # negative n must not iterate
        self.assertEqual(tail(squares, 0), [])  # must not consume generator
        self.assertEqual(tail(squares, 2), [9, 16])  # Consuming the generator
        self.assertEqual(list(squares), [])  # No item should reamin
        self.assertEqual(tail(squares, 1), [])  # no item should be return



if __name__ == "__main__":
    unittest.main(verbosity=2)
