Files
roaregistratura/Teste/test_registratura_ui.prg
Marius Mutu 6769eb61d1 Registratura: adaugare/editare fara erori la partener NULL, lista doar ultimul document, fonturi Arial 10 (M1-M5)
M1 modifica_reg_dg: garda id_part NULL/empty (mesaj + Return .F.), NVL pe id_part/nr_pag, functia intoarce succes.
M2 validare partener in toate cele 3 puncte de salvare, INAINTE de blocarea campurilor (Command2.Click salveaza inainte sa blocheze; bara laterala si Page3.Deactivate nu mai salveaza/prompteaza cu partener NULL).
M3 do_adauga: documentul nou intra direct in editare (llock=.F., focus cmdDenumire); eliminat mesajul fals "Toate modificarile au efect imediat!".
M4 viz_registratura + do_cauta: filtru initial "doar ultimul document" (subquery max(id_reg)); fara criterii de cautare se pastreaza filtrul, nu se incarca toata baza.
M5 fonturi: eliminate 154 suprascrieri "Arial Narrow" si rebazate 96 controale baseclass pe COMUN _baza.vcx (textbox/label/checkbox/commandbutton/optiongroup); Init de grid propaga fontul la coloane si headere (fara asta raman Arial 9 - verificat empiric).

Teste: harness headless (init env dedicat, form, adaugare+editare cu verificare in baza) + test UI vizual cu screenshots pe fluxul real (19 PASS / 0 FAIL). Diff-uri de audit in docs/diff_runda1_*.patch.

M6 (build EXE) BLOCAT headless: roaRegistratura.pjx refera 48 fisiere hardcodate pe "c:\program files\...\vfp 9" (masina 32-bit din 2021) + COMUN\utile\hpdf\ReportOutput\ctl32_progressbar.vcx redenumit _old; necesita repathing o data in VFP9 IDE.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018H9za5A9Tk6wcLFof6seds
2026-07-23 18:53:12 +03:00

194 lines
9.2 KiB
Plaintext

