2020-12-06 13:03:03 +00:00
|
|
|
package testutils ;import (_e "crypto/md5";_ae "encoding/hex";_de "errors";_fc "fmt";_b "github.com/unidoc/unipdf/v3/common";_eg "github.com/unidoc/unipdf/v3/core";_ce "image";_ea "image/png";_fa "io";_fb "os";_f "os/exec";_c "path/filepath";_aa "strings";_a "testing";);func HashFile (file string )(string ,error ){_bgf ,_aca :=_fb .Open (file );if _aca !=nil {return "",_aca ;};defer _bgf .Close ();_bf :=_e .New ();if _ ,_aca =_fa .Copy (_bf ,_bgf );_aca !=nil {return "",_aca ;};return _ae .EncodeToString (_bf .Sum (nil )),nil ;};func CompareImages (img1 ,img2 _ce .Image )(bool ,error ){_cf :=img1 .Bounds ();_aae :=0;for _bfd :=0;_bfd < _cf .Size ().X ;_bfd ++{for _bgc :=0;_bgc < _cf .Size ().Y ;_bgc ++{_ga ,_cea ,_fd ,_ :=img1 .At (_bfd ,_bgc ).RGBA ();_bb ,_bfa ,_ca ,_ :=img2 .At (_bfd ,_bgc ).RGBA ();if _ga !=_bb ||_cea !=_bfa ||_fd !=_ca {_aae ++;};};};_eac :=float64 (_aae )/float64 (_cf .Dx ()*_cf .Dy ());if _eac > 0.0001{_fc .Printf ("\u0064\u0069\u0066f \u0066\u0072\u0061\u0063\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0076\u0020\u0028\u0025\u0064\u0029\u000a",_eac ,_aae );return false ,nil ;};return true ,nil ;};func RunRenderTest (t *_a .T ,pdfPath ,outputDir ,baselineRenderPath string ,saveBaseline bool ){_eaf :=_aa .TrimSuffix (_c .Base (pdfPath ),_c .Ext (pdfPath ));t .Run ("\u0072\u0065\u006e\u0064\u0065\u0072",func (_ff *_a .T ){_fae :=_c .Join (outputDir ,_eaf );_cec :=_fae +"\u002d%\u0064\u002e\u0070\u006e\u0067";if _cfg :=RenderPDFToPNGs (pdfPath ,0,_cec );_cfg !=nil {_ff .Skip (_cfg );};for _af :=1;true ;_af ++{_fcb :=_fc .Sprintf ("\u0025s\u002d\u0025\u0064\u002e\u0070\u006eg",_fae ,_af );_gg :=_c .Join (baselineRenderPath ,_fc .Sprintf ("\u0025\u0073\u002d\u0025\u0064\u005f\u0065\u0078\u0070\u002e\u0070\u006e\u0067",_eaf ,_af ));if _ ,_cdb :=_fb .Stat (_fcb );_cdb !=nil {break ;};_ff .Logf ("\u0025\u0073",_gg );if _ ,_afc :=_fb .Stat (_gg );_fb .IsNotExist (_afc ){if saveBaseline {_ff .Logf ("\u0043\u006fp\u0079\u0069\u006eg\u0020\u0025\u0073\u0020\u002d\u003e\u0020\u0025\u0073",_fcb ,_gg );CopyFile (_fcb ,_gg );continue ;};break ;};_ff .Run (_fc .Sprintf ("\u0070\u0061\u0067\u0065\u0025\u0064",_af ),func (_afe *_a .T ){_afe .Logf ("\u0043o\u006dp\u0061\u0072\u0069\u006e\u0067 \u0025\u0073 \u0076\u0073\u0020\u0025\u0073",_fcb ,_gg );_ffa ,_gd :=ComparePNGFiles (_fcb ,_gg );if _fb .IsNotExist (_gd ){_afe .Fatal ("\u0069m\u0061g\u0065\u0020\u0066\u0069\u006ce\u0020\u006di\u0073\u0073\u0069\u006e\u0067");}else if !_ffa {_afe .Fatal ("\u0077\u0072\u006f\u006eg \u0070\u0061\u0067\u0065\u0020\u0072\u0065\u006e\u0064\u0065\u0072\u0065\u0064");};});};});};func ParseIndirectObjects (rawpdf string )(map[int64 ]_eg .PdfObject ,error ){_bgcf :=_eg .NewParserFromString (rawpdf );_fca :=map[int64 ]_eg .PdfObject {};for {_aed ,_fce :=_bgcf .ParseIndirectObject ();if _fce !=nil {if _fce ==_fa .EOF {break ;};return nil ,_fce ;};switch _fab :=_aed .(type ){case *_eg .PdfIndirectObject :_fca [_fab .ObjectNumber ]=_aed ;case *_eg .PdfObjectStream :_fca [_fab .ObjectNumber ]=_aed ;};};for _ ,_ad :=range _fca {_eae (_ad ,_fca );};return _fca ,nil ;};func ComparePNGFiles (file1 ,file2 string )(bool ,error ){_bd ,_df :=HashFile (file1 );if _df !=nil {return false ,_df ;};_gaf ,_df :=HashFile (file2 );if _df !=nil {return false ,_df ;};if _bd ==_gaf {return true ,nil ;};_fdf ,_df :=ReadPNG (file1 );if _df !=nil {return false ,_df ;};_cac ,_df :=ReadPNG (file2 );if _df !=nil {return false ,_df ;};if _fdf .Bounds ()!=_cac .Bounds (){return false ,nil ;};return CompareImages (_fdf ,_cac );};func ReadPNG (file string )(_ce .Image ,error ){_cd ,_g :=_fb .Open (file );if _g !=nil {return nil ,_g ;};defer _cd .Close ();return _ea .Decode (_cd );};var (ErrRenderNotSupported =_de .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 _eae (_fcg _eg .PdfObject ,_ab map[int64 ]_eg .PdfOb
|