unipdf/internal/testutils/testutils.go
2021-03-13 21:28:23 +00:00

40 lines
8.8 KiB
Go

//
// 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/
package testutils ;import (_c "crypto/md5";_bg "encoding/hex";_cd "errors";_be "fmt";_dd "github.com/unidoc/unipdf/v3/common";_ag "github.com/unidoc/unipdf/v3/core";_fb "image";_gg "image/png";_f "io";_d "os";_ae "os/exec";_cb "path/filepath";_a "strings";
_b "testing";);func ParseIndirectObjects (rawpdf string )(map[int64 ]_ag .PdfObject ,error ){_ead :=_ag .NewParserFromString (rawpdf );_faf :=map[int64 ]_ag .PdfObject {};for {_ef ,_bge :=_ead .ParseIndirectObject ();if _bge !=nil {if _bge ==_f .EOF {break ;
};return nil ,_bge ;};switch _ada :=_ef .(type ){case *_ag .PdfIndirectObject :_faf [_ada .ObjectNumber ]=_ef ;case *_ag .PdfObjectStream :_faf [_ada .ObjectNumber ]=_ef ;};};for _ ,_aeea :=range _faf {_bf (_aeea ,_faf );};return _faf ,nil ;};func ReadPNG (file string )(_fb .Image ,error ){_ddc ,_de :=_d .Open (file );
if _de !=nil {return nil ,_de ;};defer _ddc .Close ();return _gg .Decode (_ddc );};func CopyFile (src ,dst string )error {_ad ,_e :=_d .Open (src );if _e !=nil {return _e ;};defer _ad .Close ();_eb ,_e :=_d .Create (dst );if _e !=nil {return _e ;};defer _eb .Close ();
_ ,_e =_f .Copy (_eb ,_ad );return _e ;};func RenderPDFToPNGs (pdfPath string ,dpi int ,outpathTpl string )error {if dpi <=0{dpi =100;};if _ ,_cdb :=_ae .LookPath ("\u0067\u0073");_cdb !=nil {return ErrRenderNotSupported ;};return _ae .Command ("\u0067\u0073","\u002d\u0073\u0044\u0045\u0056\u0049\u0043\u0045\u003d\u0070\u006e\u0067a\u006c\u0070\u0068\u0061","\u002d\u006f",outpathTpl ,_be .Sprintf ("\u002d\u0072\u0025\u0064",dpi ),pdfPath ).Run ();
};var (ErrRenderNotSupported =_cd .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 _bf (_dab _ag .PdfObject ,_gd map[int64 ]_ag .PdfObject )error {switch _dbd :=_dab .(type ){case *_ag .PdfIndirectObject :_bgd :=_dbd ;_bf (_bgd .PdfObject ,_gd );case *_ag .PdfObjectDictionary :_fga :=_dbd ;for _ ,_adc :=range _fga .Keys (){_geea :=_fga .Get (_adc );
if _ff ,_adad :=_geea .(*_ag .PdfObjectReference );_adad {_cda ,_aad :=_gd [_ff .ObjectNumber ];if !_aad {return _cd .New ("r\u0065\u0066\u0065\u0072\u0065\u006ec\u0065\u0020\u0074\u006f\u0020\u006f\u0075\u0074\u0073i\u0064\u0065\u0020o\u0062j\u0065\u0063\u0074");
};_fga .Set (_adc ,_cda );}else {_bf (_geea ,_gd );};};case *_ag .PdfObjectArray :_ace :=_dbd ;for _aeb ,_fc :=range _ace .Elements (){if _fce ,_feea :=_fc .(*_ag .PdfObjectReference );_feea {_fdg ,_aadb :=_gd [_fce .ObjectNumber ];if !_aadb {return _cd .New ("r\u0065\u0066\u0065\u0072\u0065\u006ec\u0065\u0020\u0074\u006f\u0020\u006f\u0075\u0074\u0073i\u0064\u0065\u0020o\u0062j\u0065\u0063\u0074");
};_ace .Set (_aeb ,_fdg );}else {_bf (_fc ,_gd );};};};return nil ;};func HashFile (file string )(string ,error ){_feg ,_ea :=_d .Open (file );if _ea !=nil {return "",_ea ;};defer _feg .Close ();_bd :=_c .New ();if _ ,_ea =_f .Copy (_bd ,_feg );_ea !=nil {return "",_ea ;
};return _bg .EncodeToString (_bd .Sum (nil )),nil ;};func CompareDictionariesDeep (d1 ,d2 *_ag .PdfObjectDictionary )bool {if len (d1 .Keys ())!=len (d2 .Keys ()){_dd .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 ()));
_dd .Log .Debug ("\u0057\u0061s\u0020\u0027\u0025s\u0027\u0020\u0076\u0073\u0020\u0027\u0025\u0073\u0027",d1 .WriteString (),d2 .WriteString ());return false ;};for _ ,_dgg :=range d1 .Keys (){if _dgg =="\u0050\u0061\u0072\u0065\u006e\u0074"{continue ;
};_gb :=_ag .TraceToDirectObject (d1 .Get (_dgg ));_dfg :=_ag .TraceToDirectObject (d2 .Get (_dgg ));if _gb ==nil {_dd .Log .Debug ("\u00761\u0020\u0069\u0073\u0020\u006e\u0069l");return false ;};if _dfg ==nil {_dd .Log .Debug ("\u00762\u0020\u0069\u0073\u0020\u006e\u0069l");
return false ;};switch _ga :=_gb .(type ){case *_ag .PdfObjectDictionary :_bef ,_bfe :=_dfg .(*_ag .PdfObjectDictionary );if !_bfe {_dd .Log .Debug ("\u0054\u0079\u0070\u0065 m\u0069\u0073\u006d\u0061\u0074\u0063\u0068\u0020\u0025\u0054\u0020\u0076\u0073\u0020%\u0054",_gb ,_dfg );
return false ;};if !CompareDictionariesDeep (_ga ,_bef ){return false ;};continue ;case *_ag .PdfObjectArray :_ebf ,_eacc :=_dfg .(*_ag .PdfObjectArray );if !_eacc {_dd .Log .Debug ("\u00762\u0020n\u006f\u0074\u0020\u0061\u006e\u0020\u0061\u0072\u0072\u0061\u0079");
return false ;};if _ga .Len ()!=_ebf .Len (){_dd .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",_ga .Len (),_ebf .Len ());
return false ;};for _efb :=0;_efb < _ga .Len ();_efb ++{_dabf :=_ag .TraceToDirectObject (_ga .Get (_efb ));_bfd :=_ag .TraceToDirectObject (_ebf .Get (_efb ));if _dc ,_eda :=_dabf .(*_ag .PdfObjectDictionary );_eda {_gda ,_acd :=_bfd .(*_ag .PdfObjectDictionary );
if !_acd {return false ;};if !CompareDictionariesDeep (_dc ,_gda ){return false ;};}else {if _dabf .WriteString ()!=_bfd .WriteString (){_dd .Log .Debug ("M\u0069\u0073\u006d\u0061tc\u0068 \u0027\u0025\u0073\u0027\u0020!\u003d\u0020\u0027\u0025\u0073\u0027",_dabf .WriteString (),_bfd .WriteString ());
return false ;};};};continue ;};if _gb .String ()!=_dfg .String (){_dd .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",_dgg ,_gb .String (),_dfg .String ());
_dd .Log .Debug ("\u0046o\u0072 \u0027\u0025\u0054\u0027\u0020\u002d\u0020\u0027\u0025\u0054\u0027",_gb ,_dfg );_dd .Log .Debug ("\u0046\u006f\u0072\u0020\u0027\u0025\u002b\u0076\u0027\u0020\u002d\u0020'\u0025\u002b\u0076\u0027",_gb ,_dfg );return false ;
};};return true ;};func RunRenderTest (t *_b .T ,pdfPath ,outputDir ,baselineRenderPath string ,saveBaseline bool ){_fd :=_a .TrimSuffix (_cb .Base (pdfPath ),_cb .Ext (pdfPath ));t .Run ("\u0072\u0065\u006e\u0064\u0065\u0072",func (_fae *_b .T ){_cce :=_cb .Join (outputDir ,_fd );
_bda :=_cce +"\u002d%\u0064\u002e\u0070\u006e\u0067";if _eg :=RenderPDFToPNGs (pdfPath ,0,_bda );_eg !=nil {_fae .Skip (_eg );};for _aee :=1;true ;_aee ++{_ee :=_be .Sprintf ("\u0025s\u002d\u0025\u0064\u002e\u0070\u006eg",_cce ,_aee );_dda :=_cb .Join (baselineRenderPath ,_be .Sprintf ("\u0025\u0073\u002d\u0025\u0064\u005f\u0065\u0078\u0070\u002e\u0070\u006e\u0067",_fd ,_aee ));
if _ ,_bgf :=_d .Stat (_ee );_bgf !=nil {break ;};_fae .Logf ("\u0025\u0073",_dda );if saveBaseline {_fae .Logf ("\u0043\u006fp\u0079\u0069\u006eg\u0020\u0025\u0073\u0020\u002d\u003e\u0020\u0025\u0073",_ee ,_dda );_gee :=CopyFile (_ee ,_dda );if _gee !=nil {_fae .Fatalf ("\u0045\u0052\u0052OR\u0020\u0063\u006f\u0070\u0079\u0069\u006e\u0067\u0020\u0074\u006f\u0020\u0025\u0073\u003a\u0020\u0025\u0076",_dda ,_gee );
};continue ;};_fae .Run (_be .Sprintf ("\u0070\u0061\u0067\u0065\u0025\u0064",_aee ),func (_bc *_b .T ){_bc .Logf ("\u0043o\u006dp\u0061\u0072\u0069\u006e\u0067 \u0025\u0073 \u0076\u0073\u0020\u0025\u0073",_ee ,_dda );_fee ,_fdf :=ComparePNGFiles (_ee ,_dda );
if _d .IsNotExist (_fdf ){_bc .Fatal ("\u0069m\u0061g\u0065\u0020\u0066\u0069\u006ce\u0020\u006di\u0073\u0073\u0069\u006e\u0067");}else if !_fee {_bc .Fatal ("\u0077\u0072\u006f\u006eg \u0070\u0061\u0067\u0065\u0020\u0072\u0065\u006e\u0064\u0065\u0072\u0065\u0064");
};});};});};func CompareImages (img1 ,img2 _fb .Image )(bool ,error ){_ac :=img1 .Bounds ();_ba :=0;for _da :=0;_da < _ac .Size ().X ;_da ++{for _df :=0;_df < _ac .Size ().Y ;_df ++{_fg ,_ab ,_adf ,_ :=img1 .At (_da ,_df ).RGBA ();_fa ,_ge ,_cc ,_ :=img2 .At (_da ,_df ).RGBA ();
if _fg !=_fa ||_ab !=_ge ||_adf !=_cc {_ba ++;};};};_ec :=float64 (_ba )/float64 (_ac .Dx ()*_ac .Dy ());if _ec > 0.0001{_be .Printf ("\u0064\u0069\u0066f \u0066\u0072\u0061\u0063\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0076\u0020\u0028\u0025\u0064\u0029\u000a",_ec ,_ba );
return false ,nil ;};return true ,nil ;};func ComparePNGFiles (file1 ,file2 string )(bool ,error ){_db ,_bdf :=HashFile (file1 );if _bdf !=nil {return false ,_bdf ;};_ddd ,_bdf :=HashFile (file2 );if _bdf !=nil {return false ,_bdf ;};if _db ==_ddd {return true ,nil ;
};_ccd ,_bdf :=ReadPNG (file1 );if _bdf !=nil {return false ,_bdf ;};_fge ,_bdf :=ReadPNG (file2 );if _bdf !=nil {return false ,_bdf ;};if _ccd .Bounds ()!=_fge .Bounds (){return false ,nil ;};return CompareImages (_ccd ,_fge );};