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 DormantVolcanoTests(unittest.TestCase):

    def test_default_case(self):
        try:
            main.ActiveVolcano
            test = True
        except:
            test = False
        message = "Please include the ActiveVolcano class in here."
        self.assertTrue(test, message)

        try:
            main.DormantVolcano
            test = True
        except:
            test = False
        message = "No DormantVolcano class."
        self.assertTrue(test, message)
        
            

        #test docstrings

        incorrect = ""

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

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

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



        
        function = main.DormantVolcano.__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)
        nearby = main.Mountain('Plymouth Mountain', 670, main.Location(main.GeographicCoordinate('N', 43, 42, 32.04), main.GeographicCoordinate('W', 71, 43, 24.96)))
        #kilauea = main.Volcano("Kilauea", 1247, main.Location(main.GeographicCoordinate('N', 19, 25, 16), main.GeographicCoordinate('W', 155, 17, 12)), True)
        loa = main.DormantVolcano("Mauna Loa", 4169, main.Location(main.GeographicCoordinate('N', 19, 28, 46.3), main.GeographicCoordinate('W', 155, 36, 9.6)))
        #kea = DormantVolcano("Mauna Kea", 4207.3, Location(GeographicCoordinate('N', 19, 49, 14), GeographicCoordinate('W', 155, 28, 5)))

        

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

        #expected answers
        correct_inputs = inputs
        correct_result = "Mauna Loa (4169m tall @(19\N{DEGREE SIGN}28'46.3\"N, 155\N{DEGREE SIGN}36'9.6\"W)) is a dormant volcano"
        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()

        #this is a cheat.  Take this out for later ones!
        #correct_result = result


        test = correct_printed == printed_output
        message = "Shouldn't print anything out."
        self.assertTrue(test, message)
        test = result == correct_result
        message = "Doesn't return the correct string for a DormantVolcano."
        self.assertTrue(test, message)
        test = tested_inputs == correct_inputs
        message = "Modifies the inputs."
        self.assertTrue(test, message)


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