From 9839876b5a6025cd9bf2dca4642d809eb9732ef2 Mon Sep 17 00:00:00 2001 From: fernando Date: Sat, 7 Dec 2013 14:02:17 +0100 Subject: [PATCH 1/4] =?UTF-8?q?Changeset:=2043=20Changeset:=2043=20-=20Arr?= =?UTF-8?q?eglo=20del=20bug=20del=20m=C3=A9todo=20movido=20y=20de=20los=20?= =?UTF-8?q?espacios=20que=20se=20pierden=20por=20el=20TEXT/ENDTEXT=20-=20N?= =?UTF-8?q?uevos=20casos=20de=20prueba=20para=20comprobar=20la=20soluci?= =?UTF-8?q?=C3=B3n=20(UT)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TESTS/DATOS_READONLY/fb2p_test.vct | Bin 12749 -> 10223 bytes TESTS/DATOS_READONLY/fb2p_test.vcx | Bin 3976 -> 2885 bytes TESTS/ut__foxbin2prg.prg | 188 ++++++++++++++++++++++++----- foxbin2prg.prg | 99 +++++++++------ 4 files changed, 217 insertions(+), 70 deletions(-) diff --git a/TESTS/DATOS_READONLY/fb2p_test.vct b/TESTS/DATOS_READONLY/fb2p_test.vct index b6b2a6063f2967c09c34bae81b26e15990252950..be2b80b47aa4750dfc154d94b3a811258d6ddf72 100644 GIT binary patch delta 1455 zcmb_cO=}ZD7@kd2X`|78*v~-w(h}OFv9wqe3JPtq)|RH*Hi?P~ak`m?wfm87l7gZH zFM5O>gf~ct1&M<=R0l3!cc$) z2D|8&-Z}d4Oji;6UJEV4{l#S|EJhN`B5;VJe|SSEX1bmW$;-jKp43RrNEyi#Ny;kD z5?I70h8)S}2sRI~Vu*D4w7*q_ER9Q`~8m8v;aKbEJSbJq~@u#OeHd}jQ zu4jDeXK|JVzhW$0EF?auUOyX914=_~=46uzT8cq{^a`Nyu1744~5aFoKMx%7w4|J_} zf-=cZ9Ixt-l(iHUdPleygTKFItQa#_*pVm51PHn|Tf2SV&e!yLX>SFg9X2+zFFw!* z{q2QEf*VDxK2+*PL6}a=FuL;)eHWJ^5=5mdvk__1x`j&D*{Xes%s0?Jb4!6_A;Zly zNyao%d08|PK-;|Ra9E46<{ll|5(ov zQ(;i7GuHDY#Y?RcljyR7d3~LO7%Sv9YcZYxy4^&oqGc2uvTmSKq6T~CAf>F5&MTzA zD(t5vO>;_6p;1ZVIpO)Kn8sB*^PM;g$+%^dTM+$tSa(ay(y=dZ^E(l#;wM;ZaO~F-QLSA ze9Wx0UF8kR{q896H&5z1?}zhx;^MV9@6n^3<}3f^a^Yy3xug#G|8v-Zblfe-)sCw> zR~Lg7{xf$S+`o1Rzefx+-B0|Nu&M!`>v6BRf&Gc)CiZk{N&mT@wtIREBINjb*J>lH&MmrLM0dY$h!}`Hhs<Kx32iPAuVQ2Y2~B<{VZs(0N;32F(u?v-3k=bW-`pj)g%Rv7kPe``CQFD*aKJ3ztSx#E zXpfX2*gT*wq_}{_W#%TPr{KPtv*z{|rfxREuTRdk{h0~pi-X?3o!P5bIr_6%Y`BO1cBwevomXLCXn~4>MBIVw5F|cG%u;D` Q9gjJe8dUhNBG5}#0EP2GKL7v# delta 806 zcmZvZO=uHA6vtmGn{3va&}vtbHiX(Fo3ymu-H5wu3z9}#Pe~7@iXhlv6%h(WL@0u2 ziywG=_6vj}*png@ysDt+sfc*do;+Ae4<35;BL1f{8xS1$WnX4~v+rX+nh&#@eW*3s zxuIRvItDvwf2A@+RTVSe)v}Qb{7hTU)vBWtj#G9$8_Ub5rM-futKw>!BL~cmB>r}( zEh!O2cq-<%?4=-#@O9%L@5WlY#GA_Qt;15cHx%@83xPe%#O+3AhvV zu7I1}s)u&-SPxMEYM=q;z@wi1V=+8g+@(CxEVvICtb^BiA&G>|W~DrU>Q8|QFa>Ua zdj-ftyk!&(Ull%PVfZI8jU@ky>2eDGv?Keu4QW!v>*_+XNc5x>_KQk!KC7H?_kqI| zEtC8AE6(&0Er3<<5_|w(`c diff --git a/TESTS/ut__foxbin2prg.prg b/TESTS/ut__foxbin2prg.prg index 34ab5b3..c27a768 100644 --- a/TESTS/ut__foxbin2prg.prg +++ b/TESTS/ut__foxbin2prg.prg @@ -71,39 +71,41 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg , loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG" *-- TEST - TRY - lcTipoBinario = UPPER( JUSTEXT( tc_OutputFile ) ) + IF ISNULL(toEx) && Respetar errores previos + TRY + lcTipoBinario = UPPER( JUSTEXT( tc_OutputFile ) ) - IF FILE(tc_OutputFile) - SELECT 0 - USE (tc_OutputFile) SHARED NOUPDATE ALIAS TABLABIN - ELSE - ERROR 'No se encontró el archivo "' + tc_OutputFile + '"' - ENDIF - - IF EMPTY(tcParent) AND EMPTY(tcClass) AND EMPTY(tcObjName) - DO CASE - CASE lcTipoBinario = 'SCX' - LOCATE FOR PLATFORM=="COMMENT " AND UniqueID=="Screen " - CASE lcTipoBinario = 'VCX' - LOCATE FOR PLATFORM=="COMMENT " AND UniqueID=="Class " - ENDCASE - IF NOT FOUND() - ERROR 'No se encontró el registro de cabecera "' + UniqueID + '"' + IF FILE(tc_OutputFile) + SELECT 0 + USE (tc_OutputFile) SHARED NOUPDATE ALIAS TABLABIN + ELSE + ERROR 'No se encontró el archivo "' + tc_OutputFile + '"' ENDIF - ELSE - LOCATE FOR CLASS==tcClass AND PARENT==tcParent AND objName==tcObjName - IF NOT FOUND() - ERROR 'No se encontró el registro para CLASS=="' + tcClass + '" AND PARENT=="' + tcParent + '" AND objName=="' + tcObjName + '"' + + IF EMPTY(tcParent) AND EMPTY(tcClass) AND EMPTY(tcObjName) + DO CASE + CASE lcTipoBinario = 'SCX' + LOCATE FOR PLATFORM=="COMMENT " AND UniqueID=="Screen " + CASE lcTipoBinario = 'VCX' + LOCATE FOR PLATFORM=="COMMENT " AND UniqueID=="Class " + ENDCASE + IF NOT FOUND() + ERROR 'No se encontró el registro de cabecera "' + UniqueID + '"' + ENDIF + ELSE + LOCATE FOR CLASS==tcClass AND PARENT==tcParent AND objName==tcObjName + IF NOT FOUND() + ERROR 'No se encontró el registro para CLASS=="' + tcClass + '" AND PARENT=="' + tcParent + '" AND objName=="' + tcObjName + '"' + ENDIF ENDIF - ENDIF - SCATTER MEMO NAME toReg + SCATTER MEMO NAME toReg - CATCH TO toEx - FINALLY - USE IN (SELECT("TABLABIN")) - ENDTRY + CATCH TO toEx + FINALLY + USE IN (SELECT("TABLABIN")) + ENDTRY + ENDIF IF ISNULL(toEx) @@ -225,8 +227,18 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg ENDFOR *-- METHODS + lcMensaje = "Tamaño de METHODS para " + lcExtraData + * COMPROBAR "BUG DEL MÉTODO MOVIDO" + IF LEN( STRTRAN( toReg_Esperado.METHODS, CHR(13)+CHR(10), CHR(13) ) ) <> LEN( STRTRAN( toReg.METHODS, CHR(13)+CHR(10), CHR(13) ) ) + IF "BUG DEL MÉTODO MOVIDO" $ toReg.METHODS AND NOT "BUG DEL MÉTODO MOVIDO" $ toReg_Esperado.METHODS + lcMensaje = lcMensaje + ' >>> ATENCIÓN!! - COMPROBAR "BUG DEL MÉTODO MOVIDO"' + ENDIF + ENDIF + *-- Fin comprobación + THIS.assertequals( LEN( STRTRAN( toReg_Esperado.METHODS, CHR(13)+CHR(10), CHR(13) ) ) ; - , LEN( STRTRAN( toReg.METHODS, CHR(13)+CHR(10), CHR(13) ) ), "Tamaño de METHODS para " + lcExtraData ) + , LEN( STRTRAN( toReg.METHODS, CHR(13)+CHR(10), CHR(13) ) ), lcMensaje ) + THIS.assertequals( lnMethods_Count_Esperado, lnMethods_Count, "Cantidad de METHODS para " + lcExtraData ) FOR I = 1 TO lnMethods_Count_Esperado THIS.asserttrue( ASCAN( laMethods, laMethods_Esperado(I,1), 1, -1, 1, 0+2+4) > 0 ; @@ -320,13 +332,125 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg *loCnv.l_Debug = .F. loCnv.l_ShowErrors = .F. *loCnv.l_Test = .T. - loCnv.l_PropSort_Enabled = .F. && Para buscar diferencias - loCnv.l_MethodSort_Enabled = .F. && Para buscar diferencias + *loCnv.l_PropSort_Enabled = .F. && Para buscar diferencias + *loCnv.l_MethodSort_Enabled = .F. && Para buscar diferencias *-- DATOS DE ENTRADA STORE 0 TO lnCodError - lc_File = 'fb2p_test.vcx' && 'THCALC.VCX' && + lc_File = 'fb2p_test.vcx' + lc_InputFile = FORCEPATH( lc_File, 'TESTS\DATOS_READONLY' ) + lc_OutputFile = FORCEPATH( lc_File, 'TESTS\DATOS_TEST' ) + + oFXU_LIB.copiarArchivosParaTest( FORCEEXT( lc_File, LEFT( JUSTEXT(lc_File),2 ) + '?' ) ) + + loCnv.Convertir( lc_OutputFile, .F., .F., .T. ) + loCnv.Convertir( FORCEEXT(lc_OutputFile, LEFT( JUSTEXT(lc_File),2 ) + '2' ), .F., .F., .T. ) + + SELECT 0 + USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIBOBIN_IN + + SCAN ALL FOR NOT DELETED() AND ( UniqueID==PADR('Class',10) OR PLATFORM==PADR("WINDOWS",8) ) + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + SCATTER MEMO NAME loReg_Esperado + lcClass = loReg_Esperado.CLASS + lcParent = loReg_Esperado.PARENT + lcObjName = loReg_Esperado.objName + + THIS.Evaluate_results( loEx, lnCodError_Esperado, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado ) + ENDSCAN + + CATCH TO loEx + THIS.Evaluate_results( loEx, lnCodError_Esperado, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado ) + + FINALLY + USE IN (SELECT("ARCHIBOBIN_IN")) + ENDTRY + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaLaLibreria_FB2P_TEST_VCX_YValidarEl_BUG_DelMetodoMovidoEntreClases + LOCAL lnCodError, lnCodError_Esperado ; + , lc_File, lc_InputFile, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado ; + , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ; + , loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ; + , loEx AS EXCEPTION + #IF .F. + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + + TRY + loEx = NULL + loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG") + *loCnv.l_Debug = .F. + loCnv.l_ShowErrors = .F. + *loCnv.l_Test = .T. + *loCnv.l_PropSort_Enabled = .F. && Para buscar diferencias + *loCnv.l_MethodSort_Enabled = .F. && Para buscar diferencias + + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lc_File = 'fb2p_test_bug_metodo_movido.vcx' + lc_InputFile = FORCEPATH( lc_File, 'TESTS\DATOS_READONLY' ) + lc_OutputFile = FORCEPATH( lc_File, 'TESTS\DATOS_TEST' ) + + oFXU_LIB.copiarArchivosParaTest( FORCEEXT( lc_File, LEFT( JUSTEXT(lc_File),2 ) + '?' ) ) + + loCnv.Convertir( lc_OutputFile, .F., .F., .T. ) + loCnv.Convertir( FORCEEXT(lc_OutputFile, LEFT( JUSTEXT(lc_File),2 ) + '2' ), .F., .F., .T. ) + + SELECT 0 + USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIBOBIN_IN + + SCAN ALL FOR NOT DELETED() AND ( UniqueID==PADR('Class',10) OR PLATFORM==PADR("WINDOWS",8) ) + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + SCATTER MEMO NAME loReg_Esperado + lcClass = loReg_Esperado.CLASS + lcParent = loReg_Esperado.PARENT + lcObjName = loReg_Esperado.objName + + THIS.Evaluate_results( loEx, lnCodError_Esperado, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado ) + ENDSCAN + + CATCH TO loEx + THIS.Evaluate_results( loEx, lnCodError_Esperado, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado ) + + FINALLY + USE IN (SELECT("ARCHIBOBIN_IN")) + ENDTRY + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaLaLibreria_FB2P_TEST_VCX_YValidarEl_BUG_Del_PROCEDURE_SIN_ENDPROC + LOCAL lnCodError, lnCodError_Esperado ; + , lc_File, lc_InputFile, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado ; + , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ; + , loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ; + , loEx AS EXCEPTION + #IF .F. + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + + TRY + loEx = NULL + loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG") + *loCnv.l_Debug = .F. + loCnv.l_ShowErrors = .F. + *loCnv.l_Test = .T. + *loCnv.l_PropSort_Enabled = .F. && Para buscar diferencias + *loCnv.l_MethodSort_Enabled = .F. && Para buscar diferencias + + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lc_File = 'fb2p_test_bug_estructural.vcx' lc_InputFile = FORCEPATH( lc_File, 'TESTS\DATOS_READONLY' ) lc_OutputFile = FORCEPATH( lc_File, 'TESTS\DATOS_TEST' ) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 41538f9..aa2a471 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -46,7 +46,8 @@ * 01/12/2013 FDBOZZO v1.6 Refactorización completa generación BIN y PRG, cambio de algoritmos, arreglo de bugs, Unit Testing con FoxUnit * 02/12/2013 FDBOZZO v1.7 Arreglo bug "Name", barra de progreso, agregado mensaje de ayuda si se llama sin parámetros, verificación y logueo de archivos READONLY con debug activa * 03/12/2013 FDBOZZO v1.8 Arreglo bug "Name" (otra vez), sort encapsulado y reutilizado para versiones TEXTO y BIN por seguridad -* 03/12/2013 FDBOZZO v1.9 Arreglo bug pérdida de propiedades causado por una mejora anterior +* 06/12/2013 FDBOZZO v1.9 Arreglo bug pérdida de propiedades causado por una mejora anterior +* 06/12/2013 FDBOZZO v1.10 Arreglo del bug de mezcla de métodos de una clase con la siguiente * *--------------------------------------------------------------------------------------------------- * TESTEO Y REPORTE DE BUGS (AGRADECIMIENTOS) @@ -55,6 +56,7 @@ * 02/12/2013 Fidel Charny REPORTE BUG: Se pierden algunas propiedades y no muestra picture si "Name" no es la última (arreglado en v.1.7) * 03/12/2013 Fidel Charny REPORTE BUG: Se siguen perdiendo algunas propiedades por implementación defectuosa del arreglo anterior (arreglado en v.1.8) * 03/12/2013 Fidel Charny REPORTE BUG: Se siguen perdiendo algunas propiedades por implementación defectuosa de una mejora anterior (arreglado en v.1.9) +* 06/12/2013 Fidel Charny REPORTE BUG: Cuando hay métodos que tienen el mismo nombre, aparecen mezclados en objetos a los que no corresponden * *--------------------------------------------------------------------------------------------------- * TRAMIENTOS ESPECIALES DE ASIGNACIONES DE PROPIEDADES: @@ -350,7 +352,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM l_PropSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias lFileMode = .F. nClassTimeStamp = '' - n_FB2PRG_Version = 1.9 + n_FB2PRG_Version = 1.10 o_Conversor = NULL c_VC2 = 'VC2' c_SC2 = 'SC2' @@ -2428,11 +2430,12 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base #ENDIF TRY - LOCAL loProcedure AS CL_PROCEDURE OF 'FOXBIN2PRG.PRG' + LOCAL llEsProcedureDeClase, loProcedure AS CL_PROCEDURE OF 'FOXBIN2PRG.PRG' IF '.' $ tcProcedureAbierto AND VARTYPE(toObjeto) = 'O' AND toObjeto._Procedure_Count > 0 loProcedure = toObjeto._Procedures(toObjeto._Procedure_Count) ELSE + llEsProcedureDeClase = .T. loProcedure = toClase._Procedures(toClase._Procedure_Count) ENDIF @@ -2443,10 +2446,22 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base IF NOT .lineaExcluida( I, tnBloquesExclusion, @taBloquesExclusion ) ; AND NOT .lineIsOnlyCommentAndNoMetadata( @tcLine, @tc_Comentario ) - IF LEFT( tcLine, 8 ) + ' ' == C_ENDPROC + ' ' && Fin del PROCEDURE - *tcProcedureAbierto = '' + DO CASE + CASE LEFT( tcLine, 8 ) + ' ' == C_ENDPROC + ' ' && Fin del PROCEDURE + tcProcedureAbierto = '' EXIT - ENDIF + + CASE LEFT( tcLine + ' ', 10 ) == C_ENDDEFINE + ' ' && Fin de bloque (ENDDEFINE) encontrado + IF llEsProcedureDeClase + ERROR 'Error de anidamiento de estructuras. Se esperaba ENDPROC y se encontró ENDDEFINE en la clase ' ; + + toClase._Nombre + ' (' + loProcedure._Nombre + ')' ; + + ', línea ' + TRANSFORM(I) + ' del archivo ' + THIS.c_InputFile + ELSE + ERROR 'Error de anidamiento de estructuras. Se esperaba ENDPROC y se encontró ENDDEFINE en la clase ' ; + + toClase._Nombre + ' (' + toObjeto._Nombre + '.' + loProcedure._Nombre + ')' ; + + ', línea ' + TRANSFORM(I) + ' del archivo ' + THIS.c_InputFile + ENDIF + ENDCASE ENDIF *-- Quito 2 TABS de la izquierda (si se puede y si el integrador/desarrollador no la lió quitándolos) @@ -2650,14 +2665,13 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ******************************************************************************************************************* PROCEDURE analizarBloque_DEFINE_CLASS - LPARAMETERS toModulo, toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto ; + LPARAMETERS toModulo, toClase, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto ; , taBloquesExclusion, tnBloquesExclusion, tc_Comentario EXTERNAL ARRAY taCodeLines, tnBloquesExclusion, taBloquesExclusion #IF .F. LOCAL toModulo AS CL_MODULO OF 'FOXBIN2PRG.PRG' - LOCAL toObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' #ENDIF @@ -2668,7 +2682,8 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base llBloqueEncontrado = .T. LOCAL Z, lcProp, lcValue, loEx AS EXCEPTION ; , llMETADATA_Completed, llPROTECTED_Completed, llHIDDEN_Completed, llDEFINED_PAM_Completed ; - , llINCLUDE_Completed, llCLASS_PROPERTY_Completed + , llINCLUDE_Completed, llCLASS_PROPERTY_Completed ; + , loObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' STORE '' TO tcProcedureAbierto toClase = CREATEOBJECT('CL_CLASE') @@ -2699,11 +2714,11 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base tc_Comentario = '' .set_Line( @tcLine, @taCodeLines, I ) - - .lineIsOnlyCommentAndNoMetadata( @tcLine, @tc_Comentario ) - DO CASE - CASE .analizarBloque_PROCEDURE( @toModulo, @toClase, @toObjeto, @tcLine, @taCodeLines, @I, @tnCodeLines ; + CASE .lineIsOnlyCommentAndNoMetadata( @tcLine, @tc_Comentario ) + LOOP + + CASE .analizarBloque_PROCEDURE( @toModulo, @toClase, @loObjeto, @tcLine, @taCodeLines, @I, @tnCodeLines ; , @tcProcedureAbierto, @tc_Comentario, @taBloquesExclusion, @tnBloquesExclusion ) *-- OJO: Esta se analiza primero a propósito, solo porque no puede estar detrás de PROTECTED y HIDDEN llCLASS_PROPERTY_Completed = .T. @@ -2722,7 +2737,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base llHIDDEN_Completed = .T. - CASE NOT llINCLUDE_Completed AND .c_Type <> "SCX" AND .analizarBloque_INCLUDE( @toModulo, @toClase, @toObjeto, @tcLine, @taCodeLines ; + CASE NOT llINCLUDE_Completed AND .c_Type <> "SCX" AND .analizarBloque_INCLUDE( @toModulo, @toClase, @tcLine, @taCodeLines ; , @I, @tnCodeLines, @tcProcedureAbierto ) llINCLUDE_Completed = .T. @@ -2848,7 +2863,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ******************************************************************************************************************* PROCEDURE analizarBloque_INCLUDE - LPARAMETERS toModulo, toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto + LPARAMETERS toModulo, toClase, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto LOCAL llBloqueEncontrado #IF .F. @@ -2906,13 +2921,11 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ******************************************************************************************************************* PROCEDURE analizarBloque_OLE_DEF - LPARAMETERS toModulo, toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto + LPARAMETERS toModulo, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto LOCAL llBloqueEncontrado #IF .F. LOCAL toModulo AS CL_MODULO OF 'FOXBIN2PRG.PRG' - LOCAL toObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' #ENDIF IF LEFT( tcLine + ' ', C_LEN_OLE_I + 1 ) == C_OLE_I + ' ' @@ -2992,7 +3005,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base IF llBloqueEncontrado *-- Evalúo todo el contenido del PROCEDURE - THIS.analizarLineasDeProcedure( @toClase, @toObjeto, @tcLine, @taCodeLines, @I, @tnCodeLines, tcProcedureAbierto ; + THIS.analizarLineasDeProcedure( @toClase, @toObjeto, @tcLine, @taCodeLines, @I, @tnCodeLines, @tcProcedureAbierto ; , @tc_Comentario, @taBloquesExclusion, @tnBloquesExclusion ) ENDIF @@ -3063,6 +3076,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base IF lnObjProc = 0 *-- Procedimiento de clase toClase.add_Procedure( loProcedure ) + toObjeto = NULL ELSE *-- Procedimiento de objeto toObjeto = toClase._AddObjects( lnObjProc ) @@ -3113,7 +3127,6 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base LOCAL I, loEx AS EXCEPTION ; , llFoxBin2Prg_Completed, llOLE_DEF_Completed, llINCLUDE_SCX_Completed ; , lc_Comentario, lcProcedureAbierto, lcLine ; - , loObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' ; , loClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' STORE '' TO lcProcedureAbierto @@ -3136,21 +3149,19 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base CASE THIS.lineaExcluida( I, tnBloquesExclusion, @taBloquesExclusion ) ; OR .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Excluida, vacía o solo Comentarios - *.analizarLineasDeProcedure( @loClase, @loObjeto, @lcLine, @taCodeLines, @I, tnCodeLines, @lcProcedureAbierto ) - CASE NOT llFoxBin2Prg_Completed AND .analizarBloque_FoxBin2Prg( toModulo, @lcLine, @taCodeLines, @I, tnCodeLines ) llFoxBin2Prg_Completed = .T. - CASE NOT llOLE_DEF_Completed AND .analizarBloque_OLE_DEF( @toModulo, @loClase, @loObjeto, @lcLine, @taCodeLines ; + CASE NOT llOLE_DEF_Completed AND .analizarBloque_OLE_DEF( @toModulo, @lcLine, @taCodeLines ; , @I, tnCodeLines, @lcProcedureAbierto ) *-- Puede haber varios - CASE NOT llINCLUDE_SCX_Completed AND .c_Type = 'SCX' AND .analizarBloque_INCLUDE( @toModulo, @loClase, @loObjeto, @lcLine ; + CASE NOT llINCLUDE_SCX_Completed AND .c_Type = 'SCX' AND .analizarBloque_INCLUDE( @toModulo, @loClase, @lcLine ; , @taCodeLines, @I, tnCodeLines, @lcProcedureAbierto ) * Específico para SCX que lo tiene al inicio llINCLUDE_SCX_Completed = .T. - CASE .analizarBloque_DEFINE_CLASS( @toModulo, @loClase, @loObjeto, @lcLine, @taCodeLines, @I, tnCodeLines ; + CASE .analizarBloque_DEFINE_CLASS( @toModulo, @loClase, @lcLine, @taCodeLines, @I, tnCodeLines ; , @lcProcedureAbierto, @taBloquesExclusion, @tnBloquesExclusion, @lc_Comentario ) *-- Puede haber varias @@ -3168,8 +3179,8 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base THROW FINALLY - STORE NULL TO loObjeto, loClase - RELEASE loObjeto, loClase + STORE NULL TO loClase + RELEASE loClase ENDTRY RETURN @@ -4812,11 +4823,16 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF *-- Genero el método SIN indentar, ya que se hace luego - TEXT TO tcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <<'PROCEDURE'>> <> - <> - <<'ENDPROC'>> - ENDTEXT + *TEXT TO tcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + * <<'PROCEDURE'>> <> + * <> + * <<'ENDPROC'>> + *ENDTEXT + *-- Sustituyo el TEXT/ENDTEXT aquí porque a veces quita espacios de la derecha, y eso es peligroso + tcMethods = tcMethods + CR_LF + 'PROCEDURE ' + tcMethodName + tcMethods = tcMethods + CR_LF + THIS.IndentarMemo( taCode(taMethods(I,2)) ) + tcMethods = tcMethods + CR_LF + 'ENDPROC' + tcMethods = tcMethods + CR_LF ENDFOR ENDIF @@ -5369,12 +5385,17 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base FOR I = 1 TO lnMethodCount *-- Genero los métodos indentados - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <><>PROCEDURE <> - <> - <>ENDPROC + *TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + * <><>PROCEDURE <> + * <> + * <>ENDPROC - ENDTEXT + *ENDTEXT + *-- Sustituyo el TEXT/ENDTEXT aquí porque a veces quita espacios de la derecha, y eso es peligroso + C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + C_TAB + laMethods(I,3) + 'PROCEDURE ' + laMethods(I,1) + C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + THIS.IndentarMemo( laCode(laMethods(I,2)), CHR(9) + CHR(9) ) + C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + C_TAB + 'ENDPROC' + C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF ENDFOR ENDIF @@ -5432,8 +5453,10 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base * <>ENDPROC *ENDTEXT + *-- Sustituyo el TEXT/ENDTEXT aquí porque a veces quita espacios de la derecha, y eso es peligroso lcMethods = lcMethods + CR_LF + THIS.IndentarMemo( taCode(taMethods(I,2)), C_TAB + C_TAB ) - lcMethods = lcMethods + CR_LF + C_TAB + 'ENDPROC' + CR_LF + lcMethods = lcMethods + CR_LF + C_TAB + 'ENDPROC' + lcMethods = lcMethods + CR_LF ENDFOR *TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 From 31ac44040ea1b4985e0f8281d77fed15e51f9d8a Mon Sep 17 00:00:00 2001 From: fernando Date: Sat, 7 Dec 2013 14:20:43 +0100 Subject: [PATCH 2/4] Changeset: 45 Changeset: 45 Tests FoxUnit --- .../DATOS_READONLY/fb2p_test_bug_estructural.vct | Bin 0 -> 2153 bytes .../DATOS_READONLY/fb2p_test_bug_estructural.vcx | Bin 0 -> 1468 bytes .../fb2p_test_bug_metodo_movido.vct | Bin 0 -> 3198 bytes .../fb2p_test_bug_metodo_movido.vcx | Bin 0 -> 1577 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 TESTS/DATOS_READONLY/fb2p_test_bug_estructural.vct create mode 100644 TESTS/DATOS_READONLY/fb2p_test_bug_estructural.vcx create mode 100644 TESTS/DATOS_READONLY/fb2p_test_bug_metodo_movido.vct create mode 100644 TESTS/DATOS_READONLY/fb2p_test_bug_metodo_movido.vcx diff --git a/TESTS/DATOS_READONLY/fb2p_test_bug_estructural.vct b/TESTS/DATOS_READONLY/fb2p_test_bug_estructural.vct new file mode 100644 index 0000000000000000000000000000000000000000..1fdad1e358dd14792478f3ed7393682e7f68124b GIT binary patch literal 2153 zcmeHI&2G~`5FS&vNi10^Prwj~N`M>Xr~Dm|2#zBnrAg&FlnbD3vT03iZ)!UdFT{~6 zFT$B801j{@!C}^Qz(p+*f(t5^CZ4|??|eJo2B7EyfI{;BxtIvZvtNH~*}I*75AP#l zqf)JsPx`MmLzj65Rt>yo;4K4dQtAdaq>x|B5(`7``B;R0X0GkHFS!?G)~e~TXlW?* z%&X?|PcK)VC7%~~Np8TRA1P-)^EWbdjpSXHFsFBsr z&Pf$YI-c?o!wElNRE^1cz8m=r1qK2qBE&KCViw{wK-0e2Z6ga}9^r`U$wW~}3NTZk zl&EkeNjJO-rsocijI@`FbF=@42hbOAU;xfrsk`%J*q?`jD#g(G$!Dl*lwyr(m?!lon>UVT) z&mF~wq~G1rHIq$ZR|I60P2u}AL^Xn<$9(>iD?5(UGY-Y&qAaY_kjWzZ(>NBvFPzHL z@9b#NF-kf6IeH~Sd3Mm`r|fv2Tky}aLxrwjqu(LNI<+k?h!inNj&rc1xKj8*4*8jj j&W){>FhkB_IolP7$djA?Hr@NV$~(3ky;@FfbtHrzP#c;3h@{<>J(Fs5%r>2?hjA;Q^3%09Iat z$7AP`2AV`}PcJz*3iR zqTnGFERZQCaH`^hhfGM1MFb2rm&}n28vp|Z2PQAMn^g!S1;_jx?k@8?&v>~)?q>`M z0jje1nVCYAtje-AA%aCrTr(GQ2M-Ue5>t^U*X$}X#o1i&QizLy?vQc{)f1lQ-Uf}X+q}^IG-EdtY z48yR@QGcXc_Dk+yj!(^NzV7AE&VHMa&(kxdLUYH58wM!)_y)$sVs`)l literal 0 HcmV?d00001 diff --git a/TESTS/DATOS_READONLY/fb2p_test_bug_metodo_movido.vct b/TESTS/DATOS_READONLY/fb2p_test_bug_metodo_movido.vct new file mode 100644 index 0000000000000000000000000000000000000000..92b14e4c7bd7129474f324169e1c290def01167e GIT binary patch literal 3198 zcmeHJ&5zqu5P#k;si7$xfkPQ8QFW1JHs0;FT?wSbad(4~IL*hFwuj<6-mHsbr;d$4 zNL=|7_&a*y!evj00|<#5Ai*9H;=++2FEh5EKXwzTz;c2oJ-_$n&71joX5PGE?Bd6a zF#-Gk?Z0UO^8E|@YPZ+W+VCa-Y)Ts&NF(~IRnO9G5jI4)CBk(PD%52WHmM`MlrUa0 z?1%2ew_IoBxxpl%u63*rOnaKFRux;H@`X@IsL!1}HdmN%SPOjLbrd&ne8ef2OZ&PV zm^iJJOM9j@IwbPecDZ!d8v2JgzkwTVeM~G@iukUSOIn1sA}M+_A)bVk+stX;{HdnO zjZ8?>JRs%QGfLl`6bT&EHiF`^IJnb_<+G^d6qPK^fgnq#A;?k;LEhr}Wa%shSt?>6 zH47aheBSA5idr9ZRp7s%*p~5LxztzR>0h{d6_n;ft<%Ry+U;tC&dyGO?b>>|^g7fA zyHHn~(E75k)ir2o`;EG`LpxDZr@jf}pM7`ef;okW?&;u}6VDw6hUG!vz@uO!!o>B! zw803DZ5n^KeQWGOhHq#Rt5$nk?Q5xQB-%O{7=|Y3j&FJvO2PS)z#Nj61Jg4d!_rB$ zL+9N`=3~=$i2)p!SZ!-Ov2-yN`Qd3KQ)?7hCJHZtiIG5zAmdS*)t*Xn^^s?e^i-^F z!`PaRT`|VyM8@FI4L1Up80mf8_|=u*nucO@5pCw{XlJ!uC!a(UvI=+WQZ4-L1eWM> zuP?eR9KZA3&Pry z)u*dRD^*7Mx7f(7FJXU*lgP#ExS$}J(`f&hABX2L`5NwctUJTM`Z`>kb8fykp_K;q z7NVm*zy0tLZBbxxK*l)4fO>~sn>#O(y%wFHM8;S|3v5OE-)9-M zsH~9k6|L1ma7oTDGR8^&?^%x0;rUo?aY7Uho~f?b&eavS@JZ#*=Bd!e=QI8Nv;;^g z*&Cgb(zjg3aw4Vjhx#UJN{P8jh12rtIHI$AycF2Xq~+^{j$YIHfh8&hceZr4t PShAubx0eK5;X?lj!HvM4 literal 0 HcmV?d00001 diff --git a/TESTS/DATOS_READONLY/fb2p_test_bug_metodo_movido.vcx b/TESTS/DATOS_READONLY/fb2p_test_bug_metodo_movido.vcx new file mode 100644 index 0000000000000000000000000000000000000000..2d9d5f1bcc9ec24f4ec17d182126906603bed4b8 GIT binary patch literal 1577 zcmeH{y-ve05XVhvMM3QZ0}M!EK!^dUN%}zt1~)MxC>OW+XjLRY9Xfzup<-fWN386u zyajK=D==_LT}Ui9g&hy)^Zk5h|83c|YGtKF2q_nD(Pmp=nUJna!(;9P5^D)fIXi_! zp3{q%W5;|I&6>nR2UrkN=n~?sE4by-AeiRBHugm+KjAL7Fbq2i-k|{#HDFi4dFRxl zz~ZW~ui#zkGcSxWfdduyd6)U2!vX@jnup8^86E&M6dYK1!tF#Mv=topXK{PFzoUd_ zPk_4#LqdS6@?B=c5L==$n@xz%0_OLbje7?NC(Ywn1ma7c$4%tD99~Br<#0S380PRM z^79CfiVt%O`}fr6`iTB>Y8)?oFO7e#>_Q|q Kqymf7r1=--CTu7G literal 0 HcmV?d00001 From fb9d0cc41d39e35c8cb10715db2ff90b58a4df51 Mon Sep 17 00:00:00 2001 From: fernando Date: Sat, 7 Dec 2013 16:13:33 +0100 Subject: [PATCH 3/4] =?UTF-8?q?Changeset:=2047=20Changeset:=2047=20Arreglo?= =?UTF-8?q?=20definitivo=20del=20ENDPROC=20sobrante=20por=20tener=20un=20E?= =?UTF-8?q?NTER=20dem=C3=A1s=20luego=20del=20ENDPROC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...g__c_conversor_bin_a_prg__indentarMemo.prg | 175 ++++++++++++++++++ foxbin2prg.prg | 45 +++-- 2 files changed, 208 insertions(+), 12 deletions(-) create mode 100644 TESTS/ut__foxbin2prg__c_conversor_bin_a_prg__indentarMemo.prg diff --git a/TESTS/ut__foxbin2prg__c_conversor_bin_a_prg__indentarMemo.prg b/TESTS/ut__foxbin2prg__c_conversor_bin_a_prg__indentarMemo.prg new file mode 100644 index 0000000..3a7f7dc --- /dev/null +++ b/TESTS/ut__foxbin2prg__c_conversor_bin_a_prg__indentarMemo.prg @@ -0,0 +1,175 @@ +DEFINE CLASS ut__foxbin2prg__c_conversor_bin_a_prg__indentarMemo AS FxuTestCase OF FxuTestCase.prg + + #IF .F. + LOCAL THIS AS ut__foxbin2prg__c_conversor_bin_a_prg__indentarMemo OF ut__foxbin2prg__c_conversor_bin_a_prg__indentarMemo.PRG + #ENDIF + + #DEFINE C_FB2P_VALUE_I '' + #DEFINE C_FB2P_VALUE_F '' + #DEFINE CR_LF CHR(13) + CHR(10) + #DEFINE C_CR CHR(13) + #DEFINE C_LF CHR(10) + #DEFINE C_TAB CHR(9) + #DEFINE C_PROC 'PROCEDURE' + #DEFINE C_ENDPROC 'ENDPROC' + #DEFINE C_TEXT 'TEXT' + #DEFINE C_ENDTEXT 'ENDTEXT' + #DEFINE C_IF_F '#IF .F.' + #DEFINE C_ENDIF '#ENDIF' + #DEFINE C_DEFINE_CLASS 'DEFINE CLASS' + #DEFINE C_ENDDEFINE_CLASS 'ENDDEFINE' + icObj = NULL + + + ******************************************************************************************************************************************* + FUNCTION SETUP + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + SET PROCEDURE TO 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + oFXU_LIB = CREATEOBJECT('CL_FXU_CONFIG') + oFXU_LIB.setup_comun() + + THIS.icObj = NEWOBJECT("c_conversor_bin_a_prg", "FOXBIN2PRG.PRG") + loObj = THIS.icObj + loObj.l_Test = .T. + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION TearDown + #IF .F. + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + THIS.icObj = NULL + + IF VARTYPE(oFXU_LIB) = "O" + oFXU_LIB.teardown_comun() + oFXU_LIB = NULL + ENDIF + RELEASE PROCEDURE 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Evaluate_results + LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado, tcMemo, tcMemo_Salida, tcMemo_Esperado + + #IF .F. + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + LOCAL loObj AS c_conversor_bin_a_prg OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + + IF PCOUNT() = 0 + THIS.messageout( "* Support method, not a valid test." ) + RETURN .T. + ENDIF + + IF ISNULL(toEx) + *-- Algunos ajustes para mejor visualización de caracteres especiales + tcMemo = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcMemo ) + tcMemo_Esperado = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcMemo_Esperado ) + tcMemo_Salida = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcMemo_Salida ) + + *-- Visualización de valores + THIS.messageout( ' Memo de entrada:' ) + THIS.messageout( '[' + tcMemo + ']' ) + + THIS.messageout( REPLICATE('-',80) ) + + THIS.messageout( ' Memo esperado:' ) + THIS.messageout( '[' + tcMemo_Esperado + ']' ) + + + *-- Evaluación de valores + THIS.assertequals( '[' + tcMemo_Esperado + ']', '[' + tcMemo_Salida + ']', "Contenido del Memo de PROCEDURE" ) + + ELSE + *-- Evaluación de errores + THIS.messageout( "Error " + TRANSFORM(toEx.ERRORNO) + ', ' + TRANSFORM(toEx.MESSAGE) ) + THIS.messageout( toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) ) + THIS.messageout( TRANSFORM(toEx.LINECONTENTS) ) + + THIS.assertequals( tnCodError_Esperado, toEx.ERRORNO, 'Error' ) + ENDIF + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_evaluarUnMemo_PROCEDURE_YQuitarleLaCabecera_PROCEDURE_YElPie_ENDPROC_DejandoSoloElContenido + LOCAL lnCodError, lcMenError, lnCodError_Esperado ; + , lcMemo, lcMemo_Salida, lcMemo_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_bin_a_prg OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + + TEXT TO lcMemo TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + <<'PROCEDURE miMetodo'>> + Page1.Name = "Page1" + <<'ENDPROC'>> + + + ENDTEXT + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + + TEXT TO lcMemo_Esperado TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + <><>Page1.Name = "Page1" + ENDTEXT + + + *-- TEST + lcMemo_Salida = loObj.IndentarMemo( @lcMemo, C_TAB+C_TAB ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado, @lcMemo, @lcMemo_Salida, @lcMemo_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_evaluarUnMemo_PROCEDURE_YDarUnError_1098_Por_ProcedimientoSinCerrar + LOCAL lnCodError, lcMenError, lnCodError_Esperado ; + , lcMemo, lcMemo_Salida, lcMemo_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_bin_a_prg OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + + TEXT TO lcMemo TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + <<'PROCEDURE miMetodo'>> + Page1.Name = "Page1" + + + ENDTEXT + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + lnCodError_Esperado = 1098 + + TEXT TO lcMemo_Esperado TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + <><>Page1.Name = "Page1" + ENDTEXT + + + *-- TEST + TRY + lcMemo_Salida = loObj.IndentarMemo( @lcMemo, C_TAB+C_TAB ) + CATCH TO loEx + ENDTRY + + THIS.Evaluate_results( loEx, lnCodError_Esperado, @lcMemo, @lcMemo_Salida, @lcMemo_Esperado ) + + ENDFUNC + + +ENDDEFINE diff --git a/foxbin2prg.prg b/foxbin2prg.prg index aa2a471..366af53 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -4823,7 +4823,8 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF *-- Genero el método SIN indentar, ya que se hace luego - *TEXT TO tcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + *tcMethods2 = tcMethods + *TEXT TO tcMethods2 ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 * <<'PROCEDURE'>> <> * <> * <<'ENDPROC'>> @@ -4832,7 +4833,6 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base tcMethods = tcMethods + CR_LF + 'PROCEDURE ' + tcMethodName tcMethods = tcMethods + CR_LF + THIS.IndentarMemo( taCode(taMethods(I,2)) ) tcMethods = tcMethods + CR_LF + 'ENDPROC' - tcMethods = tcMethods + CR_LF ENDFOR ENDIF @@ -5073,7 +5073,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base LPARAMETERS tcMethod, tcIndentation *-- INDENTA EL CÓDIGO DE UN MÉTODO DADO Y QUITA LA CABECERA DE MÉTODO (PROCEDURE/ENDPROC) SI LA ENCUENTRA TRY - LOCAL I, lcMethod, llProcedure, lnInicio, lnFin + LOCAL I, X, lcMethod, llProcedure, lnInicio, lnFin, laLineas(1) lcMethod = '' llProcedure = ( LEFT(tcMethod,10) == 'PROCEDURE ' ; OR LEFT(tcMethod,17) == 'HIDDEN PROCEDURE ' ; @@ -5083,6 +5083,24 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base IF VARTYPE(tcIndentation) # 'C' tcIndentation = '' ENDIF + + *-- Quito las líneas en blanco luego del final del ENDPROC + X = 0 + FOR I = lnFin TO 1 STEP -1 + IF NOT EMPTY(laLineas(I)) && Última línea de código + IF LEFT( laLineas(I), 10 ) <> C_ENDPROC + ERROR 'Procedimiento sin cerrar. La última línea de código debe ser ENDPROC. [' + laLineas(1) + ']' + ENDIF + EXIT + ENDIF + X = X + 1 + ENDFOR + + IF X > 0 + lnFin = lnFin - X + DIMENSION laLineas(lnFin) + ENDIF + *-- Si encuentra la cabecera de un PROCEDURE, la saltea IF llProcedure @@ -5377,26 +5395,29 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base LPARAMETERS tcMethods *-- Finalmente, todos los métodos los ordeno y escribo juntos - LOCAL laMethods(1), laCode(1), lnMethodCount, I + LOCAL laMethods(1), laCode(1), lnMethodCount, I, lcMethods, lcMethods2 IF NOT EMPTY(tcMethods) + STORE '' TO lcMethods, lcMethods2 DIMENSION laMethods(1,3) THIS.SortMethod( @tcMethods, @laMethods, @laCode, '', @lnMethodCount ) FOR I = 1 TO lnMethodCount *-- Genero los métodos indentados - *TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + *TEXT TO lcMethods2 ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 * <><>PROCEDURE <> * <> * <>ENDPROC *ENDTEXT *-- Sustituyo el TEXT/ENDTEXT aquí porque a veces quita espacios de la derecha, y eso es peligroso - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + C_TAB + laMethods(I,3) + 'PROCEDURE ' + laMethods(I,1) - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + THIS.IndentarMemo( laCode(laMethods(I,2)), CHR(9) + CHR(9) ) - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + C_TAB + 'ENDPROC' - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + lcMethods = lcMethods + CR_LF + C_TAB + laMethods(I,3) + 'PROCEDURE ' + laMethods(I,1) + lcMethods = lcMethods + CR_LF + THIS.IndentarMemo( laCode(laMethods(I,2)), CHR(9) + CHR(9) ) + lcMethods = lcMethods + CR_LF + C_TAB + 'ENDPROC' + lcMethods = lcMethods + CR_LF ENDFOR + + C_FB2PRG_CODE = C_FB2PRG_CODE + lcMethods ENDIF RETURN @@ -5411,8 +5432,8 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base EXTERNAL ARRAY taMethods, taCode, taProtected, taPropsAndComments TRY - LOCAL lcMethod, lnProtectedItem, lnCommentRow, lcProcDef, lcMethods - STORE '' TO lcMethod, lcProcDef, lcMethods + LOCAL lcMethod, lnProtectedItem, lnCommentRow, lcProcDef, lcMethods, lcMethods2 + STORE '' TO lcMethod, lcProcDef, lcMethods, lcMethods2 IF tnMethodCount > 0 THEN FOR I = 1 TO tnMethodCount @@ -5448,7 +5469,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF *-- Código del método - *TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + *TEXT TO lcMethods2 ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 * <> * <>ENDPROC From e9727e69ae278ce7b62243aa526ba653fe2bf4ed Mon Sep 17 00:00:00 2001 From: fernando Date: Sat, 7 Dec 2013 16:32:52 +0100 Subject: [PATCH 4/4] =?UTF-8?q?Changeset:=2048=20Changeset:=2048=20Nuevo?= =?UTF-8?q?=20test=20de=20bloques=20de=20exclusi=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...or_base__IdentificarBloquesDeExclusion.prg | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg diff --git a/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg b/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg new file mode 100644 index 0000000..da7c064 --- /dev/null +++ b/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg @@ -0,0 +1,127 @@ +DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as FxuTestCase OF FxuTestCase.prg + + #IF .F. + LOCAL THIS AS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion OF ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.PRG + #ENDIF + + #DEFINE C_PROC 'PROCEDURE' + #DEFINE C_ENDPROC 'ENDPROC' + #DEFINE C_TEXT 'TEXT' + #DEFINE C_ENDTEXT 'ENDTEXT' + #DEFINE C_IF_F '#IF .F.' + #DEFINE C_ENDIF '#ENDIF' + icObj = NULL + + ******************************************************************************************************************************************* + FUNCTION Setup + THIS.icObj = NEWOBJECT("c_conversor_prg_a_bin", "FOXBIN2PRG.PRG") + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION TearDown + THIS.icObj = NULL + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Evaluate_results + LPARAMETERS taExpected_Pos, taPos, tnPos_Count + + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + + IF PCOUNT() = 0 + THIS.messageout( "* Support method, not a valid test." ) + RETURN .T. + ENDIF + + THIS.messageout( "Pares de posiciones esperados: " + TRANSFORM(tnPos_Count) ) + FOR I = 1 TO tnPos_Count + THIS.messageout( "Posición de Inicio/Fin esperados: " + TRANSFORM(taExpected_Pos(I,1)) + ',' + TRANSFORM(taExpected_Pos(I,2)) ) + ENDFOR + + THIS.assertequals( ALEN(taExpected_Pos,1), ALEN(taPos,1), "Posición de Inicio/Fin" ) + + FOR I = 1 TO tnPos_Count + THIS.assertequals( TRANSFORM(taExpected_Pos(I,1)) + ',' + TRANSFORM(taExpected_Pos(I,2)) ; + , TRANSFORM(taPos(I,1)) + ',' + TRANSFORM(taPos(I,2)) ; + , "Posición de Inicio/Fin" ) + ENDFOR + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_ObtenerLaUbicacionDelBloque_IF_ENDIF_CuandoCodigoCon_IF_ENDIF_predominante_esEvaluado + LOCAL lcMethod, laLineas(1), lnLineas, laPos(1,2), lnPos_Count, laExpected_Pos(2,2) + LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + + *-- Input and expected params + STORE '' TO lcMethod + laExpected_Pos(1,1) = 3 + laExpected_Pos(1,2) = 5 + laExpected_Pos(2,1) = 7 + laExpected_Pos(2,2) = 9 + + TEXT TO lcMethod NOSHOW TEXTMERGE FLAGS 1 PRETEXT 1+2+4 + <> myMethod_B + *-- Code Block + <> + <> + <> + *-- Code Block + <> + <> + <> + <> + ENDTEXT + + lnLineas = ALINES( laLineas, lcMethod ) + + *-- Test + loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , @laPos, @lnPos_Count ) + + THIS.Evaluate_results( @laExpected_Pos, @laPos, lnPos_Count ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_ObtenerLaUbicacionDelBloque_TEXT_ENDTEXT_CuandoCodigoCon_TEXT_ENDTEXT_predominante_esEvaluado + LOCAL lcMethod, laLineas(1), lnLineas, laPos(1,2), lnPos_Count, laExpected_Pos(2,2) + LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + + *-- Input and expected params + STORE '' TO lcMethod + laExpected_Pos(1,1) = 3 + laExpected_Pos(1,2) = 5 + laExpected_Pos(2,1) = 7 + laExpected_Pos(2,2) = 9 + + TEXT TO lcMethod NOSHOW TEXTMERGE FLAGS 1 PRETEXT 1+2+4 + <> myMethod_B + *-- Code Block + <> + <> + <> + *-- Code Block + <> + <> + <> + <> + ENDTEXT + + lnLineas = ALINES( laLineas, lcMethod ) + + *-- Test + loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , @laPos, @lnPos_Count ) + + THIS.Evaluate_results( @laExpected_Pos, @laPos, lnPos_Count ) + + ENDFUNC + + +ENDDEFINE