program filesave_test;

{$mode delphi}{$H+}

uses
  SysUtils, Classes, IniFiles,
  Interfaces,
  pstcircker;

const
  testFile = '/tmp/test_circuit.pst';

procedure DumpObjets(const label_: string);
var
  i: integer;
begin
  Writeln('--- ', label_, ' (', Objets.Count, ' objets) ---');
  for i := 0 to Objets.Count - 1 do
    Writeln('  [', i, '] ', Objets[i].ClassName,
            ' nom=', Objets[i].Fnom,
            ' pos=(', Objets[i].Point.X:0:1, ',', Objets[i].Point.Y:0:1, ')');
end;

var
  R: TDipole;
  C: TCarrefour;
  Tx: TTexte;
  L: Tlien;
  Tri: TTripole;
  Quad: TQuadripole;
  Mono: TMonopole;
  Fr: TFrame;
  F: TMemIniFile;
  i: integer;
  nomS: TStringList;
  carac: char;
  Adipole: TDipole;
  Acarrefour: TCarrefour;
  Atexte: TTexte;
  Alien: Tlien;
  Atripole: TTripole;
  Aquadripole: TQuadripole;
  Amonopole: TMonopole;
  Aframe: TFrame;
begin
  DeleteFile(testFile);

  // --- construire un petit circuit couvrant tous les types d'objets ---
  R := TDipole.Create(dR);
  R.SetPosition(100, 100);
  R.Fnom := 'R1';
  Objets.Add(R);

  C := TCarrefour.Create;
  C.SetPosition(200, 100);
  C.Fnom := 'N1';
  Objets.Add(C);

  Tx := TTexte.Create('Bonjour accentué');
  Tx.SetPosition(150, 50);
  Objets.Add(Tx);

  L := Tlien.Create;
  L.debut := R;
  L.borneDebut := 2;
  L.fin := C;
  L.borneFin := 1;
  Objets.Add(L);

  Tri := TTripole.Create(tnpn);
  Tri.SetPosition(300, 100);
  Tri.Fnom := 'T1';
  Objets.Add(Tri);

  Quad := TQuadripole.Create(qTransfo);
  Quad.SetPosition(400, 100);
  Quad.Fnom := 'Q1';
  Objets.Add(Quad);

  Mono := TMonopole.Create;
  Mono.SetPosition(500, 100);
  Mono.Fnom := 'M1';
  Objets.Add(Mono);

  Fr := TFrame.Create;
  Fr.debut.X := 50;
  Fr.debut.Y := 50;
  Fr.fin.X := 550;
  Fr.fin.Y := 200;
  Objets.Add(Fr);

  DumpObjets('avant sauvegarde');

  // --- ecriture (reprend la logique de EcritFichier de pstcircu.pas) ---
  F := TMemIniFile.Create(testFile);
  try
    for i := 0 to Objets.Count - 1 do Objets[i].EcritFichier(F, i);
    F.UpdateFile;
  finally
    F.Free;
  end;
  Writeln('Fichier ecrit: ', testFile, ' (existe=', FileExists(testFile), ')');

  // --- reset et rechargement (reprend LitFichier de pstcircu.pas) ---
  resetObjets;
  DumpObjets('apres resetObjets');

  F := TMemIniFile.Create(testFile);
  nomS := TStringList.Create;
  F.ReadSections(nomS);
  Writeln('Sections trouvees dans le fichier: ', nomS.Count);
  for i := 0 to nomS.Count - 1 do begin
    carac := nomS[i][1];
    case carac of
      'D': begin Adipole := TDipole.CreateSimple; Adipole.LitFichier(F, nomS[i]); Objets.Add(Adipole); end;
      'N': begin Acarrefour := TCarrefour.Create; Acarrefour.LitFichier(F, nomS[i]); Objets.Add(Acarrefour); end;
      'A': begin Atexte := TTexte.CreateSimple; Atexte.LitFichier(F, nomS[i]); Objets.Add(Atexte); end;
      'L': begin Alien := Tlien.Create; Alien.LitFichier(F, nomS[i]); Objets.Add(Alien); end;
      'T': begin Atripole := TTripole.CreateSimple; Atripole.LitFichier(F, nomS[i]); Objets.Add(Atripole); end;
      'Q': begin Aquadripole := TQuadripole.CreateSimple; Aquadripole.LitFichier(F, nomS[i]); Objets.Add(Aquadripole); end;
      'M': begin Amonopole := TMonopole.Create; Amonopole.LitFichier(F, nomS[i]); Objets.Add(Amonopole); end;
      'F': begin Aframe := TFrame.Create; Aframe.LitFichier(F, nomS[i]); Objets.Add(Aframe); end;
    end;
  end;
  F.Free;
  nomS.Free;

  DumpObjets('apres rechargement');

  Writeln('--- verification ---');
  if Objets.Count = 8 then Writeln('OK: 8 objets rechargés (tous les types)')
  else Writeln('ECHEC: attendu 8, obtenu ', Objets.Count);
  if (Objets[3] is Tlien) and (Tlien(Objets[3]).debut = Objets[0]) and (Tlien(Objets[3]).fin = Objets[1]) then
    Writeln('OK: le Lien reconnecte bien R1 (index 0) et N1 (index 1)')
  else
    Writeln('ECHEC: le Lien ne reference pas les bons objets apres rechargement');
  if (Objets[4] is TTripole) and (TTripole(Objets[4]).Modele = tnpn) then
    Writeln('OK: TTripole modele (tnpn) preserve')
  else Writeln('ECHEC: TTripole modele non preserve');
  if (Objets[5] is TQuadripole) and (TQuadripole(Objets[5]).Modele = qTransfo) then
    Writeln('OK: TQuadripole modele (qTransfo) preserve')
  else Writeln('ECHEC: TQuadripole modele non preserve');
  if (Objets[6] is TMonopole) and (Objets[6].Fnom = 'M1') then
    Writeln('OK: TMonopole nom preserve')
  else Writeln('ECHEC: TMonopole nom non preserve');
  if (Objets[7] is TFrame) then
    Writeln('OK: TFrame rechargee (type=TFrame)')
  else Writeln('ECHEC: TFrame non rechargee correctement');
end.
