You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
calculate-utils-4-lib/tests/utils/test_images.py

216 lines
7.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import pytest
from calculate.utils.images import ImageMagick, ImageMagickError
import os
from calculate.utils.files import Process
@pytest.mark.images_utils
def test_imagemagick_initialization():
im = ImageMagick()
assert im.available
assert not im.chroot
im = ImageMagick(prefix='/mnt/somepath')
assert not im.available
assert im.chroot
@pytest.mark.images_utils
@pytest.mark.parametrize('case',
[
{
"name": "simple path",
"chroot": "/mnt/install",
"source": "/mnt/install/usr/share/pixmap/image.jpg",
"result": "/usr/share/pixmap/image.jpg",
},
{
"name": "relative",
"chroot": "/mnt/install",
"source": "/mnt/install/usr/share/../pixmap/image.jpg",
"result": "/usr/pixmap/image.jpg",
},
{
"name": "first level",
"chroot": "/mnt/install",
"source": "/mnt/install/image.jpg",
"result": "/image.jpg",
},
{
"name": "Wrong",
"chroot": "/mnt/install",
"source": "/mnt/image.jpg",
"result": None,
},
],
ids=lambda x:x["name"])
def test_imagemagick_trim_prefix_path(case):
im = ImageMagick(case['chroot'])
assert im.trim_prefix_path(case["source"]) == case["result"]
@pytest.mark.images_utils
@pytest.mark.parametrize('case',
[
{
"name": "PNG file",
"image": "tests/utils/testfiles/file.png",
"result": (48,48),
},
{
"name": "JPEG file",
"image": "tests/utils/testfiles/file.jpg",
"result": (320,180),
},
{
"name": "No file",
"image": "tests/utils/testfiles/file2.jpg",
"result": None,
},
{
"name": "Wrong file",
"image": "tests/utils/testfiles/wrong.jpg",
"result": None,
},
],
ids=lambda x:x["name"])
def test_imagemagick_get_resolutions(case):
im = ImageMagick()
assert im.get_image_resolution(case["image"]) == case["result"]
@pytest.fixture
def chroot_test():
chrootpath = "/mnt/testchroot"
assert os.getuid() == 0, "Need superuser privileges"
if os.path.exists(chrootpath):
os.unlink(chrootpath)
os.symlink("/", chrootpath)
try:
yield chrootpath
finally:
os.unlink(chrootpath)
@pytest.mark.chroot
@pytest.mark.images_utils
def test_chroot_imagemagick_get_resolution(chroot_test):
im = ImageMagick(chroot_test)
curpath = os.getcwd()
image_path = os.path.join(curpath, "tests/utils/testfiles/file.png")
assert im.get_image_resolution(image_path) == (48,48)
def get_histogram(image, remap_image):
p = Process("/usr/bin/convert", image, "-remap", remap_image, "-format", "%c", "histogram:info:-")
return p.read()
def get_verbose_image_info(image):
p = Process("/usr/bin/identify", "-verbose", image)
return p.read()
@pytest.mark.images_utils
@pytest.mark.parametrize('case',
[
{
# проверка, пропорционального уменьшения
"name": "Origin test",
"resize": (16,32),
"result": """192: (0,0,0) #000000 black
64: (0,255,0) #00FF00 lime
256: (255,255,255) #FFFFFF white"""
},
{
# проверка, что при изменении размера только по горизонтали
# удаляются только части изображения справа и слева
# в исходном изображении на этих частях находится белый фон
"name": "Shrink horizontal",
"resize": (16,16),
"result": """192: (0,0,0) #000000 black
64: (0,255,0) #00FF00 lime"""
},
{
# проверка, что при уменьшении изображения первоначально оно сдавливается
# по вертикали а затем обрезаются части слева и справа
"name": "Shrink all",
"resize": (8,8),
"result": """48: (0,0,0) #000000 black
16: (0,255,0) #00FF00 lime"""
},
{
# проверка, пропорционального уменьшения
"name": "Shrink proportionately",
"resize": (8,16),
"result": """48: (0,0,0) #000000 black
16: (0,255,0) #00FF00 lime
64: (255,255,255) #FFFFFF white"""
},
{
# проверка, пропорционального увеличения
"name": "Increase size proportionately",
"resize": (32,64),
"result": """768: (0,0,0) #000000 black
256: (0,255,0) #00FF00 lime
1024: (255,255,255) #FFFFFF white"""
},
{
# проверка увеличения и обрезки по горизонтали
"name": "Increase size and cut",
"resize": (32,32),
"result": """768: (0,0,0) #000000 black
256: (0,255,0) #00FF00 lime"""
},
{
# проверка увеличения по горизонтали
# в этом случае будет отрезан верх и низ
# поэтому на выходе нет зелёного цвета
"name": "Increase horizontal size",
"resize": (16,48),
"result": """384: (0,0,0) #000000 gray(0)
384: (255,255,255) #FFFFFF gray(255)"""
},
],
ids=lambda x:x["name"])
def test_imagemagick_convert(case):
image_path = "tests/utils/testfiles/origin.png"
output_file = "tests/utils/testfiles/test_output5.png"
if os.path.exists(output_file):
os.unlink(output_file)
im = ImageMagick()
im.default_opts = ["-filter","box"]
assert im.convert_resize_crop_center(image_path, output_file, *case["resize"])
histogram = get_histogram(output_file, image_path)
discard_space = lambda x: x.replace(" ","").replace("\n","")
assert discard_space(histogram) == discard_space(case["result"])
@pytest.mark.chroot
@pytest.mark.images_utils
def test_chroot_imagemagick_convert_center(chroot_test):
curpath = os.getcwd()
image_path = "tests/utils/testfiles/origin.png"
output_file = "tests/utils/testfiles/test_output.png"
image_path = os.path.join(curpath, image_path)
output_file = os.path.join(curpath, output_file)
result = """48: (0,0,0) #000000 black
16: (0,255,0) #00FF00 lime"""
if os.path.exists(output_file):
os.unlink(output_file)
im = ImageMagick(chroot_test)
im.default_opts = ["-filter","box"]
assert im.convert_resize_crop_center(image_path, output_file, 8, 8)
histogram = get_histogram(output_file, image_path)
discard_space = lambda x: x.replace(" ","").replace("\n","")
assert discard_space(histogram) == discard_space(result)
@pytest.mark.images_utils
def test_imagemagick_convert_gfxboot():
output_file = "tests/utils/testfiles/test_output.jpg"
image_path = "tests/utils/testfiles/origin.png"
im = ImageMagick()
im.convert_resize_gfxboot(image_path, output_file, 32, 32)
assert "sampling-factor: 2x2" in get_verbose_image_info(output_file)
@pytest.mark.images_utils
def test_clear_imagemagick_convert():
for output_file in (
"tests/utils/testfiles/test_output.png",
"tests/utils/testfiles/test_output.jpg"
):
if os.path.exists(output_file):
os.unlink(output_file)