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

class PrintDucklingNamesTests(unittest.TestCase):

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


        inputs = ("J", )
        with mock.patch('sys.stdout', new=io.StringIO()) as fake_stdout:
            function(*inputs)
        output = fake_stdout.getvalue().strip()

        correct = "Jack" in output
        feedback = "Doesn't print 'Jack' when 'J' is in the input."
        self.assertTrue(correct, feedback)

        #regex = output == "Jack"
        #correct = re.match(regex, output)
        correct = output == "Jack"
        feedback = "Doesn't print exactly 'Jack' when 'J' is in the input."
        self.assertTrue(correct, feedback)


        inputs = ("JK", )
        with mock.patch('sys.stdout', new=io.StringIO()) as fake_stdout:
            function(*inputs)
        output = fake_stdout.getvalue().strip()

        correct = "Kack" in output
        feedback = "Doesn't print 'Kack' when 'K' is in the input."
        self.assertTrue(correct, feedback)

        #regex = output == "Jack"
        #correct = re.match(regex, output)
        correct = output == "Jack\nKack"
        feedback = "Doesn't work on 'JK'."
        self.assertTrue(correct, feedback)


        inputs = ("JKLMNOPQ", )
        with mock.patch('sys.stdout', new=io.StringIO()) as fake_stdout:
            function(*inputs)
        output = fake_stdout.getvalue().strip()

        correct = "Mack" in output
        feedback = "Doesn't print 'Mack' when given the normal duckling first letters."
        self.assertTrue(correct, feedback)

        correct = not "Oack" in output
        feedback = "Yours prints Oack, but it should print Ouack instead."
        self.assertTrue(correct, feedback)

        correct = not "Qack" in output
        feedback = "Yours prints Qack, but it should print Quack instead."
        self.assertTrue(correct, feedback)

        #regex = output == "Jack"
        #correct = re.match(regex, output)
        correct = output == "Jack\nKack\nLack\nMack\nNack\nOuack\nPack\nQuack"
        feedback = "Doesn't work on the normal duckling letters."
        self.assertTrue(correct, feedback)



        

        inputs = ("ABCDEFGHIJKLM", )
        with mock.patch('sys.stdout', new=io.StringIO()) as fake_stdout:
            function(*inputs)
        output = fake_stdout.getvalue().strip()

        correct = "Mack" in output
        feedback = "Doesn't print 'Mack' when 'M' is in the input."
        self.assertTrue(correct, feedback)

        correct = not "Aack" in output
        feedback = "Yours prints Aack, but I decided that should also get a 'u', so it should print Auack instead."
        self.assertTrue(correct, feedback)

        #regex = output == "Jack"
        #correct = re.match(regex, output)
        correct = output == "Auack\nBack\nCack\nDack\nEack\nFack\nGack\nHack\nIack\nJack\nKack\nLack\nMack"
        feedback = "Doesn't work on the first half of the alphabet."
        self.assertTrue(correct, feedback)
        
        
if __name__ == "__main__":
    tests = PrintDucklingNamesTests()
    tests.test_default_case()