Files
comun/utile/Teste/facturare_unificat/test_s5c_rutare_copiere.prg
Marius Mutu 8e022d332e #13: formular de facturare unificat - etapa curenta
Squash al branch-ului de lucru plan13-s2.

Clase: ofacturare (nucleul formularului unificat), ofacturare_comun,
ferestre_cere_date, ocomenzi, caut_ora (lista de preturi in combo-urile de
cautare), omodificari.

Programe: ofacturare impartit - ofacturare_antet, ofacturare_rutare_scriere si
ogrid_latimi sunt fisiere noi; oproceduri_facturare primeste discountul pe linie
si cota standard de TVA cand articolul nu are cota pe politica.

Documentatie: capcana SQLExec no_data_found, conventia de encoding, depanarea
testelor VFP si regulile de lucru - conflictele cu modificarile venite din alte
proiecte sunt rezolvate pastrand ambele parti.

Loguri de rulare a testelor scoase din versionare; testele raman.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
2026-09-09 21:38:25 +03:00

234 lines
9.7 KiB
Plaintext

* test_s5c_rutare_copiere.prg
* Headless (-A -T), static, FARA Oracle: probeaza RUTAREA copierii unui document, nu formularul.
* Testul UI existent instantiaza frm_facturare_articole2 direct si sare peste rutarea din
* factureaza() - de aceea nu a prins ca scrie_legatura_proforma() lipsea de pe calea reala (v1).
* R1 - copiere_factura cheama factureaza(toFactura.Tip, toFactura), fara plFacturareNoua
* R2 - plFacturareNoua e declarat Private numai in Clase\ofundal_facturare.vc2 (doua situri)
* si nu apare deloc in COMUN\programe\oproceduri_facturare.prg
* R3 - deci pe calea de copiere llFacturareNoua = .F. -> se emite pe frm_facturare_articole (v1)
* R4 - completeaza_setari_document(toFactura, .T.) se cheama INAINTE de comutarea v1/v2,
* deci poDate.lProformaSursa se ridica si pe traseul v1
* R5 - scrie_legatura_proforma() apare de doua ori in ofacturare.vc2: o data in v1, o data in v2
* R6 - in do_scrie_factura din v1 apelul e conditionat de If m.llReturn si e inainte de
* do_inchide_tranzactie(1) (aceeasi tranzactie)
* R7 - acelasi lucru in do_scrie_factura din v2 (neregresie fata de S5c)
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5c_rutare_copiere.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_rutare_copiere.log
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
PUBLIC gcLog, gnFail, gnPass, gnSarit, gcCaz, gcVc2, gcPrgRut, gcPrgFact, gcFundal
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_rutare_copiere.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
gnFail = 0
gnPass = 0
gnSarit = 0
gcCaz = ""
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
gcVc2 = "D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2"
gcPrgRut = "D:\ROA\ROAFACTURARE\COMUN\programe\oproceduri_facturare.prg"
gcPrgFact = "D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare.prg"
gcFundal = "D:\ROA\ROAFACTURARE\Clase\ofundal_facturare.vc2"
DO TestCopiereFaraSteagulNou
DO TestSteagulNouDoarPeButoaneleNoi
DO TestSemnalulSeSeteazaInainteDeRutare
DO TestApelPeAmbeleFormulare
DO TestApelInV1
DO TestApelInV2
DO Final
*----------------------------------------------------------------------------------------
* R1: copiere_factura ruteaza catre factureaza fara sa ridice plFacturareNoua
PROCEDURE TestCopiereFaraSteagulNou
LOCAL lcTxt, lcProc
gcCaz = "[R1 copiere_factura -> factureaza fara plFacturareNoua] "
lcTxt = FILETOSTR(gcPrgRut)
IF EMPTY(lcTxt)
DO Assert WITH .F., "FILETOSTR oproceduri_facturare.prg a esuat/gol"
RETURN
ENDIF
lcProc = Fereastra(lcTxt, "PROCEDURE copiere_factura", "ENDPROC")
IF EMPTY(lcProc)
DO Assert WITH .F., "nu s-a putut izola PROCEDURE copiere_factura"
RETURN
ENDIF
DO AfLog WITH "DIAG R1: copiere_factura len=" + TRANSFORM(LEN(lcProc))
DO Assert WITH "factureaza(toFactura.Tip, toFactura)" $ lcProc, ;
"copiere_factura cheama factureaza(toFactura.Tip, toFactura)"
DO Assert WITH OCCURS("plFacturareNoua", lcTxt) = 0, ;
"plFacturareNoua nu apare in oproceduri_facturare.prg, ocurente=" + ;
TRANSFORM(OCCURS("plFacturareNoua", lcTxt))
ENDPROC
* R2 + R3: steagul e ridicat numai de butoanele "Facturare (nou)" / "Avize (nou)"
PROCEDURE TestSteagulNouDoarPeButoaneleNoi
LOCAL lcFundal, lcFact
gcCaz = "[R2/R3 plFacturareNoua ridicat numai in ofundal_facturare] "
lcFundal = FILETOSTR(gcFundal)
lcFact = FILETOSTR(gcPrgFact)
IF EMPTY(lcFundal) OR EMPTY(lcFact)
DO Assert WITH .F., "FILETOSTR ofundal_facturare.vc2 / ofacturare.prg a esuat/gol"
RETURN
ENDIF
DO Assert WITH OCCURS("Private plFacturareNoua", lcFundal) = 2, ;
"doua declaratii Private plFacturareNoua in ofundal_facturare.vc2, ocurente=" + ;
TRANSFORM(OCCURS("Private plFacturareNoua", lcFundal))
DO Assert WITH OCCURS("Private plFacturareNoua", lcFact) = 0, ;
"ofacturare.prg doar citeste steagul, nu il declara"
DO Assert WITH "llFacturareNoua = (Type('plFacturareNoua') = 'L'" $ lcFact, ;
"factureaza decide v1/v2 dupa Type('plFacturareNoua')"
* fara declaratie pe lantul de apel, Type() da 'U' -> llFacturareNoua = .F. -> v1
DO Assert WITH "ofrmdetaliifactura = Createobject('frm_facturare_articole2')" $ lcFact, ;
"ramura llFacturareNoua = .T. instantiaza v2 (deci ramura .F. ramane pe v1)"
ENDPROC
* R4: semnalul lProformaSursa se ridica inaintea comutarii v1/v2, deci si pe traseul v1
PROCEDURE TestSemnalulSeSeteazaInainteDeRutare
LOCAL lcTxt, lnSetare, lnComutare
gcCaz = "[R4 completeaza_setari_document inainte de comutarea v1/v2] "
lcTxt = FILETOSTR(gcPrgFact)
IF EMPTY(lcTxt)
DO Assert WITH .F., "FILETOSTR ofacturare.prg a esuat/gol"
RETURN
ENDIF
lnSetare = AT("poDate.completeaza_setari_document(m.toFactura, .T.)", lcTxt)
lnComutare = AT("llFacturareNoua = (Type('plFacturareNoua')", lcTxt)
DO Assert WITH lnSetare > 0, "completeaza_setari_document(m.toFactura, .T.) prezent, poz=" + TRANSFORM(lnSetare)
DO Assert WITH lnComutare > 0, "comutarea v1/v2 prezenta, poz=" + TRANSFORM(lnComutare)
IF lnSetare > 0 AND lnComutare > 0
DO Assert WITH lnSetare < lnComutare, ;
"semnalul se ridica INAINTE de rutare (comun ambelor formulare), setare=" + ;
TRANSFORM(lnSetare) + " comutare=" + TRANSFORM(lnComutare)
ENDIF
ENDPROC
* R5: apelul exista pe ambele formulare, cate o singura data
PROCEDURE TestApelPeAmbeleFormulare
LOCAL lcTxt, lcV1, lcV2
gcCaz = "[R5 apelul e si pe v1 si pe v2] "
lcTxt = FILETOSTR(gcVc2)
IF EMPTY(lcTxt)
DO Assert WITH .F., "FILETOSTR ofacturare.vc2 a esuat/gol"
RETURN
ENDIF
DO Assert WITH OCCURS("scrie_legatura_proforma()", lcTxt) = 2, ;
"doua apeluri scrie_legatura_proforma() in ofacturare.vc2, ocurente=" + ;
TRANSFORM(OCCURS("scrie_legatura_proforma()", lcTxt))
lcV1 = FereastraClasa(lcTxt, 1)
lcV2 = FereastraClasa(lcTxt, 2)
DO Assert WITH !EMPTY(lcV1), "clasa frm_facturare_articole (v1) izolata"
DO Assert WITH !EMPTY(lcV2), "clasa frm_facturare_articole2 (v2) izolata"
IF !EMPTY(lcV1)
DO Assert WITH OCCURS("scrie_legatura_proforma()", lcV1) = 1, ;
"un apel in clasa v1, ocurente=" + TRANSFORM(OCCURS("scrie_legatura_proforma()", lcV1))
ENDIF
IF !EMPTY(lcV2)
DO Assert WITH OCCURS("scrie_legatura_proforma()", lcV2) = 1, ;
"un apel in clasa v2, ocurente=" + TRANSFORM(OCCURS("scrie_legatura_proforma()", lcV2))
ENDIF
ENDPROC
* R6: pozitia si conditia apelului in do_scrie_factura din v1
PROCEDURE TestApelInV1
gcCaz = "[R6 v1: apel conditionat, inainte de COMMIT] "
DO VerificaMetoda WITH 1, "If m.llReturn"
ENDPROC
* R7: acelasi lucru in v2 (neregresie)
PROCEDURE TestApelInV2
gcCaz = "[R7 v2: apel conditionat, inainte de COMMIT] "
DO VerificaMetoda WITH 2, "If llReturn"
ENDPROC
PROCEDURE VerificaMetoda
LPARAMETERS tnVersiune, tcGarda
LOCAL lcTxt, lcClasa, lcMetoda, lnApel, lnCommit, lcSecventa
lcTxt = FILETOSTR(gcVc2)
lcClasa = FereastraClasa(lcTxt, tnVersiune)
IF EMPTY(lcClasa)
DO Assert WITH .F., "clasa nu s-a putut izola"
RETURN
ENDIF
lcMetoda = Fereastra(lcClasa, CHR(9) + "PROCEDURE do_scrie_factura" + CHR(13), CHR(9) + "ENDPROC")
IF EMPTY(lcMetoda)
DO Assert WITH .F., "nu s-a putut izola do_scrie_factura"
RETURN
ENDIF
DO AfLog WITH "DIAG: do_scrie_factura v" + TRANSFORM(tnVersiune) + " len=" + TRANSFORM(LEN(lcMetoda))
lnApel = AT("scrie_legatura_proforma()", lcMetoda)
lnCommit = AT("Thisform.do_inchide_tranzactie(1)", lcMetoda)
DO Assert WITH lnApel > 0, "apelul e in do_scrie_factura, poz=" + TRANSFORM(lnApel)
DO Assert WITH lnCommit > 0, "do_inchide_tranzactie(1) prezent, poz=" + TRANSFORM(lnCommit)
IF lnApel > 0 AND lnCommit > 0
DO Assert WITH lnApel < lnCommit, ;
"apelul e INAINTE de do_inchide_tranzactie(1), apel=" + TRANSFORM(lnApel) + ;
" commit=" + TRANSFORM(lnCommit)
ENDIF
lcSecventa = tcGarda + CHR(13) + CHR(10) + REPLICATE(CHR(9), 4) + "llReturn = scrie_legatura_proforma()"
DO Assert WITH lcSecventa $ lcMetoda, ;
"apelul e in ramura " + tcGarda + " (nu neconditionat)"
ENDPROC
*----------------------------------------------------------------------------------------
* felie de text intre un marcaj de start si primul marcaj de sfarsit de dupa el
FUNCTION Fereastra
LPARAMETERS tcTxt, tcStart, tcEnd
LOCAL lnStart, lnEnd
lnStart = AT(tcStart, tcTxt)
IF lnStart = 0
RETURN ""
ENDIF
lnEnd = AT(tcEnd, SUBSTR(tcTxt, lnStart))
IF lnEnd = 0
RETURN ""
ENDIF
RETURN SUBSTR(tcTxt, lnStart, lnEnd + LEN(tcEnd) - 1)
ENDFUNC
* corpul clasei frm_facturare_articole (tnVersiune = 1) sau frm_facturare_articole2 (tnVersiune = 2)
FUNCTION FereastraClasa
LPARAMETERS tcTxt, tnVersiune
LOCAL lnV1, lnV2
lnV1 = AT("DEFINE CLASS frm_facturare_articole AS", tcTxt)
lnV2 = AT("DEFINE CLASS frm_facturare_articole2 AS", tcTxt)
IF lnV1 = 0 OR lnV2 = 0 OR lnV1 >= lnV2
RETURN ""
ENDIF
IF tnVersiune = 1
RETURN SUBSTR(tcTxt, lnV1, lnV2 - lnV1)
ENDIF
RETURN SUBSTR(tcTxt, lnV2)
ENDFUNC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnFail = gnFail + 1
DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
ENDPROC
PROCEDURE Final
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " sarit=" + TRANSFORM(gnSarit)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC