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