* test_s3_do_cauta.prg * Headless: paritatea cautarilor de antet (do_cauta_* + do_verifica) intre calea veche (frm_date_factura / * frm_date_aviz, metode in .vcx) si formularul unificat (frm_facturare_articole2 -> oAntetFacturare din * ofacturare_antet.prg), cu dialogurile modale inlocuite de mock_caut_antet.prg si amessagebox de * mock_amessagebox.prg. * * REZULTAT ASTEPTAT (declarat inainte de rulare): * A. Pentru fiecare caz (metoda, tip, varianta) se construieste ACELASI poDate de doua ori (oDateFactura + * aceleasi valori de intrare), se creeaza formularul vechi pe primul si unificatul pe al doilea, se * apeleaza metoda pe fiecare si se compara amprenta: toate proprietatile poDate (AMEMBERS, camp cu camp, * TRANSFORM), proprietatile de formular scrise de metode (nSoldLei, nSoldValuta, cgestiune_init, tooltip * client), lista apelurilor catre dialoguri (nume + argumente - dovedeste ramura aleasa si parametrii: * ex. caut_contract_facturare(id) pe factura vs (id,[3,4]) pe aviz; cCont 4111 / 357 / 461 la client), * mesajele amessagebox (text + tip) si erorile VFP (numar + mesaj). Asteptat: IDENTIC pe toate cazurile, cu * exceptia lui poDate.nract cand la Init calea veche a ars deja un numar (cascada de LostFocus) si unificatul * nu - acolo se verifica tiparul (vechi>0, nou=0, neschimbat de metoda) si se normalizeaza doar acea cheie. * B. Cazuri (tip -> metode), variante: NORMAL (id_client real), IDCLIENT0 (id_client = 0 -> mesaj "Nu ati * ales clientul!" / "gestiunea"), SAMECLIENT (dialogul intoarce acelasi id_client -> listaid/descriere NU * se golesc pe factura), BUTON0 (dialogul seteaza gnButon = 0 -> lucrare/sectie/venchelt pe factura * pun Null, pe aviz (lucrare/sectie) pastreaza valoarea intoarsa), VALUTA0 (tip 9 fara valuta -> mesaj): * - factura: 1: client(NORMAL,SAMECLIENT), fdoc, lucrare(NORMAL,BUTON0), sectie(NORMAL,BUTON0), * venchelt(NORMAL,BUTON0), responsabil, verifica, altele(=nimic); 2: altele(->contract), contract(IDCLIENT0), * gestiune_init; 3: client, altele(->comanda), comanda(IDCLIENT0); 4: altele(->avize), avize(IDCLIENT0); * 5: valuta; 7: altele(->factura), factura(IDCLIENT0); 8: altele(->facturi); 9: facturi(VALUTA0,NORMAL); * 45: altele(->locatii), locatii. * - aviz: 21: client, altele(->comanda), comanda, lucrare(NORMAL,BUTON0), sectie(BUTON0), venchelt(BUTON0), * responsabil, gestiune_init, fdoc; 22: client; 23: client, altele(->gestiune_dest), gestiune_dest(IDCLIENT0), * politica; 24: altele(->avize); 25: client, comanda; 26: altele(->contract), contract; 28: client; * 41: client, gestiune_dest; 42: client. * C. Netestabil headless: focusul de dupa cautare (SetFocus fara Show - daca ridica eroare, eroarea e parte * din amprenta si trebuie sa fie identica pe ambele cai); selectia reala din dialog (mock cu valoare fixa); * raspunsul Oracle la pack_facturare.cauta_date_comanda (real, acelasi pe ambele cai). * D. Neregresie calea veche: test_s3_neregresie_vechi.prg CURENT vs BACKUP (amprenta Init) - separat. * * Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_do_cauta.prg" * Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_do_cauta.log * Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (seriile pe utilizator); gnScadereStoc = 1; rezultat_serii * real (creeaza_cursor_serii, numarul se dezaloca dupa fiecare caz) ca sa existe clb_serie_act pe ambele. SET SAFETY OFF SET TALK OFF SET NOTIFY OFF PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr, gcMockApeluri, gnMockIdPart, gnMockButon, gcBaza, gnDivergenteQ8 gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_do_cauta.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 gcCaz = "" gcErr = "" gcMockApeluri = "" gnMockIdPart = 0 gnMockButon = 1 gnDivergenteQ8 = 0 ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0 DO AfLog WITH "FAIL: conexiune Oracle esuata" DO Final ENDIF * la nume duplicat castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul: mock-urile se pun in fata LOCAL lcProc lcProc = SET("PROCEDURE") SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_caut_antet.prg", &lcProc PUBLIC gcMockUltimMesaj, gnMockUltimTip gcMockUltimMesaj = "" gnMockUltimTip = 0 IF !actualizeaza_optiuni_program() DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" DO Final ENDIF gnIdUtil = 8 goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) gnScadereStoc = 1 DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + " gnScadereStoc=" + TRANSFORM(gnScadereStoc) SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE * dovada ca ofacturare_antet.prg e incarcat de harness si ca mock-urile castiga rezolutia DO Assert WITH TYPE('CREATEOBJECT("oAntetFacturare")') = 'O', "oAntetFacturare instantiabil (ofacturare_antet.prg in SET PROCEDURE)" LOCAL loMock loMock = caut_fdoc() DO Assert WITH VARTYPE(loMock) = 'O' AND loMock.fel_document == "FEL MOCK", "mock caut_fdoc activ" DO AfLog WITH "asertiuni initiale: pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " erori=[" + gcErr + "]" gcErr = "" PRIVATE poDate, poGeneratorNumere, plVizibil, poDateGestiuneDest plVizibil = .F. poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") poDateGestiuneDest = CREATEOBJECT("oDateGestiune") IF USED('crscursuri') USE IN crscursuri ENDIF CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) DO creeaza_facturacrs WITH 'crsfactura' SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE USE IN crsfactura SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE USE IN crsfact_tmp * doi clienti reali (GetSoldClient si cauta_date_comanda cer id-uri existente) PUBLIC gnIdClient1, gnIdClient2 gnIdClient1 = 0 gnIdClient2 = 0 IF SQLEXEC(gnHandle, "select min(id_part) as id1, max(id_part) as id2 from nom_parteneri", "crsclient") > 0 gnIdClient1 = NVL(crsclient.id1, 0) gnIdClient2 = NVL(crsclient.id2, 0) USE IN crsclient ENDIF DO AfLog WITH "clienti de test: " + TRANSFORM(gnIdClient1) + " / " + TRANSFORM(gnIdClient2) * ---- factura ---- DO Caz WITH 1, "do_cauta_client", "NORMAL" DO Caz WITH 1, "do_cauta_client", "SAMECLIENT" DO Caz WITH 1, "do_cauta_fdoc", "NORMAL" DO Caz WITH 1, "do_cauta_lucrare", "NORMAL" DO Caz WITH 1, "do_cauta_lucrare", "BUTON0" DO Caz WITH 1, "do_cauta_sectie", "NORMAL" DO Caz WITH 1, "do_cauta_sectie", "BUTON0" DO Caz WITH 1, "do_cauta_venchelt", "NORMAL" DO Caz WITH 1, "do_cauta_venchelt", "BUTON0" DO Caz WITH 1, "do_cauta_responsabil", "NORMAL" DO Caz WITH 1, "do_verifica", "NORMAL" DO Caz WITH 1, "do_cauta_altele", "NORMAL" DO Caz WITH 2, "do_cauta_altele", "NORMAL" DO Caz WITH 2, "do_cauta_contract", "IDCLIENT0" DO Caz WITH 2, "do_cauta_gestiune_init", "NORMAL" DO Caz WITH 3, "do_cauta_client", "NORMAL" DO Caz WITH 3, "do_cauta_altele", "NORMAL" DO Caz WITH 3, "do_cauta_comanda", "IDCLIENT0" DO Caz WITH 4, "do_cauta_altele", "NORMAL" DO Caz WITH 4, "do_cauta_avize", "IDCLIENT0" DO Caz WITH 5, "do_cauta_valuta", "NORMAL" DO Caz WITH 7, "do_cauta_altele", "NORMAL" DO Caz WITH 7, "do_cauta_factura", "IDCLIENT0" DO Caz WITH 8, "do_cauta_altele", "NORMAL" DO Caz WITH 9, "do_cauta_facturi", "VALUTA0" DO Caz WITH 9, "do_cauta_facturi", "NORMAL" DO Caz WITH 45, "do_cauta_altele", "NORMAL" DO Caz WITH 45, "do_cauta_locatii", "NORMAL" * ---- aviz ---- DO Caz WITH 21, "do_cauta_client", "NORMAL" DO Caz WITH 21, "do_cauta_altele", "NORMAL" DO Caz WITH 21, "do_cauta_comanda", "NORMAL" DO Caz WITH 21, "do_cauta_lucrare", "NORMAL" DO Caz WITH 21, "do_cauta_lucrare", "BUTON0" DO Caz WITH 21, "do_cauta_sectie", "BUTON0" DO Caz WITH 21, "do_cauta_venchelt", "BUTON0" DO Caz WITH 21, "do_cauta_responsabil", "NORMAL" DO Caz WITH 21, "do_cauta_gestiune_init", "NORMAL" DO Caz WITH 21, "do_cauta_fdoc", "NORMAL" DO Caz WITH 22, "do_cauta_client", "NORMAL" DO Caz WITH 23, "do_cauta_client", "NORMAL" DO Caz WITH 23, "do_cauta_altele", "NORMAL" DO Caz WITH 23, "do_cauta_gestiune_dest", "IDCLIENT0" DO Caz WITH 23, "do_cauta_politica", "NORMAL" DO Caz WITH 24, "do_cauta_altele", "NORMAL" DO Caz WITH 25, "do_cauta_client", "NORMAL" DO Caz WITH 25, "do_cauta_comanda", "NORMAL" DO Caz WITH 26, "do_cauta_altele", "NORMAL" DO Caz WITH 26, "do_cauta_contract", "NORMAL" DO Caz WITH 28, "do_cauta_client", "NORMAL" DO Caz WITH 41, "do_cauta_client", "NORMAL" DO Caz WITH 41, "do_cauta_gestiune_dest", "NORMAL" DO Caz WITH 42, "do_cauta_client", "NORMAL" DO Final *---------------------------------------------------------------------------------------- PROCEDURE Caz LPARAMETERS tnTip, tcMetoda, tcVar LOCAL llAviz, lcVechi, lcNou, lcBazaVechi, lcBazaNou, lcExclus llAviz = INLIST(tnTip, 21, 22, 23, 24, 25, 26, 28, 29, 41, 42, 47) gcCaz = "[tip=" + TRANSFORM(tnTip) + " " + tcMetoda + " " + tcVar + "] " lcVechi = Amprenta(tnTip, llAviz, IIF(llAviz, 'frm_date_aviz', 'frm_date_factura'), tcMetoda, tcVar) lcBazaVechi = gcBaza lcNou = Amprenta(tnTip, llAviz, 'frm_facturare_articole2', tcMetoda, tcVar) lcBazaNou = gcBaza * proprietatile poDate care difera deja dupa Init (inainte de apel) tin de Init (focus headless), nu de * metoda testata: cand e exact divergenta Q8 (nract ars la Init pe calea veche) se verifica tiparul si se * normalizeaza in loc sa se excluda, ca sa ramana comparat tot restul amprentei, inclusiv nract dupa apel lcExclus = CheiDiferite(lcBazaVechi, lcBazaNou) IF !EMPTY(lcExclus) DO AfLog WITH " > " + gcCaz + "INIT-DIF (Q8, normalizat, nu exclus): " + lcExclus lcVechi = NormalizeazaInitDifQ8(lcVechi, lcNou, lcBazaVechi, lcBazaNou, lcExclus) ENDIF IF lcVechi == lcNou gnPass = gnPass + 1 DO AfLog WITH "OK " + gcCaz + TRANSFORM(OCCURS(CHR(10), lcVechi)) + " linii amprenta" ELSE gnFail = gnFail + 1 DO AfLog WITH "FAIL " + gcCaz + "amprente diferite:" DO DifLinii WITH lcVechi, lcNou ENDIF ENDPROC FUNCTION NormalizeazaInitDifQ8 * Q8: pe calea veche, cascada de LostFocus de la Init arde un numar inainte ca metoda testata sa ruleze; * pe calea unificata nu se aloca nimic. Se verifica tiparul (nu doar cheia nract, ci si valorile) si ca * metoda testata nu mai atinge nract pe nicio cale, apoi se normalizeaza doar nract, restul ramane comparat. LPARAMETERS tcVechi, tcNou, tcBazaVechi, tcBazaNou, tcExclus LOCAL lnBazaVechi, lnBazaNou, lnFinalVechi, lnFinalNou, lcVechiNorm DO Assert WITH tcExclus == "poDate.nract=(vechi " + ValoareCheieDC(tcBazaVechi, "poDate.nract") + " / nou " + ValoareCheieDC(tcBazaNou, "poDate.nract") + "), ", "Q8: singura cheie care difera la Init e poDate.nract, nu altceva" lnBazaVechi = VAL(ValoareCheieDC(tcBazaVechi, "poDate.nract")) lnBazaNou = VAL(ValoareCheieDC(tcBazaNou, "poDate.nract")) DO Assert WITH lnBazaVechi > 0, "Q8: la Init, pe calea veche nract e deja ars (cascada de LostFocus)" DO Assert WITH lnBazaNou = 0, "Q8: la Init, pe calea unificata nract ramane 0" lnFinalVechi = VAL(ValoareCheieDC(tcVechi, "poDate.nract")) lnFinalNou = VAL(ValoareCheieDC(tcNou, "poDate.nract")) DO Assert WITH lnFinalVechi = lnBazaVechi, "Q8: metoda testata nu mai modifica nract pe calea veche fata de Init" DO Assert WITH lnFinalNou = lnBazaNou, "Q8: metoda testata nu mai modifica nract pe calea unificata fata de Init" gnDivergenteQ8 = gnDivergenteQ8 + 1 DO AfLog WITH "DIVERGENTA-ASTEPTATA (Q8): " + gcCaz + "la Init, calea veche a ars deja un numar (nract=" + TRANSFORM(lnBazaVechi) + "), unificatul nu a alocat nimic (nract=0); neschimbat de metoda testata" lcVechiNorm = STRTRAN(tcVechi, "poDate.nract=" + TRANSFORM(lnFinalVechi) + CHR(13) + CHR(10), "poDate.nract=" + TRANSFORM(lnFinalNou) + CHR(13) + CHR(10), 1, 1) RETURN lcVechiNorm ENDFUNC FUNCTION ValoareCheieDC * valoarea unei chei "cheie=valoare" dintr-o amprenta poDate, cautata linie cu linie LPARAMETERS tcAmprenta, tcCheie LOCAL laL[1], lnL, i lnL = ALINES(laL, tcAmprenta) FOR i = 1 TO lnL IF LEFT(laL[i], LEN(tcCheie) + 1) == tcCheie + "=" RETURN SUBSTR(laL[i], LEN(tcCheie) + 2) ENDIF ENDFOR RETURN "" ENDFUNC FUNCTION Amprenta LPARAMETERS tnTip, tlAviz, tcClasa, tcMetoda, tcVar LOCAL loF, lcA, lcCmd poDate = NULL poDate = CREATEOBJECT("oDateFactura", 25000 + tnTip, tnTip) poDate.nIdTipDoc = IIF(tlAviz, poDate.nIdTipDocAvizExpeditie, poDate.nIdTipDocFactura) poGeneratorNumere.ResetNumere() poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) poDate.dataact = DATE(gnAn, gnLuna, 1) poDate.dataireg = poDate.dataact poDate.id_client = IIF(tcVar == "IDCLIENT0", 0, gnIdClient1) poDate.nume_client = IIF(tcVar == "IDCLIENT0", "", "CLIENT INITIAL") poDate.listaid = "999" poDate.descriere = "DESCRIERE INITIALA" poDate.text_aditional = "TEXT INITIAL" IF tnTip = 9 poDate.id_valuta = IIF(tcVar == "VALUTA0", 0, 2) ENDIF gnMockIdPart = IIF(tcVar == "SAMECLIENT", gnIdClient1, gnIdClient2) gnMockButon = IIF(tcVar == "BUTON0", 0, 1) gnButon = 1 poDateGestiuneDest.Reset() gcErr = "" gcMockApeluri = "" gcMockUltimMesaj = "" gnMockUltimTip = 0 DO AfLog WITH " > " + gcCaz + "creez " + tcClasa loF = CREATEOBJECT(tcClasa) IF VARTYPE(loF) <> 'O' RETURN "CREATEOBJECT " + tcClasa + " ESUAT" + CHR(13) + CHR(10) + gcErr ENDIF gcErr = "" * focusul pleaca de pe controlul lasat de Init inainte de apel: pe frm_date_factura Init lasa focusul pe * combo-ul fdoc, al carui LostFocus (do_schimba_tipdoc -> clb_serie_act.genereazaNumar) ar scrie poDate.nract * la primul SetFocus din metoda testata; efectul tine de evenimentele formularului, nu de metoda. * Doar pe factura: pe aviz vechiul nu are combo, iar pe unificat Clb_dataact.LostFocus ar scrie datascad (S3-3) IF !tlAviz loF.clb_dataact.SetFocus() ENDIF gcBaza = AmprentaPoDate() gcMockApeluri = "" gcErr = "" lcCmd = "loF." + tcMetoda + "()" DO AfLog WITH " > " + gcCaz + "apelez " + lcCmd &lcCmd DO AfLog WITH " > " + gcCaz + "apel incheiat" lcA = "metoda=" + tcMetoda + CHR(13) + CHR(10) lcA = lcA + AmprentaPoDate() * soldul exista doar pe frm_date_factura si pe unificat; pe aviz unificatul nu trebuie sa-l scrie IF PEMSTATUS(loF, "nSoldLei", 5) IF tlAviz DO Assert WITH loF.nSoldLei = 0 AND loF.nSoldValuta = 0, "pe aviz nSoldLei/nSoldValuta raman 0 (" + tcClasa + ")" DO AfLog WITH " > " + gcCaz + "sold pe " + tcClasa + ": " + TRANSFORM(loF.nSoldLei) + "/" + TRANSFORM(loF.nSoldValuta) ELSE lcA = lcA + "form.nSoldLei=" + TRANSFORM(loF.nSoldLei) + CHR(13) + CHR(10) lcA = lcA + "form.nSoldValuta=" + TRANSFORM(loF.nSoldValuta) + CHR(13) + CHR(10) ENDIF ENDIF lcA = lcA + "form.cgestiune_init=" + TRANSFORM(loF.cgestiune_init) + CHR(13) + CHR(10) lcA = lcA + "form.tooltip_client=" + TRANSFORM(loF.Ct_clb_nume_client.clb_TX_CAUTARE.text_SIMPLU1.ToolTipText) + CHR(13) + CHR(10) lcA = lcA + "gest_dest=" + TRANSFORM(poDateGestiuneDest.id_gestiune) + "|" + TRANSFORM(poDateGestiuneDest.id_tipgest) + "|" + TRANSFORM(poDateGestiuneDest.Cont) + "|" + TRANSFORM(poDateGestiuneDest.acont) + CHR(13) + CHR(10) lcA = lcA + "gnButon=" + TRANSFORM(gnButon) + CHR(13) + CHR(10) lcA = lcA + "APELURI:" + CHR(13) + CHR(10) + gcMockApeluri lcA = lcA + "MESAJ=" + gcMockUltimMesaj + "|" + TRANSFORM(gnMockUltimTip) + CHR(13) + CHR(10) lcA = lcA + "ERORI:" + CHR(13) + CHR(10) + gcErr loF.Release() RELEASE loF IF poDate.rezultat_serii <> 0 poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) ENDIF RETURN lcA ENDFUNC FUNCTION AmprentaPoDate LOCAL laM[1], lnN, i, lcA, lcV lcA = "" lnN = AMEMBERS(laM, poDate, 0) ASORT(laM) FOR i = 1 TO lnN IF TYPE("poDate." + laM[i]) $ "CNDTLY" lcV = TRANSFORM(EVALUATE("poDate." + laM[i])) ELSE lcV = "<" + TYPE("poDate." + laM[i]) + ">" ENDIF lcA = lcA + "poDate." + LOWER(laM[i]) + "=" + lcV + CHR(13) + CHR(10) ENDFOR RETURN lcA ENDFUNC FUNCTION CheiDiferite * cheile (poDate.x=) ale liniilor care difera intre doua amprente poDate, cu valorile, separate prin virgula LPARAMETERS tcV, tcN LOCAL laV[1], laN[1], lnV, lnN, i, lcChei, lcCheie, lcLinie lnV = ALINES(laV, tcV) lnN = ALINES(laN, tcN) lcChei = "" FOR i = 1 TO MAX(lnV, lnN) IF i > lnV OR i > lnN OR !(laV[i] == laN[i]) lcLinie = IIF(i <= lnV, laV[i], laN[i]) lcCheie = LEFT(lcLinie, AT("=", lcLinie)) IF !(lcCheie + "(" $ lcChei) lcChei = lcChei + lcCheie + "(vechi " + IIF(i <= lnV, SUBSTR(laV[i], LEN(lcCheie) + 1), "") ; + " / nou " + IIF(i <= lnN, SUBSTR(laN[i], LEN(lcCheie) + 1), "") + "), " ENDIF ENDIF ENDFOR RETURN lcChei ENDFUNC FUNCTION FaraChei * scoate dintr-o amprenta liniile a caror cheie (pana la =) apare in lista de chei LPARAMETERS tcA, tcChei LOCAL laL[1], lnL, i, lcR, lnEq lnL = ALINES(laL, tcA) lcR = "" FOR i = 1 TO lnL lnEq = AT("=", laL[i]) IF lnEq = 0 OR !(LEFT(laL[i], lnEq) + "(" $ tcChei) lcR = lcR + laL[i] + CHR(13) + CHR(10) ENDIF ENDFOR RETURN lcR ENDFUNC PROCEDURE DifLinii LPARAMETERS tcV, tcN LOCAL laV[1], laN[1], lnV, lnN, i, lnMax lnV = ALINES(laV, tcV) lnN = ALINES(laN, tcN) lnMax = MAX(lnV, lnN) FOR i = 1 TO lnMax IF i > lnV OR i > lnN OR !(laV[i] == laN[i]) DO AfLog WITH " vechi: " + IIF(i <= lnV, laV[i], "") DO AfLog WITH " nou : " + IIF(i <= lnN, laN[i], "") ENDIF ENDFOR ENDPROC 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 gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + CHR(13) + CHR(10) ENDPROC PROCEDURE Final DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " divergente-asteptate(Q8)=" + TRANSFORM(gnDivergenteQ8) DO AfLog WITH "END " + TTOC(DATETIME()) QUIT ENDPROC