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

class SwapElementsTests(unittest.TestCase):

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

        
        inputs = ([1], 0, 0)
        correct = ([1], 0, 0)
        if isinstance(inputs, tuple):
            result = function(*inputs)
        else:
            result = function(inputs)
        test = result == None
        message = "Isn't void."
        self.assertTrue(test, message)
        test = inputs == correct
        message = "Doesn't work on a case where the list only has one element."
        self.assertTrue(test, message)

        
        inputs = ([1, 2], 0, 0)
        correct = ([1, 2], 0, 0)
        if isinstance(inputs, tuple):
            result = function(*inputs)
        else:
            result = function(inputs)
        test = result == None
        message = "Isn't void."
        self.assertTrue(test, message)
        test = inputs == correct
        message = "Doesn't work on a case when the two indices are the same."
        self.assertTrue(test, message)

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

        
        inputs = ([1, 2, 3], 0, 2)
        correct = ([3, 2, 1], 0, 2)
        if isinstance(inputs, tuple):
            result = function(*inputs)
        else:
            result = function(inputs)
        test = result == None
        message = "Isn't void."
        self.assertTrue(test, message)
        test = inputs == correct
        message = "Doesn't work when swapping the first and last elements."
        self.assertTrue(test, message)

        
        inputs = ([1, 2, 3, 4], 0, 2)
        correct = ([3, 2, 1, 4], 0, 2)
        if isinstance(inputs, tuple):
            result = function(*inputs)
        else:
            result = function(inputs)
        test = result == None
        message = "Isn't void."
        self.assertTrue(test, message)
        test = inputs == correct
        message = "Doesn't work when swapping the first element with one in the middle."
        self.assertTrue(test, message)

        
        inputs = ([0, 1, 2, 3, 4], 1, 3)
        correct = ([0, 3, 2, 1, 4], 1, 3)
        if isinstance(inputs, tuple):
            result = function(*inputs)
        else:
            result = function(inputs)
        test = result == None
        message = "Isn't void."
        self.assertTrue(test, message)
        test = inputs == correct
        message = "Doesn't work when swapping two elements  in the middle of the list."
        self.assertTrue(test, message)

        
        inputs = ([0, 1, 2, 3, 4], 3, 1)
        correct = ([0, 3, 2, 1, 4], 3, 1)
        if isinstance(inputs, tuple):
            result = function(*inputs)
        else:
            result = function(inputs)
        test = result == None
        message = "Isn't void."
        self.assertTrue(test, message)
        test = inputs == correct
        message = "Doesn't work when the two indices are in decreasing order."
        self.assertTrue(test, message)

        
        inputs = (["a", "b", "c", "d", "e", "f", "g", "h"], 2, 4)
        correct = (["a", "b", "e", "d", "c", "f", "g", "h"], 2, 4)
        if isinstance(inputs, tuple):
            result = function(*inputs)
        else:
            result = function(inputs)
        test = result == None
        message = "Isn't void."
        self.assertTrue(test, message)
        test = inputs == correct
        message = "Doesn't work on my long list of strings."
        self.assertTrue(test, message)




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