2020-11-11 18:48:37 +00:00
|
|
|
package testutils ;import (_g "crypto/md5";_bb "encoding/hex";_f "errors";_ac "fmt";_gb "github.com/unidoc/unipdf/v3/common";_ce "github.com/unidoc/unipdf/v3/core";_cg "image";_bc "image/png";_gc "io";_bg "os";_c "os/exec";_e "path/filepath";_b "strings";_ag "testing";);func HashFile (file string )(string ,error ){_ga ,_gcf :=_bg .Open (file );if _gcf !=nil {return "",_gcf ;};defer _ga .Close ();_ee :=_g .New ();if _ ,_gcf =_gc .Copy (_ee ,_ga );_gcf !=nil {return "",_gcf ;};return _bb .EncodeToString (_ee .Sum (nil )),nil ;};func CopyFile (src ,dst string )error {_af ,_aa :=_bg .Open (src );if _aa !=nil {return _aa ;};defer _af .Close ();_ba ,_aa :=_bg .Create (dst );if _aa !=nil {return _aa ;};defer _ba .Close ();_ ,_aa =_gc .Copy (_ba ,_af );return _aa ;};func _egd (_dfe _ce .PdfObject ,_feg map[int64 ]_ce .PdfObject )error {switch _ab :=_dfe .(type ){case *_ce .PdfIndirectObject :_bdb :=_ab ;_egd (_bdb .PdfObject ,_feg );case *_ce .PdfObjectDictionary :_dd :=_ab ;for _ ,_edd :=range _dd .Keys (){_eddd :=_dd .Get (_edd );if _bee ,_dc :=_eddd .(*_ce .PdfObjectReference );_dc {_dbd ,_fd :=_feg [_bee .ObjectNumber ];if !_fd {return _f .New ("r\u0065\u0066\u0065\u0072\u0065\u006ec\u0065\u0020\u0074\u006f\u0020\u006f\u0075\u0074\u0073i\u0064\u0065\u0020o\u0062j\u0065\u0063\u0074");};_dd .Set (_edd ,_dbd );}else {_egd (_eddd ,_feg );};};case *_ce .PdfObjectArray :_gg :=_ab ;for _ebd ,_fee :=range _gg .Elements (){if _gda ,_ef :=_fee .(*_ce .PdfObjectReference );_ef {_aecc ,_cdg :=_feg [_gda .ObjectNumber ];if !_cdg {return _f .New ("r\u0065\u0066\u0065\u0072\u0065\u006ec\u0065\u0020\u0074\u006f\u0020\u006f\u0075\u0074\u0073i\u0064\u0065\u0020o\u0062j\u0065\u0063\u0074");};_gg .Set (_ebd ,_aecc );}else {_egd (_fee ,_feg );};};};return nil ;};func RenderPDFToPNGs (pdfPath string ,dpi int ,outpathTpl string )error {if dpi <=0{dpi =100;};if _ ,_bca :=_c .LookPath ("\u0067\u0073");_bca !=nil {return ErrRenderNotSupported ;};return _c .Command ("\u0067\u0073","\u002d\u0073\u0044\u0045\u0056\u0049\u0043\u0045\u003d\u0070\u006e\u0067a\u006c\u0070\u0068\u0061","\u002d\u006f",outpathTpl ,_ac .Sprintf ("\u002d\u0072\u0025\u0064",dpi ),pdfPath ).Run ();};func RunRenderTest (t *_ag .T ,pdfPath ,outputDir ,baselineRenderPath string ,saveBaseline bool ){_fa :=_b .TrimSuffix (_e .Base (pdfPath ),_e .Ext (pdfPath ));t .Run ("\u0072\u0065\u006e\u0064\u0065\u0072",func (_gf *_ag .T ){_ffae :=_e .Join (outputDir ,_fa );_gaf :=_ffae +"\u002d%\u0064\u002e\u0070\u006e\u0067";if _fe :=RenderPDFToPNGs (pdfPath ,0,_gaf );_fe !=nil {_gf .Skip (_fe );};for _cgb :=1;true ;_cgb ++{_df :=_ac .Sprintf ("\u0025s\u002d\u0025\u0064\u002e\u0070\u006eg",_ffae ,_cgb );_ffg :=_e .Join (baselineRenderPath ,_ac .Sprintf ("\u0025\u0073\u002d\u0025\u0064\u005f\u0065\u0078\u0070\u002e\u0070\u006e\u0067",_fa ,_cgb ));if _ ,_fbc :=_bg .Stat (_df );_fbc !=nil {break ;};_gf .Logf ("\u0025\u0073",_ffg );if _ ,_bd :=_bg .Stat (_ffg );_bg .IsNotExist (_bd ){if saveBaseline {_gf .Logf ("\u0043\u006fp\u0079\u0069\u006eg\u0020\u0025\u0073\u0020\u002d\u003e\u0020\u0025\u0073",_df ,_ffg );CopyFile (_df ,_ffg );continue ;};break ;};_gf .Run (_ac .Sprintf ("\u0070\u0061\u0067\u0065\u0025\u0064",_cgb ),func (_cd *_ag .T ){_cd .Logf ("\u0043o\u006dp\u0061\u0072\u0069\u006e\u0067 \u0025\u0073 \u0076\u0073\u0020\u0025\u0073",_df ,_ffg );_gce ,_ae :=ComparePNGFiles (_df ,_ffg );if _bg .IsNotExist (_ae ){_cd .Fatal ("\u0069m\u0061g\u0065\u0020\u0066\u0069\u006ce\u0020\u006di\u0073\u0073\u0069\u006e\u0067");}else if !_gce {_cd .Fatal ("\u0077\u0072\u006f\u006eg \u0070\u0061\u0067\u0065\u0020\u0072\u0065\u006e\u0064\u0065\u0072\u0065\u0064");};});};});};var (ErrRenderNotSupported =_f .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 CompareDictionariesDeep (d1 ,d2 *_ce .PdfObjectDictionary )bool {if len (d1 .Keys ())!=len (d2 .Keys ()
|