# 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 ```powershell # 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\_log.txt` (linii `PASS:`/`FAIL:` si `REZULTAT:`), capturi in `Teste\screenshots\`, erori runtime in `Teste\_erori_test.txt`. ## Editarea formularului pe text ```powershell 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 , ''`. 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. - **Array-ul `-Steps` nu se leaga prin `powershell -File`**: parametrul se colapseaza si al doilea pas ajunge in `-StepTimeoutSec` ("Cannot convert value 'trace' to type Int32"). Din alt script PowerShell invoca harness-ul cu `&`; din `cmd` linia din exemplu (cu `-File`) merge pentru ca acolo `@(...)` e parsat de PowerShell, nu de cmd. - Dupa un `git clone` proaspat, binarele VFP NU sunt in repo: se regenereaza din text cu `FoxBin2Prg.EXE ".sc2" "" "" "" 1 0 1` (sau `Teste\text_din_bin.ps1` in sens invers) inainte de a rula testele. Verificat: suita da PASS intr-o clona curata cu binarul regenerat. - 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.