diff --git a/TESTS/DATOS_READONLY/fb2p_frm_1.sct b/TESTS/DATOS_READONLY/fb2p_frm_1.sct new file mode 100644 index 0000000..5324983 Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_frm_1.sct differ diff --git a/TESTS/DATOS_READONLY/fb2p_frm_1.scx b/TESTS/DATOS_READONLY/fb2p_frm_1.scx new file mode 100644 index 0000000..0391e14 Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_frm_1.scx differ diff --git a/TESTS/DATOS_READONLY/fb2p_frm_2.sct b/TESTS/DATOS_READONLY/fb2p_frm_2.sct new file mode 100644 index 0000000..803343d Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_frm_2.sct differ diff --git a/TESTS/DATOS_READONLY/fb2p_frm_2.scx b/TESTS/DATOS_READONLY/fb2p_frm_2.scx new file mode 100644 index 0000000..d52cd12 Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_frm_2.scx differ diff --git a/TESTS/DATOS_READONLY/fb2p_test.pjt b/TESTS/DATOS_READONLY/fb2p_test.pjt new file mode 100644 index 0000000..bedf8f9 Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_test.pjt differ diff --git a/TESTS/DATOS_READONLY/fb2p_test.pjx b/TESTS/DATOS_READONLY/fb2p_test.pjx new file mode 100644 index 0000000..bcbff62 Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_test.pjx differ diff --git a/TESTS/DATOS_READONLY/fb2p_test.vct b/TESTS/DATOS_READONLY/fb2p_test.vct new file mode 100644 index 0000000..b6b2a60 Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_test.vct differ diff --git a/TESTS/DATOS_READONLY/fb2p_test.vcx b/TESTS/DATOS_READONLY/fb2p_test.vcx new file mode 100644 index 0000000..c44d4b3 Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_test.vcx differ diff --git a/TESTS/fxu_lib_objetos_y_funciones_de_soporte.prg b/TESTS/fxu_lib_objetos_y_funciones_de_soporte.prg new file mode 100644 index 0000000..f12c2be --- /dev/null +++ b/TESTS/fxu_lib_objetos_y_funciones_de_soporte.prg @@ -0,0 +1,135 @@ +*-- Módulo: fxu_lib_objetos_y_funciones_de_soporte.PRG +*-- Autor: Fernando D. Bozzo - 30/11/2013 +*-- Detalle: LIBRERÍA DE SOPORTE DE LOS TESTS PARA OBJETOS Y FUNCIONES DE FOXBIN2PRG +*---------------------------------------------------------------------------------------- + + +DEFINE CLASS CL_FXU_CONFIG AS CUSTOM + #IF .F. + LOCAL THIS AS CL_FXU_CONFIG OF 'fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + + _MEMBERDATA = [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] + + + cOldPath = '' + cPath = 'FOXUNIT;TESTS;TESTS\DATOS_TEST' + cPathDatosReadOnly = 'TESTS\DATOS_READONLY' + cPathDatosTest = 'TESTS\DATOS_TEST' + cSetDate = '' + + + *---------------------------------------------------------------------------------------- + PROCEDURE INIT + THIS.cSetDate = SET("Date") + + SET DATE TO YMD + SET HOURS TO 24 + SET SAFETY OFF + SET TABLEPROMPT OFF + SET TALK OFF + + THIS.cOldPath = SET("Path") + SET PATH TO (THIS.cPath) + ENDPROC + + + *---------------------------------------------------------------------------------------- + PROCEDURE DESTROY + SET PATH TO (THIS.cOldPath) + SET DATE (THIS.cSetDate) + ENDPROC + + + *---------------------------------------------------------------------------------------- + PROCEDURE SETUP_COMUN + ERASE (FORCEPATH( '*.*', THIS.cPathDatosTest ) ) + ENDPROC + + + *---------------------------------------------------------------------------------------- + PROCEDURE TEARDOWN_COMUN + USE IN (SELECT("TABLABIN")) + ENDPROC + + + *---------------------------------------------------------------------------------------- + PROCEDURE copiarArchivosParaTest + LPARAMETERS tcFileSpec + + COPY FILE (FORCEPATH( tcFileSpec, THIS.cPathDatosReadOnly )) TO (FORCEPATH( tcFileSpec, THIS.cPathDatosTest )) + ENDPROC + + + *---------------------------------------------------------------------------------------- + FUNCTION mejorarPresentacionCaracteresEspeciales + LPARAMETERS tcText + RETURN STRTRAN( ; + STRTRAN( ; + STRTRAN( ; + STRTRAN( ; + STRTRAN( ; + STRTRAN( tcText, CHR(13)+CHR(10), '' ) ; + , CHR(13), '' ) ; + , CHR(10), '' ) ; + , CHR(9), '' ) ; + , ' ', '·' ) ; + , '', ''+CHR(13)+CHR(10) ) + ENDFUNC + + + *---------------------------------------------------------------------------------------- + PROCEDURE prepararObjetoReg_SCX + LPARAMETERS toReg, tcClass, tcParent, tcObjName + + toReg = CREATEOBJECT("EMPTY") + ADDPROPERTY( toReg, 'Class', tcClass ) + ADDPROPERTY( toReg, 'Parent', tcParent ) + ADDPROPERTY( toReg, 'objName', tcObjName ) + ADDPROPERTY( toReg, 'Reserved1', '' ) + ADDPROPERTY( toReg, 'Reserved2', '' ) + ADDPROPERTY( toReg, 'Reserved3', '' ) + ADDPROPERTY( toReg, 'Reserved4', '' ) + ADDPROPERTY( toReg, 'Reserved5', '' ) + ADDPROPERTY( toReg, 'Reserved6', '' ) + ADDPROPERTY( toReg, 'Reserved7', '' ) + ADDPROPERTY( toReg, 'Reserved8', '' ) + ADDPROPERTY( toReg, 'Properties', '' ) + ADDPROPERTY( toReg, 'Protected', '' ) + ADDPROPERTY( toReg, 'Methods', '' ) + ENDPROC + + + *---------------------------------------------------------------------------------------- + PROCEDURE prepararObjetoReg_VCX + LPARAMETERS toReg, tcClass, tcParent, tcObjName + + toReg = CREATEOBJECT("EMPTY") + ADDPROPERTY( toReg, 'Class', tcClass ) + ADDPROPERTY( toReg, 'Parent', tcParent ) + ADDPROPERTY( toReg, 'objName', tcObjName ) + ADDPROPERTY( toReg, 'Reserved1', '' ) + ADDPROPERTY( toReg, 'Reserved2', '' ) + ADDPROPERTY( toReg, 'Reserved3', '' ) + ADDPROPERTY( toReg, 'Reserved4', '' ) + ADDPROPERTY( toReg, 'Reserved5', '' ) + ADDPROPERTY( toReg, 'Reserved6', '' ) + ADDPROPERTY( toReg, 'Reserved7', '' ) + ADDPROPERTY( toReg, 'Reserved8', '' ) + ADDPROPERTY( toReg, 'Properties', '' ) + ADDPROPERTY( toReg, 'Protected', '' ) + ADDPROPERTY( toReg, 'Methods', '' ) + ENDPROC + + +ENDDEFINE diff --git a/TESTS/ut__foxbin2prg.prg b/TESTS/ut__foxbin2prg.prg new file mode 100644 index 0000000..34ab5b3 --- /dev/null +++ b/TESTS/ut__foxbin2prg.prg @@ -0,0 +1,362 @@ +DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg + + #IF .F. + LOCAL THIS AS ut__foxbin2prg OF ut__foxbin2prg.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_base", "FOXBIN2PRG.PRG") + *loObj = THIS.icObj + *loObj.l_Test = .F. + + 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, tc_OutputFile, tcParent, tcClass, tcObjName, toReg_Esperado + + #IF .F. + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + + IF PCOUNT() = 0 + THIS.messageout( "* Support method, not a valid test." ) + RETURN .T. + ENDIF + + + LOCAL lnCodError, lcTipoBinario, toReg ; + , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ; + , loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG" + + *-- TEST + 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 + '"' + 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 + + SCATTER MEMO NAME toReg + + CATCH TO toEx + FINALLY + USE IN (SELECT("TABLABIN")) + ENDTRY + + + IF ISNULL(toEx) + LOCAL laPropsAndValues(1,2), lnPropsAndValues_Count, laPropsAndValues_Esperado(1,2), lnPropsAndValues_Count_Esperado ; + , lnPropsAndComments_Count, lnPropsAndComments_Count_Esperado, laPropsAndComments(1,2), laPropsAndComments_Esperado(1,2) ; + , laProtected(1), lnProtected_Count, laProtected_Esperado(1), lnProtected_Count_Esperado ; + , laMethods(1,2), lnMethods_Count, laMethods_Esperado(1,2), lnMethods_Count_Esperado, lcExtraData + LOCAL loObj AS c_conversor_bin_a_prg OF "FOXBIN2PRG.PRG" + + *-- Algunos ajustes para mejor visualización de caracteres especiales + *tcPropValue = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcPropValue ) + loObj = NEWOBJECT("c_conversor_bin_a_prg", "FOXBIN2PRG.PRG") + + *-- Reserved3 + loObj.get_PropsAndCommentsFrom_RESERVED3( toReg.RESERVED3, .F., @laPropsAndComments, @lnPropsAndComments_Count, '' ) + loObj.get_PropsAndCommentsFrom_RESERVED3( toReg_Esperado.RESERVED3, .F., @laPropsAndComments_Esperado, @lnPropsAndComments_Count_Esperado, '' ) + + *-- Properties + loObj.get_PropsAndValuesFrom_PROPERTIES( toReg.PROPERTIES, 0, @laPropsAndValues, @lnPropsAndValues_Count, '' ) + loObj.get_PropsAndValuesFrom_PROPERTIES( toReg_Esperado.PROPERTIES, 0, @laPropsAndValues_Esperado, @lnPropsAndValues_Count_Esperado, '' ) + + *-- Protected + loObj.get_PropsFrom_PROTECTED( toReg.PROTECTED, .F., @laProtected, @lnProtected_Count, '' ) + loObj.get_PropsFrom_PROTECTED( toReg_Esperado.PROTECTED, .F., @laProtected_Esperado, @lnProtected_Count_Esperado, '' ) + + *-- Methods + loObj.get_ADD_OBJECT_METHODS( toReg, toReg, '', @laMethods, '', @lnMethods_Count ) + loObj.get_ADD_OBJECT_METHODS( toReg_Esperado, toReg_Esperado, '', @laMethods_Esperado, '', @lnMethods_Count_Esperado ) + + lcExtraData = tcParent + '.' + tcObjName + ' (' + tcClass + ')' + + + *-- Visualización de valores + THIS.messageout( LOWER(PROGRAM(PROGRAM(-1)-1)) ) + + THIS.messageout( 'PROPERTIES esperadas para ' + lcExtraData + ': ' ; + + TRANSFORM(lnPropsAndValues_Count_Esperado) + ' (Tamaño = ' + TRANSFORM(LEN(toReg_Esperado.PROPERTIES)) + ' bytes)' ) + *THIS.messageout( REPLICATE('-',80) ) + *FOR I = 1 TO lnPropsAndValues_Count_Esperado + * THIS.messageout( 'PropName = ' + TRANSFORM(laPropsAndValues_Esperado(I,1)) ) + *ENDFOR + + THIS.messageout( 'PROTECTED esperadas para ' + lcExtraData + ': ' ; + + TRANSFORM(lnProtected_Count_Esperado) + ' (Tamaño = ' + TRANSFORM(LEN(toReg_Esperado.PROTECTED)) + ' bytes)' ) + *THIS.messageout( REPLICATE('-',80) ) + *FOR I = 1 TO lnProtected_Count_Esperado + * THIS.messageout( 'PropName = ' + TRANSFORM(laProtected_Esperado(I,1)) ) + *ENDFOR + + THIS.messageout( 'RESERVED3 esperadas para ' + lcExtraData + ': ' ; + + TRANSFORM(lnPropsAndComments_Count_Esperado) + ' (Tamaño = ' + TRANSFORM(LEN(toReg_Esperado.RESERVED3)) + ' bytes)' ) + *THIS.messageout( REPLICATE('-',80) ) + *FOR I = 1 TO lnPropsAndComments_Count_Esperado + * THIS.messageout( 'PropName = ' + TRANSFORM(laPropsAndComments_Esperado(I,1)) ) + *ENDFOR + + THIS.messageout( 'METHODS esperadas para ' + lcExtraData + ': ' ; + + TRANSFORM(lnMethods_Count_Esperado) + ' (Tamaño = ' + TRANSFORM(LEN(toReg_Esperado.METHODS)) + ' bytes)' ) + *THIS.messageout( REPLICATE('-',80) ) + *FOR I = 1 TO lnMethods_Count_Esperado + * THIS.messageout( 'Name = ' + TRANSFORM(laMethods_Esperado(I,1)) ) + *ENDFOR + + THIS.messageout( 'OLE2 esperado para ' + lcExtraData + ': ' + TRANSFORM(toReg_Esperado.OLE2) ) + + THIS.messageout( 'Checksum OLE esperado para ' + lcExtraData + ': ' + TRANSFORM(SYS(2007, toReg_Esperado.OLE)) ) + + + *-- Evaluación de valores + THIS.assertequals( toReg_Esperado.Reserved1, toReg.Reserved1, "Valor de RESERVED1 para " + lcExtraData ) + THIS.assertequals( LEN(toReg_Esperado.Reserved1), LEN(toReg.Reserved1), "Tamaño de RESERVED1 para " + lcExtraData ) + + THIS.assertequals( toReg_Esperado.Reserved2, toReg.Reserved2, "Valor de RESERVED2 para " + lcExtraData ) + THIS.assertequals( LEN(toReg_Esperado.Reserved2), LEN(toReg.Reserved2), "Tamaño de RESERVED2 para " + lcExtraData ) + + THIS.assertequals( toReg_Esperado.Reserved4, toReg.Reserved4, "Valor de RESERVED4 para " + lcExtraData ) + THIS.assertequals( LEN(toReg_Esperado.Reserved4), LEN(toReg.Reserved4), "Tamaño de RESERVED4 para " + lcExtraData ) + + THIS.assertequals( toReg_Esperado.Reserved5, toReg.Reserved5, "Valor de RESERVED5 para " + lcExtraData ) + THIS.assertequals( LEN(toReg_Esperado.Reserved5), LEN(toReg.Reserved5), "Tamaño de RESERVED5 para " + lcExtraData ) + + THIS.assertequals( toReg_Esperado.Reserved6, toReg.Reserved6, "Valor de RESERVED6 para " + lcExtraData ) + THIS.assertequals( LEN(toReg_Esperado.Reserved6), LEN(toReg.Reserved6), "Tamaño de RESERVED6 para " + lcExtraData ) + + THIS.assertequals( toReg_Esperado.Reserved7, toReg.Reserved7, "Valor de RESERVED7 para " + lcExtraData ) + THIS.assertequals( LEN(toReg_Esperado.Reserved7), LEN(toReg.Reserved7), "Tamaño de RESERVED7 para " + lcExtraData ) + + THIS.assertequals( toReg_Esperado.Reserved8, toReg.Reserved8, "Valor de RESERVED8 para " + lcExtraData ) + THIS.assertequals( LEN(toReg_Esperado.Reserved8), LEN(toReg.Reserved8), "Tamaño de RESERVED8 para " + lcExtraData ) + + THIS.assertequals( toReg_Esperado.OLE2, toReg.OLE2, "Valor de OLE2 para " + lcExtraData ) + THIS.assertequals( LEN(toReg_Esperado.OLE2), LEN(toReg.OLE2), "Tamaño de OLE2 para " + lcExtraData ) + + THIS.assertequals( SYS(2007, toReg_Esperado.OLE), SYS(2007, toReg.OLE), "Valor de OLE (Checksum) para " + lcExtraData ) + THIS.assertequals( LEN(toReg_Esperado.OLE), LEN(toReg.OLE), "Tamaño de OLE para " + lcExtraData ) + + *-- PROPERTIES + THIS.assertequals( LEN(toReg_Esperado.PROPERTIES), LEN(toReg.PROPERTIES), "Tamaño de PROPERTIES para " + lcExtraData ) + THIS.assertequals( lnPropsAndValues_Count_Esperado, lnPropsAndValues_Count, "Cantidad de PROPERTIES para " + lcExtraData ) + FOR I = 1 TO lnPropsAndValues_Count_Esperado + THIS.asserttrue( ASCAN( laPropsAndValues, laPropsAndValues_Esperado(I,1), 1, -1, 1, 0+2+4) > 0 ; + , ' Comprobación de que existe la Property "' + TRANSFORM(laPropsAndValues_Esperado(I,1)) + '"' + " para " + lcExtraData ) + ENDFOR + + *-- RESERVED3 + THIS.assertequals( LEN(toReg_Esperado.RESERVED3), LEN(toReg.RESERVED3), "Tamaño de RESERVED3 para " + lcExtraData ) + THIS.assertequals( lnPropsAndComments_Count_Esperado, lnPropsAndComments_Count, "Cantidad de RESERVED3 para " + lcExtraData ) + FOR I = 1 TO lnPropsAndComments_Count_Esperado + THIS.asserttrue( ASCAN( laPropsAndComments, laPropsAndComments_Esperado(I,1), 1, -1, 1, 0+2+4) > 0 ; + , ' Comprobación de que existe la Reserved3 "' + TRANSFORM(laPropsAndComments_Esperado(I,1)) + '"' + " para " + lcExtraData ) + ENDFOR + + *-- PROTECTED + THIS.assertequals( LEN(toReg_Esperado.PROTECTED), LEN(toReg.PROTECTED), "Tamaño de PROTECTED para " + lcExtraData ) + THIS.assertequals( lnProtected_Count_Esperado, lnProtected_Count, "Cantidad de PROTECTED para " + lcExtraData ) + FOR I = 1 TO lnProtected_Count_Esperado + THIS.asserttrue( ASCAN( laProtected, laProtected_Esperado(I,1), 1, -1, 1, 0+2+4) > 0 ; + , ' Comprobación de que existe la Protected "' + TRANSFORM(laProtected_Esperado(I,1)) + '"' + " para " + lcExtraData ) + ENDFOR + + *-- METHODS + 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 ) + 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 ; + , ' Comprobación de que existe el Method "' + TRANSFORM(laMethods_Esperado(I,1)) + '"' + " para " + lcExtraData ) + ENDFOR + + ELSE + *-- Evaluación de errores + THIS.messageout( "Error " + TRANSFORM(toEx.ERRORNO) + ', ' + TRANSFORM(toEx.MESSAGE) ) + THIS.messageout( toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) ) + IF NOT INLIST( toEx.ERRORNO, 1098, 2071 ) && Error del usuario (ERROR y THROW) + THIS.messageout( TRANSFORM(toEx.LINECONTENTS) ) + ENDIF + + THIS.assertequals( tnCodError_Esperado, toEx.ERRORNO, 'Error' ) + ENDIF + + THIS.messageout( '' ) + THIS.messageout( REPLICATE('*',80) ) + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaElForm_FB2P_SCX_YValidarLosCamposDelRegistro + 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. + + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lc_File = 'fb2p_frm_1.scx' + 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('Form',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_YValidarLosCamposDelRegistro + 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.vcx' && 'THCALC.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 + + +ENDDEFINE diff --git a/TESTS/ut__foxbin2prg__c_conversor_base__GetTimeStamp.prg b/TESTS/ut__foxbin2prg__c_conversor_base__GetTimeStamp.prg new file mode 100644 index 0000000..8def1ab --- /dev/null +++ b/TESTS/ut__foxbin2prg__c_conversor_base__GetTimeStamp.prg @@ -0,0 +1,266 @@ +DEFINE CLASS ut__foxbin2prg__c_conversor_base__GetTimeStamp AS FxuTestCase OF FxuTestCase.prg + + #IF .F. + LOCAL THIS AS ut__foxbin2prg__c_conversor_base__GetTimeStamp OF ut__foxbin2prg__c_conversor_base__GetTimeStamp.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_base", "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, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_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_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + + IF PCOUNT() = 0 + THIS.messageout( "* Support method, not a valid test." ) + RETURN .T. + ENDIF + + IF ISNULL(toEx) + + *-- Visualización de valores + THIS.messageout( ' TimeStamp (T) = ' + TRANSFORM(ltTimeStamp) ) + THIS.messageout( ' TimeStamp (N) = ' + TRANSFORM(lnTimeStamp) ) + + + *-- Evaluación de valores + THIS.assertequals( ltTimeStamp_Esperado, ltTimeStamp, "[Fecha y Hora]" ) + + 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_DevolverLaFechaHora_2013_12_01_08_02_00_ParaElValor_1132544064 + LOCAL lnCodError, lnCodError_Esperado ; + , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lnTimeStamp = 1132544064 && Corresponde a {^2013/12/01 8:02:00} + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + ltTimeStamp_Esperado = TTOC({^2013/12/01 8:02:00}) + + *-- TEST + ltTimeStamp = loObj.gettimestamp( lnTimeStamp ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_DevolverLaFechaHora_2013_12_01_08_02_01_ParaElValor_1132544065 + LOCAL lnCodError, lnCodError_Esperado ; + , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lnTimeStamp = 1132544065 && Corresponde a {^2013/12/01 8:02:01} + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + ltTimeStamp_Esperado = TTOC({^2013/12/01 8:02:01}) + + *-- TEST + ltTimeStamp = loObj.gettimestamp( lnTimeStamp ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_DevolverLaFechaHora_2013_12_01_08_02_30_ParaElValor_1132544094 + LOCAL lnCodError, lnCodError_Esperado ; + , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lnTimeStamp = 1132544094 && Corresponde a {^2013/12/01 8:02:30} + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + ltTimeStamp_Esperado = TTOC({^2013/12/01 8:02:30}) + + *-- TEST + ltTimeStamp = loObj.gettimestamp( lnTimeStamp ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_DevolverLaFechaHora_2013_12_01_08_02_31_ParaElValor_1132544095 + LOCAL lnCodError, lnCodError_Esperado ; + , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lnTimeStamp = 1132544095 && Corresponde a {^2013/12/01 8:02:31} + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + ltTimeStamp_Esperado = TTOC({^2013/12/01 8:02:31}) + + *-- TEST + ltTimeStamp = loObj.gettimestamp( lnTimeStamp ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_DevolverLaFechaHora_2013_12_01_08_03_00_ParaElValor_1132544096 + LOCAL lnCodError, lnCodError_Esperado ; + , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lnTimeStamp = 1132544096 && Corresponde a {^2013/12/01 8:02:32} + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + ltTimeStamp_Esperado = TTOC({^2013/12/01 8:03:00}) + + *-- TEST + ltTimeStamp = loObj.gettimestamp( lnTimeStamp ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_DevolverLaFechaHora_2013_12_01_08_03_01_ParaElValor_1132544097 + LOCAL lnCodError, lnCodError_Esperado ; + , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lnTimeStamp = 1132544097 && Corresponde a {^2013/12/01 8:02:33} + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + ltTimeStamp_Esperado = TTOC({^2013/12/01 8:03:01}) + + *-- TEST + ltTimeStamp = loObj.gettimestamp( lnTimeStamp ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_DevolverLaFechaHora_2013_12_01_08_03_27_ParaElValor_1132544123__HoraReal__08_02_59 + LOCAL lnCodError, lnCodError_Esperado ; + , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lnTimeStamp = 1132544123 && Corresponde a {^2013/12/01 8:02:59} + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + ltTimeStamp_Esperado = TTOC({^2013/12/01 8:03:27}) + + *-- TEST + ltTimeStamp = loObj.gettimestamp( lnTimeStamp ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ) + + ENDFUNC + + +ENDDEFINE diff --git a/TESTS/ut__foxbin2prg__c_conversor_base__RowTimeStamp.prg b/TESTS/ut__foxbin2prg__c_conversor_base__RowTimeStamp.prg new file mode 100644 index 0000000..f4732f0 --- /dev/null +++ b/TESTS/ut__foxbin2prg__c_conversor_base__RowTimeStamp.prg @@ -0,0 +1,325 @@ +DEFINE CLASS ut__foxbin2prg__c_conversor_base__RowTimeStamp AS FxuTestCase OF FxuTestCase.prg + + #IF .F. + LOCAL THIS AS ut__foxbin2prg__c_conversor_base__RowTimeStamp OF ut__foxbin2prg__c_conversor_base__RowTimeStamp.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_base", "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, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_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_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + + IF PCOUNT() = 0 + THIS.messageout( "* Support method, not a valid test." ) + RETURN .T. + ENDIF + + IF ISNULL(toEx) + + *-- Visualización de valores + THIS.messageout( ' TimeStamp (T) = ' + TRANSFORM(ltTimeStamp) ) + THIS.messageout( ' TimeStamp (N) = ' + TRANSFORM(lnTimeStamp) ) + + + *-- Evaluación de valores + THIS.assertequals( lnTimeStamp_Esperado, lnTimeStamp, "[Valor de TimeStamp]" ) + + 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_DevolverElValor_1132544064_ParaLaFechaHora_2013_12_01_08_02_00 + LOCAL lnCodError, lnCodError_Esperado ; + , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + ltTimeStamp = {^2013/12/01 8:02:00} && Le corresponde el numero 1132544064 + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + lnTimeStamp_Esperado = 1132544064 + *lnTimeStamp_Esperado = loObj.rowtimestamp( ltTimeStamp ) + + *-- TEST + lnTimeStamp = loObj.rowtimestamp( ltTimeStamp ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_DevolverElValor_1132544065_ParaLaFechaHora_2013_12_01_08_02_01 + LOCAL lnCodError, lnCodError_Esperado ; + , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + ltTimeStamp = {^2013/12/01 8:02:01} && Le corresponde el numero 1132544065 + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + lnTimeStamp_Esperado = 1132544065 + *lnTimeStamp_Esperado = loObj.rowtimestamp( ltTimeStamp ) + + *-- TEST + lnTimeStamp = loObj.rowtimestamp( ltTimeStamp ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_DevolverElValor_1132544095_ParaLaFechaHora_2013_12_01_08_02_31 + LOCAL lnCodError, lnCodError_Esperado ; + , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + ltTimeStamp = {^2013/12/01 8:02:31} && Le corresponde el numero 1132544095 + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + lnTimeStamp_Esperado = 1132544095 + *lnTimeStamp_Esperado = loObj.rowtimestamp( ltTimeStamp ) + + *-- TEST + lnTimeStamp = loObj.rowtimestamp( ltTimeStamp ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_DevolverElValor_1132544096_ParaLaFechaHora_2013_12_01_08_02_32 + LOCAL lnCodError, lnCodError_Esperado ; + , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + ltTimeStamp = {^2013/12/01 8:02:32} && Le corresponde el numero 1132544096 + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + lnTimeStamp_Esperado = 1132544096 + *lnTimeStamp_Esperado = loObj.rowtimestamp( ltTimeStamp ) + + *-- TEST + lnTimeStamp = loObj.rowtimestamp( ltTimeStamp ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_DevolverElValor_1132544097_ParaLaFechaHora_2013_12_01_08_02_33 + LOCAL lnCodError, lnCodError_Esperado ; + , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + ltTimeStamp = {^2013/12/01 8:02:33} && Le corresponde el numero 1132544097 + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + lnTimeStamp_Esperado = 1132544097 + *lnTimeStamp_Esperado = loObj.rowtimestamp( ltTimeStamp-1 ) + + *-- TEST + lnTimeStamp = loObj.rowtimestamp( ltTimeStamp ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_DevolverElValor_1132544123_ParaLaFechaHora_2013_12_01_08_02_59 + LOCAL lnCodError, lnCodError_Esperado ; + , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + ltTimeStamp = {^2013/12/01 8:02:59} && Le corresponde el numero 1132544123 + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + lnTimeStamp_Esperado = 1132544123 + *lnTimeStamp_Esperado = loObj.rowtimestamp( ltTimeStamp ) + + *-- TEST + lnTimeStamp = loObj.rowtimestamp( ltTimeStamp ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_DevolverElValor_1132544096_ParaLaFechaHora_2013_12_01_08_03_00 + LOCAL lnCodError, lnCodError_Esperado ; + , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + ltTimeStamp = {^2013/12/01 8:03:00} && Le corresponde el numero 1132544096 + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + lnTimeStamp_Esperado = 1132544096 + *lnTimeStamp_Esperado = loObj.rowtimestamp( ltTimeStamp ) + + *-- TEST + lnTimeStamp = loObj.rowtimestamp( ltTimeStamp ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_DevolverElValor_1132544097_ParaLaFechaHora_2013_12_01_08_03_01 + LOCAL lnCodError, lnCodError_Esperado ; + , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + ltTimeStamp = {^2013/12/01 8:03:01} && Le corresponde el numero 1132544097 + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + lnTimeStamp_Esperado = 1132544097 + *lnTimeStamp_Esperado = loObj.rowtimestamp( ltTimeStamp-1 ) + + *-- TEST + lnTimeStamp = loObj.rowtimestamp( ltTimeStamp ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_DevolverElValor_1132544123_ParaLaFechaHora_2013_12_01_08_03_27 + LOCAL lnCodError, lnCodError_Esperado ; + , ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + ltTimeStamp = {^2013/12/01 8:03:27} && Le corresponde el numero 1132544123 + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + lnTimeStamp_Esperado = 1132544123 + *lnTimeStamp_Esperado = loObj.rowtimestamp( ltTimeStamp ) + + *-- TEST + lnTimeStamp = loObj.rowtimestamp( ltTimeStamp ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado, ltTimeStamp, ltTimeStamp_Esperado, lnTimeStamp, lnTimeStamp_Esperado ) + + ENDFUNC + + +ENDDEFINE diff --git a/TESTS/ut__foxbin2prg__c_conversor_base__get_SeparatedPropAndValue.prg b/TESTS/ut__foxbin2prg__c_conversor_base__get_SeparatedPropAndValue.prg new file mode 100644 index 0000000..69798d8 --- /dev/null +++ b/TESTS/ut__foxbin2prg__c_conversor_base__get_SeparatedPropAndValue.prg @@ -0,0 +1,127 @@ +DEFINE CLASS ut__foxbin2prg__c_conversor_base__get_SeparatedPropAndValue AS FxuTestCase OF FxuTestCase.prg + + #IF .F. + LOCAL THIS AS ut__foxbin2prg__c_conversor_base__get_SeparatedPropAndValue OF ut__foxbin2prg__c_conversor_base__get_SeparatedPropAndValue.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_base", "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 ; + , tcPropName, tcPropValue, tcComentario, tcPropName_Esperado, tcPropValue_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_base 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 + tcPropValue = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcPropValue ) + tcPropValue_Esperado = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcPropValue_Esperado ) + + + *-- Visualización de valores + THIS.messageout( ' PropName = ' + TRANSFORM(tcPropName) ) + THIS.messageout( ' PropValue = ' + TRANSFORM(tcPropValue) ) + + + *-- Evaluación de valores + THIS.assertequals( tcPropName_Esperado, tcPropName, "PropsAndValues_Count" ) + THIS.assertequals( tcPropValue_Esperado, tcPropValue, "PropsAndValues_Count" ) + + 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_DevolverSeparados_Prop_y_Value + LOCAL lnCodError, lcMenError, lnCodError_Esperado ; + , laProps(1,2) ,lcPropName, lcPropValue, lcComentario, lcPropName_Esperado, lcPropValue_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lcPropName = '_memberdata' + lcPropValue = '' + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + laProps( 1,1) = 'prop_especial_cr = Este es el valor 1 Este el 2 Y este bajo Shift_Enter el 3' + laProps( 1,2) = '' + lcPropName_Esperado = 'prop_especial_cr' + lcPropValue_Esperado = 'Este es el valor 1 Este el 2 Y este bajo Shift_Enter el 3' + + *-- TEST + loObj.get_SeparatedPropAndValue( laProps(1,1), @lcPropName, @lcPropValue ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado ; + , @lcPropName, @lcPropValue, @lcComentario, @lcPropName_Esperado, @lcPropValue_Esperado ) + + ENDFUNC + + +ENDDEFINE diff --git a/TESTS/ut__foxbin2prg__c_conversor_base__normalizarValorPropiedad.prg b/TESTS/ut__foxbin2prg__c_conversor_base__normalizarValorPropiedad.prg new file mode 100644 index 0000000..774d812 --- /dev/null +++ b/TESTS/ut__foxbin2prg__c_conversor_base__normalizarValorPropiedad.prg @@ -0,0 +1,235 @@ +DEFINE CLASS ut__foxbin2prg__c_conversor_base__normalizarValorPropiedad AS FxuTestCase OF FxuTestCase.prg + + #IF .F. + LOCAL THIS AS ut__foxbin2prg__c_conversor_base__normalizarValorPropiedad OF ut__foxbin2prg__c_conversor_base__normalizarValorPropiedad.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_base", "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 ; + , tcPropName, tcPropValue, tcComentario, tcPropValue_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_base 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 + tcPropValue = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcPropValue ) + tcPropValue_Esperado = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcPropValue_Esperado ) + + + *-- Visualización de valores + THIS.messageout( ' PropName = ' + TRANSFORM(tcPropName) ) + THIS.messageout( ' PropValue = ' + TRANSFORM(tcPropValue) ) + + + *-- Evaluación de valores + THIS.assertequals( tcPropValue_Esperado, tcPropValue, "PropsAndValues_Count" ) + + 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_normalizarLaPropiedad_memberdata_separandoLosMiembrosPorLinea_ConLosTags_VFPData_PorFuera + LOCAL lnCodError, lcMenError, lnCodError_Esperado ; + , lcPropName, lcPropValue, lcComentario, lcPropValue_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lcPropName = '_memberdata' + lcPropValue = '' + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + TEXT TO lcPropValue_Esperado TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + + <><> + <><> + ENDTEXT + + *-- TEST + loObj.normalizarValorPropiedad( @lcPropName, @lcPropValue, @lcComentario ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado ; + , @lcPropName, @lcPropValue, @lcComentario, @lcPropValue_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_normalizarUnaPropiedadCon_CR__AgregandoLosTags_fb2p_value_PorFueraYCodificandoLos_CR + LOCAL lnCodError, lcMenError, lnCodError_Esperado ; + , lcPropName, lcPropValue, lcComentario, lcPropValue_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lcPropName = 'unaPropiedadCon_CR' + lcPropValue = C_FB2P_VALUE_I + 'valor 1' + C_CR + 'valor 2' + C_CR + 'valor 3' + C_FB2P_VALUE_F + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + lcPropValue_Esperado = C_FB2P_VALUE_I + 'valor 1 valor 2 valor 3' + C_FB2P_VALUE_F + + *-- TEST + loObj.normalizarValorPropiedad( @lcPropName, @lcPropValue, @lcComentario ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado ; + , @lcPropName, @lcPropValue, @lcComentario, @lcPropValue_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_normalizarUnaPropiedadCon_CRLF__AgregandoLosTags_fb2p_value_PorFueraYSinCodificarLos_CRLF + LOCAL lnCodError, lcMenError, lnCodError_Esperado ; + , lcPropName, lcPropValue, lcComentario, lcPropValue_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lcPropName = 'unaPropiedadCon_CR' + lcPropValue = C_FB2P_VALUE_I + 'valor 1' + CR_LF + 'valor 2' + CR_LF + 'valor 3' + C_FB2P_VALUE_F + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + lcPropValue_Esperado = C_FB2P_VALUE_I + 'valor 1' + CR_LF + 'valor 2' + CR_LF + 'valor 3' + C_FB2P_VALUE_F + + *-- TEST + loObj.normalizarValorPropiedad( @lcPropName, @lcPropValue, @lcComentario ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado ; + , @lcPropName, @lcPropValue, @lcComentario, @lcPropValue_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_normalizarUnaPropiedadCon_CR_y_CRLF_mixta__AgregandoLosTags_fb2p_value_PorFueraCodificandoLos_CR_yMantneiendoLos_CRLF + LOCAL lnCodError, lcMenError, lnCodError_Esperado ; + , lcPropName, lcPropValue, lcComentario, lcPropValue_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lcPropName = 'unaPropiedadCon_CR' + lcPropValue = C_FB2P_VALUE_I + 'valor 1' + C_CR + 'valor 2' + CR_LF + 'valor 3' + C_FB2P_VALUE_F + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + lcPropValue_Esperado = C_FB2P_VALUE_I + 'valor 1' + ' ' + 'valor 2' + CR_LF + 'valor 3' + C_FB2P_VALUE_F + + *-- TEST + loObj.normalizarValorPropiedad( @lcPropName, @lcPropValue, @lcComentario ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado ; + , @lcPropName, @lcPropValue, @lcComentario, @lcPropValue_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_normalizarUnaPropiedadCon_LF_y_CRLF_mixta__AgregandoLosTags_fb2p_value_PorFueraCodificandoLos_LF_yMantneiendoLos_CRLF + LOCAL lnCodError, lcMenError, lnCodError_Esperado ; + , lcPropName, lcPropValue, lcComentario, lcPropValue_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lcPropName = 'unaPropiedadCon_CR' + lcPropValue = C_FB2P_VALUE_I + 'valor 1' + C_LF + 'valor 2' + CR_LF + 'valor 3' + C_FB2P_VALUE_F + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + lcPropValue_Esperado = C_FB2P_VALUE_I + 'valor 1' + ' ' + 'valor 2' + CR_LF + 'valor 3' + C_FB2P_VALUE_F + + *-- TEST + loObj.normalizarValorPropiedad( @lcPropName, @lcPropValue, @lcComentario ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado ; + , @lcPropName, @lcPropValue, @lcComentario, @lcPropValue_Esperado ) + + ENDFUNC + + +ENDDEFINE diff --git a/TESTS/ut__foxbin2prg__c_conversor_bin_a_prg__get_PropsAndValuesFrom_PROPERTIES.prg b/TESTS/ut__foxbin2prg__c_conversor_bin_a_prg__get_PropsAndValuesFrom_PROPERTIES.prg new file mode 100644 index 0000000..46841c3 --- /dev/null +++ b/TESTS/ut__foxbin2prg__c_conversor_bin_a_prg__get_PropsAndValuesFrom_PROPERTIES.prg @@ -0,0 +1,296 @@ +DEFINE CLASS ut__foxbin2prg__c_conversor_bin_a_prg__get_PropsAndValuesFrom_PROPERTIES AS FxuTestCase OF FxuTestCase.prg + + #IF .F. + LOCAL THIS AS ut__foxbin2prg__c_conversor_bin_a_prg__get_PropsAndValuesFrom_PROPERTIES OF ut__foxbin2prg__c_conversor_bin_a_prg__get_PropsAndValuesFrom_PROPERTIES.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, tnSort, taPropsAndValues, tnPropsAndValues_Count, tcSortedMemo ; + , taPropsAndValues_Esperado, tnPropsAndValues_Count_Esperado, 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 + tcSortedMemo = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcSortedMemo ) + tcMemo_Esperado = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcMemo_Esperado ) + FOR I = 1 TO tnPropsAndValues_Count + taPropsAndValues(I,2) = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( TRANSFORM(taPropsAndValues(I,2)) ) + ENDFOR + FOR I = 1 TO tnPropsAndValues_Count_Esperado + taPropsAndValues_Esperado(I,2) = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( TRANSFORM(taPropsAndValues_Esperado(I,2)) ) + ENDFOR + + + *-- Visualización de valores + THIS.messageout( ' Sort = ' + TRANSFORM(tnSort) ) + THIS.messageout( REPLICATE('-',50) ) + FOR I = 1 TO tnPropsAndValues_Count + THIS.messageout( "taPropsAndValues(" + STR(I,3) + '): ' ; + + TRANSFORM(taPropsAndValues(I,1)) + ' = ' + TRANSFORM(taPropsAndValues(I,2)) + '' ) + ENDFOR + THIS.messageout( REPLICATE('-',50) ) + FOR I = 1 TO tnPropsAndValues_Count_Esperado + THIS.messageout( "taPropsAndValues_Esp(" + STR(I,3) + '): ' ; + + TRANSFORM(taPropsAndValues_Esperado(I,1)) + ' = ' + TRANSFORM(taPropsAndValues_Esperado(I,2)) + '' ) + ENDFOR + THIS.messageout( REPLICATE('-',50) ) + THIS.messageout( 'Sorted Memo: [' + tcSortedMemo + ']' ) + + + *-- Evaluación de valores + THIS.assertequals( tnPropsAndValues_Count_Esperado, tnPropsAndValues_Count, "PropsAndValues_Count" ) + + FOR I = 1 TO MIN(tnPropsAndValues_Count, tnPropsAndValues_Count_Esperado) + THIS.assertequals( taPropsAndValues_Esperado(I,1), taPropsAndValues(I,1), "PropAndValue" ) + ENDFOR + + THIS.assertequals( tcMemo_Esperado, tcSortedMemo, "Memo" ) + + 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_PROPERTIES_yDevolverUnArrayConLasPropsOrdenadas_PrimeroLasNormalesYLuegoLasDeObjeto_Sorted + LOCAL lnCodError, lcMenError, lnCodError_Esperado ; + , lnSort, laPropsAndValues(1,2), lnPropsAndValues_Count, lcMemo, lcSortedMemo ; + , laPropsAndValues_Esperado(1,2), lnPropsAndValues_Count_Esperado, 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 + Height = 2.73 + Width = 27.40 + prop1 = .F. + _memberdata = + prop_especial_cr = <> 57Este es el valor 1 Este el 2 Y este bajo Shift_Enter el 3 + prop_especial_crlf = <> 35El valor 1 + El valor 2 + Y el 3! + <> + Name = "c1" + Page2.Caption = "Page2" + Page1.Name = "Page1" + ENDTEXT + + lcMemo = STRTRAN( STRTRAN( lcMemo, ' ', CHR(13) ), ' ', CHR(10) ) + lnSort = 1 + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + DIMENSION laPropsAndValues_Esperado(9,2) + laPropsAndValues_Esperado = '' + laPropsAndValues_Esperado( 1,1) = 'Height' + laPropsAndValues_Esperado( 1,2) = '2.73' + laPropsAndValues_Esperado( 2,1) = 'Name' + laPropsAndValues_Esperado( 2,2) = '"c1"' + laPropsAndValues_Esperado( 3,1) = 'prop1' + laPropsAndValues_Esperado( 3,2) = '.F.' + laPropsAndValues_Esperado( 4,1) = 'prop_especial_cr' + laPropsAndValues_Esperado( 4,2) = 'Este es el valor 1' + CHR(13) + 'Este el 2' + CHR(13) + 'Y este bajo Shift_Enter el 3' + laPropsAndValues_Esperado( 5,1) = 'prop_especial_crlf' + laPropsAndValues_Esperado( 5,2) = 'El valor 1' + CHR(13) + CHR(10) ; + + 'El valor 2' + CHR(13) + CHR(10) + 'Y el 3!' + CHR(13) + CHR(10) + SPACE(2) + laPropsAndValues_Esperado( 6,1) = 'Width' + laPropsAndValues_Esperado( 6,2) = '27.40' + laPropsAndValues_Esperado( 7,1) = '_memberdata' + laPropsAndValues_Esperado( 7,2) = '' + laPropsAndValues_Esperado( 8,1) = 'Page1.Name' + laPropsAndValues_Esperado( 8,2) = '"Page1"' + laPropsAndValues_Esperado( 9,1) = 'Page2.Caption' + laPropsAndValues_Esperado( 9,2) = '"Page2"' + lnPropsAndValues_Count_Esperado = 9 + + TEXT TO lcMemo_Esperado TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + Height = 2.73 + Name = "c1" + prop1 = .F. + prop_especial_cr = Este es el valor 1 Este el 2 Y este bajo Shift_Enter el 3 + prop_especial_crlf = + El valor 1 + El valor 2 + Y el 3! + <> + + Width = 27.40 + _memberdata = + <<>> + <<>> + Page1.Name = "Page1" + Page2.Caption = "Page2" + + ENDTEXT + + + *-- TEST + loObj.get_PropsAndValuesFrom_PROPERTIES( @lcMemo, lnSort, @laPropsAndValues, @lnPropsAndValues_Count, @lcSortedMemo ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado ; + , @lcMemo, lnSort, @laPropsAndValues, @lnPropsAndValues_Count, @lcSortedMemo ; + , @laPropsAndValues_Esperado, @lnPropsAndValues_Count_Esperado, @lcMemo_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_evaluarUnMemo_PROPERTIES_yDevolverUnArrayConLasPropsSinOrdenar_PrimeroLasNormalesYLuegoLasDeObjeto + LOCAL lnCodError, lcMenError, lnCodError_Esperado ; + , lnSort, laPropsAndValues(1,2), lnPropsAndValues_Count, lcMemo, lcSortedMemo ; + , laPropsAndValues_Esperado(1,2), lnPropsAndValues_Count_Esperado, 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 + Height = 2.73 + Width = 27.40 + prop1 = .F. + _memberdata = + prop_especial_cr = <> 57Este es el valor 1 Este el 2 Y este bajo Shift_Enter el 3 + prop_especial_crlf = <> 35El valor 1 + El valor 2 + Y el 3! + <> + Name = "c1" + Page2.Caption = "Page2" + Page1.Name = "Page1" + ENDTEXT + + lcMemo = STRTRAN( STRTRAN( lcMemo, ' ', CHR(13) ), ' ', CHR(10) ) + lnSort = 0 + + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + DIMENSION laPropsAndValues_Esperado(9,2) + laPropsAndValues_Esperado = '' + laPropsAndValues_Esperado( 1,1) = 'Height' + laPropsAndValues_Esperado( 1,2) = '2.73' + laPropsAndValues_Esperado( 2,1) = 'Width' + laPropsAndValues_Esperado( 2,2) = '27.40' + laPropsAndValues_Esperado( 3,1) = 'prop1' + laPropsAndValues_Esperado( 3,2) = '.F.' + laPropsAndValues_Esperado( 4,1) = '_memberdata' + laPropsAndValues_Esperado( 4,2) = '' + laPropsAndValues_Esperado( 5,1) = 'prop_especial_cr' + laPropsAndValues_Esperado( 5,2) = 'Este es el valor 1' + C_CR + 'Este el 2' + C_LF + 'Y este bajo Shift_Enter el 3' + laPropsAndValues_Esperado( 6,1) = 'prop_especial_crlf' + laPropsAndValues_Esperado( 6,2) = 'El valor 1' + CR_LF ; + + 'El valor 2' + CR_LF + 'Y el 3!' + CR_LF + SPACE(2) + laPropsAndValues_Esperado( 7,1) = 'Name' + laPropsAndValues_Esperado( 7,2) = '"c1"' + laPropsAndValues_Esperado( 8,1) = 'Page2.Caption' + laPropsAndValues_Esperado( 8,2) = '"Page2"' + laPropsAndValues_Esperado( 9,1) = 'Page1.Name' + laPropsAndValues_Esperado( 9,2) = '"Page1"' + lnPropsAndValues_Count_Esperado = 9 + + TEXT TO lcMemo_Esperado TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + Height = 2.73 + Width = 27.40 + prop1 = .F. + _memberdata = + <<>> + <<>> + prop_especial_cr = Este es el valor 1 Este el 2 Y este bajo Shift_Enter el 3 + prop_especial_crlf = + El valor 1 + El valor 2 + Y el 3! + <> + + Name = "c1" + Page2.Caption = "Page2" + Page1.Name = "Page1" + + ENDTEXT + + + *-- TEST + loObj.get_PropsAndValuesFrom_PROPERTIES( @lcMemo, lnSort, @laPropsAndValues, @lnPropsAndValues_Count, @lcSortedMemo ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado ; + , @lcMemo, lnSort, @laPropsAndValues, @lnPropsAndValues_Count, @lcSortedMemo ; + , @laPropsAndValues_Esperado, @lnPropsAndValues_Count_Esperado, @lcMemo_Esperado ) + + ENDFUNC + + +ENDDEFINE diff --git a/TESTS/ut__foxbin2prg__c_conversor_prg_a_bin__analizarAsignacion_TAG_Indicado.prg b/TESTS/ut__foxbin2prg__c_conversor_prg_a_bin__analizarAsignacion_TAG_Indicado.prg new file mode 100644 index 0000000..e234e3c --- /dev/null +++ b/TESTS/ut__foxbin2prg__c_conversor_prg_a_bin__analizarAsignacion_TAG_Indicado.prg @@ -0,0 +1,300 @@ +DEFINE CLASS ut__foxbin2prg__c_conversor_prg_a_bin__analizarAsignacion_TAG_Indicado AS FxuTestCase OF FxuTestCase.prg + + #IF .F. + LOCAL THIS AS ut__foxbin2prg__c_conversor_prg_a_bin__analizarAsignacion_TAG_Indicado OF ut__foxbin2prg__c_conversor_prg_a_bin__analizarAsignacion_TAG_Indicado.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_prg_a_bin", "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 ; + , tcPropName, tcPropValue, taProps, tnProp_Count ; + , I, tcTag_I, tcTag_F, tnLen_lcTag_I, tnLen_lcTag_F, tcMemo, tcValue_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_prg_a_bin 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 + tcPropValue = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcPropValue ) + tcValue_Esperado = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcValue_Esperado ) + + + *-- Visualización de valores + THIS.messageout( ' Value = ' + TRANSFORM(tcPropValue) ) + THIS.messageout( ' Value_Esperado = ' + TRANSFORM(tcValue_Esperado) ) + + + *-- Evaluación de valores + THIS.assertequals( tcValue_Esperado, tcPropValue, "Valor devuelto" ) + + 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_analizarAsignacion_TAG__fb2p_value__EnUnaAsignacion_InLine + LOCAL lnCodError, lcMenError, lnCodError_Esperado ; + , lcPropName, lcPropValue, laProps(1,2), lnProp_Count, I, lcTag_I, lcTag_F, lnLen_lcTag_I, lnLen_lcTag_F, lcMemo ; + , lcValue_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lcTag_I = '' + lcTag_F = '' + lnLen_lcTag_I = LEN(lcTag_I) + lnLen_lcTag_F = LEN(lcTag_F) + lnProp_Count = 17 + DIMENSION laProps(lnProp_Count,2) + laProps = '' + laProps( 1,1) = 'Height = 2.73' + laProps( 1,2) = '' + laProps( 2,1) = 'Name = "c1"' + laProps( 2,2) = '' + laProps( 3,1) = 'prop1 = .F.' + laProps( 3,2) = 'Mi prop1' + laProps( 4,1) = 'prop_especial_cr = Este es el valor 1 Este el 2 Y este bajo Shift_Enter el 3' + laProps( 4,2) = '' + laProps( 5,1) = 'prop_especial_crlf = ' + laProps( 5,2) = '' + laProps( 6,1) = 'El valor 1' + laProps( 6,2) = '' + laProps( 7,1) = 'El valor 2' + laProps( 7,2) = '' + laProps( 8,1) = 'Y el 3!' + laProps( 8,2) = '' + laProps( 9,1) = '' + laProps( 9,2) = '' + laProps(10,1) = '' + laProps(10,2) = '' + laProps(11,2) = 'Debería tener CR+LF' + laProps(11,2) = '' + laProps(12,1) = 'Width = 27.4' + laProps(12,2) = '' + laProps(13,1) = '_memberdata = [ ;' + laProps(13,2) = '' + laProps(14,1) = ' ;' + laProps(14,2) = '' + laProps(15,1) = ']' + laProps(15,2) = 'XML Metadata for customizable properties' + I = 4 + loObj.get_SeparatedPropAndValue( laProps(I,1), @lcPropName, @lcPropValue ) + *lcPropName = 'prop_especial_cr' + *lcPropValue = 'Este es el valor 1 Este el 2 Y este bajo Shift_Enter el 3' + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + lcValue_Esperado = REPLICATE( CHR(1), 517 ) + STR(57,8) + 'Este es el valor 1' + CHR(13) + 'Este el 2' + CHR(13) + 'Y este bajo Shift_Enter el 3' + + *-- TEST + loObj.analizarAsignacion_TAG_Indicado( @lcPropName, @lcPropValue, @laProps, @lnProp_Count ; + , @I, lcTag_I, lcTag_F, lnLen_lcTag_I, lnLen_lcTag_F, @lcMemo ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado ; + , @lcPropName, @lcPropValue, @laProps, @lnProp_Count ; + , @I, lcTag_I, lcTag_F, lnLen_lcTag_I, lnLen_lcTag_F, @lcMemo, @lcValue_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_analizarAsignacion_TAG__fb2p_value__EnUnaAsignacion_MultiLine + LOCAL lnCodError, lcMenError, lnCodError_Esperado ; + , lcPropName, lcPropValue, laProps(1,2), lnProp_Count, I, lcTag_I, lcTag_F, lnLen_lcTag_I, lnLen_lcTag_F, lcMemo ; + , lcValue_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lcTag_I = '' + lcTag_F = '' + lnLen_lcTag_I = LEN(lcTag_I) + lnLen_lcTag_F = LEN(lcTag_F) + lnProp_Count = 17 + DIMENSION laProps(lnProp_Count,2) + laProps = '' + laProps( 1,1) = 'Height = 2.73' + laProps( 1,2) = '' + laProps( 2,1) = 'Name = "c1"' + laProps( 2,2) = '' + laProps( 3,1) = 'prop1 = .F.' + laProps( 3,2) = 'Mi prop1' + laProps( 4,1) = 'prop_especial_cr = Este es el valor 1 Este el 2 Y este bajo Shift_Enter el 3' + laProps( 4,2) = '' + laProps( 5,1) = 'prop_especial_crlf = ' + laProps( 5,2) = '' + laProps( 6,1) = 'El valor 1' + laProps( 6,2) = '' + laProps( 7,1) = 'El valor 2' + laProps( 7,2) = '' + laProps( 8,1) = 'Y el 3!' + laProps( 8,2) = '' + laProps( 9,1) = '' + laProps( 9,2) = '' + laProps(10,1) = '' + laProps(10,2) = '' + laProps(11,2) = 'Debería tener CR+LF' + laProps(11,2) = '' + laProps(12,1) = 'Width = 27.4' + laProps(12,2) = '' + laProps(13,1) = '_memberdata = [ ;' + laProps(13,2) = '' + laProps(14,1) = ' ;' + laProps(14,2) = '' + laProps(15,1) = ']' + laProps(15,2) = 'XML Metadata for customizable properties' + I = 5 + loObj.get_SeparatedPropAndValue( laProps(I,1), @lcPropName, @lcPropValue ) + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + lcValue_Esperado = REPLICATE( CHR(1), 517 ) + STR(33,8) + 'El valor 1' + CR_LF + 'El valor 2' + CR_LF + 'Y el 3!' + CR_LF + + *-- TEST + loObj.analizarAsignacion_TAG_Indicado( @lcPropName, @lcPropValue, @laProps, @lnProp_Count ; + , @I, lcTag_I, lcTag_F, lnLen_lcTag_I, lnLen_lcTag_F, @lcMemo ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado ; + , @lcPropName, @lcPropValue, @laProps, @lnProp_Count ; + , @I, lcTag_I, lcTag_F, lnLen_lcTag_I, lnLen_lcTag_F, @lcMemo, @lcValue_Esperado ) + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_analizarAsignacion_TAG__memberdata__EnUnaAsignacion_MultiLine + LOCAL lnCodError, lcMenError, lnCodError_Esperado ; + , lcPropName, lcPropValue, laProps(1,2), lnProp_Count, I, lcTag_I, lcTag_F, lnLen_lcTag_I, lnLen_lcTag_F, lcMemo ; + , lcValue_Esperado ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lcTag_I = '' + lcTag_F = '' + lnLen_lcTag_I = LEN(lcTag_I) + lnLen_lcTag_F = LEN(lcTag_F) + lnProp_Count = 17 + DIMENSION laProps(lnProp_Count,2) + laProps = '' + laProps( 1,1) = 'Height = 2.73' + laProps( 1,2) = '' + laProps( 2,1) = 'Name = "c1"' + laProps( 2,2) = '' + laProps( 3,1) = 'prop1 = .F.' + laProps( 3,2) = 'Mi prop1' + laProps( 4,1) = 'prop_especial_cr = Este es el valor 1 Este el 2 Y este bajo Shift_Enter el 3' + laProps( 4,2) = '' + laProps( 5,1) = 'prop_especial_crlf = ' + laProps( 5,2) = '' + laProps( 6,1) = 'El valor 1' + laProps( 6,2) = '' + laProps( 7,1) = 'El valor 2' + laProps( 7,2) = '' + laProps( 8,1) = 'Y el 3!' + laProps( 8,2) = '' + laProps( 9,1) = '' + laProps( 9,2) = '' + laProps(10,1) = '' + laProps(10,2) = '' + laProps(11,2) = 'Debería tener CR+LF' + laProps(11,2) = '' + laProps(12,1) = 'Width = 27.4' + laProps(12,2) = '' + laProps(13,1) = '_memberdata = ' + laProps(13,2) = '' + laProps(14,1) = '' + laProps(14,2) = '' + laProps(15,1) = '' + laProps(15,2) = 'XML Metadata for customizable properties' + I = 13 + loObj.get_SeparatedPropAndValue( laProps(I,1), @lcPropName, @lcPropValue ) + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + lcValue_Esperado = REPLICATE( CHR(1), 517 ) + STR(71,8) + '' + CR_LF + '' + CR_LF + '' + + *-- TEST + loObj.analizarAsignacion_TAG_Indicado( @lcPropName, @lcPropValue, @laProps, @lnProp_Count ; + , @I, lcTag_I, lcTag_F, lnLen_lcTag_I, lnLen_lcTag_F, @lcMemo ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado ; + , @lcPropName, @lcPropValue, @laProps, @lnProp_Count ; + , @I, lcTag_I, lcTag_F, lnLen_lcTag_I, lnLen_lcTag_F, @lcMemo, @lcValue_Esperado ) + + ENDFUNC + + +ENDDEFINE diff --git a/TESTS/ut__foxbin2prg__c_conversor_prg_a_bin__insert_AllObjects.prg b/TESTS/ut__foxbin2prg__c_conversor_prg_a_bin__insert_AllObjects.prg new file mode 100644 index 0000000..90ade57 --- /dev/null +++ b/TESTS/ut__foxbin2prg__c_conversor_prg_a_bin__insert_AllObjects.prg @@ -0,0 +1,161 @@ +DEFINE CLASS ut__foxbin2prg__c_conversor_prg_a_bin__insert_AllObjects AS FxuTestCase OF FxuTestCase.prg + + #IF .F. + LOCAL THIS AS ut__foxbin2prg__c_conversor_prg_a_bin__insert_AllObjects OF ut__foxbin2prg__c_conversor_prg_a_bin__insert_AllObjects.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 + icClase = 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" + LOCAL loObjeto AS CL_OBJETO OF "FOXBIN2PRG.PRG" + LOCAL loClase AS CL_CLASE 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_prg_a_bin", "FOXBIN2PRG.PRG") + THIS.icClase = NEWOBJECT("CL_CLASE", "FOXBIN2PRG.PRG") + loClase = THIS.icClase + 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 + THIS.icClase = 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, toClase, taWriteOrder_Esperado + + LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG" + LOCAL loObjeto AS CL_OBJETO OF "FOXBIN2PRG.PRG" + LOCAL loClase AS CL_CLASE OF "FOXBIN2PRG.PRG" + LOCAL I + loObj = THIS.icObj + loClase = toClase + + IF PCOUNT() = 0 + THIS.messageout( "* Support method, not a valid test." ) + RETURN .T. + ENDIF + + IF ISNULL(toEx) + *-- Visualización de valores + FOR I = 1 TO loClase._AddObject_Count + loObjeto = loClase._AddObjects(I) + THIS.messageout( ' objeto._Nombre = ' + TRANSFORM(loObjeto._Nombre) ) + THIS.messageout( ' objeto._ZOrder = ' + TRANSFORM(loObjeto._ZOrder) ) + THIS.messageout( ' objeto._WriteOrder = ' + TRANSFORM(loObjeto._WriteOrder) ) + THIS.messageout( REPLICATE('-',50) ) + ENDFOR + + + *-- Evaluación de valores + FOR I = 1 TO loClase._AddObject_Count + loObjeto = loClase._AddObjects(I) + THIS.assertequals( taWriteOrder_Esperado(I), loObjeto._WriteOrder, "[WriteOrder para objeto " + loObjeto._Nombre + "]" ) + ENDFOR + + 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_ordenarLosObjetosSegunSuOrdenOriginal + LOCAL lnCodError, lcMenError, lnCodError_Esperado ; + , laWriteOrder_Esperado(3) ; + , loEx AS EXCEPTION + + LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG" + LOCAL loObjeto AS CL_OBJETO OF "FOXBIN2PRG.PRG" + LOCAL loClase AS CL_CLASE OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loClase = THIS.icClase + loEx = NULL + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + *-- + loObjeto = NULL + loObjeto = NEWOBJECT("CL_OBJETO", "FOXBIN2PRG.PRG") + loObjeto._ObjName = 'Label3' + loObjeto._Parent = 'Form1.pgfPanel.pagApariencia' + loObjeto._Nombre = 'Form1.pgfPanel.pagApariencia.Label3' + loObjeto._ZOrder = 50 + loClase.add_Object( loObjeto ) + *-- + loObjeto = NULL + loObjeto = NEWOBJECT("CL_OBJETO", "FOXBIN2PRG.PRG") + loObjeto._ObjName = 'Label3' + loObjeto._Parent = 'Form1.pgfPanel.pagAvanzado' + loObjeto._Nombre = 'Form1.pgfPanel.pagAvanzado.Label3' + loObjeto._ZOrder = 82 + loClase.add_Object( loObjeto ) + *-- + loObjeto = NULL + loObjeto = NEWOBJECT("CL_OBJETO", "FOXBIN2PRG.PRG") + loObjeto._ObjName = 'Label3' + loObjeto._Parent = 'Form1.pgfPanel.pagSeteos' + loObjeto._Nombre = 'Form1.pgfPanel.pagSeteos.Label3' + loObjeto._ZOrder = 30 + loClase.add_Object( loObjeto ) + *-- + loObjeto = NULL + + *-- DATOS ESPERADOS + STORE 0 TO lnCodError_Esperado + laWriteOrder_Esperado(1) = 2 + laWriteOrder_Esperado(2) = 3 + laWriteOrder_Esperado(3) = 1 + + *-- TEST + loObj.insert_AllObjects( @loClase ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado, @loClase, @laWriteOrder_Esperado ) + + ENDFUNC + + +ENDDEFINE diff --git a/foxbin2prg.pjt b/foxbin2prg.pjt new file mode 100644 index 0000000..b2c5295 Binary files /dev/null and b/foxbin2prg.pjt differ diff --git a/foxbin2prg.pjx b/foxbin2prg.pjx new file mode 100644 index 0000000..a9a20d1 Binary files /dev/null and b/foxbin2prg.pjx differ diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 6d6ea79..41538f9 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -46,6 +46,7 @@ * 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 * *--------------------------------------------------------------------------------------------------- * TESTEO Y REPORTE DE BUGS (AGRADECIMIENTOS) @@ -53,6 +54,7 @@ * 27/11/2013 Fidel Charny REPORTE BUG: Error en el guardado de ciertas propiedades de array (arreglado en v.1.6) * 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) * *--------------------------------------------------------------------------------------------------- * TRAMIENTOS ESPECIALES DE ASIGNACIONES DE PROPIEDADES: @@ -121,12 +123,19 @@ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErro #DEFINE C_FILE_TXT_F '*' #DEFINE C_FB2P_VALUE_I '' #DEFINE C_FB2P_VALUE_F '' -#DEFINE C_MEMBERDATA_I '' -#DEFINE C_MEMBERDATA_F '' -#DEFINE C_LEN_MEMBERDATA_I LEN(C_MEMBERDATA_I) -#DEFINE C_LEN_MEMBERDATA_F LEN(C_MEMBERDATA_F) #DEFINE C_LEN_FB2P_VALUE_I LEN(C_FB2P_VALUE_I) #DEFINE C_LEN_FB2P_VALUE_F LEN(C_FB2P_VALUE_F) +#DEFINE C_VFPDATA_I '' +#DEFINE C_VFPDATA_F '' +#DEFINE C_MEMBERDATA_I C_VFPDATA_I +#DEFINE C_MEMBERDATA_F C_VFPDATA_F +#DEFINE C_LEN_MEMBERDATA_I LEN(C_MEMBERDATA_I) +#DEFINE C_LEN_MEMBERDATA_F LEN(C_MEMBERDATA_F) +#DEFINE C_DATA_I '' +#DEFINE C_TAG_REPORTE 'Reportes' +#DEFINE C_TAG_REPORTE_I '<' + C_TAG_REPORTE + '>' +#DEFINE C_TAG_REPORTE_F '' #DEFINE C_TAB CHR(9) #DEFINE C_CR CHR(13) #DEFINE C_LF CHR(10) @@ -274,17 +283,22 @@ TRY ENDIF ENDCASE - CD (JUSTPATH(lcSys16)) - SET PATH TO (lcPath) ENDIF CATCH TO loEx + IF llExisteConfig + goCnv.writeLog( 'ERROR: ' + TRANSFORM(loEx.ERRORNO) + ', ' + loEx.MESSAGE + CR_LF ; + + loEx.PROCEDURE + ', line ' + TRANSFORM(loEx.LINENO) + CR_LF ; + + loEx.DETAILS ) + ENDIF FINALLY goFrm_Avance.HIDE() goFrm_Avance.RELEASE() STORE NULL TO goCnv, goFrm_Avance RELEASE goCnv, goFrm_Avance + CD (JUSTPATH(lcSys16)) + SET PATH TO (lcPath) ENDTRY IF _VFP.STARTMODE > 0 @@ -304,7 +318,10 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM + [] ; + [] ; + [] ; + + [] ; + [] ; + + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -315,26 +332,35 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM + [] ; + [] ; + [] ; + + [] ; + + [] ; + + [] ; + [] ; + [] ; + [] - c_CurDir = '' - c_InputFile = '' - c_LogFile = '' - c_OutputFile = '' - l_Debug = .F. - l_ShowErrors = .F. - lFileMode = .F. - nClassTimeStamp = '' - n_FB2PRG_Version = 1.8 - o_Conversor = NULL - c_VC2 = 'VC2' - c_SC2 = 'SC2' - c_PJ2 = 'PJ2' - c_MN2 = 'MN2' - c_FR2 = 'FR2' - c_LB2 = 'LB2' + c_CurDir = '' + c_InputFile = '' + c_LogFile = '' + c_OutputFile = '' + l_Debug = .F. + l_Test = .F. + l_ShowErrors = .F. + l_MethodSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias + l_PropSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias + lFileMode = .F. + nClassTimeStamp = '' + n_FB2PRG_Version = 1.9 + o_Conversor = NULL + c_VC2 = 'VC2' + c_SC2 = 'SC2' + c_PJ2 = 'PJ2' + c_MN2 = 'MN2' + c_FR2 = 'FR2' + c_LB2 = 'LB2' + c_DB2 = 'DB2' + c_CD2 = 'CD2' + c_DC2 = 'DC2' ******************************************************************************************************************* @@ -364,10 +390,10 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM ******************************************************************************************************************* PROCEDURE Convertir - LPARAMETERS tc_InputFile + LPARAMETERS tc_InputFile, toModulo, toEx AS EXCEPTION, tlRelanzarError TRY - LOCAL lnCodError, loEx AS EXCEPTION, lcErrorInfo + LOCAL lnCodError, lcErrorInfo lnCodError = 0 THIS.c_InputFile = FULLPATH( tc_InputFile ) THIS.c_CurDir = JUSTPATH( THIS.c_InputFile ) @@ -397,6 +423,10 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, THIS.c_PJ2 ) THIS.o_Conversor = CREATEOBJECT( 'c_conversor_pjx_a_prg' ) + CASE JUSTEXT(THIS.c_InputFile) = 'FRX' + THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, THIS.c_FR2 ) + THIS.o_Conversor = CREATEOBJECT( 'c_conversor_frx_a_prg' ) + CASE JUSTEXT(THIS.c_InputFile) = THIS.c_VC2 THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, 'VCX' ) THIS.o_Conversor = CREATEOBJECT( 'c_conversor_prg_a_vcx' ) @@ -409,22 +439,29 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, 'PJX' ) THIS.o_Conversor = CREATEOBJECT( 'c_conversor_prg_a_pjx' ) + CASE JUSTEXT(THIS.c_InputFile) = THIS.c_FR2 + THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, 'FRX' ) + THIS.o_Conversor = CREATEOBJECT( 'c_conversor_prg_a_frx' ) + OTHERWISE ERROR 'El archivo [' + THIS.c_InputFile + '] no está soportado' ENDCASE - THIS.o_Conversor.c_InputFile = THIS.c_InputFile - THIS.o_Conversor.c_OutputFile = THIS.c_OutputFile - THIS.o_Conversor.c_LogFile = THIS.c_LogFile - THIS.o_Conversor.l_Debug = THIS.l_Debug - THIS.o_Conversor.n_FB2PRG_Version = THIS.n_FB2PRG_Version - THIS.o_Conversor.Convertir() + THIS.o_Conversor.c_InputFile = THIS.c_InputFile + THIS.o_Conversor.c_OutputFile = THIS.c_OutputFile + THIS.o_Conversor.c_LogFile = THIS.c_LogFile + THIS.o_Conversor.l_Debug = THIS.l_Debug + THIS.o_Conversor.l_Test = THIS.l_Test + THIS.o_Conversor.n_FB2PRG_Version = THIS.n_FB2PRG_Version + THIS.o_Conversor.Convertir( @toModulo ) + THIS.o_Conversor.l_MethodSort_Enabled = THIS.l_MethodSort_Enabled + THIS.o_Conversor.l_PropSort_Enabled = THIS.l_PropSort_Enabled THIS.o_Conversor = NULL - CATCH TO loEx - lnCodError = loEx.ERRORNO - lcErrorInfo = THIS.Exception2Str(loEx) + CR_LF + CR_LF + 'Fuente: ' + THIS.c_InputFile + CATCH TO toEx + lnCodError = toEx.ERRORNO + lcErrorInfo = THIS.Exception2Str(toEx) + CR_LF + CR_LF + 'Fuente: ' + THIS.c_InputFile TRY STRTOFILE( lcErrorInfo, THIS.c_InputFile + '.ERR' ) @@ -440,6 +477,9 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM IF THIS.l_Debug AND THIS.l_ShowErrors MESSAGEBOX( lcErrorInfo, 0+16+4096, 'FOXBIN2PRG: ERROR!!', 10000 ) ENDIF + IF tlRelanzarError && Usado en Unit Testing + THROW + ENDIF ENDTRY RETURN lnCodError @@ -547,10 +587,12 @@ DEFINE CLASS c_conversor_base AS SESSION + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -570,20 +612,24 @@ DEFINE CLASS c_conversor_base AS SESSION + [] ; + [] ; + [] ; + + [] ; + + [] ; + [] ; + [] - l_Debug = .F. - l_Test = .F. - c_InputFile = '' - c_OutputFile = '' - lFileMode = .T. - nClassTimeStamp = '' - n_FB2PRG_Version = 1.0 - c_Type = '' - c_CurDir = '' - c_LogFile = '' + l_Debug = .F. + l_Test = .F. + c_InputFile = '' + c_OutputFile = '' + lFileMode = .T. + nClassTimeStamp = '' + n_FB2PRG_Version = 1.0 + c_Type = '' + c_CurDir = '' + c_LogFile = '' + l_MethodSort_Enabled = .T. + l_PropSort_Enabled = .T. ******************************************************************************************************************* @@ -601,19 +647,6 @@ DEFINE CLASS c_conversor_base AS SESSION ENDPROC - ******************************************************************************************************************* - PROCEDURE writeLog - LPARAMETERS tcText - - IF THIS.l_Debug - TRY - STRTOFILE( TTOC(DATETIME(),3) + ' ' + EVL(tcText,'') + CR_LF, THIS.c_LogFile, 1 ) - CATCH - ENDTRY - ENDIF - ENDPROC - - ******************************************************************************************************************* PROCEDURE DESTROY C_FB2PRG_CODE = '' @@ -623,182 +656,6 @@ DEFINE CLASS c_conversor_base AS SESSION ENDPROC - ******************************************************************************************************************* - PROCEDURE Convertir - THIS.writeLog( '' ) - THIS.writeLog( 'Convirtiendo archivo ' + THIS.c_OutputFile + '...' ) - ENDPROC - - - ******************************************************************************************************************* - PROCEDURE fileTypeCode - LPARAMETERS tcExtension - tcExtension = UPPER(tcExtension) - RETURN ICASE( tcExtension = 'DBC', 'd' ; - , tcExtension = 'DBF', 'D' ; - , tcExtension = 'QPR', 'Q' ; - , tcExtension = 'SCX', 'K' ; - , tcExtension = 'FRX', 'R' ; - , tcExtension = 'LBX', 'B' ; - , tcExtension = 'VCX', 'V' ; - , tcExtension = 'PRG', 'P' ; - , tcExtension = 'FLL', 'L' ; - , tcExtension = 'APP', 'Z' ; - , tcExtension = 'EXE', 'Z' ; - , tcExtension = 'MNX', 'M' ; - , tcExtension = 'TXT', 'T' ; - , tcExtension = 'FPW', 'T' ; - , tcExtension = 'H', 'T' ; - , 'x' ) - ENDPROC - - - ******************************************************************************************************************* - PROCEDURE lineIsOnlyCommentAndNoMetadata - LPARAMETERS tcLine, tcComment - LOCAL lllineIsOnlyCommentAndNoMetadata, ln_AT_Cmt - - THIS.get_SeparatedLineAndComment( @tcLine, @tcComment ) - - DO CASE - CASE LEFT(tcLine,2) == '*<' - tcComment = tcLine - - CASE EMPTY(tcLine) OR LEFT(tcLine, 1) == '*' OR LEFT(tcLine + ' ', 5) == 'NOTE ' && Vacía o Comentarios - lllineIsOnlyCommentAndNoMetadata = .T. - - ENDCASE - - RETURN lllineIsOnlyCommentAndNoMetadata - ENDPROC - - - ******************************************************************************************************************* - PROCEDURE get_SeparatedLineAndComment - LPARAMETERS tcLine, tcComment - LOCAL ln_AT_Cmt - tcComment = '' - - IF '&'+'&' $ tcLine - ln_AT_Cmt = AT( '&'+'&', tcLine) - tcComment = LTRIM( SUBSTR( tcLine, ln_AT_Cmt + 2 ) ) - tcLine = RTRIM( LEFT( tcLine, ln_AT_Cmt - 1 ), 0, ' ', CHR(9) ) && Quito espacios y TABS - ENDIF - - RETURN - ENDPROC - - - ******************************************************************************************************************* - PROCEDURE get_SeparatedPropAndValue - LPARAMETERS tcAsignacion, tcProp, tcValue - LOCAL ln_AT_Cmt - STORE '' TO tcProp, tcValue - - IF '=' $ tcAsignacion - ln_AT_Cmt = AT( '=', tcAsignacion) - tcProp = ALLTRIM( LEFT( tcAsignacion, ln_AT_Cmt - 2 ), 0, ' ', CHR(9) ) && Quito espacios y TABS - tcValue = ALLTRIM( SUBSTR( tcAsignacion, ln_AT_Cmt + 2 ) ) - ENDIF - - RETURN - ENDPROC - - - ******************************************************************************************************************* - PROCEDURE getNext_BAK - LPARAMETERS tcOutputFileName - LOCAL lcNext_Bak, I - lcNext_Bak = '' - - FOR I = 0 TO 99 - IF I = 0 - IF NOT FILE( tcOutputFileName + '.BAK' ) - lcNext_Bak = '.BAK' - EXIT - ENDIF - ELSE - IF NOT FILE( tcOutputFileName + '.' + PADL(I,2,'0') + '.BAK' ) - lcNext_Bak = '.' + PADL(I,2,'0') + '.BAK' - EXIT - ENDIF - ENDIF - ENDFOR - - lcNext_Bak = EVL( lcNext_Bak, '.100.BAK' ) && Para que no quede nunca vacío - - RETURN lcNext_Bak - ENDPROC - - - ******************************************************************************************************************* - PROCEDURE doBackup - LOCAL lcNext_Bak - lcNext_Bak = THIS.getNext_BAK( THIS.c_OutputFile ) - - DO CASE - CASE JUSTEXT( THIS.c_OutputFile ) = 'VCX' - IF FILE( FORCEEXT(THIS.c_OutputFile,'VCX') ) - THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,'VCX') + '/VCT' ) - - COPY FILE (FORCEEXT(THIS.c_OutputFile,'VCX')) TO (FORCEEXT(THIS.c_OutputFile, 'VCX' + lcNext_Bak)) - - IF FILE( FORCEEXT(THIS.c_OutputFile,'VCT') ) - COPY FILE (FORCEEXT(THIS.c_OutputFile,'VCT')) TO (FORCEEXT(THIS.c_OutputFile,'VCT' + lcNext_Bak)) - ENDIF - ENDIF - - CASE JUSTEXT( THIS.c_OutputFile ) = 'SCX' - IF FILE( FORCEEXT(THIS.c_OutputFile,'SCX') ) - THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,'SCX') + '/SCT' ) - COPY FILE (FORCEEXT(THIS.c_OutputFile,'SCX')) TO (FORCEEXT(THIS.c_OutputFile,'SCX' + lcNext_Bak)) - - IF FILE( FORCEEXT(THIS.c_OutputFile,'SCT') ) - COPY FILE (FORCEEXT(THIS.c_OutputFile,'SCT')) TO (FORCEEXT(THIS.c_OutputFile,'SCT' + lcNext_Bak)) - ENDIF - ENDIF - - CASE JUSTEXT( THIS.c_OutputFile ) = 'PJX' - IF FILE( FORCEEXT(THIS.c_OutputFile,'PJX') ) - THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,'PJX') + '/PJT' ) - COPY FILE (FORCEEXT(THIS.c_OutputFile,'PJX')) TO (FORCEEXT(THIS.c_OutputFile,'PJX' + lcNext_Bak)) - - IF FILE( FORCEEXT(THIS.c_OutputFile,'PJT') ) - COPY FILE (FORCEEXT(THIS.c_OutputFile,'PJT')) TO (FORCEEXT(THIS.c_OutputFile,'PJT' + lcNext_Bak)) - ENDIF - ENDIF - - OTHERWISE - ERROR 'Tipo de archivo [' + JUSTFNAME(THIS.c_OutputFile) + '] no soportado para backup!' - - ENDCASE - ENDPROC - - - ******************************************************************************************************************* - PROCEDURE lineaExcluida - LPARAMETERS tn_Linea, tnBloquesExclusion, taBloquesExclusion - - EXTERNAL ARRAY taBloquesExclusion - LOCAL X, llExcluida - - FOR X = 1 TO tnBloquesExclusion - IF BETWEEN( tn_Linea, taBloquesExclusion(X,1), taBloquesExclusion(X,2) ) - llExcluida = .T. - EXIT - ENDIF - ENDFOR - - RETURN llExcluida - ENDPROC - - - ******************************************************************************************************************* - PROCEDURE identificarBloquesDeCodigo - LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toModulo - ENDPROC - - ******************************************************************************************************************* PROCEDURE buscarObjetoDelMetodoPorNombre LPARAMETERS tcNombreObjeto, toClase @@ -854,25 +711,252 @@ DEFINE CLASS c_conversor_base AS SESSION ******************************************************************************************************************* - FUNCTION RowTimeStamp(ltDateTime) - * Generate a FoxPro 3.0-style row timestamp - *-- CONVIERTE UN DATO TIPO DATETIME EN TIMESTAMP NUMERICO USADO POR LOS ARCHIVOS SCX/VCX/etc. - LOCAL lcTimeValue, tnTimeStamp + FUNCTION comprobarExpresionValida( tcAsignacion, tnCodError, tcExpNormalizada ) + LOCAL llError, loEx AS EXCEPTION - IF VARTYPE(m.ltDateTime) <> 'T' - m.ltDateTime = DATETIME() - ENDIF + TRY + tcExpNormalizada = NORMALIZE( tcAsignacion ) - tnTimeStamp = ( YEAR(m.ltDateTime) - 1980) * 2^25 ; - + MONTH(m.ltDateTime) * 2^21 ; - + DAY(m.ltDateTime) * 2^16 ; - + HOUR(m.ltDateTime) * 2^11 ; - + MINUTE(m.ltDateTime) * 2^5 ; - + SEC(m.ltDateTime) - RETURN INT(tnTimeStamp) + CATCH TO loEx + llError = .T. + tnCodError = loEx.ERRORNO + ENDTRY + + RETURN NOT llError ENDFUNC + ******************************************************************************************************************* + PROCEDURE Convertir + LPARAMETERS toModulo, toEx AS EXCEPTION + THIS.writeLog( '' ) + THIS.writeLog( 'Convirtiendo archivo ' + THIS.c_OutputFile + '...' ) + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE decode_SpecialCodes_1_31 + LPARAMETERS tcText + LOCAL I + FOR I = 0 TO 31 + tcText = STRTRAN( tcText, '{' + TRANSFORM(I) + '}', CHR(I) ) + ENDFOR + RETURN tcText + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE desnormalizarAsignacion + LPARAMETERS tcAsignacion + LOCAL lcPropName, lcValor, lnCodError, lcExpNormalizada, lnPos, lcComentario + THIS.get_SeparatedPropAndValue( @tcAsignacion, @lcPropName, @lcValor ) + lcComentario = '' + THIS.desnormalizarValorPropiedad( @lcPropName, @lcValor, @lcComentario ) + tcAsignacion = lcPropName + ' = ' + lcValor + + RETURN tcAsignacion + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE desnormalizarValorPropiedad + LPARAMETERS tcProp, tcValue, tcComentario + LOCAL lnCodError, lnPos, lcValue + tcComentario = '' + + *-- Ajustes de algunos casos especiales + DO CASE + CASE tcProp == '_memberdata' + *-- Me quedo con lo importante y quito los CHR(0) y longitud que a veces agrega al inicio + lcValue = '' + + FOR I = 1 TO OCCURS( '/>', tcValue ) + TEXT TO lcValue TEXTMERGE ADDITIVE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <', I, 1+4 )>> + ENDTEXT + ENDFOR + + TEXT TO tcValue TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + + <> + + ENDTEXT + + tcValue = C_MPROPHEADER + STR( LEN(tcValue), 8 ) + tcValue + + CASE LEFT( tcValue, C_LEN_FB2P_VALUE_I ) == C_FB2P_VALUE_I + *-- Valor especial Fox con cabecera CHR(1): Debo agregarla y desnormalizar el valor + tcValue = STRTRAN( STRTRAN( STREXTRACT( tcValue, C_FB2P_VALUE_I, C_FB2P_VALUE_F, 1, 1 ), ' ', C_CR ), ' ', C_LF ) + tcValue = C_MPROPHEADER + STR( LEN(tcValue), 8 ) + tcValue + + ENDCASE + + RETURN tcValue + ENDFUNC + + + ******************************************************************************************************************* + PROCEDURE desnormalizarValorXML + LPARAMETERS tcValor + *-- DESNORMALIZA EL TEXTO INDICADO, EXPANDIENDO LOS SÍMBOLOS XML ESPECIALES. + LOCAL lnPos, lnPos2, lnAscii + tcValor = STRTRAN(tcValor, CHR(38)+'gt;', '>') && > + tcValor = STRTRAN(tcValor, CHR(38)+'lt;', '<') && < + tcValor = STRTRAN(tcValor, CHR(38)+'quot;', CHR(34)) && " + tcValor = STRTRAN(tcValor, CHR(38)+'apos;', CHR(39)) && ' + tcValor = STRTRAN(tcValor, CHR(38)+'amp;', CHR(38)) && & + + *-- Obtengo los Hex + DO WHILE .T. + lnPos = AT( CHR(38)+'#x', tcValor ) + IF lnPos = 0 + EXIT + ENDIF + lnPos2 = lnPos + 1 + AT( ';', SUBSTR( tcValor, lnPos + 2, 4 ) ) + lnAscii = EVALUATE( '0' + SUBSTR( tcValor, lnPos + 3, lnPos2 - lnPos - 3 ) ) + tcValor = STUFF(tcValor, lnPos, lnPos2 - lnPos + 1, CHR(lnAscii)) && ASCII + ENDDO + + *-- Obtengo los Dec + DO WHILE .T. + lnPos = AT( CHR(38)+'#', tcValor ) + IF lnPos = 0 + EXIT + ENDIF + lnPos2 = lnPos + 1 + AT( ';', SUBSTR( tcValor, lnPos + 2, 4 ) ) + lnAscii = EVALUATE( SUBSTR( tcValor, lnPos + 2, lnPos2 - lnPos - 2 ) ) + tcValor = STUFF(tcValor, lnPos, lnPos2 - lnPos + 1, CHR(lnAscii)) && ASCII + ENDDO + + RETURN tcValor + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE doBackup + LOCAL lcNext_Bak + lcNext_Bak = THIS.getNext_BAK( THIS.c_OutputFile ) + + DO CASE + CASE JUSTEXT( THIS.c_OutputFile ) = 'VCX' + IF FILE( FORCEEXT(THIS.c_OutputFile,'VCX') ) + THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,'VCX') + '/VCT' ) + + COPY FILE (FORCEEXT(THIS.c_OutputFile,'VCX')) TO (FORCEEXT(THIS.c_OutputFile, 'VCX' + lcNext_Bak)) + + IF FILE( FORCEEXT(THIS.c_OutputFile,'VCT') ) + COPY FILE (FORCEEXT(THIS.c_OutputFile,'VCT')) TO (FORCEEXT(THIS.c_OutputFile,'VCT' + lcNext_Bak)) + ENDIF + ENDIF + + CASE JUSTEXT( THIS.c_OutputFile ) = 'SCX' + IF FILE( FORCEEXT(THIS.c_OutputFile,'SCX') ) + THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,'SCX') + '/SCT' ) + COPY FILE (FORCEEXT(THIS.c_OutputFile,'SCX')) TO (FORCEEXT(THIS.c_OutputFile,'SCX' + lcNext_Bak)) + + IF FILE( FORCEEXT(THIS.c_OutputFile,'SCT') ) + COPY FILE (FORCEEXT(THIS.c_OutputFile,'SCT')) TO (FORCEEXT(THIS.c_OutputFile,'SCT' + lcNext_Bak)) + ENDIF + ENDIF + + CASE JUSTEXT( THIS.c_OutputFile ) = 'PJX' + IF FILE( FORCEEXT(THIS.c_OutputFile,'PJX') ) + THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,'PJX') + '/PJT' ) + COPY FILE (FORCEEXT(THIS.c_OutputFile,'PJX')) TO (FORCEEXT(THIS.c_OutputFile,'PJX' + lcNext_Bak)) + + IF FILE( FORCEEXT(THIS.c_OutputFile,'PJT') ) + COPY FILE (FORCEEXT(THIS.c_OutputFile,'PJT')) TO (FORCEEXT(THIS.c_OutputFile,'PJT' + lcNext_Bak)) + ENDIF + ENDIF + + CASE JUSTEXT( THIS.c_OutputFile ) = 'FRX' + IF FILE( FORCEEXT(THIS.c_OutputFile,'FRX') ) + THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,'FRX') + '/FRT' ) + COPY FILE (FORCEEXT(THIS.c_OutputFile,'FRX')) TO (FORCEEXT(THIS.c_OutputFile,'FRX' + lcNext_Bak)) + + IF FILE( FORCEEXT(THIS.c_OutputFile,'FRT') ) + COPY FILE (FORCEEXT(THIS.c_OutputFile,'FRT')) TO (FORCEEXT(THIS.c_OutputFile,'FRT' + lcNext_Bak)) + ENDIF + ENDIF + + OTHERWISE + ERROR 'Tipo de archivo [' + JUSTFNAME(THIS.c_OutputFile) + '] no soportado para backup!' + + ENDCASE + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE encode_SpecialCodes_1_31 + LPARAMETERS tcText + LOCAL I + FOR I = 0 TO 31 + tcText = STRTRAN( tcText, CHR(I), '{' + TRANSFORM(I) + '}' ) + ENDFOR + RETURN tcText + ENDPROC + + + ******************************************************************************************************************* + HIDDEN PROCEDURE Exception2Str + LPARAMETERS toEx AS EXCEPTION + LOCAL lcError + lcError = 'Error ' + TRANSFORM(toEx.ERRORNO) + ', ' + toEx.MESSAGE + CHR(13) + CHR(13) ; + + toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) + CHR(13) + CHR(13) ; + + toEx.LINECONTENTS + RETURN lcError + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE fileTypeCode + LPARAMETERS tcExtension + tcExtension = UPPER(tcExtension) + RETURN ICASE( tcExtension = 'DBC', 'd' ; + , tcExtension = 'DBF', 'D' ; + , tcExtension = 'QPR', 'Q' ; + , tcExtension = 'SCX', 'K' ; + , tcExtension = 'FRX', 'R' ; + , tcExtension = 'LBX', 'B' ; + , tcExtension = 'VCX', 'V' ; + , tcExtension = 'PRG', 'P' ; + , tcExtension = 'FLL', 'L' ; + , tcExtension = 'APP', 'Z' ; + , tcExtension = 'EXE', 'Z' ; + , tcExtension = 'MNX', 'M' ; + , tcExtension = 'TXT', 'T' ; + , tcExtension = 'FPW', 'T' ; + , tcExtension = 'H', 'T' ; + , 'x' ) + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE getNext_BAK + LPARAMETERS tcOutputFileName + LOCAL lcNext_Bak, I + lcNext_Bak = '' + + FOR I = 0 TO 99 + IF I = 0 + IF NOT FILE( tcOutputFileName + '.BAK' ) + lcNext_Bak = '.BAK' + EXIT + ENDIF + ELSE + IF NOT FILE( tcOutputFileName + '.' + PADL(I,2,'0') + '.BAK' ) + lcNext_Bak = '.' + PADL(I,2,'0') + '.BAK' + EXIT + ENDIF + ENDIF + ENDFOR + + lcNext_Bak = EVL( lcNext_Bak, '.100.BAK' ) && Para que no quede nunca vacío + + RETURN lcNext_Bak + ENDPROC + + ******************************************************************************************************************* FUNCTION GetTimeStamp(tnTimeStamp) *-- CONVIERTE UN DATO TIMESTAMP NUMERICO USADO POR LOS ARCHIVOS SCX/VCX/etc. EN TIPO DATETIME @@ -955,117 +1039,79 @@ DEFINE CLASS c_conversor_base AS SESSION ******************************************************************************************************************* - HIDDEN PROCEDURE Exception2Str - LPARAMETERS toEx AS EXCEPTION - LOCAL lcError - lcError = 'Error ' + TRANSFORM(toEx.ERRORNO) + ', ' + toEx.MESSAGE + CHR(13) + CHR(13) ; - + toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) + CHR(13) + CHR(13) ; - + toEx.LINECONTENTS - RETURN lcError + PROCEDURE get_SeparatedLineAndComment + LPARAMETERS tcLine, tcComment + LOCAL ln_AT_Cmt + tcComment = '' + + IF '&'+'&' $ tcLine + ln_AT_Cmt = AT( '&'+'&', tcLine) + tcComment = LTRIM( SUBSTR( tcLine, ln_AT_Cmt + 2 ) ) + tcLine = RTRIM( LEFT( tcLine, ln_AT_Cmt - 1 ), 0, ' ', CHR(9) ) && Quito espacios y TABS + ENDIF + + RETURN ENDPROC ******************************************************************************************************************* - PROCEDURE normalizarValorXML - LPARAMETERS tcValor - *-- NORMALIZA EL TEXTO INDICADO, COMPRIMIENDO LOS SÍMBOLOS XML ESPECIALES. - tcValor = STRTRAN(tcValor, CHR(38), CHR(38) + 'amp;') && reemplaza & por & && - tcValor = STRTRAN(tcValor, CHR(39), CHR(38) + 'apos;') && reemplaza ' por ' && - tcValor = STRTRAN(tcValor, CHR(34), CHR(38) + 'quot;') && reemplaza " por " && - tcValor = STRTRAN(tcValor, '<', CHR(38) + 'lt;') && reemplaza < por < && - tcValor = STRTRAN(tcValor, '>', CHR(38) + 'gt;') && reemplaza > por > && - tcValor = STRTRAN(tcValor, CHR(13)+CHR(10), CHR(10)) && reeemplaza CR+LF por LF - tcValor = CHRTRAN(tcValor, CHR(13), CHR(10)) && reemplaza CR por LF + PROCEDURE get_SeparatedPropAndValue + LPARAMETERS tcAsignacion, tcProp, tcValue + LOCAL ln_AT_Cmt + STORE '' TO tcProp, tcValue - RETURN tcValor + IF '=' $ tcAsignacion + ln_AT_Cmt = AT( '=', tcAsignacion) + tcProp = ALLTRIM( LEFT( tcAsignacion, ln_AT_Cmt - 2 ), 0, ' ', CHR(9) ) && Quito espacios y TABS + tcValue = ALLTRIM( SUBSTR( tcAsignacion, ln_AT_Cmt + 2 ) ) + ENDIF + + RETURN ENDPROC ******************************************************************************************************************* - PROCEDURE desnormalizarValorXML - LPARAMETERS tcValor - *-- DESNORMALIZA EL TEXTO INDICADO, EXPANDIENDO LOS SÍMBOLOS XML ESPECIALES. - LOCAL lnPos, lnPos2, lnAscii - tcValor = STRTRAN(tcValor, CHR(38)+'gt;', '>') && > - tcValor = STRTRAN(tcValor, CHR(38)+'lt;', '<') && < - tcValor = STRTRAN(tcValor, CHR(38)+'quot;', CHR(34)) && " - tcValor = STRTRAN(tcValor, CHR(38)+'apos;', CHR(39)) && ' - tcValor = STRTRAN(tcValor, CHR(38)+'amp;', CHR(38)) && & + PROCEDURE identificarBloquesDeCodigo + LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toModulo + ENDPROC - *-- Obtengo los Hex - DO WHILE .T. - lnPos = AT( CHR(38)+'#x', tcValor ) - IF lnPos = 0 + + ******************************************************************************************************************* + PROCEDURE lineaExcluida + LPARAMETERS tn_Linea, tnBloquesExclusion, taBloquesExclusion + + EXTERNAL ARRAY taBloquesExclusion + LOCAL X, llExcluida + + FOR X = 1 TO tnBloquesExclusion + IF BETWEEN( tn_Linea, taBloquesExclusion(X,1), taBloquesExclusion(X,2) ) + llExcluida = .T. EXIT ENDIF - lnPos2 = lnPos + 1 + AT( ';', SUBSTR( tcValor, lnPos + 2, 4 ) ) - lnAscii = EVALUATE( '0' + SUBSTR( tcValor, lnPos + 3, lnPos2 - lnPos - 3 ) ) - tcValor = STUFF(tcValor, lnPos, lnPos2 - lnPos + 1, CHR(lnAscii)) && ASCII - ENDDO + ENDFOR - *-- Obtengo los Dec - DO WHILE .T. - lnPos = AT( CHR(38)+'#', tcValor ) - IF lnPos = 0 - EXIT - ENDIF - lnPos2 = lnPos + 1 + AT( ';', SUBSTR( tcValor, lnPos + 2, 4 ) ) - lnAscii = EVALUATE( SUBSTR( tcValor, lnPos + 2, lnPos2 - lnPos - 2 ) ) - tcValor = STUFF(tcValor, lnPos, lnPos2 - lnPos + 1, CHR(lnAscii)) && ASCII - ENDDO - - RETURN tcValor + RETURN llExcluida ENDPROC ******************************************************************************************************************* - PROCEDURE desnormalizarAsignacion - LPARAMETERS tcAsignacion - LOCAL lcPropName, lcValor, lnCodError, lcExpNormalizada, lnPos, lcComentario - THIS.get_SeparatedPropAndValue( @tcAsignacion, @lcPropName, @lcValor ) - lcComentario = '' - THIS.desnormalizarValorPropiedad( @lcPropName, @lcValor, @lcComentario ) - tcAsignacion = lcPropName + ' = ' + lcValor + PROCEDURE lineIsOnlyCommentAndNoMetadata + LPARAMETERS tcLine, tcComment + LOCAL lllineIsOnlyCommentAndNoMetadata, ln_AT_Cmt - RETURN tcAsignacion - ENDPROC + THIS.get_SeparatedLineAndComment( @tcLine, @tcComment ) - - ******************************************************************************************************************* - PROCEDURE desnormalizarValorPropiedad - LPARAMETERS tcProp, tcValue, tcComentario - LOCAL lnCodError, lnPos, lcValue - tcComentario = '' - - *-- Ajustes de algunos casos especiales DO CASE - CASE tcProp == '_memberdata' - *-- Me quedo con lo importante y quito los CHR(0) y longitud que a veces agrega al inicio - lcValue = '' + CASE LEFT(tcLine,2) == '*<' + tcComment = tcLine - FOR I = 1 TO OCCURS( '/>', tcValue ) - TEXT TO lcValue TEXTMERGE ADDITIVE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <', I, 1+4 )>> - ENDTEXT - ENDFOR - - TEXT TO tcValue TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 - - <> - - ENDTEXT - - tcValue = C_MPROPHEADER + STR( LEN(tcValue), 8 ) + tcValue - - CASE LEFT( tcValue, C_LEN_FB2P_VALUE_I ) == C_FB2P_VALUE_I - *-- Valor especial Fox con cabecera CHR(1): Debo agregarla y desnormalizar el valor - tcValue = STRTRAN( STRTRAN( STREXTRACT( tcValue, C_FB2P_VALUE_I, C_FB2P_VALUE_F, 1, 1 ), ' ', C_CR ), ' ', C_LF ) - tcValue = C_MPROPHEADER + STR( LEN(tcValue), 8 ) + tcValue + CASE EMPTY(tcLine) OR LEFT(tcLine, 1) == '*' OR LEFT(tcLine + ' ', 5) == 'NOTE ' && Vacía o Comentarios + lllineIsOnlyCommentAndNoMetadata = .T. ENDCASE - RETURN tcValue - ENDFUNC + RETURN lllineIsOnlyCommentAndNoMetadata + ENDPROC ******************************************************************************************************************* @@ -1119,18 +1165,38 @@ DEFINE CLASS c_conversor_base AS SESSION ******************************************************************************************************************* - FUNCTION comprobarExpresionValida( tcAsignacion, tnCodError, tcExpNormalizada ) - LOCAL llError, loEx AS EXCEPTION + PROCEDURE normalizarValorXML + LPARAMETERS tcValor + *-- NORMALIZA EL TEXTO INDICADO, COMPRIMIENDO LOS SÍMBOLOS XML ESPECIALES. + tcValor = STRTRAN(tcValor, CHR(38), CHR(38) + 'amp;') && reemplaza & por & && + tcValor = STRTRAN(tcValor, CHR(39), CHR(38) + 'apos;') && reemplaza ' por ' && + tcValor = STRTRAN(tcValor, CHR(34), CHR(38) + 'quot;') && reemplaza " por " && + tcValor = STRTRAN(tcValor, '<', CHR(38) + 'lt;') && reemplaza < por < && + tcValor = STRTRAN(tcValor, '>', CHR(38) + 'gt;') && reemplaza > por > && + tcValor = STRTRAN(tcValor, CHR(13)+CHR(10), CHR(10)) && reeemplaza CR+LF por LF + tcValor = CHRTRAN(tcValor, CHR(13), CHR(10)) && reemplaza CR por LF - TRY - tcExpNormalizada = NORMALIZE( tcAsignacion ) + RETURN tcValor + ENDPROC - CATCH TO loEx - llError = .T. - tnCodError = loEx.ERRORNO - ENDTRY - RETURN NOT llError + ******************************************************************************************************************* + FUNCTION RowTimeStamp(ltDateTime) + * Generate a FoxPro 3.0-style row timestamp + *-- CONVIERTE UN DATO TIPO DATETIME EN TIMESTAMP NUMERICO USADO POR LOS ARCHIVOS SCX/VCX/etc. + LOCAL lcTimeValue, tnTimeStamp + + IF VARTYPE(m.ltDateTime) <> 'T' + m.ltDateTime = DATETIME() + ENDIF + + tnTimeStamp = ( YEAR(m.ltDateTime) - 1980) * 2^25 ; + + MONTH(m.ltDateTime) * 2^21 ; + + DAY(m.ltDateTime) * 2^16 ; + + HOUR(m.ltDateTime) * 2^11 ; + + MINUTE(m.ltDateTime) * 2^5 ; + + SEC(m.ltDateTime) + RETURN INT(tnTimeStamp) ENDFUNC @@ -1176,7 +1242,9 @@ DEFINE CLASS c_conversor_base AS SESSION ENDIF ENDFOR - ASORT( laPropsAndValues, 1, -1, 0, 1) + IF THIS.l_PropSort_Enabled + ASORT( laPropsAndValues, 1, -1, 0, 1) + ENDIF *-- Quitar el agregado @@ -1254,6 +1322,19 @@ DEFINE CLASS c_conversor_base AS SESSION ENDPROC + ******************************************************************************************************************* + PROCEDURE writeLog + LPARAMETERS tcText + + IF THIS.l_Debug + TRY + STRTOFILE( TTOC(DATETIME(),3) + ' ' + EVL(tcText,'') + CR_LF, THIS.c_LogFile, 1 ) + CATCH + ENDTRY + ENDIF + ENDPROC + + ENDDEFINE @@ -1280,9 +1361,14 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base + [] ; + [] ; + [] ; + + [] ; + [] ; + + [] ; + [] ; + + [] ; + + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -1302,7 +1388,8 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ******************************************************************************************************************* PROCEDURE Convertir - DODEFAULT() + LPARAMETERS toModulo, toEx AS EXCEPTION + DODEFAULT( @toModulo, @toEx ) ENDPROC @@ -1378,6 +1465,12 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base lnLastPos = 1 DIMENSION taPropsAndValues( lnCantComillas / 2, 2 ) + *------------------------------------------------------------------------------------- + * IMPORTANTE!! + * ------------ + * SI SE SEPARAN LAS IGUALDADES CON ESPACIOS, ÉSTAS DEJAN DE RECONOCERSE!! (prop = "valor" en vez de prop="valor") + * TENER EN CUENTA AL GENERAR EL TEXTO O AL MODIFICARLO MANUALMENTE AL MERGEAR + *------------------------------------------------------------------------------------- FOR I = 1 TO lnCantComillas STEP 2 X = X + 1 @@ -1504,11 +1597,6 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ******************************************************************************************************************* PROCEDURE createProject - LPARAMETERS toProject - - #IF .F. - LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' - #ENDIF CREATE TABLE (THIS.c_OutputFile) ; ( NAME M ; @@ -1541,6 +1629,18 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , USER M ) USE (THIS.c_OutputFile) ALIAS TABLABIN AGAIN SHARED + + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE createProject_RecordHeader + LPARAMETERS toProject + + #IF .F. + LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' + #ENDIF + INSERT INTO TABLABIN ; ( NAME ; , TYPE ; @@ -1584,9 +1684,6 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ******************************************************************************************************************* PROCEDURE createClasslib - * No funciona con el EXE - *CREATE CLASSLIB (THIS.c_outputFile) - CREATE TABLE (THIS.c_OutputFile) ; ( PLATFORM C(8) ; , UNIQUEID C(10) ; @@ -1613,6 +1710,13 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , USER M ) USE (THIS.c_OutputFile) ALIAS TABLABIN AGAIN SHARED + + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE createClasslib_RecordHeader + INSERT INTO TABLABIN ; ( PLATFORM ; , UNIQUEID ; @@ -1654,6 +1758,13 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base , USER M ) USE (THIS.c_OutputFile) ALIAS TABLABIN AGAIN SHARED + + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE createForm_RecordHeader + INSERT INTO TABLABIN ; ( PLATFORM ; , UNIQUEID ; @@ -1666,6 +1777,99 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ENDPROC + ******************************************************************************************************************* + PROCEDURE createReport + + CREATE TABLE (THIS.c_OutputFile) ; + ( 'PLATFORM' C(8) ; + , 'UNIQUEID' C(10) ; + , 'TIMESTAMP' N(10) ; + , 'OBJTYPE' N(2) ; + , 'OBJCODE' N(3) ; + , 'NAME' M ; + , 'EXPR' M ; + , 'VPOS' N(9,3) ; + , 'HPOS' N(9,3) ; + , 'HEIGHT' N(9,3) ; + , 'WIDTH' N(9,3) ; + , 'STYLE' M ; + , 'PICTURE' M ; + , 'ORDER' M NOCPTRANS ; + , 'UNIQUE' L ; + , 'COMMENT' M ; + , 'ENVIRON' L ; + , 'BOXCHAR' C(1) ; + , 'FILLCHAR' C(1) ; + , 'TAG' M ; + , 'TAG2' M NOCPTRANS ; + , 'PENRED' N(5) ; + , 'PENGREEN' N(5) ; + , 'PENBLUE' N(5) ; + , 'FILLRED' N(5) ; + , 'FILLGREEN' N(5) ; + , 'FILLBLUE' N(5) ; + , 'PENSIZE' N(5) ; + , 'PENPAT' N(5) ; + , 'FILLPAT' N(5) ; + , 'FONTFACE' M ; + , 'FONTSTYLE' N(3) ; + , 'FONTSIZE' N(3) ; + , 'MODE' N(3) ; + , 'RULER' N(1) ; + , 'RULERLINES' N(1) ; + , 'GRID' L ; + , 'GRIDV' N(2) ; + , 'GRIDH' N(2) ; + , 'FLOAT' L ; + , 'STRETCH' L ; + , 'STRETCHTOP' L ; + , 'TOP' L ; + , 'BOTTOM' L ; + , 'SUPTYPE' N(1) ; + , 'SUPREST' N(1) ; + , 'NOREPEAT' L ; + , 'RESETRPT' N(2) ; + , 'PAGEBREAK' L ; + , 'COLBREAK' L ; + , 'RESETPAGE' L ; + , 'GENERAL' N(3) ; + , 'SPACING' N(3) ; + , 'DOUBLE' L ; + , 'SWAPHEADER' L ; + , 'SWAPFOOTER' L ; + , 'EJECTBEFOR' L ; + , 'EJECTAFTER' L ; + , 'PLAIN' L ; + , 'SUMMARY' L ; + , 'ADDALIAS' L ; + , 'OFFSET' N(3) ; + , 'TOPMARGIN' N(3) ; + , 'BOTMARGIN' N(3) ; + , 'TOTALTYPE' N(2) ; + , 'RESETTOTAL' N(2) ; + , 'RESOID' N(2) ; + , 'CURPOS' L ; + , 'SUPALWAYS' L ; + , 'SUPOVFLOW' L ; + , 'SUPRPCOL' N(1) ; + , 'SUPGROUP' N(2) ; + , 'SUPVALCHNG' L ; + , 'SUPEXPR' M ; + , 'USER' M ) + + USE (THIS.c_OutputFile) ALIAS TABLABIN AGAIN SHARED + + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE emptyRecord + LOCAL loReg + SCATTER MEMO BLANK NAME loReg + RETURN loReg + ENDPROC + + ******************************************************************************************************************* PROCEDURE escribirArchivoBin LPARAMETERS toModulo @@ -1706,14 +1910,16 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base lcMemo = '' IF toClase._Prop_Count > 0 - DIMENSION laProps( toClase._Prop_Count, 2 ) + DIMENSION laProps( toClase._Prop_Count, 3 ) ACOPY( toClase._Props, laProps ) lnPropsAndValues_Count = 0 WITH THIS *-- OBTENGO LAS PROPIEDADES Y SUS VALORES FOR I = 1 TO toClase._Prop_Count - .get_SeparatedPropAndValue( toClase._Props(I,1), @lcPropName, @lcValue ) + *.get_SeparatedPropAndValue( toClase._Props(I,1), @lcPropName, @lcValue ) + lcPropName = toClase._Props(I,1) + lcValue = toClase._Props(I,2) DO CASE CASE EMPTY(lcPropName) @@ -1783,14 +1989,15 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base IF toObjeto._Prop_Count > 0 DIMENSION laPropsAndValues( toObjeto._Prop_Count, 2 ) + ACOPY( toObjeto._Props, laPropsAndValues ) - WITH THIS - FOR I = 1 TO toObjeto._Prop_Count - .get_SeparatedPropAndValue( toObjeto._Props(I,1), @lcPropName, @lcValue ) - laPropsAndValues(I,1) = lcPropName - laPropsAndValues(I,2) = lcValue - ENDFOR - ENDWITH && THIS + *WITH THIS + * FOR I = 1 TO toObjeto._Prop_Count + * .get_SeparatedPropAndValue( toObjeto._Props(I,1), @lcPropName, @lcValue ) + * laPropsAndValues(I,1) = lcPropName + * laPropsAndValues(I,2) = lcValue + * ENDFOR + *ENDWITH && THIS *-- REORDENO LAS PROPIEDADES @@ -1845,8 +2052,6 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ENDTEXT ENDIF - *-- Comentarios (NO DEBEN IR EN EL VCX!!) - *-- Incluir las líneas del método FOR X = 1 TO loProcedure._ProcLine_Count TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 @@ -2151,6 +2356,14 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ******************************************************************************************************************* PROCEDURE analizarAsignacion_TAG_Indicado + *-- DETALLES: Este método está pensado para leer los tags FB2P_VALUE y MEMBERDATA, que tienen esta sintaxis: + * + * _memberdata = + * + * && XML Metadata for customizable properties + * + * Este es un valor especial + * LPARAMETERS tcPropName, tcValue, taProps, tnProp_Count, I, tcTAG_I, tcTAG_F, tnLEN_TAG_I, tnLEN_TAG_F, tcMemo EXTERNAL ARRAY taProps LOCAL llBloqueEncontrado, loEx AS EXCEPTION @@ -2203,77 +2416,6 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ENDPROC - ******************************************************************************************************************* - PROCEDURE evaluarDefinicionDeProcedure - LPARAMETERS toClase, tnX, tc_Comentario, tcProcName, tcProcType, toObjeto - *-------------------------------------------------------------------------------------------------------------- - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' ; - , toObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' - #ENDIF - - TRY - LOCAL I, lcNombreObjeto, lnObjProc ; - , loProcedure AS CL_PROCEDURE OF 'FOXBIN2PRG.PRG' - - IF EMPTY(toClase._Fin_Cab) - toClase._Fin_Cab = tnX-1 - toClase._Ini_Cuerpo = tnX - ENDIF - - loProcedure = CREATEOBJECT("CL_PROCEDURE") - loProcedure._Nombre = tcProcName - loProcedure._ProcType = tcProcType - loProcedure._Comentario = tc_Comentario - - *-- Anoto en HiddenMethods y ProtectedMethods según corresponda - DO CASE - CASE loProcedure._ProcType == 'hidden' - toClase._HiddenMethods = toClase._HiddenMethods + ',' + tcProcName - - CASE loProcedure._ProcType == 'protected' - toClase._ProtectedMethods = toClase._ProtectedMethods + ',' + tcProcName - - ENDCASE - - *-- Agrego el objeto Procedimiento a la clase, o a un objeto de la clase. - IF '.' $ tcProcName - *-- Procedimiento de objeto - lcNombreObjeto = LOWER( JUSTSTEM( tcProcName ) ) - - *-- Busco el objeto al que corresponde el método - lnObjProc = THIS.buscarObjetoDelMetodoPorNombre( lcNombreObjeto, toClase ) - - IF lnObjProc = 0 - *-- Procedimiento de clase - toClase.add_Procedure( loProcedure ) - ELSE - *-- Procedimiento de objeto - toObjeto = toClase._AddObjects( lnObjProc ) - toObjeto.add_Procedure( loProcedure ) - ENDIF - ELSE - *-- Procedimiento de clase - toClase.add_Procedure( loProcedure ) - ENDIF - - CATCH TO loEx - IF THIS.l_Debug AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - FINALLY - STORE NULL TO loProcedure - RELEASE loProcedure - - ENDTRY - - RETURN - ENDPROC - - ******************************************************************************************************************* PROCEDURE analizarLineasDeProcedure LPARAMETERS toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto, tc_Comentario ; @@ -2332,191 +2474,6 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ENDPROC - ******************************************************************************************************************* - PROCEDURE analizarBloque_PROCEDURE - LPARAMETERS toModulo, toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto ; - , tc_Comentario, taBloquesExclusion, tnBloquesExclusion - - #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 - - LOCAL llBloqueEncontrado - - DO CASE - CASE LEFT( tcLine, 20 ) == 'PROTECTED PROCEDURE ' - *-- Estructura a reconocer: PROTECTED PROCEDURE nombre_del_procedimiento - llBloqueEncontrado = .T. - tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 21 ) ) - THIS.evaluarDefinicionDeProcedure( @toClase, I, @tc_Comentario, tcProcedureAbierto, 'protected', @toObjeto ) - - - CASE LEFT( tcLine, 17 ) == 'HIDDEN PROCEDURE ' - *-- Estructura a reconocer: HIDDEN PROCEDURE nombre_del_procedimiento - llBloqueEncontrado = .T. - tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 18 ) ) - THIS.evaluarDefinicionDeProcedure( @toClase, I, @tc_Comentario, tcProcedureAbierto, 'hidden', @toObjeto ) - - CASE LEFT( tcLine, 10 ) == 'PROCEDURE ' - *-- Estructura a reconocer: PROCEDURE [objeto.]nombre_del_procedimiento - llBloqueEncontrado = .T. - tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 11 ) ) - THIS.evaluarDefinicionDeProcedure( @toClase, I, @tc_Comentario, tcProcedureAbierto, 'normal', @toObjeto ) - - ENDCASE - - IF llBloqueEncontrado - *-- Evalúo todo el contenido del PROCEDURE - THIS.analizarLineasDeProcedure( @toClase, @toObjeto, @tcLine, @taCodeLines, @I, @tnCodeLines, tcProcedureAbierto ; - , @tc_Comentario, @taBloquesExclusion, @tnBloquesExclusion ) - ENDIF - - RETURN llBloqueEncontrado - ENDPROC - - - ******************************************************************************************************************* - PROCEDURE analizarBloque_METADATA - LPARAMETERS toClase, tcLine - - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - #ENDIF - - LOCAL llBloqueEncontrado - - IF LEFT(tcLine, C_LEN_METADATA_I) == C_METADATA_I && METADATA de la CLASE - *< CLASSDATA: Baseclass="custom" Timestamp="2013/11/19 11:51:04" Scale="Foxels" Uniqueid="_3WF0VSTN1" ProjectClassIcon="container.ico" ClassIcon="toolbar.ico" /> - LOCAL laPropsAndValues(1,2), lnPropsAndValues_Count - llBloqueEncontrado = .T. - WITH THIS - .get_ListNamesWithValuesFrom_InLine_MetadataTag( @tcLine, @laPropsAndValues, @lnPropsAndValues_Count, C_METADATA_I, C_METADATA_F ) - - toClase._BaseClass = .get_ValueByName_FromListNamesWithValues( 'BaseClass', 'C', @laPropsAndValues ) - toClase._TimeStamp = INT( .RowTimeStamp( .get_ValueByName_FromListNamesWithValues( 'TimeStamp', 'T', @laPropsAndValues ) ) ) - toClase._Scale = .get_ValueByName_FromListNamesWithValues( 'Scale', 'C', @laPropsAndValues ) - toClase._UniqueID = .get_ValueByName_FromListNamesWithValues( 'UniqueID', 'C', @laPropsAndValues ) - toClase._ProjectClassIcon = .get_ValueByName_FromListNamesWithValues( 'ProjectClassIcon', 'C', @laPropsAndValues ) - toClase._ClassIcon = .get_ValueByName_FromListNamesWithValues( 'ClassIcon', 'C', @laPropsAndValues ) - toClase._Ole2 = .get_ValueByName_FromListNamesWithValues( 'Ole2', 'C', @laPropsAndValues ) - ENDWITH && THIS - - IF NOT EMPTY( toClase._Ole2 ) && Le agrego "OLEObject = " delante - toClase._Ole2 = 'OLEObject = ' + toClase._Ole2 + CR_LF - ENDIF - ENDIF - - RETURN llBloqueEncontrado - ENDPROC - - - ******************************************************************************************************************* - PROCEDURE analizarBloque_PROTECTED - LPARAMETERS toClase, tcLine - - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - #ENDIF - - LOCAL llBloqueEncontrado - - IF LEFT(tcLine, 10) == 'PROTECTED ' - llBloqueEncontrado = .T. - toClase._ProtectedProps = ALLTRIM( SUBSTR( tcLine, 11 ) ) - ENDIF - - RETURN llBloqueEncontrado - ENDPROC - - - ******************************************************************************************************************* - PROCEDURE analizarBloque_HIDDEN - LPARAMETERS toClase, tcLine - - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - #ENDIF - - LOCAL llBloqueEncontrado - - IF LEFT(tcLine, 7) == 'HIDDEN ' - llBloqueEncontrado = .T. - toClase._HiddenProps = ALLTRIM( SUBSTR( tcLine, 8 ) ) - ENDIF - - RETURN llBloqueEncontrado - ENDPROC - - - ******************************************************************************************************************* - PROCEDURE analizarBloque_DEFINED_PAM - *-- ESTRUCTURA A ANALIZAR: - * - *m: *metodovacio_con_comentarios && Este método no tiene código, pero tiene comentarios. A ver que pasa! - *m: *mimetodo && Mi metodo - *p: prop1 && Mi prop 1 - *p: prop_especial_cr && - *a: ^array_1_d[1,0] && Array 1 dimensión (1) - *a: ^array_2_d[1,2] && Array una dimension (1,2) - *p: _memberdata && XML Metadata for customizable properties - * - LPARAMETERS toClase, tcLine, taCodeLines, tnCodeLines, I - - #IF .F. - LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' - #ENDIF - - TRY - LOCAL llBloqueEncontrado, lcDefinedPAM, lnPos, lnPos2 - - IF LEFT( tcLine, C_LEN_DEFINED_PAM_I) == C_DEFINED_PAM_I - llBloqueEncontrado = .T. - lcDefinedPAM = '' - - WITH THIS - FOR I = I + 1 TO tnCodeLines - .set_Line( @tcLine, @taCodeLines, I ) - - DO CASE - CASE LEFT( tcLine, C_LEN_DEFINED_PAM_F ) == C_DEFINED_PAM_F - I = I + 1 - EXIT - - *CASE .lineIsOnlyCommentAndNoMetadata( @tcLine ) - * LOOP && Saltear comentarios - - OTHERWISE - *toProject.setParsedProjInfoLine( @tcLine ) - lnPos = AT( ' ', tcLine, 1 ) - lnPos2 = AT( '&'+'&', tcLine ) - lcDefinedPAM = lcDefinedPAM ; - + RTRIM( SUBSTR( tcLine, lnPos+1, lnPos2 - lnPos - 1 ), 0, ' ', CHR(9) ) + ' ' + SUBSTR( tcLine, lnPos2 + 3 ) ; - + CR_LF - ENDCASE - ENDFOR - ENDWITH && THIS - - toClase._Defined_PAM = lcDefinedPAM - I = I - 1 - ENDIF - - CATCH TO loEx - lnCodError = loEx.ERRORNO - - IF THIS.l_Debug AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - ENDTRY - - RETURN llBloqueEncontrado - ENDPROC - - ******************************************************************************************************************* PROCEDURE analizarBloque_ADD_OBJECT LPARAMETERS toModulo, toClase, tcLine, I, taCodeLines, tnCodeLines @@ -2535,7 +2492,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base IF LEFT( tcLine, 11 ) == 'ADD OBJECT ' *-- Estructura a reconocer: ADD OBJECT 'frm_a.Check1' AS check [WITH] llBloqueEncontrado = .T. - LOCAL laPropsAndValues(1,2), lnPropsAndValues_Count, Z + LOCAL laPropsAndValues(1,2), lnPropsAndValues_Count, Z, lcProp, lcValue tcLine = CHRTRAN( tcLine, ['], ["] ) IF EMPTY(toClase._Fin_Cab) @@ -2592,10 +2549,12 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base IF RIGHT(tcLine, 3) == ', ;' *toObjeto.add_Property( .desnormalizarAsignacion( LEFT(tcLine, LEN(tcLine) - 3) ) ) - toObjeto.add_Property( LEFT(tcLine, LEN(tcLine) - 3) ) + .get_SeparatedPropAndValue( LEFT(tcLine, LEN(tcLine) - 3), @lcProp, @lcValue ) + toObjeto.add_Property( @lcProp, @lcValue ) ELSE *toObjeto.add_Property( .desnormalizarAsignacion( RTRIM(tcLine) ) ) - toObjeto.add_Property( RTRIM(tcLine) ) + .get_SeparatedPropAndValue( RTRIM(tcLine), @lcProp, @lcValue ) + toObjeto.add_Property( @lcProp, @lcValue ) ENDIF ENDFOR @@ -2616,31 +2575,74 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ******************************************************************************************************************* - PROCEDURE analizarBloque_ENDDEFINE - LPARAMETERS toClase, tcLine, I, tcProcedureAbierto + PROCEDURE analizarBloque_DEFINED_PAM + *-- ESTRUCTURA A ANALIZAR: + * + *m: *metodovacio_con_comentarios && Este método no tiene código, pero tiene comentarios. A ver que pasa! + *m: *mimetodo && Mi metodo + *p: prop1 && Mi prop 1 + *p: prop_especial_cr && + *a: ^array_1_d[1,0] && Array 1 dimensión (1) + *a: ^array_2_d[1,2] && Array una dimension (1,2) + *p: _memberdata && XML Metadata for customizable properties + * + LPARAMETERS toClase, tcLine, taCodeLines, tnCodeLines, I #IF .F. LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' #ENDIF - LOCAL llBloqueEncontrado + TRY + LOCAL llBloqueEncontrado, lcDefinedPAM, lnPos, lnPos2, lcPAM_Name - IF LEFT( tcLine + ' ', 10 ) == C_ENDDEFINE + ' ' && Fin de bloque (ENDDEF / ENDPROC) encontrado - llBloqueEncontrado = .T. - toClase._Fin = I + IF LEFT( tcLine, C_LEN_DEFINED_PAM_I) == C_DEFINED_PAM_I + llBloqueEncontrado = .T. + lcDefinedPAM = '' - IF EMPTY( toClase._Ini_Cuerpo ) - toClase._Ini_Cuerpo = I-1 + WITH THIS + FOR I = I + 1 TO tnCodeLines + .set_Line( @tcLine, @taCodeLines, I ) + + DO CASE + CASE LEFT( tcLine, C_LEN_DEFINED_PAM_F ) == C_DEFINED_PAM_F + I = I + 1 + EXIT + + OTHERWISE + lnPos = AT( ' ', tcLine, 1 ) + lnPos2 = AT( '&'+'&', tcLine ) + + IF lnPos2 > 0 + *-- Con comentarios + lcPAM_Name = RTRIM( SUBSTR( tcLine, lnPos+1, lnPos2 - lnPos - 1 ), 0, ' ', CHR(9) ) + lcDefinedPAM = lcDefinedPAM ; + + lcPAM_Name + ' ' + SUBSTR( tcLine, lnPos2 + 3 ) ; + + CR_LF + ELSE + *-- Sin comentarios + lcPAM_Name = RTRIM( SUBSTR( tcLine, lnPos+1 ), 0, ' ', CHR(9) ) + lcDefinedPAM = lcDefinedPAM ; + + lcPAM_Name + IIF(ISALPHA(lcPAM_Name), '', ' ') ; + + CR_LF + ENDIF + ENDCASE + ENDFOR + ENDWITH && THIS + + toClase._Defined_PAM = lcDefinedPAM + I = I - 1 ENDIF - toClase._Fin_Cuerpo = I-1 + CATCH TO loEx + lnCodError = loEx.ERRORNO - IF EMPTY( toClase._Fin_Cab ) - toClase._Fin_Cab = I-1 + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON ENDIF - STORE '' TO tcProcedureAbierto - ENDIF + THROW + + ENDTRY RETURN llBloqueEncontrado ENDPROC @@ -2664,7 +2666,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base IF LEFT(tcLine + ' ', 13) == C_DEFINE_CLASS + ' ' TRY llBloqueEncontrado = .T. - LOCAL Z, loEx AS EXCEPTION ; + LOCAL Z, lcProp, lcValue, loEx AS EXCEPTION ; , llMETADATA_Completed, llPROTECTED_Completed, llHIDDEN_Completed, llDEFINED_PAM_Completed ; , llINCLUDE_Completed, llCLASS_PROPERTY_Completed @@ -2748,7 +2750,8 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base CASE NOT llCLASS_PROPERTY_Completed AND EMPTY( toClase._Fin_Cab ) && Propiedades del DEFINE CLASS *toClase.add_Property( THIS.desnormalizarAsignacion( RTRIM(tcLine) ), RTRIM(tc_Comentario) ) - toClase.add_Property( RTRIM(tcLine), RTRIM(tc_Comentario) ) + .get_SeparatedPropAndValue( RTRIM(tcLine), @lcProp, @lcValue ) + toClase.add_Property( @lcProp, @lcValue, RTRIM(tc_Comentario) ) OTHERWISE @@ -2767,6 +2770,18 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base + 'para el identificador [' + toClase._Nombre + ']' ENDIF + toClase._PROPERTIES = THIS.classProps2Memo( toClase ) + toClase._PROTECTED = THIS.hiddenAndProtected_PAM( toClase ) + toClase._METHODS = THIS.classMethods2Memo( toClase ) + toClase._RESERVED1 = IIF( THIS.c_Type = 'SCX', '', 'Class' ) + toClase._RESERVED2 = IIF( THIS.c_Type = 'VCX' OR toClase._Nombre == 'Dataenvironment', TRANSFORM( toClase._AddObject_Count + 1 ), '' ) + toClase._RESERVED3 = THIS.defined_PAM2Memo( toClase ) + toClase._RESERVED4 = toClase._ClassIcon + toClase._RESERVED5 = toClase._ProjectClassIcon + toClase._RESERVED6 = toClase._Scale + toClase._RESERVED7 = toClase._Comentario + toClase._RESERVED8 = toClase._includeFile + CATCH TO loEx IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON @@ -2781,6 +2796,56 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ENDPROC + ******************************************************************************************************************* + PROCEDURE analizarBloque_ENDDEFINE + LPARAMETERS toClase, tcLine, I, tcProcedureAbierto + + #IF .F. + LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' + #ENDIF + + LOCAL llBloqueEncontrado + + IF LEFT( tcLine + ' ', 10 ) == C_ENDDEFINE + ' ' && Fin de bloque (ENDDEF / ENDPROC) encontrado + llBloqueEncontrado = .T. + toClase._Fin = I + + IF EMPTY( toClase._Ini_Cuerpo ) + toClase._Ini_Cuerpo = I-1 + ENDIF + + toClase._Fin_Cuerpo = I-1 + + IF EMPTY( toClase._Fin_Cab ) + toClase._Fin_Cab = I-1 + ENDIF + + STORE '' TO tcProcedureAbierto + ENDIF + + RETURN llBloqueEncontrado + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE analizarBloque_HIDDEN + LPARAMETERS toClase, tcLine + + #IF .F. + LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' + #ENDIF + + LOCAL llBloqueEncontrado + + IF LEFT(tcLine, 7) == 'HIDDEN ' + llBloqueEncontrado = .T. + toClase._HiddenProps = ALLTRIM( SUBSTR( tcLine, 8 ) ) + ENDIF + + RETURN llBloqueEncontrado + ENDPROC + + ******************************************************************************************************************* PROCEDURE analizarBloque_INCLUDE LPARAMETERS toModulo, toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto @@ -2804,6 +2869,41 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ENDPROC + ******************************************************************************************************************* + PROCEDURE analizarBloque_METADATA + LPARAMETERS toClase, tcLine + + #IF .F. + LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' + #ENDIF + + LOCAL llBloqueEncontrado + + IF LEFT(tcLine, C_LEN_METADATA_I) == C_METADATA_I && METADATA de la CLASE + *< CLASSDATA: Baseclass="custom" Timestamp="2013/11/19 11:51:04" Scale="Foxels" Uniqueid="_3WF0VSTN1" ProjectClassIcon="container.ico" ClassIcon="toolbar.ico" /> + LOCAL laPropsAndValues(1,2), lnPropsAndValues_Count + llBloqueEncontrado = .T. + WITH THIS + .get_ListNamesWithValuesFrom_InLine_MetadataTag( @tcLine, @laPropsAndValues, @lnPropsAndValues_Count, C_METADATA_I, C_METADATA_F ) + + toClase._BaseClass = .get_ValueByName_FromListNamesWithValues( 'BaseClass', 'C', @laPropsAndValues ) + toClase._TimeStamp = INT( .RowTimeStamp( .get_ValueByName_FromListNamesWithValues( 'TimeStamp', 'T', @laPropsAndValues ) ) ) + toClase._Scale = .get_ValueByName_FromListNamesWithValues( 'Scale', 'C', @laPropsAndValues ) + toClase._UniqueID = .get_ValueByName_FromListNamesWithValues( 'UniqueID', 'C', @laPropsAndValues ) + toClase._ProjectClassIcon = .get_ValueByName_FromListNamesWithValues( 'ProjectClassIcon', 'C', @laPropsAndValues ) + toClase._ClassIcon = .get_ValueByName_FromListNamesWithValues( 'ClassIcon', 'C', @laPropsAndValues ) + toClase._Ole2 = .get_ValueByName_FromListNamesWithValues( 'OLEObject', 'C', @laPropsAndValues ) + ENDWITH && THIS + + IF NOT EMPTY( toClase._Ole2 ) && Le agrego "OLEObject = " delante + toClase._Ole2 = 'OLEObject = ' + toClase._Ole2 + CR_LF + ENDIF + ENDIF + + RETURN llBloqueEncontrado + ENDPROC + + ******************************************************************************************************************* PROCEDURE analizarBloque_OLE_DEF LPARAMETERS toModulo, toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto @@ -2854,6 +2954,142 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base RETURN llBloqueEncontrado ENDPROC + + ******************************************************************************************************************* + PROCEDURE analizarBloque_PROCEDURE + LPARAMETERS toModulo, toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto ; + , tc_Comentario, taBloquesExclusion, tnBloquesExclusion + + #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 + + LOCAL llBloqueEncontrado + + DO CASE + CASE LEFT( tcLine, 20 ) == 'PROTECTED PROCEDURE ' + *-- Estructura a reconocer: PROTECTED PROCEDURE nombre_del_procedimiento + llBloqueEncontrado = .T. + tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 21 ) ) + THIS.evaluarDefinicionDeProcedure( @toClase, I, @tc_Comentario, tcProcedureAbierto, 'protected', @toObjeto ) + + + CASE LEFT( tcLine, 17 ) == 'HIDDEN PROCEDURE ' + *-- Estructura a reconocer: HIDDEN PROCEDURE nombre_del_procedimiento + llBloqueEncontrado = .T. + tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 18 ) ) + THIS.evaluarDefinicionDeProcedure( @toClase, I, @tc_Comentario, tcProcedureAbierto, 'hidden', @toObjeto ) + + CASE LEFT( tcLine, 10 ) == 'PROCEDURE ' + *-- Estructura a reconocer: PROCEDURE [objeto.]nombre_del_procedimiento + llBloqueEncontrado = .T. + tcProcedureAbierto = ALLTRIM( SUBSTR( tcLine, 11 ) ) + THIS.evaluarDefinicionDeProcedure( @toClase, I, @tc_Comentario, tcProcedureAbierto, 'normal', @toObjeto ) + + ENDCASE + + IF llBloqueEncontrado + *-- Evalúo todo el contenido del PROCEDURE + THIS.analizarLineasDeProcedure( @toClase, @toObjeto, @tcLine, @taCodeLines, @I, @tnCodeLines, tcProcedureAbierto ; + , @tc_Comentario, @taBloquesExclusion, @tnBloquesExclusion ) + ENDIF + + RETURN llBloqueEncontrado + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE analizarBloque_PROTECTED + LPARAMETERS toClase, tcLine + + #IF .F. + LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' + #ENDIF + + LOCAL llBloqueEncontrado + + IF LEFT(tcLine, 10) == 'PROTECTED ' + llBloqueEncontrado = .T. + toClase._ProtectedProps = ALLTRIM( SUBSTR( tcLine, 11 ) ) + ENDIF + + RETURN llBloqueEncontrado + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE evaluarDefinicionDeProcedure + LPARAMETERS toClase, tnX, tc_Comentario, tcProcName, tcProcType, toObjeto + *-------------------------------------------------------------------------------------------------------------- + #IF .F. + LOCAL toClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' ; + , toObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' + #ENDIF + + TRY + LOCAL I, lcNombreObjeto, lnObjProc ; + , loProcedure AS CL_PROCEDURE OF 'FOXBIN2PRG.PRG' + + IF EMPTY(toClase._Fin_Cab) + toClase._Fin_Cab = tnX-1 + toClase._Ini_Cuerpo = tnX + ENDIF + + loProcedure = CREATEOBJECT("CL_PROCEDURE") + loProcedure._Nombre = tcProcName + loProcedure._ProcType = tcProcType + loProcedure._Comentario = tc_Comentario + + *-- Anoto en HiddenMethods y ProtectedMethods según corresponda + DO CASE + CASE loProcedure._ProcType == 'hidden' + toClase._HiddenMethods = toClase._HiddenMethods + ',' + tcProcName + + CASE loProcedure._ProcType == 'protected' + toClase._ProtectedMethods = toClase._ProtectedMethods + ',' + tcProcName + + ENDCASE + + *-- Agrego el objeto Procedimiento a la clase, o a un objeto de la clase. + IF '.' $ tcProcName + *-- Procedimiento de objeto + lcNombreObjeto = LOWER( JUSTSTEM( tcProcName ) ) + + *-- Busco el objeto al que corresponde el método + lnObjProc = THIS.buscarObjetoDelMetodoPorNombre( lcNombreObjeto, toClase ) + + IF lnObjProc = 0 + *-- Procedimiento de clase + toClase.add_Procedure( loProcedure ) + ELSE + *-- Procedimiento de objeto + toObjeto = toClase._AddObjects( lnObjProc ) + toObjeto.add_Procedure( loProcedure ) + ENDIF + ELSE + *-- Procedimiento de clase + toClase.add_Procedure( loProcedure ) + ENDIF + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + FINALLY + STORE NULL TO loProcedure + RELEASE loProcedure + + ENDTRY + + RETURN + ENDPROC + + ******************************************************************************************************************* PROCEDURE identificarBloquesDeCodigo LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toModulo @@ -2955,11 +3191,12 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin ******************************************************************************************************************* PROCEDURE Convertir - DODEFAULT() + LPARAMETERS toModulo, toEx AS EXCEPTION + DODEFAULT( @toModulo, @toEx ) TRY - LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ; - , laBloquesExclusion(1,2), lnBloquesExclusion, I, toModulo + LOCAL lnCodError, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ; + , laBloquesExclusion(1,2), lnBloquesExclusion, I STORE 0 TO lnCodError, lnCodeLines, lnFB2P_Version STORE '' TO lcLine, lcSourceFile STORE NULL TO loReg, toModulo @@ -2967,6 +3204,11 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin C_FB2PRG_CODE = FILETOSTR( THIS.c_InputFile ) lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) + THIS.doBackup() + + *-- Creo la librería + THIS.createClasslib() + *-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF THIS.identificarBloquesDeExclusion( @laCodeLines, lnCodeLines, .F., @laBloquesExclusion, @lnBloquesExclusion ) @@ -2976,9 +3218,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin THIS.escribirArchivoBin( @toModulo ) - CATCH TO loEx - lnCodError = loEx.ERRORNO - + CATCH TO toEx IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -2987,7 +3227,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin ENDTRY - RETURN lnCodError + RETURN ENDPROC @@ -3068,8 +3308,8 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin , loClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' ; , loObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' - THIS.doBackup() - THIS.createClasslib() + *-- Creo el registro de cabecera + THIS.createClasslib_RecordHeader() *-- Recorro las CLASES @@ -3110,14 +3350,14 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin , loClase._BaseClass ; , loClase._ObjName ; , loClase._Parent ; - , THIS.classProps2Memo( loClase ) ; - , THIS.hiddenAndProtected_PAM( loClase ) ; - , THIS.classMethods2Memo( loClase ) ; + , loClase._PROPERTIES ; + , loClase._PROTECTED ; + , loClase._METHODS ; , loClase._Ole ; , loClase._Ole2 ; - , 'Class' ; - , TRANSFORM( loClase._AddObject_Count + 1 ) ; - , THIS.defined_PAM2Memo( loClase ) ; + , loClase._RESERVED1 ; + , loClase._RESERVED2 ; + , loClase._RESERVED3 ; , loClase._ClassIcon ; , loClase._ProjectClassIcon ; , loClase._Scale ; @@ -3215,11 +3455,12 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin ******************************************************************************************************************* PROCEDURE Convertir - DODEFAULT() + LPARAMETERS toModulo, toEx AS EXCEPTION + DODEFAULT( @toModulo, @toEx ) TRY - LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ; - , laBloquesExclusion(1,2), lnBloquesExclusion, I, toModulo + LOCAL lnCodError, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ; + , laBloquesExclusion(1,2), lnBloquesExclusion, I STORE 0 TO lnCodError, lnCodeLines, lnFB2P_Version STORE '' TO lcLine, lcSourceFile STORE NULL TO loReg, toModulo @@ -3227,6 +3468,11 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin C_FB2PRG_CODE = FILETOSTR( THIS.c_InputFile ) lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) + THIS.doBackup() + + *-- Creo el form + THIS.createForm() + *-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF THIS.identificarBloquesDeExclusion( @laCodeLines, lnCodeLines, .F., @laBloquesExclusion, @lnBloquesExclusion ) @@ -3236,9 +3482,7 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin THIS.escribirArchivoBin( @toModulo ) - CATCH TO loEx - lnCodError = loEx.ERRORNO - + CATCH TO toEx IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -3247,7 +3491,7 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin ENDTRY - RETURN lnCodError + RETURN ENDPROC @@ -3328,8 +3572,8 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin , loClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' ; , loObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' - THIS.doBackup() - THIS.createForm() + *-- Creo el registro de cabecera + THIS.createForm_RecordHeader() *-- El SCX tiene el INCLUDE en el primer registro IF NOT EMPTY(toModulo._includeFile) @@ -3375,14 +3619,14 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin , loClase._BaseClass ; , loClase._ObjName ; , loClase._Parent ; - , THIS.classProps2Memo( loClase ) ; - , THIS.hiddenAndProtected_PAM( loClase ) ; - , THIS.classMethods2Memo( loClase ) ; + , loClase._PROPERTIES ; + , loClase._PROTECTED ; + , loClase._METHODS ; , loClase._Ole ; , loClase._Ole2 ; - , '' ; - , TRANSFORM( loClase._AddObject_Count + 1 ) ; - , THIS.defined_PAM2Memo( loClase ) ; + , loClase._RESERVED1 ; + , loClase._RESERVED2 ; + , loClase._RESERVED3 ; , loClase._ClassIcon ; , loClase._ProjectClassIcon ; , loClase._Scale ; @@ -3394,7 +3638,7 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin THIS.insert_AllObjects( @loClase ) - IF NOT loClase._BaseClass == 'dataenvironment' + IF .F. &&NOT loClase._BaseClass == 'dataenvironment' *-- Inserto el COMMENT INSERT INTO TABLABIN ; ( PLATFORM ; @@ -3451,8 +3695,6 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin CATCH TO loEx - lnCodError = loEx.ERRORNO - IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -3464,7 +3706,7 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin ENDTRY - RETURN lnCodError + RETURN ENDPROC ENDDEFINE @@ -3490,12 +3732,16 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin ******************************************************************************************************************* PROCEDURE Convertir - DODEFAULT() + LPARAMETERS toModulo, toEx AS EXCEPTION + DODEFAULT( @toModulo, @toEx ) + + #IF .F. + LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' + #ENDIF TRY - LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ; - , laBloquesExclusion(1,2), lnBloquesExclusion, I ; - , loProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' + LOCAL lnCodError, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ; + , laBloquesExclusion(1,2), lnBloquesExclusion, I STORE 0 TO lnCodError, lnCodeLines, lnFB2P_Version STORE '' TO lcLine, lcSourceFile STORE NULL TO loReg, toModulo @@ -3503,18 +3749,21 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin C_FB2PRG_CODE = FILETOSTR( THIS.c_InputFile ) lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) + THIS.doBackup() + + *-- Creo solo la cabecera del proyecto + THIS.createProject() + *-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF *THIS.identificarBloquesDeExclusion( @laCodeLines, .F., @laBloquesExclusion, @lnBloquesExclusion ) *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo de cada clase - THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @loProject ) + THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toProject ) - THIS.escribirArchivoBin( @loProject ) + THIS.escribirArchivoBin( @toProject ) - CATCH TO loEx - lnCodError = loEx.ERRORNO - + CATCH TO toEx IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -3523,7 +3772,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin ENDTRY - RETURN lnCodError + RETURN ENDPROC @@ -3540,10 +3789,8 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin , loServerHead AS CL_PROJ_SRV_HEAD OF 'FOXBIN2PRG.PRG' ; , loFile AS CL_PROJ_FILE OF 'FOXBIN2PRG.PRG' - THIS.doBackup() - - *-- Creo solo la cabecera del proyecto - THIS.createProject( toProject ) + *-- Creo solo el registro de cabecera del proyecto + THIS.createProject_RecordHeader( toProject ) lcMainProg = '' @@ -4179,6 +4426,1779 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin ENDDEFINE +******************************************************************************************************************* +DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin + #IF .F. + LOCAL THIS AS c_conversor_prg_a_frx OF 'FOXBIN2PRG.PRG' + #ENDIF + _MEMBERDATA = [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] + + + ******************************************************************************************************************* + PROCEDURE Convertir + DODEFAULT() + + TRY + LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ; + , laBloquesExclusion(1,2), lnBloquesExclusion, I ; + , loReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' + STORE 0 TO lnCodError, lnCodeLines, lnFB2P_Version + STORE '' TO lcLine, lcSourceFile + STORE NULL TO loReg, toModulo + + C_FB2PRG_CODE = FILETOSTR( THIS.c_InputFile ) + lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) + + THIS.doBackup() + + *-- Creo el reporte + THIS.createReport() + + *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte + THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @loReport ) + + THIS.escribirArchivoBin( @loReport ) + + + CATCH TO loEx + lnCodError = loEx.ERRORNO + + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + ENDTRY + + RETURN lnCodError + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE escribirArchivoBin + LPARAMETERS toReport + *-- ----------------------------------------------------------------------------------------------------------- + #IF .F. + LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' + #ENDIF + + TRY + LOCAL loReg, lnCodError, loEx AS EXCEPTION + + *-- Agrego los ARCHIVOS + FOR EACH loReg IN toReport FOXOBJECT + INSERT INTO TABLABIN FROM NAME loReg + ENDFOR + + USE IN (SELECT("TABLABIN")) + + + CATCH TO loEx + lnCodError = loEx.ERRORNO + + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + FINALLY + USE IN (SELECT("TABLABIN")) + + ENDTRY + + RETURN lnCodError + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE identificarBloquesDeCodigo + LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toReport + *-------------------------------------------------------------------------------------------------------------- + * taCodeLines (!@ IN ) El array con las líneas del código donde buscar + * tnCodeLines (!@ IN ) Cantidad de líneas de código + * taBloquesExclusion (?@ IN ) Sin uso + * tnBloquesExclusion (?@ IN ) Sin uso + * toReport (?@ OUT) Objeto con toda la información del reporte analizado + * + * NOTA: + * Como identificador se usa el nombre de clase o de procedimiento, según corresponda. + *-------------------------------------------------------------------------------------------------------------- + EXTERNAL ARRAY taCodeLines, taBloquesExclusion + + #IF .F. + LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' + #ENDIF + + TRY + LOCAL I, lc_Comentario, lcLine, llFoxBin2Prg_Completed + STORE 0 TO I + + THIS.c_Type = UPPER(JUSTEXT(THIS.c_OutputFile)) + + IF tnCodeLines > 1 + toReport = NULL + toReport = CREATEOBJECT('CL_REPORT') + + WITH THIS + FOR I = 1 TO tnCodeLines + .set_Line( @lcLine, @taCodeLines, I ) + + IF .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Vacía o solo Comentarios + LOOP + ENDIF + + DO CASE + CASE NOT llFoxBin2Prg_Completed AND .analizarBloque_FoxBin2Prg( toReport, @lcLine, @taCodeLines, @I, tnCodeLines ) + llFoxBin2Prg_Completed = .T. + + CASE .analizarBloque_Reportes( toReport, @lcLine, @taCodeLines, @I, tnCodeLines ) + + ENDCASE + ENDFOR + ENDWITH && THIS + ENDIF + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + ENDTRY + + RETURN + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE analizarBloque_Reportes + *------------------------------------------------------ + *-- Analiza el bloque + *------------------------------------------------------ + LPARAMETERS toReport, tcLine, taCodeLines, I, tnCodeLines + + #IF .F. + LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' + #ENDIF + + TRY + LOCAL llBloqueEncontrado, lcComment, lcMetadatos, luValor ; + , laPropsAndValues(1,2), lnPropsAndValues_Count ; + , loReg + + IF LEFT( tcLine, LEN(C_TAG_REPORTE) + 1 ) == '<' + C_TAG_REPORTE + '' + llBloqueEncontrado = .T. + loReg = THIS.emptyRecord() + + WITH THIS + FOR I = I + 1 TO tnCodeLines + lcComment = '' + .set_Line( @tcLine, @taCodeLines, I ) + + DO CASE + CASE LEFT( tcLine, LEN(C_TAG_REPORTE_F) ) == C_TAG_REPORTE_F + I = I + 1 + EXIT + + CASE .lineIsOnlyCommentAndNoMetadata( @tcLine, @lcComment ) + LOOP && Saltear comentarios + + *CASE UPPER( LEFT( tcLine, 14 ) ) == 'BUILD PROJECT ' + * LOOP + + CASE .analizarBloque_platform( toReport, @tcLine, @taCodeLines, @I, @tnCodeLines, @loReg ) + + CASE .analizarBloque_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'picture' ) + + CASE .analizarBloque_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'tag' ) + + CASE .analizarBloque_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'tag2' ) + + CASE .analizarBloque_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'penred' ) + + *CASE .analizarBloque_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'style' ) + + *CASE .analizarBloque_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'expr' ) + + CASE .analizarBloque_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'user' ) + + ENDCASE + ENDFOR + ENDWITH && THIS + + I = I - 1 + toReport.Add( loReg ) + ENDIF + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + ENDTRY + + RETURN llBloqueEncontrado + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE analizarBloque_platform + *------------------------------------------------------ + *-- Analiza el bloque + *------------------------------------------------------ + LPARAMETERS toReport, tcLine, taCodeLines, I, tnCodeLines, toReg + + #IF .F. + LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' + #ENDIF + + TRY + LOCAL llBloqueEncontrado, X, lnPos, lnPos2, lcValue, lnLenPropName, laProps(1) ; + , lcComment, lcMetadatos, luValor ; + , laPropsAndValues(1,2), lnPropsAndValues_Count + + IF LOWER( LEFT(tcLine, 10) ) == 'platform="' + llBloqueEncontrado = .T. + lnLastPos = 1 + + FOR X = 1 TO AMEMBERS( laProps, toReg, 0 ) + lnPos = AT( LOWER(laProps(X)) + '="', tcLine ) + + IF lnPos > 0 + lnLenPropName = LEN(laProps(X)) + lnPos2 = AT( '"', SUBSTR( tcLine, lnPos + lnLenPropName + 2 ) ) + lcValue = SUBSTR( tcLine, lnPos + lnLenPropName + 2, lnPos2 - 1 ) + ADDPROPERTY( toReg, laProps(X), lcValue ) + ENDIF + ENDFOR + + ENDIF + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + ENDTRY + + RETURN llBloqueEncontrado + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE analizarBloque_CDATA_inline + *------------------------------------------------------ + *-- Analiza el bloque + *------------------------------------------------------ + LPARAMETERS toReport, tcLine, taCodeLines, I, tnCodeLines, toReg, tcPropName + + #IF .F. + LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' + #ENDIF + + TRY + LOCAL llBloqueEncontrado, lcValue, loEx as Exception + + IF LEFT(tcLine, 9) == '<' + tcPropName + '>' + llBloqueEncontrado = .T. + + lcValue = STREXTRACT( tcLine, C_DATA_I, C_DATA_F ) + ADDPROPERTY( toReg, tcPropName, lcValue ) + ENDIF + + CATCH TO loEx + IF loEx.ErrorNo = 1470 && Incorrect property name. + loEx.UserValue = 'PropName=[' + TRANSFORM(tcPropName) + '], Value=[' + TRANSFORM(lcValue) + ']' + ENDIF + + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + ENDTRY + + RETURN llBloqueEncontrado + ENDPROC + + +ENDDEFINE + + +******************************************************************************************************************* +DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base + #IF .F. + LOCAL THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG' + #ENDIF + _MEMBERDATA = [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] + + + ******************************************************************************************************************* + PROCEDURE Convertir + LPARAMETERS toModulo, toEx AS EXCEPTION + DODEFAULT( @toModulo, @toEx ) + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE get_ADD_OBJECT_METHODS + LPARAMETERS toRegObj, toRegClass, tcMethods, taMethods, taCode, tnMethodCount + + TRY + THIS.SortMethod( toRegObj.METHODS, @taMethods, @taCode, '', @tnMethodCount ) + + *-- Ubico los métodos protegidos y les cambio la definición. + *-- Los métodos se deben generar con la ruta completa, porque si no es imposible saber a que objeto corresponden, + *-- o si son de la clase. + IF tnMethodCount > 0 THEN + FOR I = 1 TO tnMethodCount + IF EMPTY(toRegObj.PARENT) + tcMethodName = toRegObj.OBJNAME + '.' + taMethods(I,1) + ELSE + DO CASE + CASE '.' $ toRegObj.PARENT + tcMethodName = SUBSTR(toRegObj.PARENT, AT('.', toRegObj.PARENT) + 1) + '.' + toRegObj.OBJNAME + '.' + taMethods(I,1) + + CASE LEFT(toRegObj.PARENT + '.', LEN( toRegClass.OBJNAME + '.' ) ) == toRegClass.OBJNAME + '.' + tcMethodName = toRegObj.OBJNAME + '.' + taMethods(I,1) + + OTHERWISE + tcMethodName = toRegObj.PARENT + '.' + toRegObj.OBJNAME + '.' + taMethods(I,1) + + ENDCASE + 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 + ENDFOR + ENDIF + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + ENDTRY + + RETURN + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE get_NombresObjetosOLEPublic + LPARAMETERS ta_NombresObjsOle + *-- Obtengo los objetos "OLEPublic" + SELECT PADR(OBJNAME,100) OBJNAME ; + FROM TABLABIN ; + WHERE TABLABIN.PLATFORM = "COMMENT" AND TABLABIN.RESERVED2 == "OLEPublic" ; + ORDER BY 1 ; + INTO ARRAY ta_NombresObjsOle + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE get_PropsAndCommentsFrom_RESERVED3 + *-- Sirve para el memo RESERVED3 + *--------------------------------------------------------------------------------------------------- + * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT) + * tcMemo (v! IN ) Contenido de un campo MEMO + * tlSort (v? IN ) Indica si se deben ordenar alfabéticamente los nombres + * taPropsAndComments (@! OUT) Array con las propiedades y comentarios + * tnPropsAndComments_Count (@! OUT) Cantidad de propiedades + * tcSortedMemo (@? OUT) Contenido del campo memo ordenado + *--------------------------------------------------------------------------------------------------- + LPARAMETERS tcMemo, tlSort, taPropsAndComments, tnPropsAndComments_Count, tcSortedMemo + EXTERNAL ARRAY taPropsAndComments + + TRY + LOCAL laLines(1), I, lnPos, loEx AS EXCEPTION + tcSortedMemo = '' + tnPropsAndComments_Count = ALINES(laLines, tcMemo, 1+4) + + IF tnPropsAndComments_Count <= 1 AND EMPTY(laLines) + tnPropsAndComments_Count = 0 + EXIT + ENDIF + + DIMENSION taPropsAndComments(tnPropsAndComments_Count,2) + + FOR I = 1 TO tnPropsAndComments_Count + lnPos = AT(' ', laLines(I)) && Un espacio separa la propiedad de su comentario (si tiene) + + IF lnPos = 0 + taPropsAndComments(I,1) = laLines(I) + taPropsAndComments(I,2) = '' + ELSE + taPropsAndComments(I,1) = LEFT( laLines(I), lnPos - 1 ) + taPropsAndComments(I,2) = SUBSTR( laLines(I), lnPos + 1 ) + ENDIF + ENDFOR + + IF tlSort AND THIS.l_PropSort_Enabled + ASORT( taPropsAndComments, 1, -1, 0, 1 ) + ENDIF + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + ENDTRY + + RETURN + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE get_PropsAndValuesFrom_PROPERTIES + *-- Sirve para el memo PROPERTIES + *--------------------------------------------------------------------------------------------------- + * KNOWLEDGE BASE: + * 29/11/2013 FDBOZZO En un pageframe, si las props.nativas del mismo no están antes que las de + * los objetos contenidos, causa un error. Se deben ordenar primero las + * props.nativas (sin punto) y luego las de los objetos (con punto) + * + *--------------------------------------------------------------------------------------------------- + * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT) + * tcMemo (v! IN ) Contenido de un campo MEMO + * tnSort (v? IN ) Indica si se deben ordenar alfabéticamente los objetos y props (1), o no (0) + * taPropsAndValues (@! OUT) Array con las propiedades y comentarios + * tnPropsAndValues_Count (@! OUT) Cantidad de propiedades + * tcSortedMemo (@? OUT) Contenido del campo memo ordenado + *--------------------------------------------------------------------------------------------------- + LPARAMETERS tcMemo, tnSort, taPropsAndValues, tnPropsAndValues_Count, tcSortedMemo + EXTERNAL ARRAY taPropsAndValues + TRY + LOCAL laItems(1), I, X, lnLenAcum, lnPosEQ, lcPropName, lnLenVal, lcValue, lcMethods + tcSortedMemo = '' + tnPropsAndValues_Count = 0 + + IF NOT EMPTY(m.tcMemo) + lnItemCount = ALINES(laItems, m.tcMemo, 0, CR_LF) && Específicamente CR+LF para que no reconozca los CR o LF por separado + X = 0 + + IF lnItemCount <= 1 AND EMPTY(laItems) + lnItemCount = 0 + EXIT + ENDIF + + + *-- 1) OBTENCIÓN Y SEPARACIÓN DE PROPIEDADES Y VALORES + *-- Crear un array con los valores especiales que pueden estar repartidos entre varias lineas + FOR I = 1 TO m.lnItemCount + IF EMPTY( laItems(I) ) + LOOP + ENDIF + + X = X + 1 + DIMENSION taPropsAndValues(X,2) + + IF C_MPROPHEADER $ laItems(I) + *-- Solo entrará por aquí cuando se evalúe una propiedad de PROPERTIES con un valor especial (largo) + lnLenAcum = 0 + lnPosEQ = AT( '=', laItems(I) ) + lcPropName = LEFT( laItems(I), lnPosEQ - 2 ) + lnLenVal = INT( VAL( SUBSTR( laItems(I), lnPosEQ + 2 + 517, 8) ) ) + lcValue = SUBSTR( laItems(I), lnPosEQ + 2 + 517 + 8 ) + + IF LEN( lcValue ) < lnLenVal + *-- Como el valor es multi-línea, debo agregarle los CR_LF que le quitó el ALINES() + FOR I = I + 1 TO m.lnItemCount + lcValue = lcValue + CR_LF + laItems(I) + + IF LEN( lcValue ) >= lnLenVal + EXIT + ENDIF + ENDFOR + + lcValue = C_FB2P_VALUE_I + CR_LF + lcValue + CR_LF + C_FB2P_VALUE_F + ELSE + lcValue = C_FB2P_VALUE_I + lcValue + C_FB2P_VALUE_F + ENDIF + + *-- Es un valor especial, por lo que se encapsula en un marcador especial + taPropsAndValues(X,1) = lcPropName + taPropsAndValues(X,2) = THIS.normalizarValorPropiedad( lcPropName, lcValue, '' ) + + ELSE + *-- Propiedad normal + *-- SI HACE FALTA QUE LOS MÉTODOS ESTÉN AL FINAL, DESCOMENTAR ESTO (Y EL DE MÁS ABAJO) + *IF LEFT(laItems(I), 1) == '*' && Only Reserved3 have this + * LOOP + *ENDIF + + lnPosEQ = AT( '=', laItems(I) ) + taPropsAndValues(X,1) = LEFT( laItems(I), lnPosEQ - 2 ) + taPropsAndValues(X,2) = THIS.normalizarValorPropiedad( taPropsAndValues(X,1), LTRIM( SUBSTR( laItems(I), lnPosEQ + 2 ) ), '' ) + ENDIF + ENDFOR + + + tnPropsAndValues_Count = X + lcMethods = '' + + + *-- 2) SORT + THIS.sortPropsAndValues( @taPropsAndValues, tnPropsAndValues_Count, tnSort ) + + + *-- Agregar propiedades primero + FOR I = 1 TO m.tnPropsAndValues_Count + *-- SI HACE FALTA QUE LOS MÉTODOS ESTÉN AL FINAL, DESCOMENTAR ESTO (Y EL DE MÁS ARRIBA) + *IF LEFT(taPropsAndValues(I), 1) == '*' && Only Reserved3 have this + * lcMethods = m.lcMethods + m.taPropsAndValues(I,1) + ' = ' + m.taPropsAndValues(I,2) + CR_LF + * LOOP + *ENDIF + + tcSortedMemo = m.tcSortedMemo + m.taPropsAndValues(I,1) + ' = ' + m.taPropsAndValues(I,2) + CR_LF + ENDFOR + + *-- Agregar métodos al final + tcSortedMemo = m.tcSortedMemo + m.lcMethods + + ENDIF + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + ENDTRY + + RETURN + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE get_PropsFrom_PROTECTED + *-- Sirve para el memo PROTECTED + *--------------------------------------------------------------------------------------------------- + * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT) + * tcMemo (v! IN ) Contenido de un campo MEMO + * tlSort (v? IN ) Indica si se deben ordenar alfabéticamente los nombres + * taProtected (@! OUT) Array con las propiedades y comentarios + * tnProtected_Count (@! OUT) Cantidad de propiedades + * tcSortedMemo (@? OUT) Contenido del campo memo ordenado + *--------------------------------------------------------------------------------------------------- + LPARAMETERS tcMemo, tlSort, taProtected, tnProtected_Count, tcSortedMemo + EXTERNAL ARRAY taProtected + + tcSortedMemo = '' + tnProtected_Count = ALINES(taProtected, tcMemo, 1+4) + + IF tnProtected_Count <= 1 AND EMPTY(taProtected) + tnProtected_Count = 0 + ELSE + IF tlSort AND THIS.l_PropSort_Enabled + ASORT( taProtected, 1, -1, 0, 1 ) + ENDIF + + FOR I = 1 TO tnProtected_Count + tcSortedMemo = tcSortedMemo + taProtected(I) + CR_LF + ENDFOR + ENDIF + + RETURN + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE IndentarMemo + 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 + lcMethod = '' + llProcedure = ( LEFT(tcMethod,10) == 'PROCEDURE ' ; + OR LEFT(tcMethod,17) == 'HIDDEN PROCEDURE ' ; + OR LEFT(tcMethod,20) == 'PROTECTED PROCEDURE ' ) + lnInicio = 1 + lnFin = ALINES(laLineas, tcMethod) + IF VARTYPE(tcIndentation) # 'C' + tcIndentation = '' + ENDIF + + *-- Si encuentra la cabecera de un PROCEDURE, la saltea + IF llProcedure + lnInicio = 2 + lnFin = lnFin - 1 + ENDIF + + FOR I = lnInicio TO lnFin + *-- TEXT/ENDTEXT aquí da error 2044 de recursividad. No usar. + lcMethod = lcMethod + CR_LF + tcIndentation + laLineas(I) + ENDFOR + + lcMethod = SUBSTR(lcMethod,3) && Quito el primer ENTER (CR+LF) + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + ENDTRY + + RETURN lcMethod + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE MemoInOneLine( tcMethod ) + TRY + LOCAL lcLine, I + lcLine = '' + + IF NOT EMPTY(tcMethod) + FOR I = 1 TO ALINES(laLines, m.tcMethod, 0) + lcLine = lcLine + ', ' + laLines(I) + ENDFOR + + lcLine = SUBSTR(lcLine, 3) + ENDIF + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + ENDTRY + + RETURN lcLine + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE set_MultilineMemoWithAddObjectProperties + LPARAMETERS taPropsAndValues, tnPropCount, tcLeftIndentation, tlNormalizeLine + EXTERNAL ARRAY taPropsAndValues + + TRY + LOCAL lcLine, I, lcComentarios, laLines(1), lcFinDeLinea_Coma_PuntoComa_CR + lcLine = '' + lcFinDeLinea = ', ;' + CR_LF + + IF tnPropCount > 0 + IF VARTYPE(tcLeftIndentation) # 'C' + tcLeftIndentation = '' + ENDIF + + FOR I = 1 TO tnPropCount + lcLine = lcLine + tcLeftIndentation + taPropsAndValues(I,1) + ' = ' + taPropsAndValues(I,2) + lcFinDeLinea + ENDFOR + + *-- Quito el ", ;" final + lcLine = tcLeftIndentation + SUBSTR(lcLine, 1 + LEN(tcLeftIndentation), LEN(lcLine) - LEN(tcLeftIndentation) - LEN(lcFinDeLinea)) + ENDIF + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + ENDTRY + + RETURN lcLine + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE SortMethod + LPARAMETERS tcMethod, taMethods, taCode, tcSorted, tnMethodCount + *-- 29/10/2013 Fernando D. Bozzo + *-- Se tiene en cuenta la posibilidad de que haya un PROC/ENDPROC dentro de un TEXT/ENDTEXT + *-- cuando es usado en un generador de código o similar. + EXTERNAL ARRAY taMethods, taCode + + *-- ESTRUCTURA DE LOS ARRAYS CREADOS: + *-- taMethods[1,3] + *-- Nombre Método + *-- Posición Original + *-- Tipo (HIDDEN/PROTECTED/NORMAL) + *-- taCode[1] + *-- Bloque de código del método en su posición original + TRY + LOCAL lnLineCount, laLine(1), I, lnTextNodes, tcSorted + LOCAL loEx AS EXCEPTION + DIMENSION taMethods(1,3) + STORE '' TO taMethods, m.tcSorted, taCode + tnMethodCount = 0 + + IF NOT EMPTY(m.tcMethod) AND LEFT(m.tcMethod,9) == "ENDPROC"+CHR(13)+CHR(10) + tcMethod = SUBSTR(m.tcMethod,10) + ENDIF + + IF NOT EMPTY(m.tcMethod) + DIMENSION laLine(1), taMethods(1,3) + STORE '' TO laLine, taMethods, taCode + STORE 0 TO tnMethodCount, lnTextNodes + lnLineCount = ALINES(laLine, m.tcMethod) && NO aplicar nungún formato ni limpieza, que es el CÓDIGO FUENTE + + *-- Delete beginning empty lines before first "PROCEDURE", that is the first not empty line. + FOR I = 1 TO lnLineCount + IF NOT EMPTY(laLine(I)) + IF I > 1 + FOR X = I-1 TO 1 STEP -1 + ADEL(laLine, X) + ENDFOR + lnLineCount = lnLineCount - I + 1 + DIMENSION laLine(lnLineCount) + ENDIF + EXIT + ENDIF + ENDFOR + + *-- Delete ending empty lines after last "ENDPROC", that is the last not empty line. + FOR I = lnLineCount TO 1 STEP -1 + IF EMPTY(laLine(I)) + ADEL(laLine, I) + ELSE + IF I < lnLineCount + lnLineCount = I + DIMENSION laLine(lnLineCount) + ENDIF + EXIT + ENDIF + ENDFOR + + *-- Analyze and count line methods, get method names and consolidate block code + FOR I = 1 TO lnLineCount + DO CASE + CASE LEFT(laLine(I), 4) == C_TEXT + lnTextNodes = lnTextNodes + 1 + taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) + CR_LF + + CASE LEFT(laLine(I), 7) == C_ENDTEXT + lnTextNodes = lnTextNodes - 1 + taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) + CR_LF + + CASE lnTextNodes = 0 AND LEFT(laLine(I), 10) == 'PROCEDURE ' + tnMethodCount = tnMethodCount + 1 + DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount) + taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(laLine(I), 11) ) + taMethods(tnMethodCount, 2) = tnMethodCount + taMethods(tnMethodCount, 3) = '' + taCode(tnMethodCount) = laLine(I) + CR_LF + + CASE lnTextNodes = 0 AND LEFT(laLine(I), 17) == 'HIDDEN PROCEDURE ' + tnMethodCount = tnMethodCount + 1 + DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount) + taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(laLine(I), 18) ) + taMethods(tnMethodCount, 2) = tnMethodCount + taMethods(tnMethodCount, 3) = 'HIDDEN ' + taCode(tnMethodCount) = laLine(I) + CR_LF + + CASE lnTextNodes = 0 AND LEFT(laLine(I), 20) == 'PROTECTED PROCEDURE ' + tnMethodCount = tnMethodCount + 1 + DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount) + taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(laLine(I), 21) ) + taMethods(tnMethodCount, 2) = tnMethodCount + taMethods(tnMethodCount, 3) = 'PROTECTED ' + taCode(tnMethodCount) = laLine(I) + CR_LF + + CASE lnTextNodes = 0 AND LEFT(laLine(I), 7) == 'ENDPROC' + taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) + CR_LF + + CASE tnMethodCount = 0 && Skip empty lines before methods begin + + OTHERWISE && Method Code + taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) + CR_LF + + ENDCASE + ENDFOR + + *-- Alphabetical ordering of methods + IF THIS.l_MethodSort_Enabled + ASORT(taMethods,1,-1,0,1) + ENDIF + + FOR I = 1 TO tnMethodCount + m.tcSorted = m.tcSorted + taCode(taMethods(I,2)) + ENDFOR + + ENDIF + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + ENDTRY + + RETURN + ENDPROC && SordMethod + + + ******************************************************************************************************************* + PROCEDURE write_ADD_OBJECTS_WithProperties + LPARAMETERS toRegObj + + #IF .F. + LOCAL toRegObj AS CL_OBJETO OF 'FOXBIN2PRG.PRG' + #ENDIF + + TRY + LOCAL lcMemo, laPropsAndValues(1,2), lnPropsAndValues_Count + + *-- Defino los objetos a cargar + THIS.get_PropsAndValuesFrom_PROPERTIES( toRegObj.PROPERTIES, 1, @laPropsAndValues, @lnPropsAndValues_Count, @lcMemo ) + *lcMemo = THIS.set_MultilineMemoWithAddObjectProperties( lcMemo, C_TAB + C_TAB, .T. ) + lcMemo = THIS.set_MultilineMemoWithAddObjectProperties( @laPropsAndValues, @lnPropsAndValues_Count, C_TAB + C_TAB, .T. ) + + IF '.' $ toRegObj.PARENT + *-- Este caso: clase.objeto.objeto ==> se quita clase + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <>ADD OBJECT '<>.<>' AS <> <<>> + ENDTEXT + ELSE + *-- Este caso: objeto + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <>ADD OBJECT '<>' AS <> <<>> + ENDTEXT + ENDIF + + IF NOT EMPTY(lcMemo) + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + WITH ; + <> + ENDTEXT + ENDIF + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <><> <<>> + ENDTEXT + + IF NOT EMPTY(toRegObj.CLASSLOC) + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + ClassLib="<>" <<>> + ENDTEXT + ENDIF + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2+4+8 + BaseClass="<>" UniqueID="<>" + Timestamp="<>" ZOrder="<>" <<>> + ENDTEXT + + *-- Agrego metainformación para objetos OLE + IF toRegObj.BASECLASS == 'olecontrol' + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + OLEObject="<><>PROCEDURE <> + <> + <>ENDPROC + + ENDTEXT + ENDFOR + ENDIF + + RETURN + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE write_CLASS_METHODS + LPARAMETERS tnMethodCount, taMethods, taCode, taProtected, taPropsAndComments + *-- DEFINIR MÉTODOS DE LA CLASE + *-- Ubico los métodos protegidos y les cambio la definición + EXTERNAL ARRAY taMethods, taCode, taProtected, taPropsAndComments + + TRY + LOCAL lcMethod, lnProtectedItem, lnCommentRow, lcProcDef, lcMethods + STORE '' TO lcMethod, lcProcDef, lcMethods + + IF tnMethodCount > 0 THEN + FOR I = 1 TO tnMethodCount + lcMethod = CHRTRAN( taMethods(I,1), '^', '' ) + lnProtectedItem = ASCAN( taProtected, taMethods(I,1), 1, 0, 0, 0) + lnCommentRow = ASCAN( taPropsAndComments, '*' + lcMethod, 1, 0, 1, 8) + + DO CASE + CASE lnProtectedItem = 0 + *-- Método común + lcProcDef = 'PROCEDURE' + + CASE taProtected(lnProtectedItem) == taMethods(I,1) + *-- Método protegido + lcProcDef = 'PROTECTED PROCEDURE' + + CASE taProtected(lnProtectedItem) == taMethods(I,1) + '^' + *-- Método oculto + lcProcDef = 'HIDDEN PROCEDURE' + + ENDCASE + + *-- Nombre del método + TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <><> <> + ENDTEXT + + *-- Comentarios del método (si tiene) + IF lnCommentRow > 0 AND NOT EMPTY(taPropsAndComments(lnCommentRow,2)) + TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + <><>&& <> + ENDTEXT + ENDIF + + *-- Código del método + *TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + * <> + * <>ENDPROC + + *ENDTEXT + lcMethods = lcMethods + CR_LF + THIS.IndentarMemo( taCode(taMethods(I,2)), C_TAB + C_TAB ) + lcMethods = lcMethods + CR_LF + C_TAB + 'ENDPROC' + CR_LF + ENDFOR + + *TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + * <> + *ENDTEXT + C_FB2PRG_CODE = C_FB2PRG_CODE + C_TAB + lcMethods &&+ CR_LF + + ENDIF + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + ENDTRY + + RETURN + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE write_CLASS_PROPERTIES + LPARAMETERS toRegClass, taPropsAndValues, taPropsAndComments, taProtected + + EXTERNAL ARRAY taPropsAndValues, taPropsAndComments + + TRY + LOCAL lnPropsAndValues_Count, lcHiddenProp, lcProtectedProp, lcPropsMethodsDefd, lnPropsAndComments_Count, I ; + , lcPropName, lnProtectedItem, lcComentarios + + WITH THIS + *-- DEFINIR PROPIEDADES ( HIDDEN, PROTECTED, *DEFINED_PAM ) + DIMENSION taProtected(1) + STORE '' TO lcHiddenProp, lcProtectedProp, lcPropsMethodsDefd + THIS.get_PropsAndValuesFrom_PROPERTIES( toRegClass.PROPERTIES, 1, @taPropsAndValues, @lnPropsAndValues_Count, '' ) + THIS.get_PropsAndCommentsFrom_RESERVED3( toRegClass.RESERVED3, .T., @taPropsAndComments, @lnPropsAndComments_Count, '' ) + THIS.get_PropsFrom_PROTECTED( toRegClass.PROTECTED, .T., @taProtected, 0, '' ) + + IF lnPropsAndValues_Count > 0 THEN + *-- Recorro las propiedades (campo Properties) para ir conformando + *-- las definiciones HIDDEN y PROTECTED + FOR I = 1 TO lnPropsAndValues_Count + IF EMPTY(taPropsAndValues(I,1)) + LOOP + ENDIF + + lnProtectedItem = ASCAN(taProtected, taPropsAndValues(I,1), 1, 0, 0, 0) + + DO CASE + CASE lnProtectedItem = 0 + *-- Propiedad común + + CASE taProtected(lnProtectedItem) == taPropsAndValues(I,1) + *-- Propiedad protegida + lcProtectedProp = lcProtectedProp + ',' + taPropsAndValues(I,1) + + CASE taProtected(lnProtectedItem) == taPropsAndValues(I,1) + '^' + *-- Propiedad oculta + lcHiddenProp = lcHiddenProp + ',' + taPropsAndValues(I,1) + + ENDCASE + ENDFOR + + THIS.write_DEFINED_PAM( @taPropsAndComments, lnPropsAndComments_Count ) + + THIS.write_HIDDEN_Properties( @lcHiddenProp ) + + THIS.write_PROTECTED_Properties( @lcProtectedProp ) + + *-- Escribo las propiedades de la clase y sus comentarios (los comentarios aquí son redundantes) + FOR I = 1 TO ALEN(taPropsAndValues, 1) + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <><> = <> + ENDTEXT + + lnComment = ASCAN( taPropsAndComments, taPropsAndValues(I,1), 1, 0, 1, 8) + + IF lnComment > 0 AND NOT EMPTY(taPropsAndComments(lnComment,2)) + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + <><>&& <> + ENDTEXT + ENDIF + ENDFOR + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + + ENDTEXT + ENDIF + ENDWITH && THIS + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + ENDTRY + + RETURN + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE write_DEFINED_PAM + *-- Escribo propiedades DEFINED (Reserved3) en este formato: + + * + *m: *metodovacio_con_comentarios && Este método no tiene código, pero tiene comentarios. A ver que pasa! + *m: *mimetodo && Mi metodo + *p: prop1 && Mi prop 1 + *p: prop_especial_cr && + *a: ^array_1_d[1,0] && Array 1 dimensión (1) + *a: ^array_2_d[1,2] && Array una dimension (1,2) + *p: _memberdata && XML Metadata for customizable properties + * + + LPARAMETERS taPropsAndComments, tnPropsAndComments_Count + + IF tnPropsAndComments_Count > 0 + LOCAL I, lcPropsMethodsDefd + lcPropsMethodsDefd = '' + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <><> + ENDTEXT + + FOR I = 1 TO tnPropsAndComments_Count + IF EMPTY(taPropsAndComments(I,1)) + LOOP + ENDIF + + lcType = LEFT( taPropsAndComments(I,1), 1 ) + lcType = ICASE( lcType == '*', 'm' ; + , lcType == '^', 'a' ; + , 'p' ) + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <><>*<>: <> + ENDTEXT + + IF NOT EMPTY(taPropsAndComments(I,2)) + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + <><><<'&'>><<'&'>> <> + ENDTEXT + ENDIF + ENDFOR + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <><> + ENDTEXT + + ENDIF + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE write_DEFINE_CLASS + LPARAMETERS ta_NombresObjsOle, toRegClass + + LOCAL lcOF_Classlib, llOleObject + lcOF_Classlib = '' + llOleObject = ( ASCAN( ta_NombresObjsOle, toRegClass.OBJNAME, 1, 0, 1, 8) > 0 ) + + IF NOT EMPTY(toRegClass.CLASSLOC) + lcOF_Classlib = 'OF "' + ALLTRIM(toRegClass.CLASSLOC) + '" ' + ENDIF + + *-- DEFINICIÓN DE LA CLASE ( DEFINE CLASS 'className' AS 'classType' [OF 'classLib'] [OLEPUBLIC] ) + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <<'DEFINE CLASS'>> <> AS <> <> + ENDTEXT + + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE write_DEFINE_CLASS_COMMENTS + LPARAMETERS toRegClass + *-- Comentario de la clase + IF NOT EMPTY(toRegClass.RESERVED7) THEN + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + <><><<'&'+'&'>> <> + ENDTEXT + ENDIF + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE write_ENDDEFINE_SiCorresponde + LPARAMETERS tnLastClass + IF tnLastClass = 1 + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <<'ENDDEFINE'>> + + ENDTEXT + ENDIF + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE write_INCLUDE + LPARAMETERS toReg + *-- #INCLUDE + IF NOT EMPTY(toReg.RESERVED8) THEN + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <>#INCLUDE "<>" + ENDTEXT + ENDIF + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE write_METADATA + LPARAMETERS toRegClass + + *-- Agrego Metadatos de la clase (Baseclass, Timestamp, Scale, Uniqueid) + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + + ENDTEXT + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2+8 + <><> + Baseclass="<>" + Timestamp="<>" + Scale="<>" + Uniqueid="<>" + ENDTEXT + + IF NOT EMPTY(toRegClass.OLE2) + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2+4+8 + OLEObject="<' + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <> + ENDTEXT + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <>platform="WINDOWS " uniqueid="<>" timestamp="<>" objtype="<>" <<>> + ENDTEXT + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + objcode="<>" name="<>" <<>> + ENDTEXT + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + vpos="<>" hpos="<>" height="<>" width="<>" <<>> + ENDTEXT + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + order="<>" unique="<>" comment="<>" <<>> + ENDTEXT + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + environ="<>" boxchar="<>" fillchar="<>" <<>> + ENDTEXT + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + pengreen="<>" penblue="<>" fillred="<>" fillgreen="<>" <<>> + ENDTEXT + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + fillblue="<>" pensize="<>" penpat="<>" fillpat="<>" <<>> + ENDTEXT + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + fontface="<>" fontstyle="<>" fontsize="<>" mode="<>" <<>> + ENDTEXT + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + ruler="<>" rulerlines="<>" grid="<>" gridv="<>" <<>> + ENDTEXT + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + gridh="<>" float="<>" stretch="<>" stretchtop="<>" <<>> + ENDTEXT + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + top="<>" bottom="<>" suptype="<>" suprest="<>" norepeat="<>" <<>> + ENDTEXT + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + resetrpt="<>" pagebreak="<>" colbreak="<>" resetpage="<>" <<>> + ENDTEXT + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + general="<>" spacing="<>" double="<>" swapheader="<>" <<>> + ENDTEXT + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + swapfooter="<>" ejectbefor="<>" ejectafter="<>" plain="<>" <<>> + ENDTEXT + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + summary="<>" addalias="<>" offset="<>" topmargin="<>" <<>> + ENDTEXT + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + botmargin="<>" totaltype="<>" resettotal="<>" resoid="<>" <<>> + ENDTEXT + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + curpos="<>" supalways="<>" supovflow="<>" suprpcol="<>" <<>> + ENDTEXT + + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 + supgroup="<>" supvalchng="<>" supexpr="<>" > + ENDTEXT + + * <>tag="<>" + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <>>]]> + <>>]]> + <>>]]> + <>>]]> + <>