1// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2// See LICENSE.txt for license information. 3 4package imaging 5 6import ( 7 "bytes" 8 "image/color" 9 "io/ioutil" 10 "os" 11 "testing" 12 13 "github.com/mattermost/mattermost-server/v6/utils/fileutils" 14 15 "github.com/stretchr/testify/require" 16) 17 18func TestFillImageTransparency(t *testing.T) { 19 tcs := []struct { 20 name string 21 inputName string 22 outputName string 23 fillColor color.Color 24 }{ 25 { 26 "8-bit Palette", 27 "fill_test_8bit_palette.png", 28 "fill_test_8bit_palette_out.png", 29 color.RGBA{0, 255, 0, 255}, 30 }, 31 { 32 "8-bit RGB", 33 "fill_test_8bit_rgb.png", 34 "fill_test_8bit_rgb_out.png", 35 color.RGBA{0, 255, 0, 255}, 36 }, 37 { 38 "8-bit RGBA", 39 "fill_test_8bit_rgba.png", 40 "fill_test_8bit_rgba_out.png", 41 color.RGBA{0, 255, 0, 255}, 42 }, 43 { 44 "16-bit RGB", 45 "fill_test_16bit_rgb.png", 46 "fill_test_16bit_rgb_out.png", 47 color.RGBA{0, 255, 0, 255}, 48 }, 49 { 50 "16-bit RGBA", 51 "fill_test_16bit_rgba.png", 52 "fill_test_16bit_rgba_out.png", 53 color.RGBA{0, 255, 0, 255}, 54 }, 55 } 56 57 imgDir, ok := fileutils.FindDir("tests") 58 require.True(t, ok) 59 60 e, err := NewEncoder(EncoderOptions{}) 61 require.NotNil(t, e) 62 require.NoError(t, err) 63 64 d, err := NewDecoder(DecoderOptions{}) 65 require.NotNil(t, d) 66 require.NoError(t, err) 67 68 for _, tc := range tcs { 69 t.Run(tc.name, func(t *testing.T) { 70 inputFile, err := os.Open(imgDir + "/" + tc.inputName) 71 require.NoError(t, err) 72 require.NotNil(t, inputFile) 73 defer inputFile.Close() 74 75 inputImg, format, err := d.Decode(inputFile) 76 require.NoError(t, err) 77 require.NotNil(t, inputImg) 78 require.Equal(t, "png", format) 79 80 expectedBytes, err := ioutil.ReadFile(imgDir + "/" + tc.outputName) 81 require.NoError(t, err) 82 83 FillImageTransparency(inputImg, tc.fillColor) 84 85 var b bytes.Buffer 86 err = e.EncodePNG(&b, inputImg) 87 require.NoError(t, err) 88 89 require.Equal(t, expectedBytes, b.Bytes()) 90 }) 91 } 92 93 t.Run("Opaque image", func(t *testing.T) { 94 inputFile, err := os.Open(imgDir + "/fill_test_opaque.png") 95 require.NoError(t, err) 96 require.NotNil(t, inputFile) 97 defer inputFile.Close() 98 99 inputImg, format, err := d.Decode(inputFile) 100 require.NoError(t, err) 101 require.NotNil(t, inputImg) 102 require.Equal(t, "png", format) 103 104 inputFile.Seek(0, 0) 105 106 expectedImg, format, err := d.Decode(inputFile) 107 require.NoError(t, err) 108 require.NotNil(t, expectedImg) 109 require.Equal(t, "png", format) 110 111 FillImageTransparency(inputImg, color.RGBA{0, 255, 0, 255}) 112 113 require.Equal(t, expectedImg, inputImg) 114 }) 115} 116