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