public void Test3_Lower_Cost_Route_From_A_To_D_Will_Pass()
        {
            CalculoService service = new CalculoService(this._testMapa);

            var result = service.Process("A", "D", 10, 2.50m);

            Assert.IsTrue(result.CustoTotal == 6.25m);
        }
        public CalcularMelhorRotaResponse CalcularRota(CalcularMelhorRotaRequest request)
        {
            var response = new CalcularMelhorRotaResponse();

            try
            {
                var problema = request.Problema.ConvertToProblema();
                if (problema.IsValid())
                {
                    CalculoService servicoDeCalculo;
                    Mapa           mapa = null;

                    if (!string.IsNullOrEmpty(problema.Id))
                    {
                        var id = Guid.Parse(problema.Id);
                        mapa = _mapaRepository.FindBy(id);
                    }
                    else if (!string.IsNullOrEmpty(problema.NomeMapa))
                    {
                        var nomeMapa = problema.NomeMapa;
                        mapa = _mapaRepository.FindByName(nomeMapa);
                    }

                    if (mapa != null)
                    {
                        servicoDeCalculo = new CalculoService(mapa);

                        var result = servicoDeCalculo.Process(problema.Origem,
                                                              problema.Destino,
                                                              problema.AutonomiaVeiculo,
                                                              problema.ValorCombustivel);
                        IFormatProvider culture = Thread.CurrentThread.CurrentCulture;

                        response.Success       = true;
                        response.Message       = Resources.MapaServices_CalcularRota_Success_Message;
                        response.CustoTotal    = result.CustoTotal.ToString("n", culture);
                        response.MelhorCaminho = result.MelhorCaminho;
                    }
                    else
                    {
                        response.Success = false;
                        response.Message = Resources.MapaServices_CalcularRota_Fail_Message;
                    }
                }
                else
                {
                    response.Success = false;
                    response.Message = Resources.MapaServices_CalcularRota_Fail2_Message + problema.GetErrorMessages();
                    response.Rules   = problema.BrokenRules;
                }
            }
            catch (Exception ex)
            {
                response.Success = false;
                response.Message = Resources.MapaServices_CalcularRota_Error_Message + ex.Message;
            }
            return(response);
        }