#include "hbclass.ch" PROCEDURE Main() LOCAL oUtil := TBarcodeUtil():New() LOCAL nFailures := 0 LOCAL hDataMatrix LOCAL hCode128 LOCAL hEan128 LOCAL hQr LOCAL aExpectedMatrix := { ; "101010101010", "110110110101", "101110110000", "100000000001", ; "111000100100", "111001100111", "101000001110", "110011001101", ; "110000100110", "110000100101", "100100011010", "111111111111" } LOCAL aExpectedQr := { ; "111111100100101111111", "100000101001001000001", "101110100100001011101", ; "101110101001001011101", "101110100011101011101", "100000101110101000001", ; "111111101010101111111", "000000000011100000000", "111110111100110101010", ; "000101000000100101001", "110111101111010011010", "001001011100000111100", ; "111100110111010010001", "000000001001111001001", "111111101100101100110", ; "100000100011111001100", "101110101100100100010", "101110101110100100100", ; "101110101011010011100", "100000101000000110100", "111111101101010010110" } nFailures += AssertEqual( "normalizar EAN13", oUtil:NormalizarTipo( "EAN13" ), "EAN13" ) nFailures += AssertEqual( "normalizar EAN-13", oUtil:NormalizarTipo( "EAN-13" ), "EAN13" ) nFailures += AssertEqual( "normalizar EAN-8", oUtil:NormalizarTipo( "EAN-8" ), "EAN8" ) nFailures += AssertEqual( "normalizar Code 128", oUtil:NormalizarTipo( "Code 128" ), "CODE128" ) nFailures += AssertEqual( "normalizar EAN-128", oUtil:NormalizarTipo( "EAN-128" ), "EAN128" ) nFailures += AssertEqual( "normalizar GS1-128", oUtil:NormalizarTipo( "GS1-128" ), "EAN128" ) nFailures += AssertEqual( "normalizar data_matrix", oUtil:NormalizarTipo( "data_matrix" ), "DATAMATRIX" ) nFailures += AssertEqual( "normalizar QR Code", oUtil:NormalizarTipo( "QR Code" ), "QR" ) nFailures += AssertEqual( "normalizar q r", oUtil:NormalizarTipo( "q r" ), "QR" ) nFailures += AssertEqual( "normalizar foo", oUtil:NormalizarTipo( "foo" ), "" ) nFailures += AssertEqual( "normalizar vacio", oUtil:NormalizarTipo( "" ), "" ) nFailures += AssertBarcodeOk( "crear EAN13 12 digitos", oUtil:Crear( "123456789012", "EAN13" ), "EAN13", "1234567890128" ) nFailures += AssertBarcodeOk( "crear EAN13 13 digitos valido", oUtil:Crear( "4006381333931", "EAN13" ), "EAN13", "4006381333931" ) nFailures += AssertBarcodeError( "crear EAN13 checksum invalido", oUtil:Crear( "4006381333932", "EAN13" ), "Digito de control EAN-13 no valido." ) nFailures += AssertBarcodeError( "crear EAN13 corto", oUtil:Crear( "123", "EAN13" ), "EAN-13 debe contener 12 o 13 digitos." ) nFailures += AssertBarcodeError( "crear EAN13 no numerico", oUtil:Crear( "12345678901A", "EAN13" ), "EAN-13 debe contener 12 o 13 digitos." ) nFailures += AssertBarcodeError( "crear EAN13 vacio", oUtil:Crear( "", "EAN13" ), "EAN-13 debe contener 12 o 13 digitos." ) nFailures += AssertBarcodeOk( "crear EAN8 7 digitos", oUtil:Crear( "1234567", "EAN8" ), "EAN8", "12345670" ) nFailures += AssertBarcodeOk( "crear EAN8 8 digitos valido", oUtil:Crear( "55123457", "EAN8" ), "EAN8", "55123457" ) nFailures += AssertBarcodeError( "crear EAN8 checksum invalido", oUtil:Crear( "12345671", "EAN8" ), "Digito de control EAN-8 no valido." ) nFailures += AssertBarcodeError( "crear EAN8 corto", oUtil:Crear( "123", "EAN8" ), "EAN-8 debe contener 7 u 8 digitos." ) nFailures += AssertBarcodeOk( "crear CODE128", oUtil:Crear( "ABC", "Code 128" ), "CODE128", "ABC" ) hCode128 := oUtil:Crear( "ABC-123", "Code 128" ) nFailures += AssertHashValue( "CODE128 bits equivalentes", hCode128, "bits", "1101001000010100011000100010110001000100011010011011100100111001101100111001011001011100101100001001100011101011" ) nFailures += AssertBarcodeOk( "crear EAN128", oUtil:Crear( "0109501101530003", "EAN-128" ), "EAN128", "0109501101530003" ) hEan128 := oUtil:Crear( "0109501101530003", "EAN-128" ) nFailures += AssertEqual( "EAN128 incluye FNC1 tras inicio", Left( hEan128[ "bits" ], 22 ), "1101001110011110101110" ) nFailures += AssertBarcodeError( "crear CODE128 vacio", oUtil:Crear( "", "CODE128" ), "Contenido de codigo de barras vacio." ) nFailures += AssertBarcodeOk( "crear QR", oUtil:Crear( "hola", "QR Code" ), "QR", "hola" ) hQr := oUtil:Crear( "hola", "QR Code" ) nFailures += AssertMatrix( "QR ISO equivalente", hQr[ "matriz" ], aExpectedQr ) nFailures += AssertBarcodeOk( "crear DATAMATRIX unicode", oUtil:Crear( "áé", "DATAMATRIX" ), "DATAMATRIX", "áé" ) hDataMatrix := oUtil:Crear( "0722125", "DATAMATRIX" ) nFailures += AssertMatrix( "Data Matrix ECC200 albaran", hDataMatrix[ "matriz" ], aExpectedMatrix ) nFailures += AssertBarcodeError( "crear tipo no soportado", oUtil:Crear( "abc", "foo" ), "Tipo de codigo de barras no soportado." ) nFailures += AssertBarcodeOk( "crear CODE128 numerico", oUtil:Crear( 12345, "code-128" ), "CODE128", "12345" ) nFailures += AssertBarcodeError( "crear CODE128 NIL", oUtil:Crear( NIL, "CODE128" ), "Contenido de codigo de barras vacio." ) IF nFailures == 0 LogLine( "TBarcodeUtil Harbour OK" ) ELSE LogLine( "TBarcodeUtil Harbour FAIL: " + hb_NToS( nFailures ) ) ENDIF ErrorLevel( nFailures ) RETURN FUNCTION AssertEqual( cCaseName, uActual, uExpected ) IF uActual == uExpected RETURN 0 ENDIF LogLine( "FAIL " + cCaseName ) LogLine( " esperado: " + hb_ValToStr( uExpected ) ) LogLine( " actual : " + hb_ValToStr( uActual ) ) RETURN 1 FUNCTION AssertBarcodeOk( cCaseName, hActual, cExpectedType, cExpectedText ) LOCAL nFailures := 0 nFailures += AssertHashValue( cCaseName + " tipo", hActual, "tipo", "barcode" ) nFailures += AssertHashValue( cCaseName + " barcodeTipo", hActual, "barcodeTipo", cExpectedType ) nFailures += AssertHashValue( cCaseName + " texto", hActual, "texto", cExpectedText ) nFailures += AssertHashValue( cCaseName + " mostrarTexto", hActual, "mostrarTexto", .T. ) IF hb_HHasKey( hActual, "error" ) LogLine( "FAIL " + cCaseName + " error inesperado" ) LogLine( " error: " + hActual[ "error" ] ) nFailures++ ENDIF RETURN nFailures FUNCTION AssertMatrix( cCaseName, aActual, aExpected ) LOCAL nIndex IF ! HB_ISARRAY( aActual ) .OR. Len( aActual ) != Len( aExpected ) LogLine( "FAIL " + cCaseName + " dimensiones" ) RETURN 1 ENDIF FOR nIndex := 1 TO Len( aExpected ) IF aActual[ nIndex ] != aExpected[ nIndex ] LogLine( "FAIL " + cCaseName + " fila " + hb_NToS( nIndex ) ) LogLine( " esperado: " + aExpected[ nIndex ] ) LogLine( " actual : " + aActual[ nIndex ] ) RETURN 1 ENDIF NEXT RETURN 0 FUNCTION AssertBarcodeError( cCaseName, hActual, cExpectedError ) LOCAL nFailures := 0 nFailures += AssertHashValue( cCaseName + " tipo", hActual, "tipo", "barcode" ) nFailures += AssertHashValue( cCaseName + " barcodeTipo", hActual, "barcodeTipo", "" ) nFailures += AssertHashValue( cCaseName + " texto", hActual, "texto", "" ) nFailures += AssertHashValue( cCaseName + " error", hActual, "error", cExpectedError ) IF hb_HHasKey( hActual, "mostrarTexto" ) LogLine( "FAIL " + cCaseName + " mostrarTexto inesperado" ) nFailures++ ENDIF RETURN nFailures FUNCTION AssertHashValue( cCaseName, hHash, cKey, uExpected ) IF ! hb_HHasKey( hHash, cKey ) LogLine( "FAIL " + cCaseName ) LogLine( " falta clave: " + cKey ) RETURN 1 ENDIF RETURN AssertEqual( cCaseName, hHash[ cKey ], uExpected ) FUNCTION LogLine( cText ) OutStd( cText + hb_eol() ) RETURN NIL