Exemplo n.º 1
0
        private void ValidateThatTeleportationServiceIsApplicable(IUnit unitToTeleport, ILocation targetLocation, out IPath pathToTheTargetPlanet)
        {
            if (unitToTeleport.IsNull())
            {
                throw new ArgumentNullException("unitToTeleport");
            }

            if (targetLocation.IsNull())
            {
                throw new ArgumentNullException("destination");
            }

            if (!this.LocationsMatch(this.LocationOfStation, unitToTeleport.CurrentLocation))
            {
                throw new TeleportOutOfRangeException("unitToTeleport.CurrentLocation");
            }

            var pathsToTheTargetGalaxy = this.GalacticMapOfStation
                                         .Where(path => path.TargetLocation.Planet.Galaxy.Name == targetLocation.Planet.Galaxy.Name)
                                         .ToList();

            if (pathsToTheTargetGalaxy.IsNullOrEmpty())
            {
                throw new LocationNotFoundException("A path to a Galaxy with the provided name cannot be found in the TeleportStation's galactic map.");
            }

            pathToTheTargetPlanet = pathsToTheTargetGalaxy.FirstOrDefault(path => path.TargetLocation.Planet.Name == targetLocation.Planet.Name);
            if (pathToTheTargetPlanet.IsNull())
            {
                throw new LocationNotFoundException("A path to a Planet with the provided name cannot be found in the TeleportStation's galactic map.");
            }

            foreach (var unitInCity in pathToTheTargetPlanet.TargetLocation.Planet.Units)
            {
                if (this.LocationsAndCoordinatesMatch(targetLocation, unitInCity.CurrentLocation))
                {
                    throw new InvalidTeleportationLocationException("There is already a unit placed on the desired location. Cannot activate the teleportation service because the units will overlap.");
                }
            }

            if (!unitToTeleport.CanPay(pathToTheTargetPlanet.Cost))
            {
                throw new InsufficientResourcesException("The unit cannot be teleported, because THERE AIN'T NO SUCH THING AS A FREE LUNCH.");
            }
        }
Exemplo n.º 2
0
        private void ValidateThatTeleportationServiceIsApplicable(IUnit unitToTeleport, ILocation targetLocation, out IPath pathToTheTargetPlanet)
        {
            if (unitToTeleport.IsNull())
            {
                throw new ArgumentNullException("unitToTeleport");
            }

            if (targetLocation.IsNull())
            {
                throw new ArgumentNullException("destination");
            }

            if (!this.LocationsMatch(this.location, unitToTeleport.CurrentLocation))
            {
                throw new TeleportOutOfRangeException("unitToTeleport.CurrentLocation");
            }

            var pathsToTheTargetGalaxy = galacticMap
                .Where(path => path.TargetLocation.Planet.Galaxy.Name == targetLocation.Planet.Galaxy.Name)
                .ToList();
            if (pathsToTheTargetGalaxy.IsNullOrEmpty())
            {
                throw new LocationNotFoundException("A path to a Galaxy with the provided name cannot be found in the TeleportStation's galactic map.");
            }

            pathToTheTargetPlanet = pathsToTheTargetGalaxy.FirstOrDefault(path => path.TargetLocation.Planet.Name == targetLocation.Planet.Name);
            if (pathToTheTargetPlanet.IsNull())
            {
                throw new LocationNotFoundException("A path to a Planet with the provided name cannot be found in the TeleportStation's galactic map.");
            }

            foreach (var unitInCity in pathToTheTargetPlanet.TargetLocation.Planet.Units)
            {
                if (this.LocationsAndCoordinatesMatch(targetLocation, unitInCity.CurrentLocation))
                {
                    throw new InvalidTeleportationLocationException("There is already a unit placed on the desired location. Cannot activate the teleportation service because the units will overlap.");
                }
            }

            if (!unitToTeleport.CanPay(pathToTheTargetPlanet.Cost))
            {
                throw new InsufficientResourcesException("The unit cannot be teleported, because THERE AIN'T NO SUCH THING AS A FREE LUNCH.");
            }
        }