mirror of
https://github.com/unidoc/unioffice.git
synced 2025-04-29 13:49:10 +08:00
68 lines
18 KiB
Go
68 lines
18 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 (_gbc "crypto/md5";_c "encoding/hex";_a "encoding/json";_bb "errors";_db "fmt";_ba "github.com/stretchr/testify/require";_gd "golang.org/x/image/font";_gdf "golang.org/x/image/font/opentype";_cc "golang.org/x/image/math/fixed";
|
|
_ga "image";_de "image/color";_ad "image/draw";_gb "image/png";_bc "io";_bd "io/ioutil";_g "log";_eb "math";_cbb "os";_b "os/exec";_ge "path/filepath";_e "strings";_cb "sync";_f "testing";_ag "time";);func (_fb *ReferenceFile )updateMap (_agg *ReferenceMap )int {var _fea int ;
|
|
if _fb .Map ._gc ==nil {_fb .Map ._gc =map[string ]ReferenceEntry {};};for _df ,_cbd :=range _agg ._gc {_fg ,_ca :=_fb .Map ._gc [_df ];if !_ca {_fb .Map ._gc [_df ]=_cbd ;_fea ++;continue ;};if string (_fg .Value )!=string (_cbd .Value ){_fb .Map ._gc [_df ]=_cbd ;
|
|
_fea ++;};};for _bcf :=range _fb .Map ._gc {if _ ,_fa :=_agg ._gc [_bcf ];!_fa {delete (_fb .Map ._gc ,_bcf );_fea ++;};};return _fea ;};type ReferenceEntry struct{Timestamp int64 `json:"timestamp"`;Value string `json:"value"`;ResultSize int64 `json:"resultSize,omitempty"`;
|
|
DiffPercent float64 `json:"diffPercent,omitempty"`;DiffTotal float64 `json:"diffValue,omitempty"`;Invalid bool `json:"markedInvalid,omitempty"`;};func _cdf (_fcb ,_bad _ga .Rectangle )bool {return _fcb .Min .X ==_bad .Min .X &&_fcb .Min .Y ==_bad .Min .Y &&_fcb .Max .X ==_bad .Max .X &&_fcb .Max .Y ==_bad .Max .Y ;
|
|
};func _egb (_bdf ,_ef _de .Color )bool {_bcd ,_adea ,_caeg ,_gad :=_bdf .RGBA ();_gg ,_fgb ,_aggf ,_dcc :=_ef .RGBA ();return _bcd ==_gg &&_adea ==_fgb &&_caeg ==_aggf &&_gad ==_dcc ;};func RenderPDFToPNGs (pdfPath string ,dpi int ,outpathTpl string )error {if dpi <=0{dpi =100;
|
|
};if _ ,_adga :=_b .LookPath ("\u0067\u0073");_adga !=nil {return ErrRenderNotSupported ;};return _b .Command ("\u0067\u0073","\u002d\u0073\u0044\u0045\u0056\u0049\u0043\u0045\u003d\u0070\u006e\u0067a\u006c\u0070\u0068\u0061","\u002d\u006f",outpathTpl ,_db .Sprintf ("\u002d\u0072\u0025\u0064",dpi ),pdfPath ).Run ();
|
|
};func CompareImages (img1 ,img2 _ga .Image )(bool ,error ){_gag :=img1 .Bounds ();_ab :=0;for _edc :=0;_edc < _gag .Size ().X ;_edc ++{for _gf :=0;_gf < _gag .Size ().Y ;_gf ++{_afg ,_abg ,_bab ,_ :=img1 .At (_edc ,_gf ).RGBA ();_dg ,_agd ,_dae ,_ :=img2 .At (_edc ,_gf ).RGBA ();
|
|
if _afg !=_dg ||_abg !=_agd ||_bab !=_dae {_ab ++;};};};_fc :=float64 (_ab )/float64 (_gag .Dx ()*_gag .Dy ());if _fc > 0.0001{_db .Printf ("\u0064\u0069\u0066f \u0066\u0072\u0061\u0063\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0076\u0020\u0028\u0025\u0064\u0029\u000a",_fc ,_ab );
|
|
return false ,nil ;};return true ,nil ;};type ReferenceMap struct{_cb .Mutex ;_gc map[string ]ReferenceEntry ;};func RunRenderOfficeTest (t *_f .T ,pdfPath ,outputDir ,baselineRenderPath string ,saveBaseline bool ,currentHashMap *ReferenceMap ,refFile *ReferenceFile ,postfix string ){_gfg :=_e .TrimSuffix (_ge .Base (pdfPath ),_ge .Ext (pdfPath ));
|
|
t .Run ("\u0072\u0065\u006e\u0064\u0065\u0072",func (_ggf *_f .T ){_bgc :=_ge .Join (outputDir ,_gfg );_eba :=_bgc +"\u002d%\u0064\u002e\u0070\u006e\u0067";if _eca :=RenderPDFToPNGs (pdfPath ,0,_eba );_eca !=nil {_ggf .Skip (_eca );};_dcg :=_gfg +postfix ;
|
|
_efd :=_ge .Join (outputDir ,_dcg );_cce :=_efd +"\u002d%\u0064\u002e\u0070\u006e\u0067";_dfge :=false ;if saveBaseline {_bddg :=_ge .Dir (pdfPath );_afe :=_ge .Join (_bddg ,_dcg +"\u002e\u0070\u0064\u0066");if _ ,_gbcf :=_cbb .Stat (_afe );_gbcf ==nil {_ggf .Logf ("\u0052e\u006e\u0064\u0065\u0072\u0020\u004d\u0053\u0020\u004f\u0066\u0066i\u0063\u0065\u0020\u0050\u0044\u0046\u003a\u0020\u0025\u0076",_afe );
|
|
if _fcd :=RenderPDFToPNGs (_afe ,0,_cce );_fcd !=nil {_ggf .Skip (_fcd );};_dfge =true ;};};for _ceb :=1;true ;_ceb ++{_dec :=_db .Sprintf ("\u0025s\u002d\u0025\u0064\u002e\u0070\u006eg",_bgc ,_ceb );_gbge :=_ge .Join (baselineRenderPath ,_db .Sprintf ("\u0025\u0073\u002d\u0025\u0064\u005f\u0065\u0078\u0070\u002e\u0070\u006e\u0067",_gfg ,_ceb ));
|
|
if _ ,_dad :=_cbb .Stat (_dec );_dad !=nil {break ;};_ggf .Logf ("\u0025\u0073",_gbge );if saveBaseline {_ggf .Logf ("\u0043\u006fp\u0079\u0069\u006eg\u0020\u0025\u0073\u0020\u002d\u003e\u0020\u0025\u0073",_dec ,_gbge );_bbae :=CopyFile (_dec ,_gbge );
|
|
if _bbae !=nil {_ggf .Fatalf ("\u0045\u0052\u0052OR\u0020\u0063\u006f\u0070\u0079\u0069\u006e\u0067\u0020\u0074\u006f\u0020\u0025\u0073\u003a\u0020\u0025\u0076",_gbge ,_bbae );};if _dfge {_ged :=_db .Sprintf ("\u0025s\u002d\u0025\u0064\u002e\u0070\u006eg",_efd ,_ceb );
|
|
_bgca :=_ge .Join (baselineRenderPath ,_db .Sprintf ("\u0025\u0073\u002d\u0025\u0064\u005f\u0065\u0078\u0070\u002e\u0070\u006e\u0067",_dcg ,_ceb ));_ggf .Logf ("\u0043\u006f\u0070\u0079\u0069\u006e\u0067\u0020\u004d\u0053\u0020\u0057\u006f\u0072\u0064 \u0072e\u0073\u0075\u006c\u0074\u0073\u0020\u0025\u0073\u0020\u002d\u003e\u0020\u0025\u0073",_ged ,_bgca );
|
|
_aga :=CopyFile (_ged ,_bgca );if _aga !=nil {_ggf .Logf ("\u0045\u0052\u0052\u004f\u0052\u0020\u0063\u006f\u0070\u0079\u0069\u006eg\u0020\u0074\u006f \u0025\u0073\u003a\u0020\u0025\u0076\u002c\u0020\u0068\u0061\u0076i\u006e\u0067\u0020d\u0069\u0066\u0066\u0065r\u0065\u006e\u0074\u0020\u0070\u0061\u0067\u0065\u0020\u0073\u0069\u007a\u0065\u0020\u0072\u0065\u0073\u0075\u006c\u0074\u0073\u002c\u0020\u0072\u0065\u0070\u006c\u0061\u0063\u0069\u006eg\u0020\u0069\u0074\u0020\u0077\u0069\u0074\u0068\u0020\u0062\u006ca\u006e\u006b\u0020\u0069\u006d\u0061\u0067\u0065\u0020\u0069\u006e\u0073\u0074\u0065\u0061\u0064",_bgca ,_aga );
|
|
if _cdg :=_dfb (_gbge ,_bgca );_cdg !=nil {_ggf .Fatalf ("\u0045\u0052\u0052\u004f\u0052\u0020c\u0072\u0065\u0061\u0074\u0069\u006e\u0067\u0020\u0065\u006d\u0070\u0074\u0079 \u0069\u006d\u0061\u0067\u0065\u0020\u0025s\u003a\u0020\u0025\u0076",_bgca ,_cdg );
|
|
};};_ggf .Logf ("\u0043\u006fm\u0062\u0069\u006e\u0069\u006eg\u0020\u0055\u006e\u0069\u004ff\u0066\u0069\u0063\u0065\u0020\u0072\u0065\u0073\u0075\u006c\u0074\u0073\u0020\u0077\u0069\u0074\u0068\u0020\u004d\u0053\u0020\u004f\u0066\u0066\u0069\u0063\u0065\u0020\u0025\u0073\u0020\u0061\u006e\u0064\u0020\u0025\u0073",_gbge ,_bgca );
|
|
_cbc ,_aga :=CombinePNGFiles (_gbge ,_bgca );if _cbb .IsNotExist (_aga ){_ggf .Fatal ("\u0069m\u0061g\u0065\u0020\u0066\u0069\u006ce\u0020\u006di\u0073\u0073\u0069\u006e\u0067");}else if !_cbc {_ggf .Fatal ("\u0055n\u0061\u0062\u006c\u0065\u0020\u0074\u006f\u0020\u0063\u006f\u006db\u0069\u006e\u0065\u0020\u0069\u006d\u0061\u0067\u0065\u0073");
|
|
};_ggf .Logf ("\u0043\u0072\u0065\u0061\u0074\u0069\u006e\u0067\u0020\u0069\u006d\u0061\u0067\u0065\u0020\u0064\u0069\u0066f \u0055n\u0069\u004f\u0066\u0066\u0069\u0063\u0065\u0020\u0072\u0065\u0073\u0075l\u0074\u0073\u0020\u0077\u0069\u0074\u0068\u0020\u004d\u0053\u0020\u004f\u0066\u0066\u0069\u0063\u0065 \u0025\u0073\u0020\u0061\u006e\u0064\u0020\u0025\u0073",_gbge ,_bgca );
|
|
_cbc ,_eed ,_baa ,_ebd ,_aga :=CreatePNGDiff (_gbge ,_bgca );if _aga !=nil &&_bb .Is (_aga ,ErrImageSizeNotMatch ){_ggf .Fatalf ("\u0045\u0072\u0072\u006fr\u0020\u006f\u006e\u0020\u0063\u0072\u0065\u0061\u0074\u0065 \u0050N\u0047\u0020\u0044\u0069\u0066\u0066\u003a \u0025\u0076",_aga );
|
|
};if _cbc {_ggf .Logf ("\u0049\u006d\u0061\u0067\u0065\u003a\u0020\u0025\u0073\u000a",_eed );_ggf .Logf ("D\u0069\u0066\u0066\u0020Pe\u0072c\u0065\u006e\u0074\u003a\u0020%\u0032\u002e\u0066\u0025\u0025\u000a",_baa );_ggf .Logf ("\u0044i\u0066f\u0020\u0054\u006f\u0074\u0061\u006c\u003a\u0020\u0025\u0066\u000a",_ebd );
|
|
_gba :=_ge .Base (_eed );_ebb ,_dafc :=currentHashMap .Read (_gba );if _dafc &&(_ebb .DiffPercent < _baa ||_ebb .DiffTotal < _ebd ){_ggf .Logf ("\u004e\u0065\u0077\u0020\u0072\u0065\u0073\u0075\u006c\u0074\u0073\u0020\u0068\u0061\u0076\u0069\u006e\u0067 h\u0069g\u0068\u0065\u0072\u0020\u0064\u0069\u0066\u0066\u0065\u0072\u0065\u006ec\u0065\u0020\u0070\u0065\u0072\u0063\u0065\u006e\u0074\u003a\u0020\u0025\u0066\u0020\u0061\u006e\u0064 \u0074\u006f\u0074\u0061\u006c\u0020\u0025\u0066\u000a",_baa ,_ebd );
|
|
};_beb ,_dbe :=HashFile (_eed );_ba .NoError (_ggf ,_dbe );_abfg :=_fabc (_ggf ,_eed );if !_dafc ||_ebb .Value !=_beb ||_ebb .ResultSize !=_abfg ||_ebb .DiffPercent !=_baa ||_ebb .DiffTotal !=_ebd {_dece :=ReferenceEntry {Timestamp :_ag .Now ().UTC ().Unix (),Value :_beb ,ResultSize :_abfg ,DiffPercent :_baa ,DiffTotal :_ebd };
|
|
currentHashMap .Write (_gba ,_dece );if _dbe =refFile .Update (currentHashMap );_dbe !=nil {_ggf .Logf ("\u0055\u0070\u0064\u0061\u0074\u0065\u0020\u0072\u0065\u0066\u0065\u0072\u0065\u006e\u0063e\u0020f\u0069\u006c\u0065\u0020\u0066\u0061\u0069\u006c\u0065\u0064\u003a\u0020\u0025\u0076",_dbe );
|
|
};};};};continue ;};_ggf .Run (_db .Sprintf ("\u0070\u0061\u0067\u0065\u0025\u0064",_ceb ),func (_gae *_f .T ){_gae .Logf ("\u0043o\u006dp\u0061\u0072\u0069\u006e\u0067 \u0025\u0073 \u0076\u0073\u0020\u0025\u0073",_dec ,_gbge );_fbg ,_ege :=ComparePNGFiles (_dec ,_gbge );
|
|
if _cbb .IsNotExist (_ege ){_gae .Fatal ("\u0069m\u0061g\u0065\u0020\u0066\u0069\u006ce\u0020\u006di\u0073\u0073\u0069\u006e\u0067");}else if !_fbg {_gae .Fatal ("\u0077\u0072\u006f\u006eg \u0070\u0061\u0067\u0065\u0020\u0072\u0065\u006e\u0064\u0065\u0072\u0065\u0064");
|
|
};});};});};func (_ea *ReferenceMap )Len ()int {return len (_ea ._gc )};func (_fga *ReferenceMap )MarshalJSON ()([]byte ,error ){return _a .Marshal (_fga ._gc )};func _dfb (_abb ,_aa string )error {_ecd ,_fec :=_cbb .Open (_abb );if _fec !=nil {return _fec ;
|
|
};defer _ecd .Close ();_fbd ,_ ,_fec :=_ga .DecodeConfig (_ecd );if _fec !=nil {panic (_fec );};_adf :=_ga .NewRGBA (_ga .Rect (0,0,_fbd .Width ,_fbd .Height ));_bcb ,_fec :=_cbb .Create (_aa );if _fec !=nil {return _fec ;};defer _bcb .Close ();_fec =_gb .Encode (_bcb ,_adf );
|
|
if _fec !=nil {return _fec ;};return nil ;};func ComparePNGFiles (file1 ,file2 string )(bool ,error ){_dfg ,_gcd :=HashFile (file1 );if _gcd !=nil {return false ,_gcd ;};_bdd ,_gcd :=HashFile (file2 );if _gcd !=nil {return false ,_gcd ;};if _dfg ==_bdd {return true ,nil ;
|
|
};_gcc ,_gcd :=ReadPNG (file1 );if _gcd !=nil {return false ,_gcd ;};_aeb ,_gcd :=ReadPNG (file2 );if _gcd !=nil {return false ,_gcd ;};if _gcc .Bounds ()!=_aeb .Bounds (){return false ,nil ;};return CompareImages (_gcc ,_aeb );};func (_bgg *ReferenceMap )Read (key string )(ReferenceEntry ,bool ){_bgg .Lock ();
|
|
defer _bgg .Unlock ();if _bgg ._gc ==nil {return ReferenceEntry {},false ;};_bba ,_fbc :=_bgg ._gc [key ];return _bba ,_fbc ;};func _abf (_cfe *_ga .RGBA ,_babc string ,_adc string ,_aed ,_ccde int )error {_cde ,_fab :=_bd .ReadFile (_babc );if _fab !=nil {return _fab ;
|
|
};_bbf ,_fab :=_gdf .Parse (_cde );if _fab !=nil {return _fab ;};_feb ,_fab :=_gdf .NewFace (_bbf ,&_gdf .FaceOptions {Size :18,DPI :72,Hinting :_gd .HintingNone });if _fab !=nil {return _fab ;};_efg :=&_gd .Drawer {Dst :_cfe ,Src :_ga .NewUniform (_de .RGBA {200,100,0,255}),Face :_feb ,Dot :_cc .P (_aed ,_ccde )};
|
|
_efg .DrawString (_adc );return nil ;};func (_fe *ReferenceFile )Update (currentMap *ReferenceMap )error {if _fe ._fd ==""{return nil ;};_ec :=_fe .updateMap (currentMap );if _ec ==0{return nil ;};_ac ,_agc :=_cbb .OpenFile (_fe ._fd ,_cbb .O_CREATE |_cbb .O_TRUNC |_cbb .O_WRONLY ,0664);
|
|
if _agc !=nil {return _agc ;};defer _ac .Close ();_fe .Timestamp =_ag .Now ().UTC ();_ae :=_a .NewEncoder (_ac );_ae .SetIndent ("","\u0009");return _ae .Encode (_fe );};func (_be *ReferenceMap )Copy ()*ReferenceMap {_dc :=ReferenceMap {_gc :make (map[string ]ReferenceEntry ,len (_be ._gc ))};
|
|
for _da ,_adg :=range _be ._gc {_dc ._gc [_da ]=_adg ;};return &_dc ;};func CombinePNGFiles (file1 ,file2 string )(bool ,error ){_bf ,_bee :=ReadPNG (file1 );if _bee !=nil {return false ,_bee ;};_gfe ,_bee :=ReadPNG (file2 );if _bee !=nil {return false ,_bee ;
|
|
};_dff :=_ga .Point {_bf .Bounds ().Dx (),0};_fca :=_ga .Rectangle {_dff ,_dff .Add (_gfe .Bounds ().Size ())};_ee :=_ga .Rectangle {_ga .Point {0,0},_fca .Max };_gde :=_ga .NewRGBA (_ee );_ad .Draw (_gde ,_bf .Bounds (),_bf ,_ga .Point {0,0},_ad .Src );
|
|
_ad .Draw (_gde ,_fca ,_gfe ,_ga .Point {0,0},_ad .Src );_ff :=_ge .Dir (file1 );_acd :=_e .TrimSuffix (_ge .Base (file1 ),_ge .Ext (file1 ));_cf ,_bee :=_cbb .Create (_ff +"\u002f"+_acd +"\u002d\u0063\u006f\u006d\u0062\u0069\u006e\u0065\u0064\u002e\u0070\u006e\u0067");
|
|
if _bee !=nil {return false ,_bee ;};defer _cf .Close ();if _cgd :=_gb .Encode (_cf ,_gde );_cgd !=nil {return false ,_cgd ;};return true ,nil ;};func CreatePNGDiff (src ,dst string )(bool ,string ,float64 ,float64 ,error ){_ade ,_ffd :=ReadPNG (src );
|
|
if _ffd !=nil {return false ,"",0,0,_ffd ;};_fcc ,_ffd :=ReadPNG (dst );if _ffd !=nil {return false ,"",0,0,_ffd ;};_dd :=_ade .Bounds ();_gcca :=_fcc .Bounds ();if !_cdf (_dd ,_gcca ){if _eb .Abs (float64 (_dd .Max .X )-float64 (_gcca .Max .X ))> 1{_g .Printf ("S\u006f\u0075\u0072\u0063\u0065\u0020b\u006f\u0075\u006e\u0064\u0073\u003a \u0025\u0076\u003b\u0020\u0044\u0065\u0073t\u0020\u0062\u006f\u0075\u006e\u0064\u0073\u003a\u0020\u0025v\u000a",_dd ,_gcca );
|
|
return false ,"",0,0,ErrImageSizeNotMatch ;};};_cge :=_ga .NewRGBA (_ga .Rect (0,0,_dd .Max .X ,_dd .Max .Y ));var (_geb float64 ;_fde float64 ;);for _ffe :=_dd .Min .Y ;_ffe < _dd .Max .Y ;_ffe ++{for _deb :=_dd .Min .X ;_deb < _dd .Max .X ;_deb ++{_dba ,_edf ,_eag ,_cd :=_ade .At (_deb ,_ffe ).RGBA ();
|
|
_gbg ,_ddd ,_afd ,_aef :=_fcc .At (_deb ,_ffe ).RGBA ();_cge .Set (_deb ,_ffe ,_de .RGBA {uint8 (_gbg ),uint8 (_ddd ),uint8 (_afd ),64});_dfc :=_cd ==0x00&&_dba ==0x00&&_edf ==0x00&&_eag ==0x00&&_gbg ==0xFFFF&&_ddd ==0xFFFF&&_afd ==0xFFFF;if !_dfc &&!_egb (_ade .At (_deb ,_ffe ),_fcc .At (_deb ,_ffe )){_cge .Set (_deb ,_ffe ,_de .RGBA {uint8 (_dba ),uint8 (_edf ),uint8 (_eag ),uint8 (_cd )});
|
|
_ccd :=float64 (_dba )+float64 (_edf )+float64 (_eag )+float64 (_cd )-float64 (_gbg )+float64 (_ddd )+float64 (_afd )+float64 (_aef );_bbd :=_eb .Sqrt (_eb .Pow (_ccd /float64 (_dd .Dx ()*_dd .Dy ()),2));_fde +=_bbd ;_geb ++;};};};_afdc :=_geb /float64 (_dd .Dx ()*_dd .Dy ())*100;
|
|
_feg :=_ge .Dir (src );_bec :=_e .TrimSuffix (_ge .Base (src ),_ge .Ext (src ));_cae ,_ffd :=_cbb .Create (_feg +"\u002f"+_bec +"\u002dd\u0069\u0066\u0066\u002e\u0070\u006eg");if _ffd !=nil {return false ,"",0,0,_ffd ;};defer _cae .Close ();_eg :=_e .Replace (_feg ,"\u0072\u0065\u006e\u0064\u0065\u0072","\u0066\u006f\u006et\u0073",1)+"\u002f\u0043\u0061l\u0069\u0062\u0072\u0069\u002e\u0074\u0074\u0066";
|
|
_cdd :=_db .Sprintf ("\u0044\u0069f\u0066\u0065\u0072e\u006e\u0063\u0065\u003a\u0020\u0025\u0066\u0025\u0025",_afdc );_ffd =_abf (_cge ,_eg ,_cdd ,15,22);if _ffd !=nil {return false ,"",0,0,_ffd ;};_cdd =_db .Sprintf ("T\u006ft\u0061\u006c\u0020\u0044\u0069\u0066\u0066\u0065r\u0065\u006e\u0063\u0065: \u0025\u0066",_fde );
|
|
_ffd =_abf (_cge ,_eg ,_cdd ,15,44);if _ffd !=nil {return false ,"",0,0,_ffd ;};if _eac :=_gb .Encode (_cae ,_cge );_eac !=nil {return false ,"",0,0,_eac ;};return true ,_cae .Name (),_afdc ,_fde ,nil ;};func RunRenderTest (t *_f .T ,pdfPath ,outputDir ,baselineRenderPath string ,saveBaseline bool ,currentHashMap *ReferenceMap ,refFile *ReferenceFile ){RunRenderOfficeTest (t ,pdfPath ,outputDir ,baselineRenderPath ,saveBaseline ,currentHashMap ,refFile ,"\u002em\u0073\u0077\u006f\u0072\u0064");
|
|
};func HashFile (file string )(string ,error ){_caa ,_dag :=_cbb .Open (file );if _dag !=nil {return "",_dag ;};defer _caa .Close ();_eda :=_gbc .New ();if _ ,_dag =_bc .Copy (_eda ,_caa );_dag !=nil {return "",_dag ;};return _c .EncodeToString (_eda .Sum (nil )),nil ;
|
|
};func (_bca *ReferenceMap )Write (key string ,entry ReferenceEntry ){_bca .Lock ();defer _bca .Unlock ();if _bca ._gc ==nil {_bca ._gc =map[string ]ReferenceEntry {};};_bca ._gc [key ]=entry ;};func (_cg *ReferenceMap )UnmarshalJSON (data []byte )error {return _a .Unmarshal (data ,&_cg ._gc )};
|
|
func ReadPNG (file string )(_ga .Image ,error ){_fbf ,_cad :=_cbb .Open (file );if _cad !=nil {return nil ,_cad ;};defer _fbf .Close ();return _gb .Decode (_fbf );};type ReferenceFile struct{Timestamp _ag .Time `json:"timestamp"`;Map *ReferenceMap `json:"map,omitempty"`;
|
|
_fd string ;};func _fabc (_aea *_f .T ,_edab string )int64 {_dceb ,_gge :=_cbb .Stat (_edab );_ba .NoError (_aea ,_gge );return _dceb .Size ();};func ReadFile (dirPath ,testName string ,createEmpty bool )(*ReferenceFile ,error ){if dirPath ==""&&createEmpty {return &ReferenceFile {Map :&ReferenceMap {}},nil ;
|
|
};if dirPath ==""{return nil ,_cbb .ErrNotExist ;};_fgab :=_ge .Join (dirPath ,testName +"\u005fr\u0065f\u0065\u0072\u0065\u006e\u0063\u0065\u002e\u006a\u0073\u006f\u006e");_bcg :=&ReferenceFile {_fd :_fgab };_age ,_ed :=_cbb .Open (_fgab );if _bb .Is (_ed ,_cbb .ErrNotExist )&&createEmpty {_bcg .Timestamp =_ag .Now ().UTC ();
|
|
_bcg .Map =&ReferenceMap {};return _bcg ,nil ;};if _ed !=nil {return nil ,_ed ;};defer _age .Close ();if _daa :=_a .NewDecoder (_age ).Decode (_bcg );_daa !=nil {if _daa .Error ()=="i\u006c\u006c\u0065\u0067\u0061\u006c \u0062\u0061\u0073\u0065\u0036\u0034 \u0064\u0061\u0074\u0061\u0020\u0061\u0074 \u0069\u006e\u0070\u0075\u0074\u0020\u0062\u0079\u0074\u0065 \u0030"&&createEmpty {return _bcg ,nil ;
|
|
};return nil ,_daa ;};return _bcg ,nil ;};var (ErrRenderNotSupported =_bb .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");
|
|
ErrImageSizeNotMatch =_bb .New ("\u0069\u006d\u0061ge\u0020\u0073\u0069\u007a\u0065\u0073\u0020\u0064\u006f\u006e\u0027\u0074\u0020\u006d\u0061\u0074\u0063\u0068"););func (_def *ReferenceMap )Keys ()(_bg []string ){_bg =make ([]string ,len (_def ._gc ));
|
|
var _ce int ;for _gda :=range _def ._gc {_bg [_ce ]=_gda ;_ce ++;};return _bg ;};func CopyFile (src ,dst string )error {_dce ,_daf :=_cbb .Open (src );if _daf !=nil {return _daf ;};defer _dce .Close ();_af ,_daf :=_cbb .Create (dst );if _daf !=nil {return _daf ;
|
|
};defer _af .Close ();_ ,_daf =_bc .Copy (_af ,_dce );return _daf ;}; |