program tractorcito;
{$H+}
uses {$IFDEF UNIX}
  cthreads, {$ENDIF}
  Classes,
  //Interfaces,
  SysUtils,
  xmatdefs,
  uversiones,
  uversion_architexto,
  uauxiliares,
  uInicioYFinal,
  uInterpreteDeParametros,
  utractorcito_rch,
  uAdministradorDeEstadosMultiPlano,
  utrayectorias_xcdpcf,
  uestados,
  uglobs,
  usalasdejuego,
  uhiperplanos,
  ucursormapeocf,
  uparseadorsupersimple,
  ucosa,
  ubuscaarchivos,
  ucosanubeseable,
  uFuenteSintetizador,
  uEsclavizadorSobreMuestreado,
  umodelosintcegh,
  unubeseable,
  umh_worker_sim,
  umh_sincrodata,
  ulistaplantillassr3,
  udatoshorariosdetallados,
  ucosaconnombre,
  umh_distribuidor_optsim,
  uManejadoresDeMonitores,
  udemandadetallada,
  uDemandaAnioBaseEIndices,
  udemandaCombustibleAnioBaseEIndices, uHidroConEmbalse,
  ulearningcfmultiplano,
  urosx,
  ufechas, uclasificador;





  procedure testmem_cosa;
  var
    cosa: TCosa;
    CatalogoReferencias: TCatalogoReferencias;
    f: TArchiTexto;

  begin
    writeln('inicio');
    uInicioYFinal.AlInicio;

    CatalogoReferencias := TCatalogoReferencias.Create;
    f := TArchiTexto.CreateForWrite('cosa.txt', False, 1);

    cosa := TCosa.Create(0);
    f.wr('cosa', cosa);
    cosa.Free;
    f.Free;

    f := TArchiTexto.CreateForRead(0, CatalogoReferencias, 'cosa.txt', True);
    f.rd('cosa', TCosa(cosa));
    f.Free;
    f := nil;
    cosa.Free;

    CatalogoReferencias.Free;

    uInicioYFinal.AlFinal;
    writeln('fin');
  end;


procedure WriteArchiLista2Cosas;
var
  f: textfile;
begin
  assignfile( f, 'Lista2Cosas.txt' );
  rewrite(f );
