def test_Shortest_routes( self ):
        """
        The correct shortest routes and distances are found
        for start station 'A' in the exercise.

        """
        t = Traversal( Route_Map( "Data/test_route_exercise.txt" ) )
        t.find_all_shortest_routes( )
        self.assertEqual( t.traversals, all_shortest_routes )
    def test_Shortest_routes_from_station( self ):
        """
        The correrct shortest routes and distances are found
        for start station 'A' in the exercise.

        """
        t = Traversal( Route_Map( "Data/test_route_exercise.txt" ) )
        t.build_shortest_routes_from_station( 'A' )
        self.assertEqual( t.traversals, shortest_routes_from_A )
    def test_Trace( self ):
        """
        The correrct shortest destinations and distances are found
        for start station 'A' in the exercise.

        """
        t = Traversal( Route_Map( "Data/test_route_exercise.txt" ) )
        t.traversals['A'] = {}
        t.trace( 'A', 'A', 0 )
        self.assertEqual( t.traversals, shortest_dests_from_A )
class Player:
    def __init__(self):
        self.name = "Player"
        self.traitDictionary = {}
        self.counterDictionary = {}
        self.travels = Traversal()
        self.gameOver = False

    def checkCountersForEndCondition(self):
        for counter in self.counterDictionary.values():
            if counter.counter >= 1:
                self.gameOver = True
                self.endGame(counter.name)
            else:
                print("{} ending not yet reached".format(counter.name))

    def endGame(self, counterName):
        textfile = "./Text Files/Ending" + counterName + ".txt"
        if os.path.isfile(textfile):
            with open(textfile) as file:
                for line in file:
                    print(line)

    def setTraitTrue(self, traitName):
        if traitName in self.traitDictionary:
            self.traitDictionary[traitName].setTraitTrue()

    def setTraitFalse(self, traitName):
        if traitName in self.traitDictionary:
            self.traitDictionary[traitName].setTraitFalse()

    def incrementCounter(self, counterName):
        if counterName in self.counterDictionary:
            self.counterDictionary[counterName].increment()

    def decrementCounter(self, counterName):
        if counterName in self.counterDictionary:
            self.counterDictionary[counterName].decrement()

    def listTraitNamesTrue(self):
        _traitNameList = []
        for trait in self.traitDictionary.values():
            if trait.value == True:
                _traitNameList.append(trait.name)
        return _traitNameList

    def refreshTraversal(self):
        _traitsTrueList = self.listTraitNamesTrue()
        self.travels.refreshTraversal(_traitsTrueList)

    def updateTraitFromLocation(self, locationName):
        _traitNameList = self.travels.returnLocationTraitNameList(locationName)
        for traitName in _traitNameList:
            self.setTraitTrue(traitName)

    def travelRandomly(self):
        self.refreshTraversal()
        _locationName = self.travels.getRandomLocationNameByAccessibility()
        if _locationName == "empty":
            print(
                "There are no rooms left to explore. getRandomLocationNameByAccessibility returned 'empty'"
            )  #todo
        else:
            self.travels.visitLocation(_locationName)
            self.updateTraitFromLocation(_locationName)

    def travelRandomlyByTrait(self, traitName):
        self.refreshTraversal()
        _locationName = self.travels.getRandomLocationNameByTraitPrerequisite(
            traitName)
        if _locationName == "empty":
            print(
                "There are no rooms left to explore with that trait. getRandomLocationNameByTraitPrerequisite returned 'empty'"
            )  #todo
        else:
            self.travels.visitLocation(_locationName)
            self.updateTraitFromLocation(_locationName)

    def travelToLocation(self, locationName):
        self.refreshTraversal()
        if self.travels.visitLocation(locationName) == True:
            self.updateTraitFromLocation(locationName)
#            self.checkCountersForEndCondition()
        else:
            print("Couldn't travel to {}\n".format(locationName))  #todo

    def interactWithInteractable(
        self, interactableName
    ):  #probably should be more generic and not point at current location #can double up on interactable counters.
        self.travels.touchInteractable(interactableName)
        counterName = self.travels.getInteractableCounterName(interactableName)
        self.incrementCounter(counterName)

    def reportTraits(self):  #debug function
        for trait in self.traitDictionary.values():
            print(trait.name)

    def reportTraitsTrue(self):  #debug function
        for trait in self.traitDictionary.values():
            if trait.value == True:
                print('Trait: {} {}'.format(trait.name, trait.value))

    def reportTraitsFalse(self):  #debug function
        for trait in self.traitDictionary.values():
            if trait.value == False:
                print('Trait: {} {}'.format(trait.name, trait.value))

    def reportCounters(self):  #debug function
        for counter in self.counterDictionary.values():
            print('Counter: {} - {}'.format(counter.name, counter.counter))

    def reportLocations(self):  #debug function
        for location in self.travels.locationDictionary.values():
            print('Location: {}, Text: {}\n'.format(location.name,
                                                    location.text))

    def reportVisitedLocations(self):  #debug function
        for location in self.travels.visitedLocationNameList:
            print('Location: {}'.format(location))

    def reportAccessibleLocations(self):  #debug function
        for location in self.travels.accessibleLocationNameList:
            print('Location: {}'.format(location))

    def reportInaccessibleLocations(self):  #debug function
        for location in self.travels.inaccessibleLocationNameList:
            print('Location: {}'.format(location))

    def reportCurrentLocation(self):  #debug function
        print('Current Location: {}'.format(self.travels.currentLocationName))

    def reportInteractables(self):  #debug function
        for location in self.travels.locationDictionary.values():
            print(location.text)
            for interactable in location.interactablesList:
                print("     {}".format(interactable.text))

    def reportInteractablesByLocation(self, locationName):  #debug function
        if locationName in self.travels.locationDictionary:
            _location = self.travels.locationDictionary[locationName]
            for interactable in _location.interactablesList:
                print(interactable.text)
        else:
            print("{} isn't in the locationDictionary".format(locationName))
 def __init__(self):
     self.name = "Player"
     self.traitDictionary = {}
     self.counterDictionary = {}
     self.travels = Traversal()
     self.gameOver = False