Cambio de algoritmia en el descarte de paradas posibles antes del recalculo de soluciones: se analiza las 48 paradas de cada arista en bsuqueda de rutas directas scoreandolas antes de entrar en el recorrido BFS con transbordos.

configuraciones guardadas cambios

hora simualda en central
This commit is contained in:
2026-09-17 13:27:39 +02:00
parent 7090dfa9be
commit f63a1b8b08
13 changed files with 331 additions and 119 deletions

View File

@@ -20,6 +20,30 @@ var baseMethod = typeof(PlanificadorRutas).GetMethod("CrearConfiguracionBaseHist
var defaults = (ConfiguracionHistorialRuta)baseMethod.Invoke(null, null)!;
Check(defaults.PesoTransbordoRankingMinutos == 6, "Penalizacion inicial de 6 minutos");
var panelSinCambios = new PlanificadorRutas();
var alternarPanel = typeof(PlanificadorRutas).GetMethod(
"ToggleConfigPanel",
BindingFlags.Instance | BindingFlags.NonPublic)!;
var solicitarCierre = typeof(PlanificadorRutas).GetMethod(
"SolicitarCierreConfiguracionAvanzada",
BindingFlags.Instance | BindingFlags.NonPublic)!;
alternarPanel.Invoke(panelSinCambios, null);
Check(
solicitarCierre.Invoke(panelSinCambios, null) is true,
"Configuracion avanzada sin cambios se cierra directamente");
var panelConCambios = new PlanificadorRutas();
alternarPanel.Invoke(panelConCambios, null);
typeof(PlanificadorRutas)
.GetField("_velocidadPieKmH", BindingFlags.Instance | BindingFlags.NonPublic)!
.SetValue(panelConCambios, 4.2);
Check(
solicitarCierre.Invoke(panelConCambios, null) is false &&
(bool)typeof(PlanificadorRutas)
.GetField("_mostrarConfirmacionCerrarConfiguracion", BindingFlags.Instance | BindingFlags.NonPublic)!
.GetValue(panelConCambios)!,
"Configuracion avanzada avisa antes de descartar cambios");
var folder = Path.Combine(Path.GetTempPath(), "rutasdbus-regression-" + Guid.NewGuid().ToString("N"));
IConfiguration Config() => new ConfigurationBuilder().AddInMemoryCollection(new Dictionary<string, string?>
{
@@ -37,7 +61,29 @@ try
await File.WriteAllTextAsync(file, JsonSerializer.Serialize(defaults));
var loaded = await Service().CargarAsync();
Check(loaded?.PesoTransbordoRankingMinutos == 9, "Valores compartidos entre instancias");
Check(loaded is { FechaSimulada: null, HoraSimulada: null }, "Los valores de fabrica no fijan la fecha y hora");
Check(loaded is { FechaSimulada: null, HoraSimulada: null }, "Valores antiguos sin fecha y hora siguen siendo validos");
var guardadaConFecha = defaults.Clonar();
guardadaConFecha.FechaSimulada = "2026-09-16";
guardadaConFecha.HoraSimulada = "13:40:00";
Check(await Service().GuardarAsync(guardadaConFecha), "Los valores de fabrica permiten guardar fecha y hora");
var cargadaConFecha = await Service().CargarAsync();
Check(
cargadaConFecha is { FechaSimulada: "2026-09-16", HoraSimulada: "13:40:00" },
"Los valores de fabrica recuperan la fecha y hora guardadas");
var pagina = new PlanificadorRutas();
typeof(PlanificadorRutas)
.GetField("_configuracionFabrica", BindingFlags.Instance | BindingFlags.NonPublic)!
.SetValue(pagina, cargadaConFecha);
var crearPredeterminada = typeof(PlanificadorRutas).GetMethod(
"CrearConfiguracionPredeterminadaHistorial",
BindingFlags.Instance | BindingFlags.NonPublic)!;
var predeterminada = (ConfiguracionHistorialRuta)crearPredeterminada.Invoke(pagina, null)!;
Check(
predeterminada is { FechaSimulada: "2026-09-16", HoraSimulada: "13:40:00" },
"Restaurar conserva la fecha y hora de los valores de fabrica");
File.WriteAllText(file, "{incompleto");
Check(await Service().CargarAsync() is null, "JSON danado permite usar valores base");
}
@@ -183,32 +229,50 @@ var page = new PlanificadorRutas();
var flags = BindingFlags.Instance | BindingFlags.NonPublic;
var fabricaHistorial = (ConfiguracionHistorialRuta)baseMethod.Invoke(null, null)!;
fabricaHistorial.FactorEquilibradoAndarBus = 6;
fabricaHistorial.UsarHoraSimulada = true;
fabricaHistorial.FechaSimulada = "2026-09-16";
fabricaHistorial.HoraSimulada = "13:40:00";
typeof(PlanificadorRutas).GetField("_configuracionFabrica", flags)!.SetValue(page, fabricaHistorial);
var crearPredeterminadaHistorial = typeof(PlanificadorRutas).GetMethod(
"CrearConfiguracionPredeterminadaParaHistorial", flags)!;
var crearGuardadaHistorial = typeof(PlanificadorRutas).GetMethod(
"CrearConfiguracionGuardadaHistorial", flags)!;
var configuracionGuardada = fabricaHistorial.Clonar();
configuracionGuardada.UsarHoraSimulada = true;
configuracionGuardada.FechaSimulada = "2026-04-08";
configuracionGuardada.HoraSimulada = "08:46:17";
configuracionGuardada.FactorEquilibradoAndarBus = 99;
var registroConHora = new RegistroHistorialRuta { Configuracion = configuracionGuardada };
var predeterminadaConHora = (ConfiguracionHistorialRuta)crearPredeterminadaHistorial.Invoke(
var predeterminadaHistorial = (ConfiguracionHistorialRuta)crearPredeterminadaHistorial.Invoke(page, null)!;
Check(predeterminadaHistorial.UsarHoraSimulada &&
predeterminadaHistorial.FechaSimulada == "2026-09-16" &&
predeterminadaHistorial.HoraSimulada == "13:40:00" &&
predeterminadaHistorial.FactorEquilibradoAndarBus == 6,
"Predeterminada usa tambien la fecha y hora de fabrica");
var guardada = (ConfiguracionHistorialRuta)crearGuardadaHistorial.Invoke(
page, new object[] { registroConHora })!;
Check(predeterminadaConHora.UsarHoraSimulada &&
predeterminadaConHora.FechaSimulada == "2026-04-08" &&
predeterminadaConHora.HoraSimulada == "08:46:17" &&
predeterminadaConHora.FactorEquilibradoAndarBus == 6,
"Predeterminada conserva solo la fecha y hora simuladas del historial");
configuracionGuardada.UsarHoraSimulada = false;
configuracionGuardada.FechaSimulada = "2020-01-01";
configuracionGuardada.HoraSimulada = "01:02:03";
var predeterminadaSinHora = (ConfiguracionHistorialRuta)crearPredeterminadaHistorial.Invoke(
page, new object[] { registroConHora })!;
Check(!predeterminadaSinHora.UsarHoraSimulada &&
predeterminadaSinHora.FechaSimulada == DateOnly.FromDateTime(DateTime.Now)
.ToString("yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture) &&
predeterminadaSinHora.HoraSimulada != "01:02:03",
"Predeterminada usa la hora actual cuando el historial no tenia simulacion");
Check(guardada.UsarHoraSimulada &&
guardada.FechaSimulada == "2026-04-08" &&
guardada.HoraSimulada == "08:46:17" &&
guardada.FactorEquilibradoAndarBus == 99,
"Guardada conserva la fecha, hora y parametros del historial");
var paginaCierreHistorial = new PlanificadorRutas();
typeof(PlanificadorRutas).GetField("_mostrarHistorialRutas", flags)!
.SetValue(paginaCierreHistorial, true);
typeof(PlanificadorRutas).GetField("_factorEquilibradoAndarBus", flags)!
.SetValue(paginaCierreHistorial, 99.0);
var configuracionAnteriorHistorial = fabricaHistorial.Clonar();
configuracionAnteriorHistorial.FactorEquilibradoAndarBus = 6;
typeof(PlanificadorRutas).GetField("_configuracionTemporalPreviaHistorial", flags)!
.SetValue(paginaCierreHistorial, configuracionAnteriorHistorial);
var alternarHistorial = typeof(PlanificadorRutas).GetMethod("ToggleHistorialPanel", flags)!;
await (Task)alternarHistorial.Invoke(paginaCierreHistorial, null)!;
Check(
!(bool)typeof(PlanificadorRutas).GetField("_mostrarHistorialRutas", flags)!
.GetValue(paginaCierreHistorial)! &&
(double)typeof(PlanificadorRutas).GetField("_factorEquilibradoAndarBus", flags)!
.GetValue(paginaCierreHistorial)! == 99.0,
"Cerrar el historial conserva la configuracion de la ruta visible");
typeof(PlanificadorRutas).GetField("_factorEquilibradoAndarBus", flags)!.SetValue(page, 6.0);
typeof(PlanificadorRutas).GetField("_factorPenalizacionDistanciaPie", flags)!.SetValue(page, 1.8);
typeof(PlanificadorRutas).GetField("_parametroPenalizacionDistanciaPieMetros", flags)!.SetValue(page, 200.0);