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

class MountainBasicsTests(unittest.TestCase):

    def test_default_case(self):
        #test the docstrings
        incorrect = ""
        try:
            doc = main.Mountain.__doc__
            doc = doc.strip()
        except:
            doc = ""
        test = incorrect != doc
        message = "No docstring for Mountain."
        self.assertTrue(test, message)

        try:
            doc = main.Mountain.__init__.__doc__
            doc = doc.strip()
        except:
            doc = ""
        test = incorrect != doc
        message = "No docstring for Mountain.__init__"
        self.assertTrue(test, message)

        try:
            doc = main.Mountain.__str__.__doc__
            doc = doc.strip()
        except:
            doc = ""
        test = incorrect != doc
        message = "No docstring for Mountain.__str__"
        self.assertTrue(test, message)
        

        
        function = main.Mountain.__str__

        mw_latitude = main.GeographicCoordinate('N', 44, 16, 13.8)
        mw_longitude = main.GeographicCoordinate('W', 71, 18, 11.7)
        mw_location = main.Location(mw_latitude, mw_longitude)    
        washington = main.Mountain('Mount Washington', 1916.6, mw_location)

        inputs = (washington)
        tested_inputs = inputs #change this if you need to test specific inputs

        #expected answers
        correct_inputs = inputs
        correct_result = "Mount Washington (1916.6m tall @(44\N{DEGREE SIGN}16'13.8\"N, 71\N{DEGREE SIGN}18'11.7\"W))"
        correct_printed = ""

        #run the test
        with mock.patch('sys.stdout', new=io.StringIO()) as fake_stdout:
            if isinstance(inputs, tuple):
                result = function(*inputs)
            else:
                result = function(inputs)
        printed_output = fake_stdout.getvalue().strip()

        test = "m tall" in result
        message = "Doesn't include the 'm tall' correctly in the output."
        self.assertTrue(test, message)
        test = "@(44" in result
        message = "Doesn't put the @ in the output correctly."
        self.assertTrue(test, message)
        test = correct_printed == printed_output
        message = "Shouldn't print anything out."
        self.assertTrue(test, message)
        test = result == correct_result
        message = "Doesn't work on Mount Washington."
        self.assertTrue(test, message)
        test = tested_inputs == correct_inputs
        message = "Modifies the inputs."
        self.assertTrue(test, message)
        

        
        function = main.Mountain.__str__

        bh_latitude = main.GeographicCoordinate('N', 30, 59, 19)
        bh_longitude = main.GeographicCoordinate('W', 86, 16, 55)
        #print("bh_latitude:", bh_latitude)
        bh_location = main.Location(bh_latitude, bh_longitude)    
        britton = main.Mountain('Britton Hill', 105, bh_location)

        inputs = (britton)
        tested_inputs = inputs #change this if you need to test specific inputs

        #expected answers
        correct_inputs = inputs
        correct_result = "Britton Hill (105m tall @(30\N{DEGREE SIGN}59'19\"N, 86\N{DEGREE SIGN}16'55\"W))"
        correct_printed = ""

        #run the test
        with mock.patch('sys.stdout', new=io.StringIO()) as fake_stdout:
            if isinstance(inputs, tuple):
                result = function(*inputs)
            else:
                result = function(inputs)
        printed_output = fake_stdout.getvalue().strip()
        test = correct_printed == printed_output
        message = "Shouldn't print anything out."
        self.assertTrue(test, message)
        test = result == correct_result
        message = "Doesn't work on the highest point in Florida."
        self.assertTrue(test, message)
        test = tested_inputs == correct_inputs
        message = "Modifies the inputs."
        self.assertTrue(test, message)



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