import unittest
import io
import re
from unittest import mock
import math
import inspect
import student_X as main #Replace student_X with your filename 
    
    
    
 

class SelectionSortTests(unittest.TestCase):

    def test_default_case(self):
        function = main.selection_sort
        
        test = False
        try:
            incorrect = ""
            result = function.__doc__
            result = result.strip()
            test = incorrect != result
        except:
            pass
        message = "No docstring."
        self.assertTrue(message, test)


        source = inspect.getsource(function)
        test = not ".sort(" in source
        message = "You can't use the built-in sort method for lists."
        self.assertTrue(message, test)
        
        test = "index_of_max_in_range(" in source
        message = "You aren't using index_of_max_in_range in your code."
        self.assertTrue(message, test)
        
        test = "swap_elements(" in source
        message = "You aren't using swap_elements in your code."
        self.assertTrue(message, test)

        
        inputs = ([])
        correct = []
        if isinstance(inputs, tuple):
            result = function(*inputs)
        else:
            result = function(inputs)
        test = result == None
        message = "Not void."
        self.assertTrue(test, message)
        test = inputs == correct
        message = "Doesn't work on an empty list."
        self.assertTrue(test, message)

        
        inputs = ([5])
        correct = [5]
        if isinstance(inputs, tuple):
            result = function(*inputs)
        else:
            result = function(inputs)
        test = result == None
        message = "Not void."
        self.assertTrue(test, message)
        test = inputs == correct
        message = "Doesn't work on a list with one element."
        self.assertTrue(test, message)

        
        inputs = ([3, 2])
        correct = [3, 2]
        if isinstance(inputs, tuple):
            result = function(*inputs)
        else:
            result = function(inputs)
        test = result == None
        message = "Not void."
        self.assertTrue(test, message)
        test = inputs == correct
        message = "Doesn't work on an already-sorted list with two elements."
        self.assertTrue(test, message)

        
        inputs = ([2, 3])
        correct = [3, 2]
        if isinstance(inputs, tuple):
            result = function(*inputs)
        else:
            result = function(inputs)
        test = result == None
        message = "Not void."
        self.assertTrue(test, message)
        test = inputs == correct
        message = "Doesn't work on a backwards-sorted list with two elements."
        self.assertTrue(test, message)

        
        inputs = ([10, 10, 10, 10])
        correct = [10, 10, 10, 10]
        if isinstance(inputs, tuple):
            result = function(*inputs)
        else:
            result = function(inputs)
        test = result == None
        message = "Not void."
        self.assertTrue(test, message)
        test = inputs == correct
        message = "Doesn't work on a list where all elements are the same."
        self.assertTrue(test, message)

        
        inputs = ([5, 10, 10, 5])
        correct = [10, 10, 5, 5]
        if isinstance(inputs, tuple):
            result = function(*inputs)
        else:
            result = function(inputs)
        test = result == None
        message = "Not void."
        self.assertTrue(test, message)
        test = inputs == correct
        message = "Doesn't work on a list of length four."
        self.assertTrue(test, message)

        
        inputs = ([1, 2, 3, 2])
        correct = [3, 2, 2, 1]
        if isinstance(inputs, tuple):
            result = function(*inputs)
        else:
            result = function(inputs)
        test = result == None
        message = "Not void."
        self.assertTrue(test, message)
        test = inputs == correct
        message = "Doesn't work on a list of length four."
        self.assertTrue(test, message)

        
        inputs = ([1, 3, 7, 9, 8, 6, 4, 2])
        correct = [9, 8, 7, 6, 4, 3, 2, 1]
        if isinstance(inputs, tuple):
            result = function(*inputs)
        else:
            result = function(inputs)
        test = result == None
        message = "Not void."
        self.assertTrue(test, message)
        test = inputs == correct
        message = "Doesn't work on my list with no duplicates."
        self.assertTrue(test, message)

        
        inputs = ([1, 2, 3, 7, 2, 4, 10, 2])
        correct = [10, 7, 4, 3, 2, 2, 2, 1]
        if isinstance(inputs, tuple):
            result = function(*inputs)
        else:
            result = function(inputs)
        test = result == None
        message = "Not void."
        self.assertTrue(test, message)
        test = inputs == correct
        message = "Doesn't work on a long list."
        self.assertTrue(test, message)




        
        
if __name__ == "__main__":
    tests = SelectionSortTests()
    tests.test_default_case()