status-go/images/manipulation_test.go

201 lines
5.0 KiB
Go

package images
import (
"bytes"
"errors"
"image"
"testing"
"github.com/stretchr/testify/require"
)
func TestResize(t *testing.T) {
sizes := []ResizeDimension{80, 240, 1000}
cs := []struct {
Filename string
Bounds map[ResizeDimension]image.Rectangle
}{
{
"elephant.jpg",
map[ResizeDimension]image.Rectangle{
80: {
Min: image.Point{X: 0, Y: 0},
Max: image.Point{X: 80, Y: 80},
},
240: {
Min: image.Point{X: 0, Y: 0},
Max: image.Point{X: 240, Y: 240},
},
1000: {
Min: image.Point{X: 0, Y: 0},
Max: image.Point{X: 1000, Y: 1000},
},
},
},
{
"rose.webp",
map[ResizeDimension]image.Rectangle{
80: {
Min: image.Point{X: 0, Y: 0},
Max: image.Point{X: 107, Y: 80},
},
240: {
Min: image.Point{X: 0, Y: 0},
Max: image.Point{X: 319, Y: 240},
},
1000: {
Min: image.Point{X: 0, Y: 0},
Max: image.Point{X: 1329, Y: 1000},
},
},
},
{
"spin.gif",
map[ResizeDimension]image.Rectangle{
80: {
Min: image.Point{X: 0, Y: 0},
Max: image.Point{X: 80, Y: 80},
},
240: {
Min: image.Point{X: 0, Y: 0},
Max: image.Point{X: 240, Y: 240},
},
1000: {
Min: image.Point{X: 0, Y: 0},
Max: image.Point{X: 1000, Y: 1000},
},
},
},
{
"status.png",
map[ResizeDimension]image.Rectangle{
80: {
Min: image.Point{X: 0, Y: 0},
Max: image.Point{X: 80, Y: 80},
},
240: {
Min: image.Point{X: 0, Y: 0},
Max: image.Point{X: 240, Y: 240},
},
1000: {
Min: image.Point{X: 0, Y: 0},
Max: image.Point{X: 1000, Y: 1000},
},
},
},
}
for _, c := range cs {
img, err := Decode(path + c.Filename)
require.NoError(t, err)
for _, s := range sizes {
rsImg := Resize(s, img)
require.Exactly(t, c.Bounds[s], rsImg.Bounds())
}
}
}
// Requirement of ShrinkOnly
func TestThatResizeResizesSmallerHeightByTheSmallestSide(t *testing.T) {
image := image.NewRGBA(image.Rect(0, 0, 4, 2))
resizedImage := Resize(ResizeDimension(1), image)
require.Exactly(t, 2, resizedImage.Bounds().Dx())
require.Exactly(t, 1, resizedImage.Bounds().Dy())
}
// Requirement of ShrinkOnly
func TestThatResizeResizesSmallerWidthByTheSmallestSide(t *testing.T) {
image := image.NewRGBA(image.Rect(0, 0, 4, 8))
resizedImage := Resize(ResizeDimension(2), image)
require.Exactly(t, 2, resizedImage.Bounds().Dx())
require.Exactly(t, 4, resizedImage.Bounds().Dy())
}
func TestCrop(t *testing.T) {
type params struct {
Rectangle image.Rectangle
OutputBound image.Rectangle
OutputSize int
CropError error
}
topLeftSquare := image.Rectangle{
Min: image.Point{X: 0, Y: 0},
Max: image.Point{X: 80, Y: 80},
}
offsetSquare := image.Rectangle{
Min: image.Point{X: 80, Y: 80},
Max: image.Point{X: 160, Y: 160},
}
outOfBoundsSquare := image.Rectangle{
Min: image.Point{X: 0, Y: 0},
Max: image.Point{X: 1000000, Y: 1000000},
}
rect := image.Rectangle{}
options := EncodeConfig{
Quality: 70,
}
cs := []struct {
Filename string
Params []params
}{
{
"elephant.jpg",
[]params{
{topLeftSquare, topLeftSquare, 1447, nil},
{offsetSquare, rect, 0, errors.New("crop dimensions out of bounds of image, image width '80px' & height '80px'; crop bottom right coordinate at X '160px' Y '160px'")},
{outOfBoundsSquare, rect, 0, errors.New("crop dimensions out of bounds of image, image width '80px' & height '80px'; crop bottom right coordinate at X '1000000px' Y '1000000px'")},
},
},
{
"rose.webp",
[]params{
{topLeftSquare, topLeftSquare, 1183, nil},
{offsetSquare, offsetSquare, 1251, nil},
{outOfBoundsSquare, rect, 0, errors.New("crop dimensions out of bounds of image, image width '400px' & height '301px'; crop bottom right coordinate at X '1000000px' Y '1000000px'")},
},
},
{
"spin.gif",
[]params{
{topLeftSquare, topLeftSquare, 693, nil},
{offsetSquare, offsetSquare, 1339, nil},
{outOfBoundsSquare, rect, 0, errors.New("crop dimensions out of bounds of image, image width '256px' & height '256px'; crop bottom right coordinate at X '1000000px' Y '1000000px'")},
},
},
{
"status.png",
[]params{
{topLeftSquare, topLeftSquare, 1027, nil},
{offsetSquare, offsetSquare, 1157, nil},
{outOfBoundsSquare, rect, 0, errors.New("crop dimensions out of bounds of image, image width '256px' & height '256px'; crop bottom right coordinate at X '1000000px' Y '1000000px'")},
},
},
}
for _, c := range cs {
img, err := Decode(path + c.Filename)
require.NoError(t, err)
for _, p := range c.Params {
cImg, err := Crop(img, p.Rectangle)
if p.CropError != nil {
require.EqualError(t, err, p.CropError.Error())
continue
} else {
require.NoError(t, err)
}
require.Exactly(t, p.OutputBound.Dx(), cImg.Bounds().Dx(), c.Filename)
require.Exactly(t, p.OutputBound.Dy(), cImg.Bounds().Dy(), c.Filename)
bb := bytes.NewBuffer([]byte{})
err = Encode(bb, cImg, options)
require.NoError(t, err)
require.Exactly(t, p.OutputSize, bb.Len())
}
}
}