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
344 lines
15 KiB
Plaintext
344 lines
15 KiB
Plaintext
* test_s3_validare_antet.prg
|
|
* Headless: paritatea validarii antetului (inainte_de_do_termin) intre calea veche (frm_date_factura /
|
|
* frm_date_aviz) si formularul unificat (frm_facturare_articole2 -> oAntetFacturare.valideaza_antet din
|
|
* ofacturare_antet.prg). amessagebox si facturi_duplicate sunt inlocuite de mock_validare_antet.prg (jurnal
|
|
* al apelurilor + raspuns programat), deci nu se atinge Oracle la verificarea dublurilor.
|
|
*
|
|
* REZULTAT ASTEPTAT (declarat inainte de rulare):
|
|
* A. Pentru fiecare caz (tip, stricaciune) se construieste ACELASI poDate valid, i se strica EXACT campul
|
|
* cazului, se creeaza formularul vechi si unificatul si se apeleaza inainte_de_do_termin() pe fiecare.
|
|
* Se compara: jurnalul apelurilor (mesaj + tip + titlu; facturi_duplicate cu contul), valoarea intoarsa
|
|
* si erorile VFP. Pe unificat, cand antetul TRECE, metoda continua cu validarea articolelor existenta in
|
|
* prototip (cursor crsfactura gol -> "Nu ati ales articolele ..." si Return .F.); de aceea pentru cazurile
|
|
* care trec se compara separat: pe vechi inainte_de_do_termin() = .T., pe unificat
|
|
* oAntet.valideaza_antet(form) = .T. si jurnalul unificat = jurnalul vechi + mesajul de articole.
|
|
* B. Cazuri obligatorii (nota S3, Pasul 3): dataireg gol (1 si 21); id_client gol pe 1 (mesaj) si pe 21
|
|
* (fara mesaj - trece); id_pol gol pe 23 (mesaj) si pe 21 (fara); listaid gol pe 2 ("contractul") si pe
|
|
* 26 ("contractul"); duplicat pe cont 4111 (tip 1) vs 418 (tip 21) - se verifica ARGUMENTUL primit de
|
|
* facturi_duplicate prin mock. Plus: fiecare Case din ambele surse, ordinea (doua campuri stricate ->
|
|
* mesajul primului Case), copierea (lCopiere), avertismentul "CLIENT ... BON FISCAL" pe factura.
|
|
* C. Asteptat: toate cazurile IDENTIC (mesaj, tip, titlu, ordine, Return) intre vechi si unificat; contul
|
|
* din facturi_duplicate = '4111' pe factura, '418' pe aviz.
|
|
* D. Netestabil headless: SetFocus pe controlul invalid (fara Show). Daca ridica eroare (ex. 1925 pe un control
|
|
* eliminat de Init), eroarea e parte din amprenta si trebuie sa fie identica pe ambele cai - inclusiv pe
|
|
* unificat, unde vine din oAntet prin metoda formularului (asta cere ca frm_facturare_articole2 sa NU aiba
|
|
* override Error: un Error cu cod, chiar DoDefault(), o inghitea - C6 bis). Asert explicit pe tip 1
|
|
* COPIERE_DESCR_GOL.
|
|
*
|
|
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_validare_antet.prg"
|
|
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_validare_antet.log
|
|
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1.
|
|
|
|
SET SAFETY OFF
|
|
SET TALK OFF
|
|
SET NOTIFY OFF
|
|
PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr, gcMockApeluri, gnMockRaspuns, gcMockDuplicat
|
|
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_validare_antet.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 = ""
|
|
gnMockRaspuns = 6
|
|
gcMockDuplicat = ""
|
|
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
|
|
LOCAL lcProc
|
|
lcProc = SET("PROCEDURE")
|
|
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", &lcProc
|
|
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
|
|
DO Assert WITH TYPE('CREATEOBJECT("oAntetFacturare")') = 'O', "oAntetFacturare instantiabil"
|
|
gcMockApeluri = ""
|
|
facturi_duplicate('X', 0, '', 0, '')
|
|
DO Assert WITH "facturi_duplicate(X" $ gcMockApeluri, "mock facturi_duplicate activ"
|
|
gcMockApeluri = ""
|
|
amessagebox("proba", 48, "T")
|
|
DO Assert WITH "amessagebox([proba]" $ gcMockApeluri, "mock amessagebox 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
|
|
|
|
PUBLIC gnIdClient1
|
|
gnIdClient1 = 0
|
|
IF SQLEXEC(gnHandle, "select min(id_part) as id1 from nom_parteneri", "crsclient") > 0
|
|
gnIdClient1 = NVL(crsclient.id1, 0)
|
|
USE IN crsclient
|
|
ENDIF
|
|
DO AfLog WITH "client de test: " + TRANSFORM(gnIdClient1)
|
|
|
|
* ---- cazuri: tip, stricaciune, asteptat (TRECE = antetul trece; altfel fragmentul de mesaj asteptat) ----
|
|
DO Caz WITH 1, "VALID", "TRECE"
|
|
DO Caz WITH 21, "VALID", "TRECE"
|
|
DO Caz WITH 1, "DATAIREG_GOL", "Nu ati completat data inregistrarii!"
|
|
DO Caz WITH 21, "DATAIREG_GOL", "Nu ati completat data inregistrarii!"
|
|
DO Caz WITH 1, "DATAACT_GOL", "Nu ati completat data documentului!"
|
|
DO Caz WITH 21, "DATAACT_GOL", "Nu ati completat data documentului!"
|
|
DO Caz WITH 1, "DATASCAD_GOL", "Nu ati completat data scadenta!"
|
|
DO Caz WITH 21, "DATASCAD_GOL", "TRECE"
|
|
DO Caz WITH 1, "IDFDOC_GOL", "Nu ati ales felul documentului!"
|
|
DO Caz WITH 21, "IDFDOC_GOL", "Nu ati ales felul documentului!"
|
|
DO Caz WITH 5, "ZICURS_GOL", "Nu ati completat ziua cursului valutar!"
|
|
DO Caz WITH 5, "IDVALUTA_GOL", "Nu ati completat valuta!"
|
|
DO Caz WITH 1, "NRACT_GOL", "Nu ati completat numarul documentului!"
|
|
DO Caz WITH 21, "NRACT_GOL", "Nu ati completat numarul documentului!"
|
|
DO Caz WITH 1, "DATAIREG_ALTA_LUNA", "Data inregistrarii trebuie sa fie din luna"
|
|
DO Caz WITH 21, "DATAIREG_ALTA_LUNA", "Data inregistrarii trebuie sa fie din luna"
|
|
DO Caz WITH 1, "DATASCAD_MICA", "Data scadenta trebuie sa fie mai mare"
|
|
DO Caz WITH 1, "DATAACT_MARE", "Data documentului trebuie sa fie mai mica"
|
|
DO Caz WITH 21, "DATAACT_MARE", "Data documentului trebuie sa fie mai mica"
|
|
DO Caz WITH 1, "IDCLIENT_GOL", "Nu ati ales clientul!"
|
|
DO Caz WITH 21, "IDCLIENT_GOL", "TRECE"
|
|
DO Caz WITH 7, "DESCRIERE_GOL", "Nu ati ales factura!"
|
|
DO Caz WITH 8, "DESCRIERE_GOL", "Nu ati ales factura/facturile pentru care se face returul!"
|
|
DO Caz WITH 1, "COPIERE_DESCR_GOL", "Nu ati ales factura de copiat!"
|
|
DO Caz WITH 21, "COPIERE_DESCR_GOL", "Nu ati ales avizul de copiat!"
|
|
DO Caz WITH 2, "LISTAID_GOL", "Nu ati ales contractul!"
|
|
DO Caz WITH 3, "LISTAID_GOL", "Nu ati ales comanda!"
|
|
DO Caz WITH 4, "LISTAID_GOL", "Nu ati ales avizul!"
|
|
DO Caz WITH 45, "LISTAID_GOL", "Nu ati ales locatia!"
|
|
DO Caz WITH 1, "LISTAID_GOL", "TRECE"
|
|
DO Caz WITH 26, "LISTAID_GOL", "Nu ati ales contractul!"
|
|
DO Caz WITH 21, "LISTAID_GOL", "Nu ati ales comanda!"
|
|
DO Caz WITH 23, "LISTAID_GOL", "Nu ati ales gestiunea destinatie!"
|
|
DO Caz WITH 41, "LISTAID_GOL", "Nu ati ales gestiunea catre care se face returul!"
|
|
DO Caz WITH 22, "LISTAID_GOL", "TRECE"
|
|
DO Caz WITH 23, "IDPOL_GOL", "Nu ati ales politica de preturi!"
|
|
DO Caz WITH 41, "IDPOL_GOL", "Nu ati ales politica de preturi!"
|
|
DO Caz WITH 21, "IDPOL_GOL", "TRECE"
|
|
DO Caz WITH 1, "DOUA_DATAIREG_NRACT", "Nu ati completat data inregistrarii!"
|
|
DO Caz WITH 21, "DOUA_DATAIREG_NRACT", "Nu ati completat data inregistrarii!"
|
|
DO Caz WITH 1, "DUPLICAT_NU", "Facturi dublate"
|
|
DO Caz WITH 21, "DUPLICAT_NU", "Avize dublate"
|
|
DO Caz WITH 1, "DUPLICAT_DA", "TRECE"
|
|
DO Caz WITH 21, "DUPLICAT_DA", "TRECE"
|
|
DO Caz WITH 1, "CLIENT_DIVERSI_NU", "in loc de BON FISCAL"
|
|
DO Caz WITH 1, "CLIENT_DIVERSI_DA", "TRECE"
|
|
|
|
DO Final
|
|
|
|
*----------------------------------------------------------------------------------------
|
|
PROCEDURE Caz
|
|
LPARAMETERS tnTip, tcStrica, tcAsteptat
|
|
LOCAL llAviz, lcVechi, lcNou, llTrece, lcCont
|
|
llAviz = INLIST(tnTip, 21, 22, 23, 24, 25, 26, 28, 29, 41, 42, 47)
|
|
llTrece = (tcAsteptat == "TRECE")
|
|
gcCaz = "[tip=" + TRANSFORM(tnTip) + " " + tcStrica + "] "
|
|
lcVechi = Amprenta(tnTip, llAviz, IIF(llAviz, 'frm_date_aviz', 'frm_date_factura'), tcStrica, llTrece)
|
|
lcNou = Amprenta(tnTip, llAviz, 'frm_facturare_articole2', tcStrica, llTrece)
|
|
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
|
|
* asteptarea declarata: mesajul (sau trecerea) si contul la dubluri
|
|
IF llTrece
|
|
DO Assert WITH "RETURN=.T." $ lcVechi, "asteptat: antetul trece (Return .T. pe vechi)"
|
|
lcCont = IIF(llAviz, "facturi_duplicate(418,", "facturi_duplicate(4111,")
|
|
DO Assert WITH lcCont $ lcVechi, "asteptat: " + lcCont + " in jurnal"
|
|
ELSE
|
|
DO Assert WITH tcAsteptat $ lcVechi, "asteptat mesajul [" + tcAsteptat + "] in jurnal"
|
|
DO Assert WITH "RETURN=.F." $ lcVechi, "asteptat: Return .F."
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNCTION Amprenta
|
|
LPARAMETERS tnTip, tlAviz, tcClasa, tcStrica, tlTrece
|
|
LOCAL loF, lcA, llR, llAntet, lcJurnalAntet
|
|
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)
|
|
* antet valid
|
|
poDate.dataireg = DATE(gnAn, gnLuna, 1)
|
|
poDate.dataact = poDate.dataireg
|
|
poDate.datascad = poDate.dataact + 1
|
|
poDate.zi_curs = poDate.dataact
|
|
IF EMPTY(NVL(poDate.id_fdoc, 0))
|
|
poDate.id_fdoc = 1
|
|
poDate.fdoc = "FEL TEST"
|
|
ENDIF
|
|
poDate.nract = 77
|
|
poDate.serie_act = "TST"
|
|
poDate.id_client = gnIdClient1
|
|
poDate.nume_client = "PARTENER TEST"
|
|
poDate.listaid = "999"
|
|
poDate.descriere = "DESCRIERE INITIALA"
|
|
poDate.id_pol = 3
|
|
IF poDate.in_valuta = 1
|
|
poDate.id_valuta = 2
|
|
poDate.nume_valuta = "EUR"
|
|
ENDIF
|
|
gnMockRaspuns = 6
|
|
gcMockDuplicat = ""
|
|
* stricaciunea cazului
|
|
DO CASE
|
|
CASE tcStrica == "VALID"
|
|
CASE tcStrica == "DATAIREG_GOL"
|
|
poDate.dataireg = {}
|
|
CASE tcStrica == "DATAACT_GOL"
|
|
poDate.dataact = {}
|
|
CASE tcStrica == "DATASCAD_GOL"
|
|
poDate.datascad = {}
|
|
CASE tcStrica == "IDFDOC_GOL"
|
|
poDate.id_fdoc = 0
|
|
CASE tcStrica == "ZICURS_GOL"
|
|
poDate.zi_curs = {}
|
|
CASE tcStrica == "IDVALUTA_GOL"
|
|
poDate.id_valuta = 0
|
|
CASE tcStrica == "NRACT_GOL"
|
|
poDate.nract = 0
|
|
CASE tcStrica == "DATAIREG_ALTA_LUNA"
|
|
poDate.dataireg = GOMONTH(DATE(gnAn, gnLuna, 1), 1)
|
|
poDate.dataact = poDate.dataireg
|
|
poDate.datascad = poDate.dataact + 1
|
|
CASE tcStrica == "DATASCAD_MICA"
|
|
poDate.datascad = poDate.dataact - 1
|
|
CASE tcStrica == "DATAACT_MARE"
|
|
poDate.dataireg = DATE(gnAn, gnLuna, 1)
|
|
poDate.dataact = poDate.dataireg + 1
|
|
poDate.datascad = poDate.dataact + 1
|
|
CASE tcStrica == "IDCLIENT_GOL"
|
|
poDate.id_client = 0
|
|
CASE tcStrica == "DESCRIERE_GOL" OR tcStrica == "COPIERE_DESCR_GOL"
|
|
poDate.descriere = ""
|
|
CASE tcStrica == "LISTAID_GOL"
|
|
poDate.listaid = ""
|
|
CASE tcStrica == "IDPOL_GOL"
|
|
poDate.id_pol = 0
|
|
CASE tcStrica == "DOUA_DATAIREG_NRACT"
|
|
poDate.dataireg = {}
|
|
poDate.nract = 0
|
|
CASE tcStrica == "DUPLICAT_NU"
|
|
gcMockDuplicat = "DUBLURA TEST 1"
|
|
gnMockRaspuns = 7
|
|
CASE tcStrica == "DUPLICAT_DA"
|
|
gcMockDuplicat = "DUBLURA TEST 1"
|
|
gnMockRaspuns = 6
|
|
CASE tcStrica == "CLIENT_DIVERSI_NU"
|
|
poDate.nume_client = "CLIENTI DIVERSI"
|
|
gnMockRaspuns = 7
|
|
CASE tcStrica == "CLIENT_DIVERSI_DA"
|
|
poDate.nume_client = "CLIENTI DIVERSI"
|
|
gnMockRaspuns = 6
|
|
ENDCASE
|
|
gcErr = ""
|
|
gcMockApeluri = ""
|
|
|
|
DO AfLog WITH " > " + gcCaz + "creez " + tcClasa
|
|
loF = CREATEOBJECT(tcClasa)
|
|
IF VARTYPE(loF) <> 'O'
|
|
RETURN "CREATEOBJECT " + tcClasa + " ESUAT" + CHR(13) + CHR(10) + gcErr
|
|
ENDIF
|
|
IF tcStrica == "COPIERE_DESCR_GOL"
|
|
loF.lCopiere = .T.
|
|
ENDIF
|
|
gcErr = ""
|
|
gcMockApeluri = ""
|
|
lcA = ""
|
|
IF tlTrece AND tcClasa == 'frm_facturare_articole2'
|
|
* pe unificat antetul trece si se continua cu articolele: se izoleaza validarea de antet
|
|
llAntet = loF.oAntet.valideaza_antet(loF)
|
|
lcJurnalAntet = gcMockApeluri
|
|
lcA = "RETURN=" + TRANSFORM(llAntet) + CHR(13) + CHR(10) + "JURNAL:" + CHR(13) + CHR(10) + lcJurnalAntet
|
|
lcA = lcA + "ERORI:" + CHR(13) + CHR(10) + gcErr
|
|
gcMockApeluri = ""
|
|
gcErr = ""
|
|
llR = loF.inainte_de_do_termin()
|
|
DO Assert WITH llR = .F. AND "Nu ati ales articolele" $ gcMockApeluri, "unificat: dupa antet valid se ajunge la validarea articolelor (crsfactura gol)"
|
|
* erorile corpului de articole (prototip, perimetrul S4: ex. grd_articole inexistent) se logheaza, nu se compara
|
|
DO AfLog WITH " > " + gcCaz + "unificat inainte_de_do_termin: " + TRANSFORM(llR) + " | " + STRTRAN(gcMockApeluri, CHR(13) + CHR(10), " ") + " | erori articole: " + STRTRAN(gcErr, CHR(13) + CHR(10), "; ")
|
|
gcErr = ""
|
|
ELSE
|
|
llR = loF.inainte_de_do_termin()
|
|
lcA = "RETURN=" + TRANSFORM(llR) + CHR(13) + CHR(10) + "JURNAL:" + CHR(13) + CHR(10) + gcMockApeluri
|
|
IF tcClasa == 'frm_facturare_articole2' AND tnTip = 1 AND tcStrica == "COPIERE_DESCR_GOL"
|
|
* ct_clb_altele e eliminat de Init pe tip 1 (gnScadereStoc=1, fara copiere): SetFocus da 1925 pe ambele
|
|
* cai; pe unificat eroarea vine din oAntet prin metoda formularului si trebuie sa ajunga la ON ERROR
|
|
* (fara override Error pe frm_facturare_articole2)
|
|
DO Assert WITH "1925" $ gcErr, "eroarea din oAntet apelat prin inainte_de_do_termin ajunge la ON ERROR"
|
|
ENDIF
|
|
lcA = lcA + "ERORI:" + CHR(13) + CHR(10) + gcErr
|
|
ENDIF
|
|
loF.Release()
|
|
RELEASE loF
|
|
IF poDate.rezultat_serii <> 0
|
|
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
|
|
ENDIF
|
|
RETURN lcA
|
|
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], "<lipsa>")
|
|
DO AfLog WITH " nou : " + IIF(i <= lnN, laN[i], "<lipsa>")
|
|
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)
|
|
DO AfLog WITH "END " + TTOC(DATETIME())
|
|
QUIT
|
|
ENDPROC
|