* test_registratura_ui.prg
* Test UI VIZUAL (harness + screenshots): fluxul REAL al utilizatorului in fereastra
* principala (Ferestre\fundal.scx) - lista documentelor, adaugare cu intrare directa
* in editare (M3), fara prompt de salvare la bara laterala (M2), refuz elegant la
* partener NULL (M1/M2), salvare + editare reala, filtrul "ultimul document" (M4),
* fonturi Arial 10 (M5).
* Rulare cu capturi:
* powershell -File COMUN\utile\Teste\vfp_ui_harness.ps1 -TestPrg Teste\test_registratura_ui.prg ^
* -Steps @('lista','adaugare_editare_directa','bara_fara_prompt','salvare_fara_partener','salvare_cu_partener','editare','lista_ultimul')
* Log: Teste\test_registratura_ui_log.txt ; PNG: Teste\screenshots\
* ATENTIE: doar pe schema de test (CENTRAL/MARIUSM_AUTO); documentul de test se sterge la final.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcUILog, gcSyncDir, gnMockRaspuns, gnPass, gnFail
gcUILog = 'D:\ROA\ROAREGISTRATURA\Teste\test_registratura_ui_log.txt'
gcSyncDir = 'D:\ROA\ROAREGISTRATURA\Teste\uisync\'
IF !DIRECTORY(gcSyncDir)
MD (gcSyncDir)
ENDIF
STORE 0 TO gnPass, gnFail
gnMockRaspuns = 6
* mock amessagebox PRIMUL in lista de proceduri (la nume duplicat castiga PRIMUL)
SET PROCEDURE TO D:\ROA\ROAREGISTRATURA\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAREGISTRATURA\COMUN\utile\Teste\ui_harness.prg ADDITIVE
STRTOFILE('=== test_registratura_ui ' + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog)
ON ERROR DO HarnessLog WITH '*** EROARE ' + TRANSFORM(ERROR()) + ': ' + MESSAGE() + ;
' | ' + MESSAGE(1) + ' | prg=' + PROGRAM() + ' lin=' + TRANSFORM(LINENO())
DO HarnessLog WITH 'Init mediu...'
DO D:\ROA\ROAREGISTRATURA\Teste\test_init_env_registratura.prg
IF TYPE('gnHandle') # 'N' OR gnHandle <= 0
DO HarnessLog WITH 'ESEC conectare - STOP'
DO HarnessDone WITH 'esec_conectare'
QUIT
ENDIF
DO HarnessLog WITH 'Conectat, schema=' + gcS
* globale suplimentare cerute de fundal.scx / Show
PUBLIC gcUserNameApp, primadata, goCw, goHelp, oTool
gcUserNameApp = 'MARIUS M'
primadata = .T.
STORE '' TO goCw, goHelp, oTool
* ------------- Pas 0: fereastra principala + lista (M4: doar ultimul document)
DO viz_registratura IN oproceduri_roaregistratura.prg
* NOSHOW: ocolesc Form.Show -> arata_meniu_fluna -> start_firma (init de aplicatie, nu de test);
* Visible=.T. afiseaza formularul FARA sa ruleze metoda Show suprascrisa.
DO FORM D:\ROA\ROAREGISTRATURA\Ferestre\fundal.scx NAME goFundal LINKED NOSHOW
goFundal._pgfrmbase1.Page2.Ct_registratura1.do_initializeaza_cursor()
goFundal.Visible = .T.
goFundal.WindowState = 2
goFundal._pgfrmbase1.ActivePage = 2
DO verif WITH USED('cRegistratura') AND RECCOUNT('cRegistratura') = 1, ;
'M4: lista initiala contine DOAR ultimul document (reccount=' + TRANSFORM(RECCOUNT('cRegistratura')) + ')'
SELECT cRegistratura
GO TOP
SCATTER NAME goRegistratura MEMO
DO HarnessLog WITH 'Ultimul document afisat: id_reg=' + TRANSFORM(NVL(id_reg,0))
LOCAL loGrid
loGrid = goFundal._pgfrmbase1.Page2.Ct_registratura1.grid_registratura
DO verif WITH loGrid.FontName == 'Arial' AND loGrid.FontSize = 10, ;
'M5: grid font=' + loGrid.FontName + ' ' + TRANSFORM(loGrid.FontSize)
DO verif WITH loGrid.Columns(1).FontName == 'Arial' AND loGrid.Columns(1).FontSize = 10, ;
'M5: coloana1 font=' + loGrid.Columns(1).FontName + ' ' + TRANSFORM(loGrid.Columns(1).FontSize)
DO verif WITH loGrid.Columns(1).Header1.FontName == 'Arial' AND loGrid.Columns(1).Header1.FontSize = 10, ;
'M5: header1 font=' + loGrid.Columns(1).Header1.FontName + ' ' + TRANSFORM(loGrid.Columns(1).Header1.FontSize)
DO HarnessStep WITH 0, 'lista: doar ultimul document, fonturi Arial 10'
* ------------- Pas 1: adaugare -> intra DIRECT in editare (M3)
LOCAL lnId_reg, loPnd
goFundal._pgfrmbase1.Page2.Ct_registratura1.But_nou1.Click()
lnId_reg = goRegistratura.id_reg
loPnd = goFundal._pgfrmbase1.Page3.ct_part_nr_data1
DO verif WITH goFundal._pgfrmbase1.ActivePage = 3, ;
'M3: dupa adaugare s-a comutat pe Page3 (ActivePage=' + TRANSFORM(goFundal._pgfrmbase1.ActivePage) + ')'
DO verif WITH !loPnd.llock, 'M3: documentul nou este DIRECT in editare (llock=' + TRANSFORM(loPnd.llock) + ')'
DO verif WITH loPnd.Command2.Caption == 'Salveaza', ;
'M3: butonul arata "Salveaza" (caption=' + loPnd.Command2.Caption + ')'
DO verif WITH !EMPTY(lnId_reg), 'Adaugare: id_reg nou=' + TRANSFORM(NVL(lnId_reg,0))
DO verif WITH loPnd.txtClient.FontName == 'Arial' AND loPnd.txtClient.FontSize = 10, ;
'M5: txtClient font=' + loPnd.txtClient.FontName + ' ' + TRANSFORM(loPnd.txtClient.FontSize)
DO HarnessStep WITH 1, 'adaugare: direct in editare, buton Salveaza'
* ------------- Pas 2: click pe bara laterala cu partener NULL -> FARA prompt de salvare (M2)
LOCAL lcLogInainte
lcLogInainte = FILETOSTR(gcUILog)
goFundal._pgfrmbase1.Page3.ct_date_generale1.outlook2003bar1.Panel.button3.Click()
LOCAL lcLogNou
lcLogNou = SUBSTR(FILETOSTR(gcUILog), LEN(lcLogInainte) + 1)
DO verif WITH !('Doriti sa salvati' $ lcLogNou), ;
'M2: barei laterale NU i-a aparut promptul "Doriti sa salvati..." cu partener NULL'
DO verif WITH !loPnd.llock, 'M2: raman in editare dupa click pe bara (llock=' + TRANSFORM(loPnd.llock) + ')'
DO HarnessStep WITH 2, 'bara laterala: fara prompt, raman in editare'
* ------------- Pas 3: Salveaza cu partener NULL -> refuz elegant (M1/M2)
lcLogInainte = FILETOSTR(gcUILog)
loPnd.Command2.Click()
lcLogNou = SUBSTR(FILETOSTR(gcUILog), LEN(lcLogInainte) + 1)
DO verif WITH ('Alegeti partenerul' $ lcLogNou), 'M2: mesaj "Alegeti partenerul!" la salvare fara partener'
DO verif WITH !loPnd.llock AND loPnd.Command2.Caption == 'Salveaza', ;
'M2: campurile raman DEBLOCATE dupa refuz (llock=' + TRANSFORM(loPnd.llock) + ', caption=' + loPnd.Command2.Caption + ')'
DO HarnessStep WITH 3, 'salvare fara partener: refuz, raman in editare'
* ------------- Pas 4: aleg partener + Salveaza -> salvare reusita (M1/M2)
LOCAL llSucces
llSucces = goExecutor.oExecuta( ;
"select id_part, denumire from vregistratura where id_part is not null and rownum = 1", 'cPartTest')
IF llSucces AND USED('cPartTest') AND RECCOUNT('cPartTest') > 0
SELECT cPartTest
goRegistratura.id_part = id_part
goRegistratura.denumire = denumire
USE IN cPartTest
goRegistratura.data = DATE()
goRegistratura.numar = 'TSTUI'
goRegistratura.descriere = 'TEST UI AUTOMAT'
goRegistratura.nr_pag = 1
loPnd.Refresh()
loPnd.Command2.Click()
DO verif WITH loPnd.llock AND loPnd.Command2.Caption == 'Modifica', ;
'M2: dupa salvare campurile sunt blocate (llock=' + TRANSFORM(loPnd.llock) + ', caption=' + loPnd.Command2.Caption + ')'
* verificare in baza
llSucces = goExecutor.oExecuta("select numar, descriere from vregistratura where id_reg = " + ;
ALLTRIM(STR(lnId_reg)), 'cVerif')
IF llSucces AND USED('cVerif') AND RECCOUNT('cVerif') > 0
SELECT cVerif
DO verif WITH ALLTRIM(NVL(numar,'')) == 'TSTUI', ;
'M1: salvarea a ajuns in baza (numar=' + TRANSFORM(NVL(numar,'')) + ')'
USE IN cVerif
ELSE
DO verif WITH .F., 'verificare in baza dupa salvare'
ENDIF
ELSE
DO HarnessLog WITH 'SKIP Pas 4: niciun partener disponibil pe schema de test'
ENDIF
DO HarnessStep WITH 4, 'salvare cu partener: reusita, campuri blocate'
* ------------- Pas 5: editare (Modifica -> schimb descriere -> Salveaza)
loPnd.Command2.Click() && Modifica -> deblocare
DO verif WITH !loPnd.llock, 'Editare: campuri deblocate (llock=' + TRANSFORM(loPnd.llock) + ')'
goRegistratura.descriere = 'TEST UI AUTOMAT - EDITAT'
goRegistratura.nr_pag = 3
loPnd.Command2.Click() && Salveaza
llSucces = goExecutor.oExecuta("select descriere, nr_pag from vregistratura where id_reg = " + ;
ALLTRIM(STR(lnId_reg)), 'cVerif2')
IF llSucces AND USED('cVerif2') AND RECCOUNT('cVerif2') > 0
SELECT cVerif2
DO verif WITH ALLTRIM(NVL(descriere,'')) == 'TEST UI AUTOMAT - EDITAT' AND NVL(nr_pag,0) = 3, ;
'Editare: modificarile au ajuns in baza (descriere=' + ALLTRIM(NVL(descriere,'')) + ', nr_pag=' + TRANSFORM(NVL(nr_pag,0)) + ')'
USE IN cVerif2
ELSE
DO verif WITH .F., 'verificare in baza dupa editare'
ENDIF
DO HarnessStep WITH 5, 'editare document: re-salvare verificata in baza'
* ------------- Pas 6: inapoi pe lista -> tot ultimul document (M4 pe do_cauta/Page2.Activate)
goFundal._pgfrmbase1.ActivePage = 2
DO verif WITH RECCOUNT('cRegistratura') = 1, ;
'M4: revenirea pe lista pastreaza filtrul ultimului document (reccount=' + TRANSFORM(RECCOUNT('cRegistratura')) + ')'
SELECT cRegistratura
GO TOP
DO verif WITH id_reg = lnId_reg, 'M4: ultimul document afisat este cel de test (id_reg=' + TRANSFORM(id_reg) + ')'
DO HarnessStep WITH 6, 'lista dupa: doar documentul de test'
* ------------- curatenie
LOCAL lcSql, lnSucces
lcSql = [begin pack_registratura.sterge_registratura(] + ALLTRIM(STR(lnId_reg)) + ;
[,] + ALLTRIM(STR(gnIdUtil)) + [); end;]
lnSucces = goExecutor.oExecute(lcSql)
DO HarnessLog WITH IIF(lnSucces < 0, ;
'ATENTIE: stergerea documentului de test a esuat - stergeti manual id_reg=' + TRANSFORM(lnId_reg), ;
'Curatenie OK: document de test sters (soft-delete), id_reg=' + TRANSFORM(lnId_reg))
DO HarnessLog WITH '=== REZULTAT: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail)
DO HarnessDone WITH IIF(gnFail = 0, 'done', 'fail')
ON ERROR
CLOSE ALL
QUIT
PROCEDURE verif
LPARAMETERS tlOk, tcMsg
IF tlOk
gnPass = gnPass + 1
DO HarnessLog WITH 'PASS: ' + tcMsg
ELSE
gnFail = gnFail + 1
DO HarnessLog WITH 'FAIL: ' + tcMsg
ENDIF
ENDPROC