Files
flora2roa/docs/depanare_testare_flora2roa.md
Marius Mutu 2736cbd525 Initial: flux text FoxBin2Prg (git urmareste .??2 in-arbore, binarele VFP git-ignored)
Include si sistemul de depanare/testare headless din Teste\ (harness UI cu capturi, verificare de sintaxa prin compilare, wrappere text<->binar) si docs\depanare_testare_flora2roa.md.
2026-08-02 08:56:52 +03:00

6.1 KiB

Depanare si testare FLORA2ROA (headless, fara IDE)

Implementarea in acest proiect a sistemului comun de depanare/testare VFP. Metoda generala si capcanele complete: D:\ROA\ROACONT\COMUN\docs\depanare_testare_vfp.md, testare-ui-vfp.md, flux-editare-vfp-text.md, reguli_lucru.md.

Ce contine Teste\

Infrastructura (copiata din COMUN\utile\Teste, generica):

  • ui_harness.prg - proceduri de handshake intre testul VFP si orchestrator (HarnessLog, HarnessStep, HarnessReady, HarnessWaitContinue, HarnessDone).
  • vfp_ui_harness.ps1 - orchestrator: precompileaza, lanseaza vfp9, conduce testul pas cu pas pe semafoare si face o captura PNG dupa fiecare pas. Fereastra e mutata off-screen, deci nu fura focusul si se poate lucra in paralel.
  • _precompile.ps1 - precompilare izolata a .fxp-ului testului (proces copil separat).

Specific FLORA2ROA:

  • test_init_env_auto.prg - initializare NEINTERACTIVA a mediului, echivalentul lui main.prg fara DO FORM / READ EVENTS. Dupa apel sunt disponibile goApp, goLog, goConn, goExecutor, gcAppPath. Conectarea la Oracle e OPTIONALA (primul parametru).
  • test_helpers.prg - TestErrorHandler (ON ERROR care logheaza si continua, fara MESSAGEBOX) si aserturile TestAssert / TestAssertEqual / TestRezultat.
  • mock_amessagebox.prg - amessagebox care returneaza direct valoarea butonului, ca dialogurile modale sa nu blocheze rularea headless.
  • verifica_sintaxa.ps1 - compilare de verificare pentru toate .prg-urile, pe copii in TEMP.
  • text_din_bin.ps1 / bin_din_text.ps1 - conversie .scx/.vcx <-> text (_textcache\).
  • ruleaza_teste.ps1 - ruleaza toata suita si da sumarul.
  • test_frm_import_ui.prg - smoke: formularul real porneste, Init completeaza intervalul din settings.ini, Trace scrie in edtInfo.
  • test_export_date.prg - functional: ExportDate() citeste XML-urile din interval si populeaza cursoarele (fara Oracle).
  • test_conectare_roa.prg - verifica drumul CU conectare la Oracle: fie se conecteaza si executa o interogare de proba, fie raporteaza esecul si iese controlat. NU e in suita implicita (depinde de reteaua/serverul Oracle).

Comenzi uzuale

# toata suita (sintaxa + teste UI cu capturi)
powershell -ExecutionPolicy Bypass -File Teste\ruleaza_teste.ps1

# doar verificarea de sintaxa, dupa orice editare de .prg
powershell -ExecutionPolicy Bypass -File Teste\verifica_sintaxa.ps1

