unipdf/internal/testutils/testutils.go

40 lines
8.8 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/
2021-02-22 02:29:48 +00:00
package testutils ;import (_a "crypto/md5";_acb "encoding/hex";_ff "errors";_ag "fmt";_fe "github.com/unidoc/unipdf/v3/common";_g "github.com/unidoc/unipdf/v3/core";_c "image";_bf "image/png";_ea "io";_fgd "os";_fg "os/exec";_ac "path/filepath";_e "strings";
_f "testing";);func ReadPNG (file string )(_c .Image ,error ){_ad ,_ca :=_fgd .Open (file );if _ca !=nil {return nil ,_ca ;};defer _ad .Close ();return _bf .Decode (_ad );};func ParseIndirectObjects (rawpdf string )(map[int64 ]_g .PdfObject ,error ){_cef :=_g .NewParserFromString (rawpdf );
_ed :=map[int64 ]_g .PdfObject {};for {_ec ,_cge :=_cef .ParseIndirectObject ();if _cge !=nil {if _cge ==_ea .EOF {break ;};return nil ,_cge ;};switch _ee :=_ec .(type ){case *_g .PdfIndirectObject :_ed [_ee .ObjectNumber ]=_ec ;case *_g .PdfObjectStream :_ed [_ee .ObjectNumber ]=_ec ;
};};for _ ,_bd :=range _ed {_gaf (_bd ,_ed );};return _ed ,nil ;};var (ErrRenderNotSupported =_ff .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 CompareImages (img1 ,img2 _c .Image )(bool ,error ){_aga :=img1 .Bounds ();_da :=0;for _agg :=0;_agg < _aga .Size ().X ;_agg ++{for _ga :=0;_ga < _aga .Size ().Y ;_ga ++{_dc ,_fd ,_cc ,_ :=img1 .At (_agg ,_ga ).RGBA ();_bad ,_cd ,_db ,_ :=img2 .At (_agg ,_ga ).RGBA ();
if _dc !=_bad ||_fd !=_cd ||_cc !=_db {_da ++;};};};_agae :=float64 (_da )/float64 (_aga .Dx ()*_aga .Dy ());if _agae > 0.0001{_ag .Printf ("\u0064\u0069\u0066f \u0066\u0072\u0061\u0063\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0076\u0020\u0028\u0025\u0064\u0029\u000a",_agae ,_da );
return false ,nil ;};return true ,nil ;};func HashFile (file string )(string ,error ){_fc ,_ef :=_fgd .Open (file );if _ef !=nil {return "",_ef ;};defer _fc .Close ();_gb :=_a .New ();if _ ,_ef =_ea .Copy (_gb ,_fc );_ef !=nil {return "",_ef ;};return _acb .EncodeToString (_gb .Sum (nil )),nil ;
};func RenderPDFToPNGs (pdfPath string ,dpi int ,outpathTpl string )error {if dpi <=0{dpi =100;};if _ ,_egb :=_fg .LookPath ("\u0067\u0073");_egb !=nil {return ErrRenderNotSupported ;};return _fg .Command ("\u0067\u0073","\u002d\u0073\u0044\u0045\u0056\u0049\u0043\u0045\u003d\u0070\u006e\u0067a\u006c\u0070\u0068\u0061","\u002d\u006f",outpathTpl ,_ag .Sprintf ("\u002d\u0072\u0025\u0064",dpi ),pdfPath ).Run ();
};func _gaf (_eb _g .PdfObject ,_bbc map[int64 ]_g .PdfObject )error {switch _dg :=_eb .(type ){case *_g .PdfIndirectObject :_dfa :=_dg ;_gaf (_dfa .PdfObject ,_bbc );case *_g .PdfObjectDictionary :_fag :=_dg ;for _ ,_cgd :=range _fag .Keys (){_gc :=_fag .Get (_cgd );
if _cga ,_aa :=_gc .(*_g .PdfObjectReference );_aa {_ddc ,_dfb :=_bbc [_cga .ObjectNumber ];if !_dfb {return _ff .New ("r\u0065\u0066\u0065\u0072\u0065\u006ec\u0065\u0020\u0074\u006f\u0020\u006f\u0075\u0074\u0073i\u0064\u0065\u0020o\u0062j\u0065\u0063\u0074");
};_fag .Set (_cgd ,_ddc );}else {_gaf (_gc ,_bbc );};};case *_g .PdfObjectArray :_fgg :=_dg ;for _dfad ,_af :=range _fgg .Elements (){if _cec ,_gac :=_af .(*_g .PdfObjectReference );_gac {_dgd ,_afa :=_bbc [_cec .ObjectNumber ];if !_afa {return _ff .New ("r\u0065\u0066\u0065\u0072\u0065\u006ec\u0065\u0020\u0074\u006f\u0020\u006f\u0075\u0074\u0073i\u0064\u0065\u0020o\u0062j\u0065\u0063\u0074");
};_fgg .Set (_dfad ,_dgd );}else {_gaf (_af ,_bbc );};};};return nil ;};func RunRenderTest (t *_f .T ,pdfPath ,outputDir ,baselineRenderPath string ,saveBaseline bool ){_fcd :=_e .TrimSuffix (_ac .Base (pdfPath ),_ac .Ext (pdfPath ));t .Run ("\u0072\u0065\u006e\u0064\u0065\u0072",func (_dbd *_f .T ){_de :=_ac .Join (outputDir ,_fcd );
_fgf :=_de +"\u002d%\u0064\u002e\u0070\u006e\u0067";if _bbg :=RenderPDFToPNGs (pdfPath ,0,_fgf );_bbg !=nil {_dbd .Skip (_bbg );};for _bfg :=1;true ;_bfg ++{_ccd :=_ag .Sprintf ("\u0025s\u002d\u0025\u0064\u002e\u0070\u006eg",_de ,_bfg );_cg :=_ac .Join (baselineRenderPath ,_ag .Sprintf ("\u0025\u0073\u002d\u0025\u0064\u005f\u0065\u0078\u0070\u002e\u0070\u006e\u0067",_fcd ,_bfg ));
if _ ,_dfg :=_fgd .Stat (_ccd );_dfg !=nil {break ;};_dbd .Logf ("\u0025\u0073",_cg );if saveBaseline {_dbd .Logf ("\u0043\u006fp\u0079\u0069\u006eg\u0020\u0025\u0073\u0020\u002d\u003e\u0020\u0025\u0073",_ccd ,_cg );_ffa :=CopyFile (_ccd ,_cg );if _ffa !=nil {_dbd .Fatalf ("\u0045\u0052\u0052OR\u0020\u0063\u006f\u0070\u0079\u0069\u006e\u0067\u0020\u0074\u006f\u0020\u0025\u0073\u003a\u0020\u0025\u0076",_cg ,_ffa );
};continue ;};_dbd .Run (_ag .Sprintf ("\u0070\u0061\u0067\u0065\u0025\u0064",_bfg ),func (_fed *_f .T ){_fed .Logf ("\u0043o\u006dp\u0061\u0072\u0069\u006e\u0067 \u0025\u0073 \u0076\u0073\u0020\u0025\u0073",_ccd ,_cg );_dd ,_egcd :=ComparePNGFiles (_ccd ,_cg );
if _fgd .IsNotExist (_egcd ){_fed .Fatal ("\u0069m\u0061g\u0065\u0020\u0066\u0069\u006ce\u0020\u006di\u0073\u0073\u0069\u006e\u0067");}else if !_dd {_fed .Fatal ("\u0077\u0072\u006f\u006eg \u0070\u0061\u0067\u0065\u0020\u0072\u0065\u006e\u0064\u0065\u0072\u0065\u0064");
};});};});};func CopyFile (src ,dst string )error {_ba ,_bb :=_fgd .Open (src );if _bb !=nil {return _bb ;};defer _ba .Close ();_d ,_bb :=_fgd .Create (dst );if _bb !=nil {return _bb ;};defer _d .Close ();_ ,_bb =_ea .Copy (_d ,_ba );return _bb ;};func ComparePNGFiles (file1 ,file2 string )(bool ,error ){_cag ,_eg :=HashFile (file1 );
if _eg !=nil {return false ,_eg ;};_acc ,_eg :=HashFile (file2 );if _eg !=nil {return false ,_eg ;};if _cag ==_acc {return true ,nil ;};_ce ,_eg :=ReadPNG (file1 );if _eg !=nil {return false ,_eg ;};_ffc ,_eg :=ReadPNG (file2 );if _eg !=nil {return false ,_eg ;
};if _ce .Bounds ()!=_ffc .Bounds (){return false ,nil ;};return CompareImages (_ce ,_ffc );};func CompareDictionariesDeep (d1 ,d2 *_g .PdfObjectDictionary )bool {if len (d1 .Keys ())!=len (d2 .Keys ()){_fe .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 ()));
_fe .Log .Debug ("\u0057\u0061s\u0020\u0027\u0025s\u0027\u0020\u0076\u0073\u0020\u0027\u0025\u0073\u0027",d1 .WriteString (),d2 .WriteString ());return false ;};for _ ,_fca :=range d1 .Keys (){if _fca =="\u0050\u0061\u0072\u0065\u006e\u0074"{continue ;
};_cgf :=_g .TraceToDirectObject (d1 .Get (_fca ));_ae :=_g .TraceToDirectObject (d2 .Get (_fca ));if _cgf ==nil {_fe .Log .Debug ("\u00761\u0020\u0069\u0073\u0020\u006e\u0069l");return false ;};if _ae ==nil {_fe .Log .Debug ("\u00762\u0020\u0069\u0073\u0020\u006e\u0069l");
return false ;};switch _bag :=_cgf .(type ){case *_g .PdfObjectDictionary :_egbf ,_cb :=_ae .(*_g .PdfObjectDictionary );if !_cb {_fe .Log .Debug ("\u0054\u0079\u0070\u0065 m\u0069\u0073\u006d\u0061\u0074\u0063\u0068\u0020\u0025\u0054\u0020\u0076\u0073\u0020%\u0054",_cgf ,_ae );
return false ;};if !CompareDictionariesDeep (_bag ,_egbf ){return false ;};continue ;case *_g .PdfObjectArray :_edc ,_fagf :=_ae .(*_g .PdfObjectArray );if !_fagf {_fe .Log .Debug ("\u00762\u0020n\u006f\u0074\u0020\u0061\u006e\u0020\u0061\u0072\u0072\u0061\u0079");
return false ;};if _bag .Len ()!=_edc .Len (){_fe .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",_bag .Len (),_edc .Len ());
return false ;};for _cf :=0;_cf < _bag .Len ();_cf ++{_fcg :=_g .TraceToDirectObject (_bag .Get (_cf ));_edb :=_g .TraceToDirectObject (_edc .Get (_cf ));if _adf ,_cdb :=_fcg .(*_g .PdfObjectDictionary );_cdb {_bac ,_ebb :=_edb .(*_g .PdfObjectDictionary );
if !_ebb {return false ;};if !CompareDictionariesDeep (_adf ,_bac ){return false ;};}else {if _fcg .WriteString ()!=_edb .WriteString (){_fe .Log .Debug ("M\u0069\u0073\u006d\u0061tc\u0068 \u0027\u0025\u0073\u0027\u0020!\u003d\u0020\u0027\u0025\u0073\u0027",_fcg .WriteString (),_edb .WriteString ());
return false ;};};};continue ;};if _cgf .String ()!=_ae .String (){_fe .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",_fca ,_cgf .String (),_ae .String ());
_fe .Log .Debug ("\u0046o\u0072 \u0027\u0025\u0054\u0027\u0020\u002d\u0020\u0027\u0025\u0054\u0027",_cgf ,_ae );_fe .Log .Debug ("\u0046\u006f\u0072\u0020\u0027\u0025\u002b\u0076\u0027\u0020\u002d\u0020'\u0025\u002b\u0076\u0027",_cgf ,_ae );return false ;
};};return true ;};