import unittest
from sack import Sack


class SackEmptyTestCase(unittest.TestCase):
    """Test behaviour of an empty Sack."""

    def setUp(self):
        """Set up an empty Sack."""
        self.Sack = Sack()

    def tearDown(self):
        """Clean up."""
        self.Sack = None

    def testIsEmpty(self):
        """Test is_empty() on empty Sack."""
        # it's hard to avoid \ continuation here.
        self.assertTrue(self.Sack.is_empty(),
            'is_empty returned False on an empty Sack!')

    def testadd(self):
        """Test add to empty Sack."""

        self.Sack.add("foo")
        self.assertTrue(self.Sack.remove() == "foo",
            'Wrong item ! Expected "foo" here.')

class SackAllTestCase(unittest.TestCase):
    """Comprehensive tests of (non-empty) Sack."""

    def setUp(self):
        """Set up an empty Sack."""
        self.Sack = Sack()

    def tearDown(self):
        """Clean up."""
        self.Sack = None

    def testAll(self):
        """Test adding and removing multiple elements."""
        number_set = set(range(20))

        for item in number_set:
            self.Sack.add(item)
            self.assertFalse(self.Sack.is_empty(),
                'is_empty() returned True on a non-empty Sack!')

        while not self.Sack.is_empty():
            element = self.Sack.remove()
            self.assertTrue(element in number_set,
                'Something wrong on top of the Sack!')
            number_set -= {element}


if __name__ == '__main__':
    unittest.main(exit=False)
