public void Test3_Finding_BestPath_Will_Pass()
        {
            var mapa = _mother.CreateClientExampleMapa();

            var resquest = new CalcularMelhorRotaRequest()
            {
                Problema = new ProblemaDto()
                {
                    NomeMapa = "TestMap", Origem = "A", Destino = "D", AutonomiaVeiculo = "10", ValorCombustivel = "2.50"
                }
            };

            //Arrange
            var mapaRepository = MockRepository.GenerateMock <IMapaRepository>();

            mapaRepository.Stub(x => x.FindByName("TestMap")).Return(mapa);

            //Act
            _mapaServices = new MapaServices(mapaRepository);
            var result = _mapaServices.CalcularRota(resquest);

            //Assert
            Assert.IsTrue(result.Success);
            mapaRepository.VerifyAllExpectations();
        }
        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);
        }
        public PartialViewResult CalcularCusto(CalculoCustoViewModel model, FormCollection forms)
        {
            ViewBag.Title = Resources.MapaController_HttpPost_Action_CalcularCusto_ViewBag_Title;//"Calculadora de Rota e Custo:";

            model.Origem  = forms["Origens"];
            model.Destino = forms["Destinos"];

            //Fix to compromise the calculation if one of the states was not set
            //Selecione
            if (model.Origem.Equals(Resources.SelectList_Null_Item))
            {
                model.Origem = string.Empty;
            }

            //Selecione
            if (model.Destino.Equals(Resources.SelectList_Null_Item))
            {
                model.Destino = string.Empty;
            }

            var request = new CalcularMelhorRotaRequest()
            {
                Problema = new ProblemaDto()
                {
                    Id               = model.Id,
                    NomeMapa         = model.NomeMapa,
                    Origem           = model.Origem,
                    Destino          = model.Destino,
                    AutonomiaVeiculo = model.AutonomiaVeiculo,
                    ValorCombustivel = model.ValorCombustivel,
                }
            };
            var response = _mapaServices.CalcularRota(request);

            if (response.Success)
            {
                ViewBag.MessageType = "alert-success";
                ViewBag.Message     = response.Message;

                var caminho = new StringBuilder();
                foreach (var state in response.MelhorCaminho)
                {
                    caminho.Append(state);
                    caminho.Append(" > ");
                }

                var resultado = new ResultadoCustoViewModel()
                {
                    Id         = model.Id,
                    NomeMapa   = model.NomeMapa,
                    Caminho    = caminho.ToString(),
                    CustoTotal = response.CustoTotal
                };
                return(PartialView("ResultadoCustoPartialView", resultado));
            }
            else
            {
                ViewBag.Title = Resources.MapaController_HttpPost_Action_CalcularCusto_ViewBag_Title;//"Calculadora de Rota e Custo:";


                response.Rules.ForEach(x => ModelState.AddModelError(x.Key, x.Value));
                var requestMapa = new EncontrarMapaPorRequest()
                {
                    Mapa = new MapaDto()
                    {
                        Id = model.Id, NomeMapa = model.NomeMapa
                    }
                };
                var responseMapa = _mapaServices.EncontrarMapaPor(requestMapa);
                if (responseMapa.Success)
                {
                    ViewBag.MessageType = "alert-warning";
                    ViewBag.Message     = response.Message;

                    var origens  = responseMapa.Mapa.Rotas.ConvertToListRotaOrigemViewMode();
                    var destinos = responseMapa.Mapa.Rotas.ConvertToListRotaDestinoViewMode();
                    model.Destinos = destinos;
                    model.Origens  = origens;
                    return(PartialView("CalcularCustoPartialView", model));
                }
                else
                {
                    ViewBag.MessageType = "alert-danger";
                    ViewBag.Message     = response.Message;

                    return(PartialView("SucessoPartialView"));
                }
            }
        }