Files
flora2roa/docs/depanare_testare_flora2roa.md

111 lines
6.7 KiB
Markdown

# 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\<test>_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 <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.
- **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 "<fisier>.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.