# S4b etapa 2 — smoke test headless al dialogului `frm_sincronizare_articole` Suita nouă: `COMUN\utile\Teste\editare_factura\test_s4b_dialog.prg`, model `test_s4b_sincronizare.prg` (același folder) — `tvd`/`trul` construite în test cu helperele `AdaugaTvd`/`AdaugaTrul` (copiate identic), `dummyform` (copiat identic) refolosit ca `oFormArticole`. Complet headless (`vfp9.exe -A -T`), **fără Oracle**. **Nu s-a atins `COMUN\clase\omodificari.vc2` sau `COMUN\programe\ofacturare_editare.prg`** — doar citite, niciun write-back. ## Rezultat ``` REZULTAT: 35 PASS / 0 FAIL ``` Log: `D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s4b_dialog_log.txt` Comandă de reproducere: ``` cd "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura" "C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe" -A -T test_s4b_dialog.prg ``` Niciun proces `vfp9.exe` rămas viu, verificat cu `tasklist` înainte și după rulare (0 ambele dăți). ## Mediu (fără Oracle, fără `test_init_env_auto`) Clasa e `OF "_frm_child.vcx"` (`WindowType=1`, modală), dar modalitatea se declanșează la `.Show()`, nu la `Createobject()` — verificat pe cod (`_frm_child.vc2`/`_frm_base.vc2`, niciun `.Show(` în lanțul de moștenire) înainte de a scrie testul, ca niciun caz să nu rămână blocat. Mediul de clase a fost replicat din `Programe\roafacturare.prg` (SET PATH + tot lanțul SET CLASSLIB, minus procedurile Oracle/`init_program`), plus `SET PROCEDURE TO proceduri_comune.prg` și `ofacturare_editare.prg` — suficient ca `CreateObject('frm_sincronizare_articole')` să rezolve lanțul `_frm_child.vcx -> _frm_base.vcx -> _baza.vcx` și controalele `_grdrow`/`_optiongrup`/`_label`. ## Ce s-a testat (cele 7 puncte din brief, toate acoperite) 1. **Instanțiere fără eroare** — 6 instanțe create (T1, T2, T2b, T3, T4, T5, T6), pe seturi diferite de `tvd`/`trul` (Modificare+Adaugare+Semnalare+N-A, document identic, doar N-A/Semnalare), toate verificate `Vartype(loForm)=='O'` — PASS pe toate. 2. **`propunere_afisata` identică camp-cu-camp cu `propunere_sincronizare`** (T1) — comparație completă (`id_articol`, `denumire`, `codmat`, `cantitate_veche/noua`, `pret_vechi/nou`, `actiune`, `motiv`) prin helper dedicat `VerificaCursoareIdentice`, 0 nepotriviri pe 4 rânduri. 3. **`But_termin1.Enabled`** — `.T.` cu Modificare+Adaugare prezente (T1), `.F.` pe propunere goală (document identic, T2) și `.F.` pe propunere cu doar N-A/Semnalare (T2b) — ambele variante cerute. 4. **Comutarea direcției** (T3) — `optDirectie.Value=2` + `.Click()` (apel direct de metodă, fără input real): `propunere_afisata` s-a reumplut la tot 3 rânduri (nu dublat), rolurile s-au inversat corect (900 Adaugare→Semnalare, 1000 Semnalare→Adaugare, 800 rămas Modificare) — exact regresia pe care corecția (`rec_s4b_etapa2.md`, punctul 2) o vizează. 5. **`inainte_de_do_termin()`** (T4) — întoarce `.T.`, aplică efectiv în `tvd` (800 modificat 4/16, 900 adăugat ca linie nouă 1/50), `dummyform.nAdaugaCalls==1`, `nBaraCalls>=1`. 6. **`oFormArticole` rămas `.F.`** (T5) — nicio eroare, garda `Vartype(...)=='O'` funcționează, REPLACE-ul de bază tot se aplică pe `tvd` (4/16) fără `toForm`. 7. **Unload/Release** (T6) — `propunere_afisata` deschisă înainte, închisă după `.Release()`. Nicio asercțiune pe coloane de grid, lățimi sau `DynamicForeColor` — confirmat inutilizabil sub `-A -T` (nu a fost nevoie: dialogul se instanțiază fără eroare fatală chiar și fără materializarea gridului, deci n-a trebuit mutat nimic în harness-ul UI vizibil). ## Zgomot de mediu — NU e defect în clasa nouă La fiecare `CreateObject`, `ON ERROR` a prins ~20 erori în cascadă în `ACTUALIZEAZA_DREPTURI` (variabile `gcAcces`, `lcProp`, `lcButoane`, `lcButon`, `lnPf` negăsite) urmate de `Object GOAPP is not found` în `_frmbase.Init`. Astea vin din codul de bază moștenit (`_frmbase`/`_baza.vcx`, folosit de **toate** formularele aplicației, nu doar de `frm_sincronizare_articole`) — gestionarea drepturilor pe butoane, care citește global `gcAcces` și `goApp`, ambele setate normal la login-ul real în aplicație. Harness-ul acestui test nu face login (fără Oracle, cum a cerut sarcina), deci aceste globale lipsesc. `frm_sincronizare_articole` **nu suprascrie** `ACTUALIZEAZA_DREPTURI` — nu are nicio metodă cu acest nume în `omodificari.vc2`. `ON ERROR` înghite fiecare eroare și continuă linie cu linie (comportament VFP normal la eroare needivizată), iar `ConstruiesteEnumerare()` din `Init` rulează *după* `DoDefault()` și suprascrie explicit `But_termin1.Enabled` — de-aia toate cele 35 de asercțiuni ies corect în ciuda zgomotului. Nu e raportat ca defect (nu ține de clasa nouă), doar semnalat ca limitare de mediu a harness-ului fără Oracle. ## Ce nu s-a putut testa Nimic din cele 7 puncte cerute nu a fost blocat. Netestat (în afara scopului acestei sarcini): comportamentul vizual real al gridului (coloane/culori — cere harness UI vizibil, nu a fost necesar aici) și `.Show()` modal (deliberat neatins, ca să nu rămână vreun `vfp9.exe` blocat pe un dialog modal fără input real).