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

class PrintAboutRectangleTests(unittest.TestCase):
    
    def test_default_case(self):
        function = main.print_about_rectangle
        

        try:
            docstring = function.__doc__
            docstring = docstring.strip()
        except:
            docstring = ""
        correct = docstring != ""
        message = "docstring is blank."
        self.assertTrue(correct, message) 

        

        with mock.patch('sys.stdout', new=io.StringIO()) as fake_stdout:
            function(3, 4, 3, 5)
        output = fake_stdout.getvalue().strip()

        correct = "isn't" in output or "is not" in output
        feedback = "Doesn't include \"isn't\" when the lengths aren't a rectangle."
        self.assertTrue(correct, feedback)

        correct = output.endswith("!")
        feedback = "The output doesn't end with an exclamation point."
        self.assertTrue(correct, feedback)

        regex = "This isn't a rectangle!"
        correct = re.match(regex, output)
        feedback = "Doesn't work when the parameters don't form a rectangle."
        self.assertTrue(correct, feedback)
        


        with mock.patch('sys.stdout', new=io.StringIO()) as fake_stdout:
            function(3, 4, 1, 4)
        output = fake_stdout.getvalue().strip()

        correct = "isn't" in output or "is not" in output
        feedback = "Doesn't include \"isn't\" when the lengths aren't a rectangle."
        self.assertTrue(correct, feedback)

        correct = output.endswith("!")
        feedback = "The output doesn't end with an exclamation point."
        self.assertTrue(correct, feedback)

        regex = "This isn't a rectangle!"
        correct = re.match(regex, output)
        feedback = "Doesn't work when the parameters don't form a rectangle."
        self.assertTrue(correct, feedback)
        



        with mock.patch('sys.stdout', new=io.StringIO()) as fake_stdout:
            function(5, 40, 5, 40)
        output = fake_stdout.getvalue().strip()

        correct = output.endswith(".")
        feedback = "The output doesn't end with a period."
        self.assertTrue(correct, feedback)

        regex = "Nice rectangle\."
        correct = re.match(regex, output)
        feedback = "Doesn't work when the parameters form a (non-square) rectangle."
        self.assertTrue(correct, feedback)
        



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

        correct = output.endswith("!")
        feedback = "The output doesn't end with an exclamation point."
        self.assertTrue(correct, feedback)

        regex = "This is a square!"
        correct = re.match(regex, output)
        feedback = "Doesn't work when the parameters form a square."
        self.assertTrue(correct, feedback)
        
        
if __name__ == "__main__":
    tests = PrintAboutRectangleTests()
    tests.test_default_case()