2020-04-04 16:53:29 +01:00
/*
libzint - the open source barcode library
2023-06-13 18:12:20 +01:00
Copyright ( C ) 2020 - 2023 Robin Stuart < rstuart114 @ gmail . com >
2020-04-04 16:53:29 +01:00
Redistribution and use in source and binary forms , with or without
modification , are permitted provided that the following conditions
are met :
1. Redistributions of source code must retain the above copyright
notice , this list of conditions and the following disclaimer .
2. Redistributions in binary form must reproduce the above copyright
notice , this list of conditions and the following disclaimer in the
documentation and / or other materials provided with the distribution .
3. Neither the name of the project nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission .
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS " AND
ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL
DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION )
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT
LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE .
*/
2022-09-12 19:26:04 +01:00
/* SPDX-License-Identifier: BSD-3-Clause */
2020-04-04 16:53:29 +01:00
# include "testcommon.h"
# include <sys/stat.h>
2020-05-05 22:28:25 +01:00
# define TEST_PRINT_OVERWRITE_EXPECTED "bmp,emf,eps,gif,pcx,png,svg,tif,txt"
2022-09-12 19:26:04 +01:00
static void test_print ( const testCtx * const p_ctx ) {
int debug = p_ctx - > debug ;
2020-04-04 16:53:29 +01:00
struct item {
int symbology ;
int option_1 ;
int option_2 ;
2020-09-30 12:19:12 +01:00
float scale ;
2020-10-03 22:51:08 +01:00
char * data ;
2020-05-05 22:28:25 +01:00
char * expected_file ;
2020-04-04 16:53:29 +01:00
} ;
struct item data [ ] = {
2020-09-30 12:19:12 +01:00
/* 0*/ { BARCODE_CODE128 , - 1 , - 1 , - 1 , " AIM " , " code128_aim " } ,
/* 1*/ { BARCODE_QRCODE , 2 , 1 , - 1 , " 1234567890 " , " qr_v1_m " } ,
/* 2*/ { BARCODE_DOTCODE , - 1 , - 1 , 5 , " 2741 " , " dotcode_aim_fig7 " } ,
/* 3*/ { BARCODE_ULTRA , - 1 , - 1 , - 1 , " A " , " ultracode_a " } ,
2020-12-19 17:13:35 +00:00
/* 4*/ { BARCODE_MAXICODE , - 1 , - 1 , - 1 , " THIS IS A 93 CHARACTER CODE SET A MESSAGE THAT FILLS A MODE 4, UNAPPENDED, MAXICODE SYMBOL... " , " maxicode_fig_2 " } ,
2020-04-04 16:53:29 +01:00
} ;
2021-06-14 00:48:29 +01:00
int data_size = ARRAY_SIZE ( data ) ;
2021-06-23 15:00:49 +01:00
int i , length , ret ;
2023-06-13 18:12:20 +01:00
struct zint_symbol * symbol = NULL ;
2021-06-23 15:00:49 +01:00
int j ;
2020-04-04 16:53:29 +01:00
2020-05-05 22:28:25 +01:00
char * exts [ ] = { " bmp " , " emf " , " eps " , " gif " , " pcx " , " png " , " svg " , " tif " , " txt " } ;
2021-06-14 00:48:29 +01:00
int exts_size = ARRAY_SIZE ( exts ) ;
2020-04-04 16:53:29 +01:00
2020-04-06 21:26:13 +01:00
char data_dir [ 1024 ] ;
2021-06-14 00:48:29 +01:00
char data_subdir [ 1024 ] ;
2020-04-06 21:26:13 +01:00
char expected_file [ 1024 ] ;
2020-04-04 16:53:29 +01:00
char escaped [ 1024 ] ;
int escaped_size = 1024 ;
- API: add new zint_symbol `dpmm` field for output resolution (BMP/
EMF/PCX/PNG/TIF only, i.e. excluding EPS, GIF & SVG)
- Add support for specifying scale by X-dimension and resolution
with new option `--scalexdimdp` for CLI/Tcl & new API function
`ZBarcode_Scale_From_XdimDp()` (+ `ZBarcode_XdimDp_From_Scale()`
& `ZBarcode_Default_Xdim()`) and new GUI popup; manual: document
- BMP/EMF/PCX/PNG/TIF: use new `dpmm` resolution field (for EMF
following Inkscape)
- backend_qt: add `dpmm()`, `vectorWidth()`, `vectorHeight()`,
`noPng()`, `getVersion()`, `takesGS1AIData()`, & `XdimDp` stuff
incl. new `QZintXdimDp` struct for passing around scale vars &
use in `getAsCLI()`; add comments
- Raise `scale` limit to 200 (from 100) to allow for large dpmm
- output: create directories & subdirectories as necessary for
output path using new function `out_fopen()` and use in BMP/EMF/
EPS/GIF/PCX/PNG/SVG/TIF
- DPLEIT/DPIDENT: format HRT according to (incomplete)
documentation, and set default height to 72X (from 50X)
- CODE128B renamed to CODE128AB as can use subsets A and/or B
- CODABAR: fix minimum height calc
- EMF: fix indexing of handles (zero-based not 1-based)
- GUI: fix symbology zap (previous technique of clearing and
re-loading settings without doing a sync no longer works);
fix UPCEAN guard descent enable
- MAILMARK: better error message if input < 14 characters
- GUI: add "Default" button for DAFT tracker ratio & enable/disable
various default buttons; use new `takesGS1AIData()` to
enable/disable GS1-specific checkboxes
- CLI: use new `validate_float()` to parse float options (7
significant digits allowed only, no scientific notation)
- DATAMATRIX/GRIDMATRIX/PDF417/QR/ULTRA: micro-optimize structapp
ID parse
- library/CLI: fiddle with static asserts (make CHAR_BIT sensitive,
supposedly)
- win32/README: update building libpng (assembly removed)
- README.linux: document incompatibility of Qt6 >= 6.3
- manual: expand Barcode Studio waffle
- test suite: change range separator to hyphen and allow multiple
excludes
2022-12-02 21:39:01 +00:00
const char * have_identify = NULL ;
2021-06-23 15:00:49 +01:00
int have_libreoffice = 0 ;
int have_ghostscript = 0 ;
int have_vnu = 0 ;
int have_tiffinfo = 0 ;
2022-09-12 19:26:04 +01:00
if ( p_ctx - > generate ) {
2021-06-23 15:00:49 +01:00
have_identify = testUtilHaveIdentify ( ) ;
have_libreoffice = testUtilHaveLibreOffice ( ) ;
have_ghostscript = testUtilHaveGhostscript ( ) ;
have_vnu = testUtilHaveVnu ( ) ;
have_tiffinfo = testUtilHaveTiffInfo ( ) ;
}
2023-06-13 18:12:20 +01:00
testStartSymbol ( " test_print " , & symbol ) ;
2021-06-23 15:00:49 +01:00
2021-06-14 00:48:29 +01:00
assert_nonzero ( testUtilDataPath ( data_dir , sizeof ( data_dir ) , " /backend/tests/data " , NULL ) , " testUtilDataPath == 0 \n " ) ;
2022-09-12 19:26:04 +01:00
if ( p_ctx - > generate ) {
2021-06-23 15:00:49 +01:00
if ( ! testUtilDirExists ( data_dir ) ) {
ret = testUtilMkDir ( data_dir ) ;
assert_zero ( ret , " testUtilMkDir(%s) ret %d != 0 (%d: %s) \n " , data_dir , ret , errno , strerror ( errno ) ) ;
2020-05-05 22:28:25 +01:00
}
2021-06-14 00:48:29 +01:00
assert_nonzero ( sizeof ( data_dir ) > strlen ( data_dir ) + 6 , " sizeof(data_dir) %d <= strlen (%d) + 6 \n " , ( int ) sizeof ( data_dir ) , ( int ) strlen ( data_dir ) ) ;
2020-05-05 22:28:25 +01:00
strcat ( data_dir , " /print " ) ;
2021-06-23 15:00:49 +01:00
if ( ! testUtilDirExists ( data_dir ) ) {
ret = testUtilMkDir ( data_dir ) ;
assert_zero ( ret , " testUtilMkDir(%s) ret %d != 0 (%d: %s) \n " , data_dir , ret , errno , strerror ( errno ) ) ;
2020-05-05 22:28:25 +01:00
}
2021-06-14 00:48:29 +01:00
} else {
assert_nonzero ( sizeof ( data_dir ) > strlen ( data_dir ) + 6 , " sizeof(data_dir) %d <= strlen (%d) + 6 \n " , ( int ) sizeof ( data_dir ) , ( int ) strlen ( data_dir ) ) ;
strcat ( data_dir , " /print " ) ;
2020-04-04 16:53:29 +01:00
}
2021-06-23 15:00:49 +01:00
for ( j = 0 ; j < exts_size ; j + + ) {
2022-11-24 14:18:31 +00:00
if ( ZBarcode_NoPng ( ) & & strcmp ( exts [ j ] , " png " ) = = 0 ) continue ;
2021-06-14 00:48:29 +01:00
assert_nonzero ( sizeof ( data_subdir ) > strlen ( data_dir ) + 1 + strlen ( exts [ j ] ) ,
" sizeof(data_subdir) (%d) <= strlen(data_dir) (%d) + 1 + strlen(%s) (%d) \n " ,
( int ) sizeof ( data_subdir ) , ( int ) strlen ( data_dir ) , exts [ j ] , ( int ) strlen ( exts [ j ] ) ) ;
strcpy ( data_subdir , data_dir ) ;
strcat ( data_subdir , " / " ) ;
strcat ( data_subdir , exts [ j ] ) ;
2020-04-06 21:26:13 +01:00
2022-09-12 19:26:04 +01:00
if ( p_ctx - > generate ) {
2021-06-23 15:00:49 +01:00
if ( ! testUtilDirExists ( data_subdir ) ) {
ret = testUtilMkDir ( data_subdir ) ;
assert_zero ( ret , " testUtilMkDir(%s) ret %d != 0 (%d: %s) \n " , data_subdir , ret , errno , strerror ( errno ) ) ;
2020-05-05 22:28:25 +01:00
}
2020-04-06 21:26:13 +01:00
}
2021-06-23 15:00:49 +01:00
for ( i = 0 ; i < data_size ; i + + ) {
2020-04-06 21:26:13 +01:00
2022-09-12 19:26:04 +01:00
if ( testContinue ( p_ctx , i ) ) continue ;
2020-05-05 22:28:25 +01:00
2021-06-23 15:00:49 +01:00
symbol = ZBarcode_Create ( ) ;
2020-04-06 21:26:13 +01:00
assert_nonnull ( symbol , " Symbol not created \n " ) ;
2021-06-23 15:00:49 +01:00
length = testUtilSetSymbol ( symbol , data [ i ] . symbology , - 1 /*input_mode*/ , - 1 /*eci*/ , data [ i ] . option_1 , data [ i ] . option_2 , - 1 , - 1 /*output_options*/ , data [ i ] . data , - 1 , debug ) ;
2020-09-30 12:19:12 +01:00
if ( data [ i ] . scale ! = - 1 ) {
symbol - > scale = data [ i ] . scale ;
2020-04-06 21:26:13 +01:00
}
2020-10-03 22:51:08 +01:00
ret = ZBarcode_Encode ( symbol , ( unsigned char * ) data [ i ] . data , length ) ;
2020-04-06 21:26:13 +01:00
assert_zero ( ret , " i:%d %s ZBarcode_Encode ret %d != 0 %s \n " , i , testUtilBarcodeName ( data [ i ] . symbology ) , ret , symbol - > errtxt ) ;
strcpy ( symbol - > outfile , " out. " ) ;
strcat ( symbol - > outfile , exts [ j ] ) ;
2021-06-14 00:48:29 +01:00
assert_nonzero ( sizeof ( expected_file ) > strlen ( data_subdir ) + 1 + strlen ( data [ i ] . expected_file ) + 1 + strlen ( exts [ j ] ) ,
" i:%d sizeof(expected_file) (%d) > strlen(data_subdir) (%d) + 1 + strlen(%s) (%d) + 1 + strlen(%s) (%d), \n " ,
i , ( int ) sizeof ( expected_file ) , ( int ) strlen ( data_subdir ) , data [ i ] . expected_file , ( int ) strlen ( data [ i ] . expected_file ) , exts [ j ] , ( int ) strlen ( exts [ j ] ) ) ;
strcpy ( expected_file , data_subdir ) ;
2020-04-06 21:26:13 +01:00
strcat ( expected_file , " / " ) ;
strcat ( expected_file , data [ i ] . expected_file ) ;
strcat ( expected_file , " . " ) ;
strcat ( expected_file , exts [ j ] ) ;
ret = ZBarcode_Print ( symbol , 0 ) ;
assert_zero ( ret , " i:%d j:%d %s %s ZBarcode_Print %s ret %d != 0 \n " , i , j , exts [ j ] , testUtilBarcodeName ( data [ i ] . symbology ) , symbol - > outfile , ret ) ;
2022-09-12 19:26:04 +01:00
if ( p_ctx - > generate ) {
2020-05-05 22:28:25 +01:00
if ( j = = 0 ) {
2020-09-30 12:19:12 +01:00
printf ( " /*%3d*/ { %s, %d, %d, %.8g, \" %s \" , \" %s \" }, \n " ,
i , testUtilBarcodeName ( data [ i ] . symbology ) , data [ i ] . option_1 , data [ i ] . option_2 , data [ i ] . scale ,
testUtilEscape ( data [ i ] . data , length , escaped , escaped_size ) , data [ i ] . expected_file ) ;
2020-05-05 22:28:25 +01:00
}
if ( strstr ( TEST_PRINT_OVERWRITE_EXPECTED , exts [ j ] ) ) {
2021-06-23 15:00:49 +01:00
ret = testUtilRename ( symbol - > outfile , expected_file ) ;
assert_zero ( ret , " i:%d testUtilRename(%s, %s) ret %d != 0 \n " , i , symbol - > outfile , expected_file , ret ) ;
2020-05-05 22:28:25 +01:00
if ( strcmp ( exts [ j ] , " eps " ) = = 0 ) {
if ( have_ghostscript ) {
ret = testUtilVerifyGhostscript ( expected_file , debug ) ;
assert_zero ( ret , " i:%d %s ghostscript %s ret %d != 0 \n " , i , testUtilBarcodeName ( data [ i ] . symbology ) , expected_file , ret ) ;
}
} else if ( strcmp ( exts [ j ] , " svg " ) = = 0 | | strcmp ( exts [ j ] , " emf " ) = = 0 ) {
2020-10-03 22:51:08 +01:00
if ( have_libreoffice ) {
2022-09-12 19:26:04 +01:00
ret = testUtilVerifyLibreOffice ( expected_file , debug ) ; /* Slow */
2020-10-03 22:51:08 +01:00
assert_zero ( ret , " i:%d %s libreoffice %s ret %d != 0 \n " , i , testUtilBarcodeName ( data [ i ] . symbology ) , expected_file , ret ) ;
}
if ( have_vnu & & strcmp ( exts [ j ] , " svg " ) = = 0 ) {
2022-09-12 19:26:04 +01:00
ret = testUtilVerifyVnu ( expected_file , debug ) ; /* Very slow */
2020-10-03 22:51:08 +01:00
assert_zero ( ret , " i:%d %s vnu %s ret %d != 0 \n " , i , testUtilBarcodeName ( data [ i ] . symbology ) , expected_file , ret ) ;
2020-05-05 22:28:25 +01:00
}
2022-09-12 19:26:04 +01:00
} else if ( strcmp ( exts [ j ] , " tif " ) = = 0 & & have_tiffinfo ) { /* Much faster (and better) than identify */
2021-03-21 21:20:16 +00:00
ret = testUtilVerifyTiffInfo ( expected_file , debug ) ;
assert_zero ( ret , " i:%d %s tiffinfo %s ret %d != 0 \n " , i , testUtilBarcodeName ( data [ i ] . symbology ) , expected_file , ret ) ;
2022-09-12 19:26:04 +01:00
} else if ( strcmp ( exts [ j ] , " txt " ) ! = 0 ) { /* I.e. rasters */
2020-05-05 22:28:25 +01:00
if ( have_identify ) {
- API: add new zint_symbol `dpmm` field for output resolution (BMP/
EMF/PCX/PNG/TIF only, i.e. excluding EPS, GIF & SVG)
- Add support for specifying scale by X-dimension and resolution
with new option `--scalexdimdp` for CLI/Tcl & new API function
`ZBarcode_Scale_From_XdimDp()` (+ `ZBarcode_XdimDp_From_Scale()`
& `ZBarcode_Default_Xdim()`) and new GUI popup; manual: document
- BMP/EMF/PCX/PNG/TIF: use new `dpmm` resolution field (for EMF
following Inkscape)
- backend_qt: add `dpmm()`, `vectorWidth()`, `vectorHeight()`,
`noPng()`, `getVersion()`, `takesGS1AIData()`, & `XdimDp` stuff
incl. new `QZintXdimDp` struct for passing around scale vars &
use in `getAsCLI()`; add comments
- Raise `scale` limit to 200 (from 100) to allow for large dpmm
- output: create directories & subdirectories as necessary for
output path using new function `out_fopen()` and use in BMP/EMF/
EPS/GIF/PCX/PNG/SVG/TIF
- DPLEIT/DPIDENT: format HRT according to (incomplete)
documentation, and set default height to 72X (from 50X)
- CODE128B renamed to CODE128AB as can use subsets A and/or B
- CODABAR: fix minimum height calc
- EMF: fix indexing of handles (zero-based not 1-based)
- GUI: fix symbology zap (previous technique of clearing and
re-loading settings without doing a sync no longer works);
fix UPCEAN guard descent enable
- MAILMARK: better error message if input < 14 characters
- GUI: add "Default" button for DAFT tracker ratio & enable/disable
various default buttons; use new `takesGS1AIData()` to
enable/disable GS1-specific checkboxes
- CLI: use new `validate_float()` to parse float options (7
significant digits allowed only, no scientific notation)
- DATAMATRIX/GRIDMATRIX/PDF417/QR/ULTRA: micro-optimize structapp
ID parse
- library/CLI: fiddle with static asserts (make CHAR_BIT sensitive,
supposedly)
- win32/README: update building libpng (assembly removed)
- README.linux: document incompatibility of Qt6 >= 6.3
- manual: expand Barcode Studio waffle
- test suite: change range separator to hyphen and allow multiple
excludes
2022-12-02 21:39:01 +00:00
ret = testUtilVerifyIdentify ( have_identify , expected_file , debug ) ;
2020-05-05 22:28:25 +01:00
assert_zero ( ret , " i:%d %s identify %s ret %d != 0 \n " , i , testUtilBarcodeName ( data [ i ] . symbology ) , expected_file , ret ) ;
}
}
}
2020-04-06 21:26:13 +01:00
} else {
2020-05-05 22:28:25 +01:00
assert_nonzero ( testUtilExists ( symbol - > outfile ) , " i:%d j:%d %s testUtilExists(%s) == 0 \n " , i , j , exts [ j ] , symbol - > outfile ) ;
if ( strcmp ( exts [ j ] , " eps " ) = = 0 ) {
ret = testUtilCmpEpss ( symbol - > outfile , expected_file ) ;
assert_zero ( ret , " i:%d %s testUtilCmpEpss(%s, %s) %d != 0 \n " , i , testUtilBarcodeName ( data [ i ] . symbology ) , symbol - > outfile , expected_file , ret ) ;
} else if ( strcmp ( exts [ j ] , " png " ) = = 0 ) {
ret = testUtilCmpPngs ( symbol - > outfile , expected_file ) ;
assert_zero ( ret , " i:%d %s testUtilCmpPngs(%s, %s) %d != 0 \n " , i , testUtilBarcodeName ( data [ i ] . symbology ) , symbol - > outfile , expected_file , ret ) ;
2021-02-26 20:45:08 +00:00
ret = testUtilCmpBins ( symbol - > outfile , expected_file ) ;
assert_zero ( ret , " i:%d %s testUtilCmpBins(%s, %s) %d != 0 \n " , i , testUtilBarcodeName ( data [ i ] . symbology ) , symbol - > outfile , expected_file , ret ) ;
2020-05-05 22:28:25 +01:00
} else if ( strcmp ( exts [ j ] , " svg " ) = = 0 ) {
ret = testUtilCmpSvgs ( symbol - > outfile , expected_file ) ;
assert_zero ( ret , " i:%d %s testUtilCmpSvgs(%s, %s) %d != 0 \n " , i , testUtilBarcodeName ( data [ i ] . symbology ) , symbol - > outfile , expected_file , ret ) ;
} else if ( strcmp ( exts [ j ] , " txt " ) = = 0 ) {
ret = testUtilCmpTxts ( symbol - > outfile , expected_file ) ;
assert_zero ( ret , " i:%d %s testUtilCmpTxts(%s, %s) %d != 0 \n " , i , testUtilBarcodeName ( data [ i ] . symbology ) , symbol - > outfile , expected_file , ret ) ;
} else {
ret = testUtilCmpBins ( symbol - > outfile , expected_file ) ;
assert_zero ( ret , " i:%d %s testUtilCmpBins(%s, %s) %d != 0 \n " , i , testUtilBarcodeName ( data [ i ] . symbology ) , symbol - > outfile , expected_file , ret ) ;
}
2023-05-10 21:29:09 +01:00
if ( p_ctx - > index = = - 1 ) assert_zero ( testUtilRemove ( symbol - > outfile ) , " i:%d testUtilRemove(%s) != 0 \n " , i , symbol - > outfile ) ;
2020-04-06 21:26:13 +01:00
}
ZBarcode_Delete ( symbol ) ;
}
}
2020-04-04 16:53:29 +01:00
testFinish ( ) ;
}
2020-05-05 22:28:25 +01:00
int main ( int argc , char * argv [ ] ) {
2022-09-12 19:26:04 +01:00
testFunction funcs [ ] = { /* name, func */
{ " test_print " , test_print } ,
2020-05-05 22:28:25 +01:00
} ;
testRun ( argc , argv , funcs , ARRAY_SIZE ( funcs ) ) ;
2020-04-04 16:53:29 +01:00
testReport ( ) ;
return 0 ;
}
2022-09-12 19:26:04 +01:00
/* vim: set ts=4 sw=4 et : */