imaginary/image_test.go

181 lines
4.4 KiB
Go

package main
import (
"io/ioutil"
"testing"
)
func TestImageResize(t *testing.T) {
t.Run("Width and Height defined", func(t *testing.T) {
opts := ImageOptions{Width: 300, Height: 300}
buf, _ := ioutil.ReadAll(readFile("imaginary.jpg"))
img, err := Resize(buf, opts)
if err != nil {
t.Errorf("Cannot process image: %s", err)
}
if img.Mime != "image/jpeg" {
t.Error("Invalid image MIME type")
}
if assertSize(img.Body, opts.Width, opts.Height) != nil {
t.Errorf("Invalid image size, expected: %dx%d", opts.Width, opts.Height)
}
})
t.Run("Width defined", func(t *testing.T) {
opts := ImageOptions{Width: 300}
buf, _ := ioutil.ReadAll(readFile("imaginary.jpg"))
img, err := Resize(buf, opts)
if err != nil {
t.Errorf("Cannot process image: %s", err)
}
if img.Mime != "image/jpeg" {
t.Error("Invalid image MIME type")
}
if err := assertSize(img.Body, 300, 404); err != nil {
t.Error(err)
}
})
t.Run("Width defined with NoCrop=false", func(t *testing.T) {
opts := ImageOptions{Width: 300, NoCrop: false, IsDefinedField: IsDefinedField{NoCrop: true}}
buf, _ := ioutil.ReadAll(readFile("imaginary.jpg"))
img, err := Resize(buf, opts)
if err != nil {
t.Errorf("Cannot process image: %s", err)
}
if img.Mime != "image/jpeg" {
t.Error("Invalid image MIME type")
}
// The original image is 550x740
if err := assertSize(img.Body, 300, 740); err != nil {
t.Error(err)
}
})
t.Run("Width defined with NoCrop=true", func(t *testing.T) {
opts := ImageOptions{Width: 300, NoCrop: true, IsDefinedField: IsDefinedField{NoCrop: true}}
buf, _ := ioutil.ReadAll(readFile("imaginary.jpg"))
img, err := Resize(buf, opts)
if err != nil {
t.Errorf("Cannot process image: %s", err)
}
if img.Mime != "image/jpeg" {
t.Error("Invalid image MIME type")
}
// The original image is 550x740
if err := assertSize(img.Body, 300, 404); err != nil {
t.Error(err)
}
})
}
func TestImageFit(t *testing.T) {
opts := ImageOptions{Width: 300, Height: 300}
buf, _ := ioutil.ReadAll(readFile("imaginary.jpg"))
img, err := Fit(buf, opts)
if err != nil {
t.Errorf("Cannot process image: %s", err)
}
if img.Mime != "image/jpeg" {
t.Error("Invalid image MIME type")
}
// 550x740 -> 222.9x300
if assertSize(img.Body, 223, 300) != nil {
t.Errorf("Invalid image size, expected: %dx%d", opts.Width, opts.Height)
}
}
func TestImageAutoRotate(t *testing.T) {
buf, _ := ioutil.ReadAll(readFile("imaginary.jpg"))
img, err := AutoRotate(buf, ImageOptions{})
if err != nil {
t.Errorf("Cannot process image: %s", err)
}
if img.Mime != "image/jpeg" {
t.Error("Invalid image MIME type")
}
if assertSize(img.Body, 550, 740) != nil {
t.Errorf("Invalid image size, expected: %dx%d", 550, 740)
}
}
func TestImagePipelineOperations(t *testing.T) {
width, height := 300, 260
operations := PipelineOperations{
PipelineOperation{
Name: "crop",
Params: map[string]interface{}{
"width": width,
"height": height,
},
},
PipelineOperation{
Name: "convert",
Params: map[string]interface{}{
"type": "webp",
},
},
}
opts := ImageOptions{Operations: operations}
buf, _ := ioutil.ReadAll(readFile("imaginary.jpg"))
img, err := Pipeline(buf, opts)
if err != nil {
t.Errorf("Cannot process image: %s", err)
}
if img.Mime != "image/webp" {
t.Error("Invalid image MIME type")
}
if assertSize(img.Body, width, height) != nil {
t.Errorf("Invalid image size, expected: %dx%d", width, height)
}
}
func TestCalculateDestinationFitDimension(t *testing.T) {
cases := []struct {
// Image
imageWidth int
imageHeight int
// User parameter
optionWidth int
optionHeight int
// Expect
fitWidth int
fitHeight int
}{
// Leading Width
{1280, 1000, 710, 9999, 710, 555},
{1279, 1000, 710, 9999, 710, 555},
{900, 500, 312, 312, 312, 173}, // rounding down
{900, 500, 313, 313, 313, 174}, // rounding up
// Leading height
{1299, 2000, 710, 999, 649, 999},
{1500, 2000, 710, 999, 710, 947},
}
for _, tc := range cases {
fitWidth, fitHeight := calculateDestinationFitDimension(tc.imageWidth, tc.imageHeight, tc.optionWidth, tc.optionHeight)
if fitWidth != tc.fitWidth || fitHeight != tc.fitHeight {
t.Errorf(
"Fit dimensions calculation failure\nExpected : %d/%d (width/height)\nActual : %d/%d (width/height)\n%+v",
tc.fitWidth, tc.fitHeight, fitWidth, fitHeight, tc,
)
}
}
}