Files
roafacturare/docs/cercetare/rec_s4b_dialog_smoke.md
Marius Mutu d9f5ca4226 docs: planurile, proiectarile si rapoartele de lucru intra in versionare
Folderul docs\ era pana acum in afara oricarui control de versiuni - nici git,
nici SVN - desi contine planurile pe puncte, proiectarile si rapoartele de
cercetare pe care se sprijina modificarile din cod. O stergere acolo era
definitiva.

Fisierele intermediare (handoff-uri intre sesiuni, diff-uri deja aplicate) au
fost sterse inainte, nu versionate: ce era durabil in ele a intrat in antetele
fisierelor de test la care se refereau.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
2026-08-11 22:17:17 +03:00

83 lines
5.1 KiB
Markdown

# 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).