unipdf/internal/testutils/testutils.go

40 lines
8.9 KiB
Go
Raw Normal View History

2020-08-27 21:45:09 +00:00
//
// Copyright 2020 FoxyUtils ehf. All rights reserved.
//
// This is a commercial product and requires a license to operate.
// A trial license can be obtained at https://unidoc.io
//
// DO NOT EDIT: generated by unitwist Go source code obfuscator.
//
// Use of this source code is governed by the UniDoc End User License Agreement
// terms that can be accessed at https://unidoc.io/eula/
2024-11-22 00:42:43 +00:00
package testutils ;import (_cc "crypto/md5";_gb "encoding/hex";_gg "errors";_b "fmt";_cda "github.com/unidoc/unipdf/v3/common";_fc "github.com/unidoc/unipdf/v3/core";_f "image";_g "image/png";_da "io";_a "os";_e "os/exec";_df "path/filepath";_cd "strings";
_d "testing";);func RunRenderTest (t *_d .T ,pdfPath ,outputDir ,baselineRenderPath string ,saveBaseline bool ){_edc :=_cd .TrimSuffix (_df .Base (pdfPath ),_df .Ext (pdfPath ));t .Run ("\u0072\u0065\u006e\u0064\u0065\u0072",func (_dfd *_d .T ){_dcda :=_df .Join (outputDir ,_edc );
_agc :=_dcda +"\u002d%\u0064\u002e\u0070\u006e\u0067";if _bafa :=RenderPDFToPNGs (pdfPath ,0,_agc );_bafa !=nil {_dfd .Skip (_bafa );};for _gda :=1;true ;_gda ++{_gdb :=_b .Sprintf ("\u0025s\u002d\u0025\u0064\u002e\u0070\u006eg",_dcda ,_gda );_de :=_df .Join (baselineRenderPath ,_b .Sprintf ("\u0025\u0073\u002d\u0025\u0064\u005f\u0065\u0078\u0070\u002e\u0070\u006e\u0067",_edc ,_gda ));
if _ ,_feb :=_a .Stat (_gdb );_feb !=nil {break ;};_dfd .Logf ("\u0025\u0073",_de );if saveBaseline {_dfd .Logf ("\u0043\u006fp\u0079\u0069\u006eg\u0020\u0025\u0073\u0020\u002d\u003e\u0020\u0025\u0073",_gdb ,_de );_ee :=CopyFile (_gdb ,_de );if _ee !=nil {_dfd .Fatalf ("\u0045\u0052\u0052OR\u0020\u0063\u006f\u0070\u0079\u0069\u006e\u0067\u0020\u0074\u006f\u0020\u0025\u0073\u003a\u0020\u0025\u0076",_de ,_ee );
};continue ;};_dfd .Run (_b .Sprintf ("\u0070\u0061\u0067\u0065\u0025\u0064",_gda ),func (_edcd *_d .T ){_edcd .Logf ("\u0043o\u006dp\u0061\u0072\u0069\u006e\u0067 \u0025\u0073 \u0076\u0073\u0020\u0025\u0073",_gdb ,_de );_ea ,_ad :=ComparePNGFiles (_gdb ,_de );
if _a .IsNotExist (_ad ){_edcd .Fatal ("\u0069m\u0061g\u0065\u0020\u0066\u0069\u006ce\u0020\u006di\u0073\u0073\u0069\u006e\u0067");}else if !_ea {_edcd .Fatal ("\u0077\u0072\u006f\u006eg \u0070\u0061\u0067\u0065\u0020\u0072\u0065\u006e\u0064\u0065\u0072\u0065\u0064");
};});};});};func ComparePNGFiles (file1 ,file2 string )(bool ,error ){_ff ,_ec :=HashFile (file1 );if _ec !=nil {return false ,_ec ;};_cdc ,_ec :=HashFile (file2 );if _ec !=nil {return false ,_ec ;};if _ff ==_cdc {return true ,nil ;};_dcd ,_ec :=ReadPNG (file1 );
if _ec !=nil {return false ,_ec ;};_ffe ,_ec :=ReadPNG (file2 );if _ec !=nil {return false ,_ec ;};if _dcd .Bounds ()!=_ffe .Bounds (){return false ,nil ;};return CompareImages (_dcd ,_ffe );};func RenderPDFToPNGs (pdfPath string ,dpi int ,outpathTpl string )error {if dpi <=0{dpi =100;
};if _ ,_bd :=_e .LookPath ("\u0067\u0073");_bd !=nil {return ErrRenderNotSupported ;};return _e .Command ("\u0067\u0073","\u002d\u0073\u0044\u0045\u0056\u0049\u0043\u0045\u003d\u0070\u006e\u0067a\u006c\u0070\u0068\u0061","\u002d\u006f",outpathTpl ,_b .Sprintf ("\u002d\u0072\u0025\u0064",dpi ),pdfPath ).Run ();
};func ParseIndirectObjects (rawpdf string )(map[int64 ]_fc .PdfObject ,error ){_cce :=_fc .NewParserFromString (rawpdf );_gc :=map[int64 ]_fc .PdfObject {};for {_aa ,_acf :=_cce .ParseIndirectObject ();if _acf !=nil {if _acf ==_da .EOF {break ;};return nil ,_acf ;
};switch _eee :=_aa .(type ){case *_fc .PdfIndirectObject :_gc [_eee .ObjectNumber ]=_aa ;case *_fc .PdfObjectStream :_gc [_eee .ObjectNumber ]=_aa ;};};for _ ,_aga :=range _gc {_aff (_aga ,_gc );};return _gc ,nil ;};var (ErrRenderNotSupported =_gg .New ("\u0072\u0065\u006e\u0064\u0065r\u0069\u006e\u0067\u0020\u0050\u0044\u0046\u0020\u0066\u0069\u006c\u0065\u0073 \u0069\u0073\u0020\u006e\u006f\u0074\u0020\u0073\u0075\u0070\u0070\u006f\u0072\u0074\u0065\u0064\u0020\u006f\u006e\u0020\u0074\u0068\u0069\u0073\u0020\u0073\u0079\u0073\u0074\u0065m");
);func ReadPNG (file string )(_f .Image ,error ){_ccb ,_gd :=_a .Open (file );if _gd !=nil {return nil ,_gd ;};defer _ccb .Close ();return _g .Decode (_ccb );};func HashFile (file string )(string ,error ){_bfb ,_ed :=_a .Open (file );if _ed !=nil {return "",_ed ;
};defer _bfb .Close ();_ag :=_cc .New ();if _ ,_ed =_da .Copy (_ag ,_bfb );_ed !=nil {return "",_ed ;};return _gb .EncodeToString (_ag .Sum (nil )),nil ;};func CompareImages (img1 ,img2 _f .Image )(bool ,error ){_ca :=img1 .Bounds ();_bfe :=0;for _bg :=0;
_bg < _ca .Size ().X ;_bg ++{for _af :=0;_af < _ca .Size ().Y ;_af ++{_ac ,_db ,_dbd ,_ :=img1 .At (_bg ,_af ).RGBA ();_fg ,_baf ,_dc ,_ :=img2 .At (_bg ,_af ).RGBA ();if _ac !=_fg ||_db !=_baf ||_dbd !=_dc {_bfe ++;};};};_ae :=float64 (_bfe )/float64 (_ca .Dx ()*_ca .Dy ());
if _ae > 0.0001{_b .Printf ("\u0064\u0069\u0066f \u0066\u0072\u0061\u0063\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0076\u0020\u0028\u0025\u0064\u0029\u000a",_ae ,_bfe );return false ,nil ;};return true ,nil ;};func CompareDictionariesDeep (d1 ,d2 *_fc .PdfObjectDictionary )bool {if len (d1 .Keys ())!=len (d2 .Keys ()){_cda .Log .Debug ("\u0044\u0069\u0063\u0074\u0020\u0065\u006e\u0074\u0072\u0069\u0065\u0073\u0020\u006d\u0069s\u006da\u0074\u0063\u0068\u0020\u0028\u0025\u0064\u0020\u0021\u003d\u0020\u0025\u0064\u0029",len (d1 .Keys ()),len (d2 .Keys ()));
_cda .Log .Debug ("\u0057\u0061s\u0020\u0027\u0025s\u0027\u0020\u0076\u0073\u0020\u0027\u0025\u0073\u0027",d1 .WriteString (),d2 .WriteString ());return false ;};for _ ,_bgc :=range d1 .Keys (){if _bgc =="\u0050\u0061\u0072\u0065\u006e\u0074"{continue ;
};_bge :=_fc .TraceToDirectObject (d1 .Get (_bgc ));_dab :=_fc .TraceToDirectObject (d2 .Get (_bgc ));if _bge ==nil {_cda .Log .Debug ("\u00761\u0020\u0069\u0073\u0020\u006e\u0069l");return false ;};if _dab ==nil {_cda .Log .Debug ("\u00762\u0020\u0069\u0073\u0020\u006e\u0069l");
return false ;};switch _gdd :=_bge .(type ){case *_fc .PdfObjectDictionary :_cbf ,_fab :=_dab .(*_fc .PdfObjectDictionary );if !_fab {_cda .Log .Debug ("\u0054\u0079\u0070\u0065 m\u0069\u0073\u006d\u0061\u0074\u0063\u0068\u0020\u0025\u0054\u0020\u0076\u0073\u0020%\u0054",_bge ,_dab );
return false ;};if !CompareDictionariesDeep (_gdd ,_cbf ){return false ;};continue ;case *_fc .PdfObjectArray :_ffa ,_fcd :=_dab .(*_fc .PdfObjectArray );if !_fcd {_cda .Log .Debug ("\u00762\u0020n\u006f\u0074\u0020\u0061\u006e\u0020\u0061\u0072\u0072\u0061\u0079");
return false ;};if _gdd .Len ()!=_ffa .Len (){_cda .Log .Debug ("\u0061\u0072\u0072\u0061\u0079\u0020\u006c\u0065\u006e\u0067\u0074\u0068\u0020\u006d\u0069s\u006da\u0074\u0063\u0068\u0020\u0028\u0025\u0064\u0020\u0021\u003d\u0020\u0025\u0064\u0029",_gdd .Len (),_ffa .Len ());
return false ;};for _ebd :=0;_ebd < _gdd .Len ();_ebd ++{_afa :=_fc .TraceToDirectObject (_gdd .Get (_ebd ));_faa :=_fc .TraceToDirectObject (_ffa .Get (_ebd ));if _fcef ,_cbc :=_afa .(*_fc .PdfObjectDictionary );_cbc {_gbe ,_bc :=_faa .(*_fc .PdfObjectDictionary );
if !_bc {return false ;};if !CompareDictionariesDeep (_fcef ,_gbe ){return false ;};}else {if _afa .WriteString ()!=_faa .WriteString (){_cda .Log .Debug ("M\u0069\u0073\u006d\u0061tc\u0068 \u0027\u0025\u0073\u0027\u0020!\u003d\u0020\u0027\u0025\u0073\u0027",_afa .WriteString (),_faa .WriteString ());
return false ;};};};continue ;};if _bge .String ()!=_dab .String (){_cda .Log .Debug ("\u006b\u0065y\u003d\u0025\u0073\u0020\u004d\u0069\u0073\u006d\u0061\u0074\u0063\u0068\u0021\u0020\u0027\u0025\u0073\u0027\u0020\u0021\u003d\u0020'%\u0073\u0027",_bgc ,_bge .String (),_dab .String ());
_cda .Log .Debug ("\u0046o\u0072 \u0027\u0025\u0054\u0027\u0020\u002d\u0020\u0027\u0025\u0054\u0027",_bge ,_dab );_cda .Log .Debug ("\u0046\u006f\u0072\u0020\u0027\u0025\u002b\u0076\u0027\u0020\u002d\u0020'\u0025\u002b\u0076\u0027",_bge ,_dab );return false ;
};};return true ;};func CopyFile (src ,dst string )error {_fe ,_ba :=_a .Open (src );if _ba !=nil {return _ba ;};defer _fe .Close ();_bf ,_ba :=_a .Create (dst );if _ba !=nil {return _ba ;};defer _bf .Close ();_ ,_ba =_da .Copy (_bf ,_fe );return _ba ;
};func _aff (_ded _fc .PdfObject ,_bfa map[int64 ]_fc .PdfObject )error {switch _fge :=_ded .(type ){case *_fc .PdfIndirectObject :_eea :=_fge ;_aff (_eea .PdfObject ,_bfa );case *_fc .PdfObjectDictionary :_eeee :=_fge ;for _ ,_agaf :=range _eeee .Keys (){_bfg :=_eeee .Get (_agaf );
if _cf ,_cac :=_bfg .(*_fc .PdfObjectReference );_cac {_fce ,_age :=_bfa [_cf .ObjectNumber ];if !_age {return _gg .New ("r\u0065\u0066\u0065\u0072\u0065\u006ec\u0065\u0020\u0074\u006f\u0020\u006f\u0075\u0074\u0073i\u0064\u0065\u0020o\u0062j\u0065\u0063\u0074");
};_eeee .Set (_agaf ,_fce );}else {_aff (_bfg ,_bfa );};};case *_fc .PdfObjectArray :_ebc :=_fge ;for _fcec ,_ge :=range _ebc .Elements (){if _gad ,_dbf :=_ge .(*_fc .PdfObjectReference );_dbf {_fgc ,_geb :=_bfa [_gad .ObjectNumber ];if !_geb {return _gg .New ("r\u0065\u0066\u0065\u0072\u0065\u006ec\u0065\u0020\u0074\u006f\u0020\u006f\u0075\u0074\u0073i\u0064\u0065\u0020o\u0062j\u0065\u0063\u0074");
};_ebc .Set (_fcec ,_fgc );}else {_aff (_ge ,_bfa );};};};return nil ;};