writeln( f, 'VERSION=193' );
writeln( f, '  enganchesContinuos= <+TListaDeCosas>' );
writeln( f, '    capa= 0;' );
writeln( f, '    n= 2;' );
writeln( f, '    := <+TEngancheCFReal>' );
writeln( f, '      capa= 0;' );
writeln( f, '      nombreVar= Bonete_Vol;' );
writeln( f, '      unidades= Hm3;' );
writeln( f, '      valor= 4104;' );
writeln( f, '    <-TEngancheCFReal>;' );
writeln( f, '' );  // con espacio tira excepcion
writeln( f, '    := <+TEngancheCFReal>' );
writeln( f, '      capa= 0;' );
writeln( f, '      nombreVar= Bonete_Vol;' );
writeln( f, '      unidades= Hm3;' );
writeln( f, '      valor= 4104;' );
writeln( f, '    <-TEngancheCFReal>;' );
writeln( f, '  <-TListaDeCosas>;' );
closefile( f );
end;

  procedure testmem_ReadListaDeCosas;
  var
    cosa: TCosa;
    CatalogoReferencias: TCatalogoReferencias;
    f: TArchiTexto;
  begin

    writeln('inicio');
    uInicioYFinal.AlInicio;

    CatalogoReferencias := TCatalogoReferencias.Create;

    writeArchiLista2Cosas;

    f := TArchiTexto.CreateForRead(0, CatalogoReferencias, 'Lista2Cosas.txt', True);
    f.rd('enganchesContinuos', TCosa(cosa));
    f.Free;
    f := nil;
    cosa.Free;

    CatalogoReferencias.Free;

    uInicioYFinal.AlFinal;
    writeln('fin');
  end;



  procedure testmem_globs;
  var
    cosa: TGlobs;
    CatalogoReferencias: TCatalogoReferencias;
    f: TArchiTexto;
    fecha: TFecha;
    durpos: TDAOfNReal;
  begin
    writeln('inicio');
    uInicioYFinal.AlInicio;

    CatalogoReferencias := TCatalogoReferencias.Create;
    f := TArchiTexto.CreateForWrite('globs.txt', False, 1);

    fecha := TFecha.Create_Dt(now);
    setlength(durpos, 1);
    durpos[0] := 1;
    cosa := TGlobs.Create('globs', 0, fecha, fecha, fecha, fecha, fecha, durpos, nil);
    f.wr('globs', cosa);
    cosa.Free;
    f.Free;
    SetLength(durpos, 0);
    fecha.Free;

    f := TArchiTexto.CreateForRead(0, CatalogoReferencias, 'globs.txt', True);
    f.rd('globs', TCosa(cosa));
    f.Free;
    f := nil;
    cosa.Free;

    CatalogoReferencias.Free;

    uInicioYFinal.AlFinal;
    writeln('fin');
  end;




  procedure testmem_varios;
  var
    cosa: TCosa;
    CatalogoReferencias: TCatalogoReferencias;
    f: TArchiTexto;
    fecha: TFecha;
    durpos: TDAOfNReal;

  (*
  globs: TGlobs;
  archs: TListaDeArchiRef_Nubeseable;
  UsosGestionables: TListaDeCosasConNombre;
  listaFuentes:TListFuenteAleatoria;
  enganchesDiscretos: TListaDeCosas;
  PlantillasSimRes3= <+TListaPlantillasSimRes3>
  Escenarios= <+TListaEscenarios>
  Casos= <+TCasosLst>
    *)


    procedure test(nombre: string);
    var
      tam1, tam2: cardinal;
    begin
      tam1 := GetHeapStatus.TotalAllocated;
      f.rd(nombre, TCosa(cosa));
      cosa.Free;
      tam2 := GetHeapStatus.TotalAllocated;
      writeln(nombre, ' pérdida: ', tam2 - tam1);
    end;

  begin
    writeln('inicio');
    uInicioYFinal.AlInicio;

    CatalogoReferencias := TCatalogoReferencias.Create;


    f := TArchiTexto.CreateForRead(0, CatalogoReferencias, 'varios.ese', True);

    test('globs');
    test('archs');
    test('UsosGestionables');
    test('listaFuentes');
    test('enganchesDiscretos');
    test('PlantillasSimRes3');
    test('Escenarios');
    test('Casos');

    f.Free;
    f := nil;

    CatalogoReferencias.Free;

    uInicioYFinal.AlFinal;
    writeln('fin');
  end;


  procedure testmemdummys;
  var
    k: integer;
    aFichaClase: TFichaClase;

  begin
    writeln('inicio');
    uInicioYFinal.AlInicio;

    for k := 0 to registro_de_ClasesDeCosas_.Count - 1 do
    begin
      aFichaClase := registro_de_ClasesDeCosas_[k];
      writeln(TestMemDummy(aFichaClase.strClaseId));
    end;

    uInicioYFinal.AlFinal;
    writeln('fin');
  end;



  procedure testWR;
  var
    k: integer;
    aFichaClase: TFichaClase;

    cosa: TCosa;
    CatalogoReferencias: TCatalogoReferencias;
    f: TArchiTexto;
    tam1, tam2, tam3: cardinal;

  begin
    writeln('inicio');
    uInicioYFinal.AlInicio;
    CatalogoReferencias := TCatalogoReferencias.Create;

    for k := 0 to registro_de_ClasesDeCosas_.Count - 1 do
    begin
      aFichaClase := registro_de_ClasesDeCosas_[k];
      Write(aFichaClase.strClaseId);
      tam1 := GetHeapStatus.TotalAllocated;

      cosa := aFichaClase.clase.Create(0);
      f := TArchiTexto.CreateForWrite(aFichaClase.strClaseId + '_wrtest.txt', False, 1);
      f.wr('cosa', cosa);
      cosa.Free;
      f.Free;

      tam2 := GetHeapStatus.TotalAllocated;

      f := TArchiTexto.CreateForRead(0, CatalogoReferencias,
        aFichaClase.strClaseId + '_wrtest.txt', True);
      f.rd('cosa', TCosa(cosa));
      f.Free;
      f := nil;
      cosa.Free;

      tam3 := GetHeapStatus.TotalAllocated;

      writeln(' 2-1: ', tam2 - tam1, ', 3-2: ': tam3 - tam2);
    end;
    CatalogoReferencias.Free;

    uInicioYFinal.AlFinal;
    writeln('fin');
  end;




var
  tam1, tam2: cardinal;


begin
  tam1 := GetHeapStatus.TotalAllocated;

  (*
  testmem_varios;
  exit;


  testmemdummys;
  exit;

 testmem_cosa ;
  exit;
    *)

 // {$IFDEF DEBUGx}
 //  if FileExists('heap.trc') then
 //    DeleteFile('heap.trc');
 //  SetHeapTraceOutput('heap.trc');
 // {$ENDIF}


 (*
 prms := TInterpreteParametros.Create;
  xo_testmem(prms);
  exit;

  testmem_ReadListaDeCosas;
 exit;
   *)

 (*
  testmem_globs;
  exit;
   *)

  // Interpreta los parámetros y ejecuta la orden correspondiente.
  tractorcito_cmd;

  tam2 := GetHeapStatus.TotalAllocated;
  writeln('Pérdida de memoria: ', tam2 - tam1, ' bytes.');

end.
