From 506995d8161b7efc0aac02c09bc313869b6d5371 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 29 Mar 2018 16:37:35 +0300 Subject: [PATCH] Tests for python API --- Tests/test_color_lut.py | 47 ++++++++++++++++++++++++++++++++++++++--- src/PIL/ImageFilter.py | 26 ++++++++++++++++------- 2 files changed, 62 insertions(+), 11 deletions(-) diff --git a/Tests/test_color_lut.py b/Tests/test_color_lut.py index 65b5c5127..5d15c4cb2 100644 --- a/Tests/test_color_lut.py +++ b/Tests/test_color_lut.py @@ -1,7 +1,7 @@ from __future__ import division from helper import unittest, PillowTestCase -from PIL import Image +from PIL import Image, ImageFilter class TestColorLut3DCoreAPI(PillowTestCase): @@ -27,7 +27,7 @@ class TestColorLut3DCoreAPI(PillowTestCase): channels, size1D, size2D, size3D, [item for sublist in table for item in sublist]) - def test_wrong_arguments(self): + def test_wrong_args(self): im = Image.new('RGB', (10, 10), 0) with self.assertRaisesRegexp(ValueError, "filter"): @@ -66,7 +66,7 @@ class TestColorLut3DCoreAPI(PillowTestCase): im.im.color_lut_3d('RGB', Image.LINEAR, 3, 2, 2, 2, [0, 0, 0] * 9) - def test_correct_arguments(self): + def test_correct_args(self): im = Image.new('RGB', (10, 10), 0) im.im.color_lut_3d('RGB', Image.LINEAR, @@ -209,5 +209,46 @@ class TestColorLut3DCoreAPI(PillowTestCase): self.assertEqual(transformed[205, 205], (255, 255, 0)) +class TestColorLut3DFilter(PillowTestCase): + def test_wrong_args(self): + with self.assertRaisesRegexp(ValueError, "should be an integer"): + ImageFilter.Color3DLUT("small", [1]) + + with self.assertRaisesRegexp(ValueError, "should be an integer"): + ImageFilter.Color3DLUT((11, 11), [1]) + + with self.assertRaisesRegexp(ValueError, r"in \[2, 65\] range"): + ImageFilter.Color3DLUT((11, 11, 1), [1]) + + with self.assertRaisesRegexp(ValueError, r"in \[2, 65\] range"): + ImageFilter.Color3DLUT((11, 11, 66), [1]) + + with self.assertRaisesRegexp(ValueError, "table should have .+ items"): + ImageFilter.Color3DLUT((3, 3, 3), [1, 1, 1]) + + with self.assertRaisesRegexp(ValueError, "table should have .+ items"): + ImageFilter.Color3DLUT((3, 3, 3), [[1, 1, 1]] * 2) + + with self.assertRaisesRegexp(ValueError, "should have a length of 4"): + ImageFilter.Color3DLUT((3, 3, 3), [[1, 1, 1]] * 27, channels=4) + + with self.assertRaisesRegexp(ValueError, "should have a length of 3"): + ImageFilter.Color3DLUT((2, 2, 2), [[1, 1]] * 8) + + def test_convert_table(self): + flt = ImageFilter.Color3DLUT(2, [0, 1, 2] * 8) + self.assertEqual(tuple(flt.size), (2, 2, 2)) + self.assertEqual(flt.name, "Color 3D LUT") + + flt = ImageFilter.Color3DLUT((2, 2, 2), [ + (0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), + (12, 13, 14), (15, 16, 17), (18, 19, 20), (21, 22, 23)]) + self.assertEqual(tuple(flt.size), (2, 2, 2)) + self.assertEqual(flt.table, list(range(24))) + + flt = ImageFilter.Color3DLUT((2, 2, 2), [(0, 1, 2, 3)] * 8, + channels=4) + + if __name__ == '__main__': unittest.main() diff --git a/src/PIL/ImageFilter.py b/src/PIL/ImageFilter.py index eba5453d4..1c9561576 100644 --- a/src/PIL/ImageFilter.py +++ b/src/PIL/ImageFilter.py @@ -43,6 +43,7 @@ class Kernel(MultibandFilter): :param offset: Offset. If given, this value is added to the result, after it has been divided by the scale factor. """ + name = "Kernel" def __init__(self, size, kernel, scale=None, offset=0): if scale is None: @@ -320,6 +321,8 @@ class Color3DLUT(MultibandFilter): than ``channels`` channels. Default is ``None``, which means that mode wouldn't be changed. """ + name = "Color 3D LUT" + def __init__(self, size, table, channels=3, target_mode=None): try: _, _, _ = size @@ -328,24 +331,31 @@ class Color3DLUT(MultibandFilter): "tuple of three integers.") except TypeError: size = (size, size, size) + size = map(int, size) + for size1D in size: + if not 2 <= size1D <= 65: + raise ValueError("Size should be in [2, 65] range.") + self.size = size self.channels = channels self.mode = target_mode table = list(table) # Convert to a flat list - if isinstance(table[0], (list, tuple)): - table = [ - pixel - for pixel in table - if len(pixel) == channels - for color in pixel - ] + if table and isinstance(table[0], (list, tuple)): + table, raw_table = [], table + for pixel in raw_table: + if len(pixel) != channels: + raise ValueError("The elements of the table should have " + "a length of {}.".format(channels)) + for color in pixel: + table.append(color) if len(table) != channels * size[0] * size[1] * size[2]: raise ValueError( "The table should have channels * size**3 float items " - "either size**3 items of channels-sized tuples with floats.") + "either size**3 items of channels-sized tuples with floats. " + "Table length: {}".format(len(table))) self.table = table def filter(self, image):