* 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