# un singur test, cu capturi
powershell -ExecutionPolicy Bypass -File Teste\vfp_ui_harness.ps1 `
    -TestPrg 'D:\PROIECTE\FLORA\FLORA2ROA\Teste\test_export_date.prg' -Steps @('afisat','importat')

# un singur test, fara capturi (auto-continue la 30s pe pas)
& 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' -A -T "D:\PROIECTE\FLORA\FLORA2ROA\Teste\test_export_date.prg" 20250601 20250630

# verificarea conexiunii la Oracle (datele din settings.ini)
& 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' -A -T "D:\PROIECTE\FLORA\FLORA2ROA\Teste\test_conectare_roa.prg"

Rezultatele: Teste\<test>_log.txt (linii PASS:/FAIL: si REZULTAT:), capturi in Teste\screenshots\, erori runtime in Teste\_erori_test.txt.

Editarea formularului pe text

powershell -ExecutionPolicy Bypass -File Teste\text_din_bin.ps1          # binar -> _textcache\*.sc2
# editezi _textcache\frm_import.sc2 BYTE-SAFE, in Windows-1252:
#   $t = [IO.File]::ReadAllText($p, [Text.Encoding]::GetEncoding(1252))
#   [IO.File]::WriteAllText($p, $t, [Text.Encoding]::GetEncoding(1252))
powershell -ExecutionPolicy Bypass -File Teste\bin_din_text.ps1 -TextFile _textcache\frm_import.sc2 -DryRun
powershell -ExecutionPolicy Bypass -File Teste\bin_din_text.ps1 -TextFile _textcache\frm_import.sc2

Write-back-ul face fidelity check (bin -> text, comparat pe octeti) inainte de a atinge binarul si refuza daca frm_import.scx e blocat de IDE sau de flora2roa.exe.

Un test nou in 5 pasi

  1. SET SAFETY OFF + SET TALK OFF ca PRIMA linie, apoi PUBLIC gcUILog, gcSyncDir.
  2. DO test_init_env_auto WITH .F. (sau .T. cand testul chiar are nevoie de Oracle), apoi SET PROCEDURE TO ui_harness ADDITIVE si mock_amessagebox ULTIMUL.
  3. DO FORM (gcAppPath + 'frm_import') NAME goImportFrm NOSHOW, WindowType = 0, Show(). Modal (Show(1)) nu returneaza si blocheaza testul.
  4. Pe fiecare pas: actiunea din fluxul REAL al utilizatorului (metoda pe care o apeleaza butonul, nu popularea directa a cursoarelor), aserturi cu TestAssert, apoi DO HarnessStep WITH <n>, '<eticheta>'. La final DO HarnessDone WITH TestRezultat() si QUIT.
  5. Inregistreaza testul in lista $suita din ruleaza_teste.ps1.

Capcane confirmate in acest proiect

  • ErrorHandler din main.prg deschide MESSAGEBOX si face SET STEP ON: headless ar bloca procesul la nesfarsit. De aceea test_init_env_auto.prg instaleaza TestErrorHandler.
  • Compilarile repetate de vfp9 din ACEEASI sesiune PowerShell esueaza tacut (procesul porneste dar nu executa). verifica_sintaxa.ps1 compileaza toate fisierele intr-o singura rulare; harness-ul foloseste proces copil izolat pentru precompilare.
  • Set Exclusive On din main.prg nu se pastreaza in teste (mediul de test deschide cursoare partajate); daca un test are nevoie de comportamentul exact al aplicatiei, il seteaza el.
  • Testele nu ruleaza in paralel intre ele: harness-ul isi omoara instantele vfp9 proprii inainte de fiecare lansare (filtrat pe linia de comanda; instantele straine nu sunt atinse).
  • settings.ini decide folderele de import. Testele functionale depind de continutul din EXEMPLE\hotel si EXEMPLE\restaurant; daca intervalul nu are fisiere, cursoarele raman goale.
  • Un test care se conecteaza la Oracle face SQLSETPROP(0, 'DispLogin', 3) inainte de conectare: altfel, cu date de acces gresite, driverul ODBC deschide un dialog de login care blocheaza procesul headless la nesfarsit (simptom: proces viu, CPU 0%, log fara linii noi).
  • CreeazaNote() si ScrieNote() scriu in ROA si NU pot fi testate fara Oracle. Bifa "Nu scrie note contabile" (chkTest.Value = 1) opreste scrierea; testele o lasa activa.