181 lines
4.4 KiB
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,
|
|
)
|
|
}
|
|
}
|
|
|
|
}
|