%run ../stack/stack.py
%load ../stack/stack.py

class MyStack(Stack):

    def sort(self):
        # TODO: Implement me
        pass

"""
Explanation: <small><i>This notebook was prepared by Donne Martin. Source and license info is on GitHub.</i></small>
Challenge Notebook
Problem: Sort a stack.  You can use another stack as a buffer.

Constraints
Test Cases
Algorithm
Code
Unit Test
Solution Notebook

Constraints

When sorted, should the largest element be at the top or bottom?
Top


Can you have duplicate values like 5, 5?
Yes


Can we assume we already have a stack class that can be used for this problem?
Yes



Test Cases

Empty stack -> None
One element stack
Two or more element stack (general case)
Already sorted stack

Algorithm
Refer to the Solution Notebook.  If you are stuck and need a hint, the solution notebook's algorithm discussion might be a good place to start.
Code
End of explanation
"""


# %load test_sort_stack.py
from random import randint
from nose.tools import assert_equal


class TestSortStack(object):

    def get_sorted_stack(self, numbers):
        stack = MyStack()
        for x in numbers:
            stack.push(x)
        sorted_stack = stack.sort()
        return sorted_stack

    def test_sort_stack(self):
        print('Test: Empty stack')
        sorted_stack = self.get_sorted_stack([])
        assert_equal(sorted_stack.pop(), None)

        print('Test: One element stack')
        sorted_stack = self.get_sorted_stack([1])
        assert_equal(sorted_stack.pop(), 1)

        print('Test: Two or more element stack (general case)')
        num_items = 10
        numbers = [randint(0, 10) for x in range(num_items)]
        sorted_stack = self.get_sorted_stack(numbers)
        sorted_numbers = []
        for _ in range(num_items):
            sorted_numbers.append(sorted_stack.pop())
        assert_equal(sorted_numbers, sorted(numbers, reverse=True))

        print('Success: test_sort_stack')


def main():
    test = TestSortStack()
    test.test_sort_stack()


if __name__ == '__main__':
    main()

"""
Explanation: Unit Test
The following unit test is expected to fail until you solve the challenge.
End of explanation
"""


