From 5f4c758b996b6dfccf5d43518a467342e5b92414 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 4 Sep 2014 22:53:35 +0300 Subject: [PATCH 01/11] Convert .ico to 8-bit to match lena.ico: convert hopper.ico -alpha off -colors 256 hopper2.ico --- Tests/images/hopper.ico | Bin 1150 -> 1406 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Tests/images/hopper.ico b/Tests/images/hopper.ico index 0c6fd8c70f927ab483d12e6552d23e9a26b63eba..cd301823af45af9b33c72a5a4fd279ea96346676 100644 GIT binary patch literal 1406 zcmbtTd0Z4_7=HGgncbb)Q+AhiVPRNcaTf#@mSchC22;TzETPiSl&Byu43aeMAPF-z zf(SB`sOYdFv(w6q?7r{&&hGmzduQm6{%^kD^L;b#_dW0Nz0Uv&8YUBHX0c8K!~jSo zkO>}wWS1WWVA0QkjM4@;g#rS>M6hXD@SF(_!HTk+LPWB2QRNfSlWs?s$fMIMpesp0 zC%t!hP1xwSp)f4~4{wB%VZdv&;28sQ^K0QqOvlE_11P9li{{oI4Aq6u?lF)LqwGiW zwIRibIO66cBqQMVASp2bM#Dm>R6<3$XtW$Sy%7v=g@NPHlE|aSXGV9b89ixcZ1P*6 zr@VQBQAw+Yfl{R*z6v_Q16Jn*$J1(XLP2Miizf63?dZ#}VY7sQ4dI1(h!afUDJG{< zQ(PV~;!^m^Cs5UK82;KB%+KtFU=gv>XT@OHg{>hc`a`i8$csh1)efJ_1A%I1)eKl; zI&{_w=qyzbEBC>jGXlZY471pZHF;SWEq7ykSptS49z;t#&{7Yi8l*mGDSl#j3!Hh= zNGRTmV8bke^|MH>nT4ll3f+-ROw@>oRwZMk!izD2z#70&?ku68bOo}ScEOp^4qN&t zV$-6qd$+-wHiC@uKH{Zdn7GkOLb(^C70J-i9W!)yDuo_dCBtx44?|^XKuq>1JmLKi z%MZdH97bbtF(#L!U`J&thRDZor57XQLrr3PXvtnvl0DBrUvAf=n(drb8Q9e3Gixhtw^(UVCW`crxC-vH$-3Jw$0oGE7+|pID zTn$15bRCvjmbgtJPv~;t=Nfy3y1zgK#J$%U`KbLP>{I zv?iML*hzfB9QU6+rK}T4D^-yQSXPHvy8|3cnk1W=a#Ks%{MXOwbQfaWSrn6o6r3Ju zmd;Aw>pQxTEGEfz74alHT{ZD#1{Td#zkj&$iT z1fXXeP${)?txf|AmNUxdwbH+*=V8!EcOk`5LQQ&->s6{@B(B#L9G%dLBMTs9QFeE5oy(JRNU8lSj&=jQXaY(4*i3oq)wc-z1wgWE6dIJ2{B z{aM``&hF_wXJg;Fn^vwmxn=d5Q`W9)J+Lh@ z@KY-ZdLf*=>|WZc+Q>~CCM>uFthW-Kq1n;OnW1sY%PR14b0^Il&(_96 zQjKQ(eKaJ;TB#5k8K!cA1B@u;GAgqYd9`j3rA&@WsleUM6}jO0s=e{?^x})9722Cy zkh!`NsMn!aC@?5x9MGsx$-H>8%!;k>4dL&GUaLbVX4VQXty0b0)D(&FsZ`s`Niv(! zduxaY2qeNkfFO-8z6uqe_SIsJP9P)8inl_Bk6MPOn86$!!~MO#c%^fdYfDcVA05S2 zk_ZqU{wggYS_4h_8T>fkMS7f(j-FenJx^lrD?p_SAv-yRx}kLfnQP-TV#xEVY0tNVdD)_OJ~R~U&L1PE|Y@y z_=C6j<>~-GFZQr|se=b|9i+u1WAalIq|9J&a+{h<+k_sw!ttS99OJ*^oc3Sti&q-p#cD#xDCIPojPSN0iR+^2nhpN8{~ zS)CeSZ{8_%+S!?D<$=J-Vmn>64cMY$F-Mp%=k<|RGDB+79M0L_s2kZKx8^!8J8$yY z*dV*pC;0wiBb!qWwk92nzdc61tpKY*PfBn&A+Z*YJKv{sdXKrKzv;RBl-CFDU_0jI zo?cfTo~oH zBa7v>JeFH+BHQ?~;|R&(ecCiW Date: Fri, 5 Sep 2014 12:14:45 +0300 Subject: [PATCH 02/11] Replace lena.tif with hopper.tif (created with ImageMagick) --- Tests/images/hopper.tif | Bin 0 -> 49597 bytes Tests/test_file_libtiff.py | 12 ++++++------ Tests/test_file_tiff_metadata.py | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) create mode 100644 Tests/images/hopper.tif diff --git a/Tests/images/hopper.tif b/Tests/images/hopper.tif new file mode 100644 index 0000000000000000000000000000000000000000..cb9ef0490cdcf47fc26f50e1604749fa7ce51a30 GIT binary patch literal 49597 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⋙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 YmiKz2z25MaH`~4TNA&96i~5Y*0#{6 Date: Fri, 5 Sep 2014 12:36:24 +0300 Subject: [PATCH 03/11] Change some lena() to hopper() --- Tests/bench_cffi_access.py | 4 ++-- Tests/bench_get.py | 2 +- Tests/helper.py | 6 +++--- Tests/test_cffi.py | 32 ++++++++++++++++---------------- Tests/test_decompression_bomb.py | 8 ++++---- Tests/test_file_bmp.py | 16 ++++++++-------- Tests/test_file_iptc.py | 4 ++-- Tests/test_file_msp.py | 4 ++-- Tests/test_file_palm.py | 14 +++++++------- Tests/test_file_pcx.py | 6 +++--- Tests/test_file_pdf.py | 4 ++-- Tests/test_file_ppm.py | 2 +- Tests/test_file_tiff.py | 20 ++++++++++---------- Tests/test_file_webp_alpha.py | 4 ++-- Tests/test_file_webp_lossless.py | 6 +++--- Tests/test_imagechops.py | 4 ++-- Tests/test_imagedraw.py | 6 +++--- Tests/test_imageenhance.py | 10 +++++----- 18 files changed, 76 insertions(+), 76 deletions(-) diff --git a/Tests/bench_cffi_access.py b/Tests/bench_cffi_access.py index 8aa322aff..769396f53 100644 --- a/Tests/bench_cffi_access.py +++ b/Tests/bench_cffi_access.py @@ -1,4 +1,4 @@ -from helper import * +from helper import unittest, PillowTestCase, hopper # Not running this test by default. No DOS against Travis CI. @@ -39,7 +39,7 @@ def timer(func, label, *args): class BenchCffiAccess(PillowTestCase): def test_direct(self): - im = lena() + im = hopper() im.load() # im = Image.new( "RGB", (2000, 2000), (1, 3, 2)) caccess = im.im.pixel_access(False) diff --git a/Tests/bench_get.py b/Tests/bench_get.py index 8a1331d39..8f786acf0 100644 --- a/Tests/bench_get.py +++ b/Tests/bench_get.py @@ -6,7 +6,7 @@ import timeit def bench(mode): - im = helper.lena(mode) + im = helper.hopper(mode) get = im.im.getpixel xy = 50, 50 # position shouldn't really matter t0 = timeit.default_timer() diff --git a/Tests/helper.py b/Tests/helper.py index 637e77f9c..34dafa645 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -191,11 +191,11 @@ def hopper(mode="RGB", cache={}): if mode == "RGB": im = Image.open("Tests/images/hopper.ppm") elif mode == "F": - im = lena("L").convert(mode) + im = hopper("L").convert(mode) elif mode[:4] == "I;16": - im = lena("I").convert(mode) + im = hopper("I").convert(mode) else: - im = lena("RGB").convert(mode) + im = hopper("RGB").convert(mode) # cache[mode] = im return im diff --git a/Tests/test_cffi.py b/Tests/test_cffi.py index b9f99976d..5599dbb48 100644 --- a/Tests/test_cffi.py +++ b/Tests/test_cffi.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper try: import cffi @@ -62,16 +62,16 @@ class TestCffi(PillowTestCase): self.assertEqual(access[(x, y)], caccess[(x, y)]) def test_get_vs_c(self): - rgb = lena('RGB') + rgb = hopper('RGB') rgb.load() self._test_get_access(rgb) - self._test_get_access(lena('RGBA')) - self._test_get_access(lena('L')) - self._test_get_access(lena('LA')) - self._test_get_access(lena('1')) - self._test_get_access(lena('P')) - # self._test_get_access(lena('PA')) # PA -- how do I make a PA image? - self._test_get_access(lena('F')) + self._test_get_access(hopper('RGBA')) + self._test_get_access(hopper('L')) + self._test_get_access(hopper('LA')) + self._test_get_access(hopper('1')) + self._test_get_access(hopper('P')) + # self._test_get_access(hopper('PA')) # PA -- how do I make a PA image? + self._test_get_access(hopper('F')) im = Image.new('I;16', (10, 10), 40000) self._test_get_access(im) @@ -104,16 +104,16 @@ class TestCffi(PillowTestCase): self.assertEqual(color, caccess[(x, y)]) def test_set_vs_c(self): - rgb = lena('RGB') + rgb = hopper('RGB') rgb.load() self._test_set_access(rgb, (255, 128, 0)) - self._test_set_access(lena('RGBA'), (255, 192, 128, 0)) - self._test_set_access(lena('L'), 128) - self._test_set_access(lena('LA'), (128, 128)) - self._test_set_access(lena('1'), 255) - self._test_set_access(lena('P'), 128) + self._test_set_access(hopper('RGBA'), (255, 192, 128, 0)) + self._test_set_access(hopper('L'), 128) + self._test_set_access(hopper('LA'), (128, 128)) + self._test_set_access(hopper('1'), 255) + self._test_set_access(hopper('P'), 128) # self._test_set_access(i, (128, 128)) #PA -- undone how to make - self._test_set_access(lena('F'), 1024.0) + self._test_set_access(hopper('F'), 1024.0) im = Image.new('I;16', (10, 10), 40000) self._test_set_access(im, 45000) diff --git a/Tests/test_decompression_bomb.py b/Tests/test_decompression_bomb.py index 0803732ce..ae9aebfa8 100644 --- a/Tests/test_decompression_bomb.py +++ b/Tests/test_decompression_bomb.py @@ -2,7 +2,7 @@ from helper import unittest, PillowTestCase from PIL import Image -test_file = "Tests/images/lena.ppm" +TEST_FILE = "Tests/images/hopper.ppm" ORIGINAL_LIMIT = Image.MAX_IMAGE_PIXELS @@ -15,7 +15,7 @@ class TestDecompressionBomb(PillowTestCase): def test_no_warning_small_file(self): # Implicit assert: no warning. # A warning would cause a failure. - Image.open(test_file) + Image.open(TEST_FILE) def test_no_warning_no_limit(self): # Arrange @@ -26,7 +26,7 @@ class TestDecompressionBomb(PillowTestCase): # Act / Assert # Implicit assert: no warning. # A warning would cause a failure. - Image.open(test_file) + Image.open(TEST_FILE) def test_warning(self): # Arrange @@ -37,7 +37,7 @@ class TestDecompressionBomb(PillowTestCase): # Act / Assert self.assert_warning( Image.DecompressionBombWarning, - lambda: Image.open(test_file)) + lambda: Image.open(TEST_FILE)) if __name__ == '__main__': unittest.main() diff --git a/Tests/test_file_bmp.py b/Tests/test_file_bmp.py index e04f3642c..69792fe12 100644 --- a/Tests/test_file_bmp.py +++ b/Tests/test_file_bmp.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image import io @@ -18,16 +18,16 @@ class TestFileBmp(PillowTestCase): self.assertEqual(reloaded.format, "BMP") def test_sanity(self): - self.roundtrip(lena()) + self.roundtrip(hopper()) - self.roundtrip(lena("1")) - self.roundtrip(lena("L")) - self.roundtrip(lena("P")) - self.roundtrip(lena("RGB")) + self.roundtrip(hopper("1")) + self.roundtrip(hopper("L")) + self.roundtrip(hopper("P")) + self.roundtrip(hopper("RGB")) def test_save_to_bytes(self): output = io.BytesIO() - im = lena() + im = hopper() im.save(output, "BMP") output.seek(0) @@ -41,7 +41,7 @@ class TestFileBmp(PillowTestCase): dpi = (72, 72) output = io.BytesIO() - im = lena() + im = hopper() im.save(output, "BMP", dpi=dpi) output.seek(0) diff --git a/Tests/test_file_iptc.py b/Tests/test_file_iptc.py index bd331e5b2..14eb135aa 100644 --- a/Tests/test_file_iptc.py +++ b/Tests/test_file_iptc.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image, IptcImagePlugin @@ -21,7 +21,7 @@ class TestFileIptc(PillowTestCase): def test_getiptcinfo_jpg_none(self): # Arrange - im = lena() + im = hopper() # Act iptc = IptcImagePlugin.getiptcinfo(im) diff --git a/Tests/test_file_msp.py b/Tests/test_file_msp.py index a64faad10..c080247a0 100644 --- a/Tests/test_file_msp.py +++ b/Tests/test_file_msp.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image @@ -9,7 +9,7 @@ class TestFileMsp(PillowTestCase): file = self.tempfile("temp.msp") - lena("1").save(file) + hopper("1").save(file) im = Image.open(file) im.load() diff --git a/Tests/test_file_palm.py b/Tests/test_file_palm.py index 388df0237..7af3e16bd 100644 --- a/Tests/test_file_palm.py +++ b/Tests/test_file_palm.py @@ -1,14 +1,14 @@ -from helper import unittest, PillowTestCase, lena, imagemagick_available +from helper import unittest, PillowTestCase, hopper, imagemagick_available import os.path class TestFilePalm(PillowTestCase): _roundtrip = imagemagick_available() - + def helper_save_as_palm(self, mode): # Arrange - im = lena(mode) + im = hopper(mode) outfile = self.tempfile("temp_" + mode + ".palm") # Act @@ -21,14 +21,14 @@ class TestFilePalm(PillowTestCase): def roundtrip(self, mode): if not self._roundtrip: return - - im = lena(mode) + + im = hopper(mode) outfile = self.tempfile("temp.palm") im.save(outfile) converted = self.open_withImagemagick(outfile) self.assert_image_equal(converted, im) - + def test_monochrome(self): # Arrange @@ -46,7 +46,7 @@ class TestFilePalm(PillowTestCase): self.helper_save_as_palm(mode) self.skipKnownBadTest("Palm P image is wrong") self.roundtrip(mode) - + def test_rgb_ioerror(self): # Arrange mode = "RGB" diff --git a/Tests/test_file_pcx.py b/Tests/test_file_pcx.py index f278bd91d..36d6e0315 100644 --- a/Tests/test_file_pcx.py +++ b/Tests/test_file_pcx.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image @@ -17,7 +17,7 @@ class TestFilePcx(PillowTestCase): def test_sanity(self): for mode in ('1', 'L', 'P', 'RGB'): - self._roundtrip(lena(mode)) + self._roundtrip(hopper(mode)) def test_odd(self): # see issue #523, odd sized images should have a stride that's even. @@ -26,7 +26,7 @@ class TestFilePcx(PillowTestCase): for mode in ('1', 'L', 'P', 'RGB'): # larger, odd sized images are better here to ensure that # we handle interrupted scan lines properly. - self._roundtrip(lena(mode).resize((511, 511))) + self._roundtrip(hopper(mode).resize((511, 511))) def test_pil184(self): # Check reading of files where xmin/xmax is not zero. diff --git a/Tests/test_file_pdf.py b/Tests/test_file_pdf.py index 689302bb5..9424bc09d 100644 --- a/Tests/test_file_pdf.py +++ b/Tests/test_file_pdf.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper import os.path @@ -7,7 +7,7 @@ class TestFilePdf(PillowTestCase): def helper_save_as_pdf(self, mode): # Arrange - im = lena(mode) + im = hopper(mode) outfile = self.tempfile("temp_" + mode + ".pdf") # Act diff --git a/Tests/test_file_ppm.py b/Tests/test_file_ppm.py index e1f1537d2..3731fd9b1 100644 --- a/Tests/test_file_ppm.py +++ b/Tests/test_file_ppm.py @@ -3,7 +3,7 @@ from helper import unittest, PillowTestCase from PIL import Image # sample ppm stream -file = "Tests/images/lena.ppm" +file = "Tests/images/hopper.ppm" data = open(file, "rb").read() diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py index 464f1c314..cf809d5d0 100644 --- a/Tests/test_file_tiff.py +++ b/Tests/test_file_tiff.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena, py3 +from helper import unittest, PillowTestCase, hopper, py3 from PIL import Image, TiffImagePlugin @@ -9,7 +9,7 @@ class TestFileTiff(PillowTestCase): file = self.tempfile("temp.tif") - lena("RGB").save(file) + hopper("RGB").save(file) im = Image.open(file) im.load() @@ -17,19 +17,19 @@ class TestFileTiff(PillowTestCase): self.assertEqual(im.size, (128, 128)) self.assertEqual(im.format, "TIFF") - lena("1").save(file) + hopper("1").save(file) im = Image.open(file) - lena("L").save(file) + hopper("L").save(file) im = Image.open(file) - lena("P").save(file) + hopper("P").save(file) im = Image.open(file) - lena("RGB").save(file) + hopper("RGB").save(file) im = Image.open(file) - lena("I").save(file) + hopper("I").save(file) im = Image.open(file) def test_mac_tiff(self): @@ -158,14 +158,14 @@ class TestFileTiff(PillowTestCase): im.seek(2) im.load() self.assertEqual(im.size, (20,20)) - self.assertEqual(im.convert('RGB').getpixel((0,0)), (0,0,255)) + self.assertEqual(im.convert('RGB').getpixel((0,0)), (0,0,255)) def test_multipage_last_frame(self): im = Image.open('Tests/images/multipage-lastframe.tif') im.load() self.assertEqual(im.size, (20,20)) - self.assertEqual(im.convert('RGB').getpixel((0,0)), (0,0,255)) - + self.assertEqual(im.convert('RGB').getpixel((0,0)), (0,0,255)) + def test___str__(self): # Arrange diff --git a/Tests/test_file_webp_alpha.py b/Tests/test_file_webp_alpha.py index 5f8f653cf..d6c5be450 100644 --- a/Tests/test_file_webp_alpha.py +++ b/Tests/test_file_webp_alpha.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image @@ -40,7 +40,7 @@ class TestFileWebpAlpha(PillowTestCase): temp_file = self.tempfile("temp.webp") # temp_file = "temp.webp" - pil_image = lena('RGBA') + pil_image = hopper('RGBA') mask = Image.new("RGBA", (64, 64), (128, 128, 128, 128)) # Add some partially transparent bits: diff --git a/Tests/test_file_webp_lossless.py b/Tests/test_file_webp_lossless.py index 662ad1117..52a461a74 100644 --- a/Tests/test_file_webp_lossless.py +++ b/Tests/test_file_webp_lossless.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image @@ -23,7 +23,7 @@ class TestFileWebpLossless(PillowTestCase): def test_write_lossless_rgb(self): temp_file = self.tempfile("temp.webp") - lena("RGB").save(temp_file, lossless=True) + hopper("RGB").save(temp_file, lossless=True) image = Image.open(temp_file) image.load() @@ -34,7 +34,7 @@ class TestFileWebpLossless(PillowTestCase): image.load() image.getdata() - self.assert_image_equal(image, lena("RGB")) + self.assert_image_equal(image, hopper("RGB")) if __name__ == '__main__': diff --git a/Tests/test_imagechops.py b/Tests/test_imagechops.py index 552314fd1..a3b7fa606 100644 --- a/Tests/test_imagechops.py +++ b/Tests/test_imagechops.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image from PIL import ImageChops @@ -8,7 +8,7 @@ class TestImageChops(PillowTestCase): def test_sanity(self): - im = lena("L") + im = hopper("L") ImageChops.constant(im, 128) ImageChops.duplicate(im) diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py index b632da73b..76e49deb4 100644 --- a/Tests/test_imagedraw.py +++ b/Tests/test_imagedraw.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image from PIL import ImageColor @@ -34,7 +34,7 @@ POINTS2 = [10, 10, 20, 40, 30, 30] class TestImageDraw(PillowTestCase): def test_sanity(self): - im = lena("RGB").copy() + im = hopper("RGB").copy() draw = ImageDraw.ImageDraw(im) draw = ImageDraw.Draw(im) @@ -45,7 +45,7 @@ class TestImageDraw(PillowTestCase): draw.rectangle(list(range(4))) def test_deprecated(self): - im = lena().copy() + im = hopper().copy() draw = ImageDraw.Draw(im) diff --git a/Tests/test_imageenhance.py b/Tests/test_imageenhance.py index 433c49cf6..5edf46b12 100644 --- a/Tests/test_imageenhance.py +++ b/Tests/test_imageenhance.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image from PIL import ImageEnhance @@ -10,10 +10,10 @@ class TestImageEnhance(PillowTestCase): # FIXME: assert_image # Implicit asserts no exception: - ImageEnhance.Color(lena()).enhance(0.5) - ImageEnhance.Contrast(lena()).enhance(0.5) - ImageEnhance.Brightness(lena()).enhance(0.5) - ImageEnhance.Sharpness(lena()).enhance(0.5) + ImageEnhance.Color(hopper()).enhance(0.5) + ImageEnhance.Contrast(hopper()).enhance(0.5) + ImageEnhance.Brightness(hopper()).enhance(0.5) + ImageEnhance.Sharpness(hopper()).enhance(0.5) def test_crash(self): From 8dad2b0c63be0a27fcb4bd9745cb6f5ec338a4f9 Mon Sep 17 00:00:00 2001 From: hugovk Date: Fri, 5 Sep 2014 13:03:56 +0300 Subject: [PATCH 04/11] Replace some lena() with hopper(), and temporarily disable fail-fast so we can see all failures --- .travis.yml | 2 + Tests/test_format_hsv.py | 38 ++++++++--------- Tests/test_image_array.py | 4 +- Tests/test_image_convert.py | 20 ++++----- Tests/test_image_copy.py | 4 +- Tests/test_image_crop.py | 4 +- Tests/test_image_draft.py | 4 +- Tests/test_image_filter.py | 4 +- Tests/test_image_frombytes.py | 4 +- Tests/test_image_getbbox.py | 4 +- Tests/test_image_getcolors.py | 6 +-- Tests/test_image_getdata.py | 6 +-- Tests/test_image_getextrema.py | 4 +- Tests/test_image_getim.py | 4 +- Tests/test_image_getpalette.py | 4 +- Tests/test_image_getprojection.py | 4 +- Tests/test_image_histogram.py | 4 +- Tests/test_image_mode.py | 4 +- Tests/test_image_offset.py | 4 +- Tests/test_image_point.py | 10 ++--- Tests/test_image_putdata.py | 10 ++--- Tests/test_image_putpalette.py | 6 +-- Tests/test_image_putpixel.py | 4 +- Tests/test_image_quantize.py | 12 +++--- Tests/test_image_resize.py | 4 +- Tests/test_image_rotate.py | 4 +- Tests/test_image_split.py | 26 ++++++------ Tests/test_image_thumbnail.py | 16 +++---- Tests/test_image_tobitmap.py | 8 ++-- Tests/test_image_tobytes.py | 4 +- Tests/test_image_transform.py | 10 ++--- Tests/test_image_transpose.py | 6 +-- Tests/test_imagefile.py | 6 +-- Tests/test_imagefileio.py | 4 +- Tests/test_imageops.py | 70 +++++++++++++++---------------- Tests/test_imageops_usm.py | 2 +- Tests/test_imageqt.py | 4 +- Tests/test_imagesequence.py | 10 ++--- Tests/test_imagestat.py | 8 ++-- Tests/test_locale.py | 4 +- Tests/test_mode_i16.py | 10 ++--- Tests/test_numpy.py | 6 +-- Tests/test_pickle.py | 10 ++--- Tests/threaded_save.py | 2 +- 44 files changed, 193 insertions(+), 191 deletions(-) diff --git a/.travis.yml b/.travis.yml index 704c0d949..2ce1827e5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,6 +37,8 @@ script: - CFLAGS="-coverage" python setup.py build_ext --inplace - coverage run --append --include=PIL/* selftest.py + # FIXME: re-add -x option to fail fast + # - coverage run --append --include=PIL/* -m nose -vx Tests/test_*.py - coverage run --append --include=PIL/* -m nose -vx Tests/test_*.py after_success: diff --git a/Tests/test_format_hsv.py b/Tests/test_format_hsv.py index 03603aa9b..c571e98ee 100644 --- a/Tests/test_format_hsv.py +++ b/Tests/test_format_hsv.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image @@ -15,7 +15,7 @@ class TestFormatHSV(PillowTestCase): def tuple_to_ints(self, tp): x,y,z = tp return (int(x*255.0), int(y*255.0), int(z*255.0)) - + def test_sanity(self): im = Image.new('HSV', (100,100)) @@ -24,7 +24,7 @@ class TestFormatHSV(PillowTestCase): w90 = w.rotate(90) (px, h) = w.size - + r = Image.new('L', (px*3,h)) g = r.copy() b = r.copy() @@ -45,12 +45,12 @@ class TestFormatHSV(PillowTestCase): #print (("%d, %d -> "% (int(.75*px),int(.25*px))) + \ # "(%s, %s, %s)"%img.getpixel((.75*px, .25*px))) return img - + def to_xxx_colorsys(self, im, func, mode): # convert the hard way using the library colorsys routines. - + (r,g,b) = im.split() - + if bytes is str: conv_func = self.str_to_float else: @@ -69,9 +69,9 @@ class TestFormatHSV(PillowTestCase): new_bytes = b''.join(chr(h)+chr(s)+chr(v) for (h,s,v) in converted) else: new_bytes = b''.join(bytes(chr(h)+chr(s)+chr(v), 'latin-1') for (h,s,v) in converted) - + hsv = Image.frombytes(mode,r.size, new_bytes) - + return hsv def to_hsv_colorsys(self, im): @@ -87,7 +87,7 @@ class TestFormatHSV(PillowTestCase): #print (im.getpixel((448, 64))) #print (comparable.getpixel((448, 64))) - + #print(im.split()[0].histogram()) #print(comparable.split()[0].histogram()) @@ -110,25 +110,25 @@ class TestFormatHSV(PillowTestCase): #comparable.split()[0].show() #print (im.getpixel((192, 64))) #print (comparable.getpixel((192, 64))) - + self.assert_image_similar(im.split()[0], comparable.split()[0], 3, "R conversion is wrong") self.assert_image_similar(im.split()[1], comparable.split()[1], 3, "G conversion is wrong") self.assert_image_similar(im.split()[2], comparable.split()[2], 3, "B conversion is wrong") - - + + def test_convert(self): - im = lena('RGB').convert('HSV') - comparable = self.to_hsv_colorsys(lena('RGB')) + im = hopper('RGB').convert('HSV') + comparable = self.to_hsv_colorsys(hopper('RGB')) # print ([ord(x) for x in im.split()[0].tobytes()[:80]]) # print ([ord(x) for x in comparable.split()[0].tobytes()[:80]]) # print(im.split()[0].histogram()) # print(comparable.split()[0].histogram()) - + self.assert_image_similar(im.split()[0], comparable.split()[0], 1, "Hue conversion is wrong") self.assert_image_similar(im.split()[1], comparable.split()[1], @@ -138,10 +138,10 @@ class TestFormatHSV(PillowTestCase): def test_hsv_to_rgb(self): - comparable = self.to_hsv_colorsys(lena('RGB')) + comparable = self.to_hsv_colorsys(hopper('RGB')) converted = comparable.convert('RGB') comparable = self.to_rgb_colorsys(comparable) - + # print(converted.split()[1].histogram()) # print(target.split()[1].histogram()) @@ -156,8 +156,8 @@ class TestFormatHSV(PillowTestCase): self.assert_image_similar(converted.split()[2], comparable.split()[2], 3, "B conversion is wrong") - - + + diff --git a/Tests/test_image_array.py b/Tests/test_image_array.py index c5e49fc39..0899afd02 100644 --- a/Tests/test_image_array.py +++ b/Tests/test_image_array.py @@ -1,8 +1,8 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image -im = lena().resize((128, 100)) +im = hopper().resize((128, 100)) class TestImageArray(PillowTestCase): diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 01a80732b..8197a66e0 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image @@ -15,13 +15,13 @@ class TestImageConvert(PillowTestCase): modes = "1", "L", "I", "F", "RGB", "RGBA", "RGBX", "CMYK", "YCbCr" for mode in modes: - im = lena(mode) + im = hopper(mode) for mode in modes: convert(im, mode) def test_default(self): - im = lena("P") + im = hopper("P") self.assert_image(im, "P", im.size) im = im.convert() self.assert_image(im, "RGB", im.size) @@ -36,7 +36,7 @@ class TestImageConvert(PillowTestCase): self.assertEqual(orig, converted) def test_8bit(self): - im = Image.open('Tests/images/lena.jpg') + im = Image.open('Tests/images/hopper.jpg') self._test_float_conversion(im.convert('L')) def test_16bit(self): @@ -48,8 +48,8 @@ class TestImageConvert(PillowTestCase): self._test_float_conversion(im.convert('I')) def test_rgba_p(self): - im = lena('RGBA') - im.putalpha(lena('L')) + im = hopper('RGBA') + im.putalpha(hopper('L')) converted = im.convert('P') comparable = converted.convert('RGBA') @@ -57,7 +57,7 @@ class TestImageConvert(PillowTestCase): self.assert_image_similar(im, comparable, 20) def test_trns_p(self): - im = lena('P') + im = hopper('P') im.info['transparency'] = 0 f = self.tempfile('temp.png') @@ -74,7 +74,7 @@ class TestImageConvert(PillowTestCase): def test_trns_p_rgba(self): # Arrange - im = lena('P') + im = hopper('P') im.info['transparency'] = 128 # Act @@ -84,7 +84,7 @@ class TestImageConvert(PillowTestCase): self.assertNotIn('transparency', rgba.info) def test_trns_l(self): - im = lena('L') + im = hopper('L') im.info['transparency'] = 128 f = self.tempfile('temp.png') @@ -104,7 +104,7 @@ class TestImageConvert(PillowTestCase): p.save(f) def test_trns_RGB(self): - im = lena('RGB') + im = hopper('RGB') im.info['transparency'] = im.getpixel((0, 0)) f = self.tempfile('temp.png') diff --git a/Tests/test_image_copy.py b/Tests/test_image_copy.py index a7882db94..4b0905af3 100644 --- a/Tests/test_image_copy.py +++ b/Tests/test_image_copy.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image @@ -7,7 +7,7 @@ class TestImageCopy(PillowTestCase): def test_copy(self): def copy(mode): - im = lena(mode) + im = hopper(mode) out = im.copy() self.assertEqual(out.mode, mode) self.assertEqual(out.size, im.size) diff --git a/Tests/test_image_crop.py b/Tests/test_image_crop.py index da93fe7c8..29ff2bc2a 100644 --- a/Tests/test_image_crop.py +++ b/Tests/test_image_crop.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image @@ -7,7 +7,7 @@ class TestImageCrop(PillowTestCase): def test_crop(self): def crop(mode): - out = lena(mode).crop((50, 50, 100, 100)) + out = hopper(mode).crop((50, 50, 100, 100)) self.assertEqual(out.mode, mode) self.assertEqual(out.size, (50, 50)) for mode in "1", "P", "L", "RGB", "I", "F": diff --git a/Tests/test_image_draft.py b/Tests/test_image_draft.py index a76b8d266..c7cd90e95 100644 --- a/Tests/test_image_draft.py +++ b/Tests/test_image_draft.py @@ -3,8 +3,8 @@ from helper import unittest, PillowTestCase, fromstring, tostring from PIL import Image codecs = dir(Image.core) -filename = "Tests/images/lena.jpg" -data = tostring(Image.open(filename).resize((512, 512)), "JPEG") +fihopperme = "Tests/images/hopper.jpg" +data = tostring(Image.open(fihopperme).resize((512, 512)), "JPEG") def draft(mode, size): diff --git a/Tests/test_image_filter.py b/Tests/test_image_filter.py index 2452479cc..d29fd3dfd 100644 --- a/Tests/test_image_filter.py +++ b/Tests/test_image_filter.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image from PIL import ImageFilter @@ -9,7 +9,7 @@ class TestImageFilter(PillowTestCase): def test_sanity(self): def filter(filter): - im = lena("L") + im = hopper("L") out = im.filter(filter) self.assertEqual(out.mode, im.mode) self.assertEqual(out.size, im.size) diff --git a/Tests/test_image_frombytes.py b/Tests/test_image_frombytes.py index aad8046a1..3f9a2237f 100644 --- a/Tests/test_image_frombytes.py +++ b/Tests/test_image_frombytes.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image @@ -6,7 +6,7 @@ from PIL import Image class TestImageFromBytes(PillowTestCase): def test_sanity(self): - im1 = lena() + im1 = hopper() im2 = Image.frombytes(im1.mode, im1.size, im1.tobytes()) self.assert_image_equal(im1, im2) diff --git a/Tests/test_image_getbbox.py b/Tests/test_image_getbbox.py index 8d78195bd..3dc341aeb 100644 --- a/Tests/test_image_getbbox.py +++ b/Tests/test_image_getbbox.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image @@ -7,7 +7,7 @@ class TestImageGetBbox(PillowTestCase): def test_sanity(self): - bbox = lena().getbbox() + bbox = hopper().getbbox() self.assertIsInstance(bbox, tuple) def test_bbox(self): diff --git a/Tests/test_image_getcolors.py b/Tests/test_image_getcolors.py index d3e5a4989..f3586565a 100644 --- a/Tests/test_image_getcolors.py +++ b/Tests/test_image_getcolors.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper class TestImageGetColors(PillowTestCase): @@ -6,7 +6,7 @@ class TestImageGetColors(PillowTestCase): def test_getcolors(self): def getcolors(mode, limit=None): - im = lena(mode) + im = hopper(mode) if limit: colors = im.getcolors(limit) else: @@ -41,7 +41,7 @@ class TestImageGetColors(PillowTestCase): def test_pack(self): # Pack problems for small tables (@PIL209) - im = lena().quantize(3).convert("RGB") + im = hopper().quantize(3).convert("RGB") expected = [ (3236, (227, 183, 147)), diff --git a/Tests/test_image_getdata.py b/Tests/test_image_getdata.py index ff6659595..bc925420d 100644 --- a/Tests/test_image_getdata.py +++ b/Tests/test_image_getdata.py @@ -1,11 +1,11 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper class TestImageGetData(PillowTestCase): def test_sanity(self): - data = lena().getdata() + data = hopper().getdata() len(data) list(data) @@ -15,7 +15,7 @@ class TestImageGetData(PillowTestCase): def test_roundtrip(self): def getdata(mode): - im = lena(mode).resize((32, 30)) + im = hopper(mode).resize((32, 30)) data = im.getdata() return data[0], len(data), len(list(data)) diff --git a/Tests/test_image_getextrema.py b/Tests/test_image_getextrema.py index af7f7698a..066d563c4 100644 --- a/Tests/test_image_getextrema.py +++ b/Tests/test_image_getextrema.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper class TestImageGetExtrema(PillowTestCase): @@ -6,7 +6,7 @@ class TestImageGetExtrema(PillowTestCase): def test_extrema(self): def extrema(mode): - return lena(mode).getextrema() + return hopper(mode).getextrema() self.assertEqual(extrema("1"), (0, 255)) self.assertEqual(extrema("L"), (40, 235)) diff --git a/Tests/test_image_getim.py b/Tests/test_image_getim.py index d498d3923..e83439789 100644 --- a/Tests/test_image_getim.py +++ b/Tests/test_image_getim.py @@ -1,10 +1,10 @@ -from helper import unittest, PillowTestCase, lena, py3 +from helper import unittest, PillowTestCase, hopper, py3 class TestImageGetIm(PillowTestCase): def test_sanity(self): - im = lena() + im = hopper() type_repr = repr(type(im.getim())) if py3: diff --git a/Tests/test_image_getpalette.py b/Tests/test_image_getpalette.py index 0c399c432..1a673c73d 100644 --- a/Tests/test_image_getpalette.py +++ b/Tests/test_image_getpalette.py @@ -1,11 +1,11 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper class TestImageGetPalette(PillowTestCase): def test_palette(self): def palette(mode): - p = lena(mode).getpalette() + p = hopper(mode).getpalette() if p: return p[:10] return None diff --git a/Tests/test_image_getprojection.py b/Tests/test_image_getprojection.py index 262a21d4b..108c75b90 100644 --- a/Tests/test_image_getprojection.py +++ b/Tests/test_image_getprojection.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image @@ -7,7 +7,7 @@ class TestImageGetProjection(PillowTestCase): def test_sanity(self): - im = lena() + im = hopper() projection = im.getprojection() diff --git a/Tests/test_image_histogram.py b/Tests/test_image_histogram.py index 70f78a1fb..4bf8d2f80 100644 --- a/Tests/test_image_histogram.py +++ b/Tests/test_image_histogram.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper class TestImageHistogram(PillowTestCase): @@ -6,7 +6,7 @@ class TestImageHistogram(PillowTestCase): def test_histogram(self): def histogram(mode): - h = lena(mode).histogram() + h = hopper(mode).histogram() return len(h), min(h), max(h) self.assertEqual(histogram("1"), (256, 0, 8872)) diff --git a/Tests/test_image_mode.py b/Tests/test_image_mode.py index 74ed9b7aa..6441c7d1b 100644 --- a/Tests/test_image_mode.py +++ b/Tests/test_image_mode.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image @@ -7,7 +7,7 @@ class TestImageMode(PillowTestCase): def test_sanity(self): - im = lena() + im = hopper() im.mode from PIL import ImageMode diff --git a/Tests/test_image_offset.py b/Tests/test_image_offset.py index 09f12266f..e5fe0bf47 100644 --- a/Tests/test_image_offset.py +++ b/Tests/test_image_offset.py @@ -1,11 +1,11 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper class TestImageOffset(PillowTestCase): def test_offset(self): - im1 = lena() + im1 = hopper() im2 = self.assert_warning(DeprecationWarning, lambda: im1.offset(10)) self.assertEqual(im1.getpixel((0, 0)), im2.getpixel((10, 10))) diff --git a/Tests/test_image_point.py b/Tests/test_image_point.py index 04054fa84..ee0165d09 100644 --- a/Tests/test_image_point.py +++ b/Tests/test_image_point.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper import sys @@ -6,7 +6,7 @@ import sys class TestImagePoint(PillowTestCase): def test_sanity(self): - im = lena() + im = hopper() self.assertRaises(ValueError, lambda: im.point(list(range(256)))) im.point(list(range(256))*3) @@ -28,19 +28,19 @@ class TestImagePoint(PillowTestCase): # see https://github.com/python-pillow/Pillow/issues/484 #self.skipKnownBadTest(msg="Too Slow on pypy", interpreter='pypy') - im = lena("I") + im = hopper("I") im.point(list(range(256))*256, 'L') def test_f_lut(self): """ Tests for floating point lut of 8bit gray image """ - im = lena('L') + im = hopper('L') lut = [0.5 * float(x) for x in range(256)] out = im.point(lut, 'F') int_lut = [x//2 for x in range(256)] self.assert_image_equal(out.convert('L'), im.point(int_lut, 'L')) - + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_image_putdata.py b/Tests/test_image_putdata.py index acea0d62a..1535acf35 100644 --- a/Tests/test_image_putdata.py +++ b/Tests/test_image_putdata.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper import sys @@ -9,7 +9,7 @@ class TestImagePutData(PillowTestCase): def test_sanity(self): - im1 = lena() + im1 = hopper() data = list(im1.getdata()) @@ -47,7 +47,7 @@ class TestImagePutData(PillowTestCase): im.putdata(list(range(256))*256) def test_mode_i(self): - src = lena('L') + src = hopper('L') data = list(src.getdata()) im = Image.new('I', src.size, 0) im.putdata(data, 2, 256) @@ -56,7 +56,7 @@ class TestImagePutData(PillowTestCase): self.assertEqual(list(im.getdata()), target) def test_mode_F(self): - src = lena('L') + src = hopper('L') data = list(src.getdata()) im = Image.new('F', src.size, 0) im.putdata(data, 2.0, 256.0) @@ -64,7 +64,7 @@ class TestImagePutData(PillowTestCase): target = [2.0* float(elt) + 256.0 for elt in data] self.assertEqual(list(im.getdata()), target) - + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_image_putpalette.py b/Tests/test_image_putpalette.py index a77c1e565..a1f00c361 100644 --- a/Tests/test_image_putpalette.py +++ b/Tests/test_image_putpalette.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import ImagePalette @@ -7,7 +7,7 @@ class TestImagePutPalette(PillowTestCase): def test_putpalette(self): def palette(mode): - im = lena(mode).copy() + im = hopper(mode).copy() im.putpalette(list(range(256))*3) p = im.getpalette() if p: @@ -23,7 +23,7 @@ class TestImagePutPalette(PillowTestCase): self.assertRaises(ValueError, lambda: palette("YCbCr")) def test_imagepalette(self): - im = lena("P") + im = hopper("P") im.putpalette(ImagePalette.negative()) im.putpalette(ImagePalette.random()) im.putpalette(ImagePalette.sepia()) diff --git a/Tests/test_image_putpixel.py b/Tests/test_image_putpixel.py index a7f5dc2bb..418e9703c 100644 --- a/Tests/test_image_putpixel.py +++ b/Tests/test_image_putpixel.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image @@ -9,7 +9,7 @@ class TestImagePutPixel(PillowTestCase): def test_sanity(self): - im1 = lena() + im1 = hopper() im2 = Image.new(im1.mode, im1.size, 0) for y in range(im1.size[1]): diff --git a/Tests/test_image_quantize.py b/Tests/test_image_quantize.py index 2cbdac225..e8183eb48 100644 --- a/Tests/test_image_quantize.py +++ b/Tests/test_image_quantize.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image @@ -6,17 +6,17 @@ from PIL import Image class TestImageQuantize(PillowTestCase): def test_sanity(self): - im = lena() + im = hopper() im = im.quantize() self.assert_image(im, "P", im.size) - im = lena() - im = im.quantize(palette=lena("P")) + im = hopper() + im = im.quantize(palette=hopper("P")) self.assert_image(im, "P", im.size) def test_octree_quantize(self): - im = lena() + im = hopper() im = im.quantize(100, Image.FASTOCTREE) self.assert_image(im, "P", im.size) @@ -24,7 +24,7 @@ class TestImageQuantize(PillowTestCase): assert len(im.getcolors()) == 100 def test_rgba_quantize(self): - im = lena('RGBA') + im = hopper('RGBA') im.quantize() self.assertRaises(Exception, lambda: im.quantize(method=0)) diff --git a/Tests/test_image_resize.py b/Tests/test_image_resize.py index 6c9932e45..603f598d8 100644 --- a/Tests/test_image_resize.py +++ b/Tests/test_image_resize.py @@ -1,11 +1,11 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper class TestImageResize(PillowTestCase): def test_resize(self): def resize(mode, size): - out = lena(mode).resize(size) + out = hopper(mode).resize(size) self.assertEqual(out.mode, mode) self.assertEqual(out.size, size) for mode in "1", "P", "L", "RGB", "I", "F": diff --git a/Tests/test_image_rotate.py b/Tests/test_image_rotate.py index 531fdd63f..38391adae 100644 --- a/Tests/test_image_rotate.py +++ b/Tests/test_image_rotate.py @@ -1,11 +1,11 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper class TestImageRotate(PillowTestCase): def test_rotate(self): def rotate(mode): - im = lena(mode) + im = hopper(mode) out = im.rotate(45) self.assertEqual(out.mode, mode) self.assertEqual(out.size, im.size) # default rotate clips output diff --git a/Tests/test_image_split.py b/Tests/test_image_split.py index 343f4bf8e..0e057523b 100644 --- a/Tests/test_image_split.py +++ b/Tests/test_image_split.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image @@ -7,7 +7,7 @@ class TestImageSplit(PillowTestCase): def test_split(self): def split(mode): - layers = lena(mode).split() + layers = hopper(mode).split() return [(i.mode, i.size[0], i.size[1]) for i in layers] self.assertEqual(split("1"), [('1', 128, 128)]) self.assertEqual(split("L"), [('L', 128, 128)]) @@ -30,16 +30,16 @@ class TestImageSplit(PillowTestCase): def test_split_merge(self): def split_merge(mode): - return Image.merge(mode, lena(mode).split()) - self.assert_image_equal(lena("1"), split_merge("1")) - self.assert_image_equal(lena("L"), split_merge("L")) - self.assert_image_equal(lena("I"), split_merge("I")) - self.assert_image_equal(lena("F"), split_merge("F")) - self.assert_image_equal(lena("P"), split_merge("P")) - self.assert_image_equal(lena("RGB"), split_merge("RGB")) - self.assert_image_equal(lena("RGBA"), split_merge("RGBA")) - self.assert_image_equal(lena("CMYK"), split_merge("CMYK")) - self.assert_image_equal(lena("YCbCr"), split_merge("YCbCr")) + return Image.merge(mode, hopper(mode).split()) + self.assert_image_equal(hopper("1"), split_merge("1")) + self.assert_image_equal(hopper("L"), split_merge("L")) + self.assert_image_equal(hopper("I"), split_merge("I")) + self.assert_image_equal(hopper("F"), split_merge("F")) + self.assert_image_equal(hopper("P"), split_merge("P")) + self.assert_image_equal(hopper("RGB"), split_merge("RGB")) + self.assert_image_equal(hopper("RGBA"), split_merge("RGBA")) + self.assert_image_equal(hopper("CMYK"), split_merge("CMYK")) + self.assert_image_equal(hopper("YCbCr"), split_merge("YCbCr")) def test_split_open(self): codecs = dir(Image.core) @@ -50,7 +50,7 @@ class TestImageSplit(PillowTestCase): file = self.tempfile("temp.pcx") def split_open(mode): - lena(mode).save(file) + hopper(mode).save(file) im = Image.open(file) return len(im.split()) self.assertEqual(split_open("1"), 1) diff --git a/Tests/test_image_thumbnail.py b/Tests/test_image_thumbnail.py index ee49be43e..d4c676bbd 100644 --- a/Tests/test_image_thumbnail.py +++ b/Tests/test_image_thumbnail.py @@ -1,38 +1,38 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper class TestImageThumbnail(PillowTestCase): def test_sanity(self): - im = lena() + im = hopper() im.thumbnail((100, 100)) self.assert_image(im, im.mode, (100, 100)) def test_aspect(self): - im = lena() + im = hopper() im.thumbnail((100, 100)) self.assert_image(im, im.mode, (100, 100)) - im = lena().resize((128, 256)) + im = hopper().resize((128, 256)) im.thumbnail((100, 100)) self.assert_image(im, im.mode, (50, 100)) - im = lena().resize((128, 256)) + im = hopper().resize((128, 256)) im.thumbnail((50, 100)) self.assert_image(im, im.mode, (50, 100)) - im = lena().resize((256, 128)) + im = hopper().resize((256, 128)) im.thumbnail((100, 100)) self.assert_image(im, im.mode, (100, 50)) - im = lena().resize((256, 128)) + im = hopper().resize((256, 128)) im.thumbnail((100, 50)) self.assert_image(im, im.mode, (100, 50)) - im = lena().resize((128, 128)) + im = hopper().resize((128, 128)) im.thumbnail((100, 100)) self.assert_image(im, im.mode, (100, 100)) diff --git a/Tests/test_image_tobitmap.py b/Tests/test_image_tobitmap.py index 56b5ef001..e26a225c2 100644 --- a/Tests/test_image_tobitmap.py +++ b/Tests/test_image_tobitmap.py @@ -1,14 +1,14 @@ -from helper import unittest, PillowTestCase, lena, fromstring +from helper import unittest, PillowTestCase, hopper, fromstring class TestImageToBitmap(PillowTestCase): def test_sanity(self): - self.assertRaises(ValueError, lambda: lena().tobitmap()) - lena().convert("1").tobitmap() + self.assertRaises(ValueError, lambda: hopper().tobitmap()) + hopper().convert("1").tobitmap() - im1 = lena().convert("1") + im1 = hopper().convert("1") bitmap = im1.tobitmap() diff --git a/Tests/test_image_tobytes.py b/Tests/test_image_tobytes.py index 6dbf7d6f2..31a7e1722 100644 --- a/Tests/test_image_tobytes.py +++ b/Tests/test_image_tobytes.py @@ -1,10 +1,10 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper class TestImageToBytes(PillowTestCase): def test_sanity(self): - data = lena().tobytes() + data = hopper().tobytes() self.assertTrue(isinstance(data, bytes)) if __name__ == '__main__': diff --git a/Tests/test_image_transform.py b/Tests/test_image_transform.py index 42a3d78f3..885893bbe 100644 --- a/Tests/test_image_transform.py +++ b/Tests/test_image_transform.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image @@ -22,7 +22,7 @@ class TestImageTransform(PillowTestCase): im.transform((100, 100), transform) def test_extent(self): - im = lena('RGB') + im = hopper('RGB') (w, h) = im.size transformed = im.transform(im.size, Image.EXTENT, (0, 0, @@ -36,7 +36,7 @@ class TestImageTransform(PillowTestCase): def test_quad(self): # one simple quad transform, equivalent to scale & crop upper left quad - im = lena('RGB') + im = hopper('RGB') (w, h) = im.size transformed = im.transform(im.size, Image.QUAD, (0, 0, 0, h//2, @@ -49,8 +49,8 @@ class TestImageTransform(PillowTestCase): self.assert_image_equal(transformed, scaled) def test_mesh(self): - # this should be a checkerboard of halfsized lenas in ul, lr - im = lena('RGBA') + # this should be a checkerboard of halfsized hoppers in ul, lr + im = hopper('RGBA') (w, h) = im.size transformed = im.transform(im.size, Image.MESH, [((0, 0, w//2, h//2), # box diff --git a/Tests/test_image_transpose.py b/Tests/test_image_transpose.py index f13e54ee7..3e4257bc0 100644 --- a/Tests/test_image_transpose.py +++ b/Tests/test_image_transpose.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image @@ -13,7 +13,7 @@ class TestImageTranspose(PillowTestCase): def test_sanity(self): - im = lena() + im = hopper() im.transpose(FLIP_LEFT_RIGHT) im.transpose(FLIP_TOP_BOTTOM) @@ -24,7 +24,7 @@ class TestImageTranspose(PillowTestCase): def test_roundtrip(self): - im = lena() + im = hopper() def transpose(first, second): return im.transpose(first).transpose(second) diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index 78fb3427f..3556661ae 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena, fromstring, tostring +from helper import unittest, PillowTestCase, hopper, fromstring, tostring from io import BytesIO @@ -20,7 +20,7 @@ class TestImageFile(PillowTestCase): def roundtrip(format): - im = lena("L").resize((1000, 1000)) + im = hopper("L").resize((1000, 1000)) if format in ("MSP", "XBM"): im = im.convert("1") @@ -73,7 +73,7 @@ class TestImageFile(PillowTestCase): def test_safeblock(self): - im1 = lena() + im1 = hopper() if "zip_encoder" not in codecs: self.skipTest("PNG (zlib) encoder not available") diff --git a/Tests/test_imagefileio.py b/Tests/test_imagefileio.py index 32ee0bc5e..f18474403 100644 --- a/Tests/test_imagefileio.py +++ b/Tests/test_imagefileio.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena, tostring +from helper import unittest, PillowTestCase, hopper, tostring from PIL import Image from PIL import ImageFileIO @@ -19,7 +19,7 @@ class TestImageFileIo(PillowTestCase): def close(self): pass - im1 = lena() + im1 = hopper() io = ImageFileIO.ImageFileIO(DumbFile(tostring(im1, "PPM"))) diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index a4a94ca4d..0ffb14bfe 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import ImageOps @@ -14,65 +14,65 @@ class TestImageOps(PillowTestCase): def test_sanity(self): - ImageOps.autocontrast(lena("L")) - ImageOps.autocontrast(lena("RGB")) + ImageOps.autocontrast(hopper("L")) + ImageOps.autocontrast(hopper("RGB")) - ImageOps.autocontrast(lena("L"), cutoff=10) - ImageOps.autocontrast(lena("L"), ignore=[0, 255]) + ImageOps.autocontrast(hopper("L"), cutoff=10) + ImageOps.autocontrast(hopper("L"), ignore=[0, 255]) - ImageOps.colorize(lena("L"), (0, 0, 0), (255, 255, 255)) - ImageOps.colorize(lena("L"), "black", "white") + ImageOps.colorize(hopper("L"), (0, 0, 0), (255, 255, 255)) + ImageOps.colorize(hopper("L"), "black", "white") - ImageOps.crop(lena("L"), 1) - ImageOps.crop(lena("RGB"), 1) + ImageOps.crop(hopper("L"), 1) + ImageOps.crop(hopper("RGB"), 1) - ImageOps.deform(lena("L"), self.deformer) - ImageOps.deform(lena("RGB"), self.deformer) + ImageOps.deform(hopper("L"), self.deformer) + ImageOps.deform(hopper("RGB"), self.deformer) - ImageOps.equalize(lena("L")) - ImageOps.equalize(lena("RGB")) + ImageOps.equalize(hopper("L")) + ImageOps.equalize(hopper("RGB")) - ImageOps.expand(lena("L"), 1) - ImageOps.expand(lena("RGB"), 1) - ImageOps.expand(lena("L"), 2, "blue") - ImageOps.expand(lena("RGB"), 2, "blue") + ImageOps.expand(hopper("L"), 1) + ImageOps.expand(hopper("RGB"), 1) + ImageOps.expand(hopper("L"), 2, "blue") + ImageOps.expand(hopper("RGB"), 2, "blue") - ImageOps.fit(lena("L"), (128, 128)) - ImageOps.fit(lena("RGB"), (128, 128)) + ImageOps.fit(hopper("L"), (128, 128)) + ImageOps.fit(hopper("RGB"), (128, 128)) - ImageOps.flip(lena("L")) - ImageOps.flip(lena("RGB")) + ImageOps.flip(hopper("L")) + ImageOps.flip(hopper("RGB")) - ImageOps.grayscale(lena("L")) - ImageOps.grayscale(lena("RGB")) + ImageOps.grayscale(hopper("L")) + ImageOps.grayscale(hopper("RGB")) - ImageOps.invert(lena("L")) - ImageOps.invert(lena("RGB")) + ImageOps.invert(hopper("L")) + ImageOps.invert(hopper("RGB")) - ImageOps.mirror(lena("L")) - ImageOps.mirror(lena("RGB")) + ImageOps.mirror(hopper("L")) + ImageOps.mirror(hopper("RGB")) - ImageOps.posterize(lena("L"), 4) - ImageOps.posterize(lena("RGB"), 4) + ImageOps.posterize(hopper("L"), 4) + ImageOps.posterize(hopper("RGB"), 4) - ImageOps.solarize(lena("L")) - ImageOps.solarize(lena("RGB")) + ImageOps.solarize(hopper("L")) + ImageOps.solarize(hopper("RGB")) def test_1pxfit(self): # Division by zero in equalize if image is 1 pixel high - newimg = ImageOps.fit(lena("RGB").resize((1, 1)), (35, 35)) + newimg = ImageOps.fit(hopper("RGB").resize((1, 1)), (35, 35)) self.assertEqual(newimg.size, (35, 35)) - newimg = ImageOps.fit(lena("RGB").resize((1, 100)), (35, 35)) + newimg = ImageOps.fit(hopper("RGB").resize((1, 100)), (35, 35)) self.assertEqual(newimg.size, (35, 35)) - newimg = ImageOps.fit(lena("RGB").resize((100, 1)), (35, 35)) + newimg = ImageOps.fit(hopper("RGB").resize((100, 1)), (35, 35)) self.assertEqual(newimg.size, (35, 35)) def test_pil163(self): # Division by zero in equalize if < 255 pixels in image (@PIL163) - i = lena("RGB").resize((15, 16)) + i = hopper("RGB").resize((15, 16)) ImageOps.equalize(i.convert("L")) ImageOps.equalize(i.convert("P")) diff --git a/Tests/test_imageops_usm.py b/Tests/test_imageops_usm.py index be7a669da..ba65f211b 100644 --- a/Tests/test_imageops_usm.py +++ b/Tests/test_imageops_usm.py @@ -4,7 +4,7 @@ from PIL import Image from PIL import ImageOps from PIL import ImageFilter -im = Image.open("Tests/images/lena.ppm") +im = Image.open("Tests/images/hopper.ppm") class TestImageOpsUsm(PillowTestCase): diff --git a/Tests/test_imageqt.py b/Tests/test_imageqt.py index fd50bf320..cd26e0038 100644 --- a/Tests/test_imageqt.py +++ b/Tests/test_imageqt.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper try: from PIL import ImageQt @@ -44,7 +44,7 @@ class TestImageQt(PillowTestCase): def test_image(self): for mode in ('1', 'RGB', 'RGBA', 'L', 'P'): - ImageQt.ImageQt(lena(mode)) + ImageQt.ImageQt(hopper(mode)) if __name__ == '__main__': diff --git a/Tests/test_imagesequence.py b/Tests/test_imagesequence.py index 068290451..62a83cda6 100644 --- a/Tests/test_imagesequence.py +++ b/Tests/test_imagesequence.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image, ImageSequence, TiffImagePlugin @@ -9,7 +9,7 @@ class TestImageSequence(PillowTestCase): file = self.tempfile("temp.im") - im = lena("RGB") + im = hopper("RGB") im.save(file) seq = ImageSequence.Iterator(im) @@ -31,14 +31,14 @@ class TestImageSequence(PillowTestCase): self.assertEqual(index, im.tell()) frame.convert('RGB') Image.DEBUG=False - + def test_tiff(self): #self._test_multipage_tiff(True) self._test_multipage_tiff(False) def test_libtiff(self): codecs = dir(Image.core) - + if "libtiff_encoder" not in codecs or "libtiff_decoder" not in codecs: self.skipTest("tiff support not available") @@ -46,7 +46,7 @@ class TestImageSequence(PillowTestCase): #self._test_multipage_tiff(True) self._test_multipage_tiff(False) TiffImagePlugin.READ_LIBTIFF = False - + if __name__ == '__main__': unittest.main() diff --git a/Tests/test_imagestat.py b/Tests/test_imagestat.py index 4d30ff023..fbb96599a 100644 --- a/Tests/test_imagestat.py +++ b/Tests/test_imagestat.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image from PIL import ImageStat @@ -8,7 +8,7 @@ class TestImageStat(PillowTestCase): def test_sanity(self): - im = lena() + im = hopper() st = ImageStat.Stat(im) st = ImageStat.Stat(im.histogram()) @@ -28,9 +28,9 @@ class TestImageStat(PillowTestCase): self.assertRaises(TypeError, lambda: ImageStat.Stat(1)) - def test_lena(self): + def test_hopper(self): - im = lena() + im = hopper() st = ImageStat.Stat(im) diff --git a/Tests/test_locale.py b/Tests/test_locale.py index 9ef136bf9..e4fab1497 100644 --- a/Tests/test_locale.py +++ b/Tests/test_locale.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image @@ -19,7 +19,7 @@ import locale # one of string.whitespace is not freely convertable into ascii. -path = "Tests/images/lena.jpg" +path = "Tests/images/hopper.jpg" class TestLocale(PillowTestCase): diff --git a/Tests/test_mode_i16.py b/Tests/test_mode_i16.py index 0cd5dba0f..4c6c181a8 100644 --- a/Tests/test_mode_i16.py +++ b/Tests/test_mode_i16.py @@ -1,11 +1,11 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image class TestModeI16(PillowTestCase): - original = lena().resize((32,32)).convert('I') + original = hopper().resize((32,32)).convert('I') def verify(self, im1): im2 = self.original.copy() @@ -39,10 +39,10 @@ class TestModeI16(PillowTestCase): imOut = imIn.transform((w, h), Image.EXTENT, (0, 0, w, h)) self.verify(imOut) # transform - filename = self.tempfile("temp.im") - imIn.save(filename) + fihopperme = self.tempfile("temp.im") + imIn.save(fihopperme) - imOut = Image.open(filename) + imOut = Image.open(fihopperme) self.verify(imIn) self.verify(imOut) diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index 07c3e0c21..b00b8b36b 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -1,4 +1,4 @@ -from helper import unittest, PillowTestCase, lena +from helper import unittest, PillowTestCase, hopper from PIL import Image @@ -90,7 +90,7 @@ class TestNumpy(PillowTestCase): def test_to_array(self): def _to_array(mode, dtype): - img = lena(mode) + img = hopper(mode) np_img = numpy.array(img) self._test_img_equals_nparray(img, np_img) self.assertEqual(np_img.dtype, numpy.dtype(dtype)) @@ -117,7 +117,7 @@ class TestNumpy(PillowTestCase): data = list(range(256))*3 lut = numpy.array(data, dtype='uint8') - im = lena() + im = hopper() im.point(lut) diff --git a/Tests/test_pickle.py b/Tests/test_pickle.py index eae5eb671..595141cb7 100644 --- a/Tests/test_pickle.py +++ b/Tests/test_pickle.py @@ -6,20 +6,20 @@ from PIL import Image class TestPickle(PillowTestCase): def helper_pickle_file(self, pickle, protocol=0): - im = Image.open('Tests/images/lena.jpg') - filename = self.tempfile('temp.pkl') + im = Image.open('Tests/images/hopper.jpg') + fihopperme = self.tempfile('temp.pkl') # Act - with open(filename, 'wb') as f: + with open(fihopperme, 'wb') as f: pickle.dump(im, f, protocol) - with open(filename, 'rb') as f: + with open(fihopperme, 'rb') as f: loaded_im = pickle.load(f) # Assert self.assertEqual(im, loaded_im) def helper_pickle_string( - self, pickle, protocol=0, file='Tests/images/lena.jpg'): + self, pickle, protocol=0, file='Tests/images/hopper.jpg'): im = Image.open(file) # Act diff --git a/Tests/threaded_save.py b/Tests/threaded_save.py index 12fcff2cf..14ef42f17 100644 --- a/Tests/threaded_save.py +++ b/Tests/threaded_save.py @@ -9,7 +9,7 @@ try: except: format = "PNG" -im = Image.open("Tests/images/lena.ppm") +im = Image.open("Tests/images/hopper.ppm") im.load() queue = queue.Queue() From 19f13c2bdda4cb3e6eafcbf57547971d8da206a5 Mon Sep 17 00:00:00 2001 From: hugovk Date: Fri, 5 Sep 2014 13:04:26 +0300 Subject: [PATCH 05/11] Temporarily disable fail-fast so we can see all failures --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2ce1827e5..b89406fc0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,7 +39,7 @@ script: - coverage run --append --include=PIL/* selftest.py # FIXME: re-add -x option to fail fast # - coverage run --append --include=PIL/* -m nose -vx Tests/test_*.py - - coverage run --append --include=PIL/* -m nose -vx Tests/test_*.py + - coverage run --append --include=PIL/* -m nose -v Tests/test_*.py after_success: # gather the coverage data From 94da23ea3b2a7b71bc320fd1768e0c11e44d4c31 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 14 Sep 2014 20:00:13 +0300 Subject: [PATCH 06/11] Fix tests. test_trns_p() needed assert_image_similar() in place of assert_image_equal() --- Tests/test_file_png.py | 3 ++- Tests/test_image_getcolors.py | 27 +++++++++++++-------------- Tests/test_image_getdata.py | 18 +++++++++--------- Tests/test_image_getextrema.py | 14 +++++++------- Tests/test_image_histogram.py | 14 +++++++------- Tests/test_imagestat.py | 10 +++++----- 6 files changed, 43 insertions(+), 43 deletions(-) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 32dc10cd1..e4d495330 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -347,7 +347,8 @@ class TestFilePng(PillowTestCase): im2 = Image.open(f) self.assertIn('transparency', im2.info) - self.assert_image_equal(im2.convert('RGBA'), im.convert('RGBA')) + self.assert_image_similar(im2.convert('RGBA'), im.convert('RGBA'), + 16) def test_save_icc_profile_none(self): # check saving files with an ICC profile set to None (omit profile) diff --git a/Tests/test_image_getcolors.py b/Tests/test_image_getcolors.py index f3586565a..8886762c7 100644 --- a/Tests/test_image_getcolors.py +++ b/Tests/test_image_getcolors.py @@ -16,25 +16,25 @@ class TestImageGetColors(PillowTestCase): return None self.assertEqual(getcolors("1"), 2) - self.assertEqual(getcolors("L"), 193) - self.assertEqual(getcolors("I"), 193) - self.assertEqual(getcolors("F"), 193) - self.assertEqual(getcolors("P"), 54) # fixed palette + self.assertEqual(getcolors("L"), 255) + self.assertEqual(getcolors("I"), 255) + self.assertEqual(getcolors("F"), 255) + self.assertEqual(getcolors("P"), 90) # fixed palette self.assertEqual(getcolors("RGB"), None) self.assertEqual(getcolors("RGBA"), None) self.assertEqual(getcolors("CMYK"), None) self.assertEqual(getcolors("YCbCr"), None) self.assertEqual(getcolors("L", 128), None) - self.assertEqual(getcolors("L", 1024), 193) + self.assertEqual(getcolors("L", 1024), 255) self.assertEqual(getcolors("RGB", 8192), None) - self.assertEqual(getcolors("RGB", 16384), 14836) - self.assertEqual(getcolors("RGB", 100000), 14836) + self.assertEqual(getcolors("RGB", 16384), 10100) + self.assertEqual(getcolors("RGB", 100000), 10100) - self.assertEqual(getcolors("RGBA", 16384), 14836) - self.assertEqual(getcolors("CMYK", 16384), 14836) - self.assertEqual(getcolors("YCbCr", 16384), 11995) + self.assertEqual(getcolors("RGBA", 16384), 10100) + self.assertEqual(getcolors("CMYK", 16384), 10100) + self.assertEqual(getcolors("YCbCr", 16384), 9329) # -------------------------------------------------------------------- @@ -43,10 +43,9 @@ class TestImageGetColors(PillowTestCase): im = hopper().quantize(3).convert("RGB") - expected = [ - (3236, (227, 183, 147)), - (6297, (143, 84, 81)), - (6851, (208, 143, 112))] + expected = [(4039, (172, 166, 181)), + (4385, (124, 113, 134)), + (7960, (31, 20, 33))] A = im.getcolors(maxcolors=2) self.assertEqual(A, None) diff --git a/Tests/test_image_getdata.py b/Tests/test_image_getdata.py index bc925420d..89bfda895 100644 --- a/Tests/test_image_getdata.py +++ b/Tests/test_image_getdata.py @@ -10,7 +10,7 @@ class TestImageGetData(PillowTestCase): len(data) list(data) - self.assertEqual(data[0], (223, 162, 133)) + self.assertEqual(data[0], (20, 20, 70)) def test_roundtrip(self): @@ -19,14 +19,14 @@ class TestImageGetData(PillowTestCase): data = im.getdata() return data[0], len(data), len(list(data)) - self.assertEqual(getdata("1"), (255, 960, 960)) - self.assertEqual(getdata("L"), (176, 960, 960)) - self.assertEqual(getdata("I"), (176, 960, 960)) - self.assertEqual(getdata("F"), (176.0, 960, 960)) - self.assertEqual(getdata("RGB"), ((223, 162, 133), 960, 960)) - self.assertEqual(getdata("RGBA"), ((223, 162, 133, 255), 960, 960)) - self.assertEqual(getdata("CMYK"), ((32, 93, 122, 0), 960, 960)) - self.assertEqual(getdata("YCbCr"), ((176, 103, 160), 960, 960)) + self.assertEqual(getdata("1"), (0, 960, 960)) + self.assertEqual(getdata("L"), (25, 960, 960)) + self.assertEqual(getdata("I"), (25, 960, 960)) + self.assertEqual(getdata("F"), (25.0, 960, 960)) + self.assertEqual(getdata("RGB"), (((20, 20, 70), 960, 960))) + self.assertEqual(getdata("RGBA"), ((20, 20, 70, 255), 960, 960)) + self.assertEqual(getdata("CMYK"), ((235, 235, 185, 0), 960, 960)) + self.assertEqual(getdata("YCbCr"), ((25, 153, 123), 960, 960)) if __name__ == '__main__': diff --git a/Tests/test_image_getextrema.py b/Tests/test_image_getextrema.py index 066d563c4..84d932a98 100644 --- a/Tests/test_image_getextrema.py +++ b/Tests/test_image_getextrema.py @@ -9,16 +9,16 @@ class TestImageGetExtrema(PillowTestCase): return hopper(mode).getextrema() self.assertEqual(extrema("1"), (0, 255)) - self.assertEqual(extrema("L"), (40, 235)) - self.assertEqual(extrema("I"), (40, 235)) - self.assertEqual(extrema("F"), (40.0, 235.0)) - self.assertEqual(extrema("P"), (11, 218)) # fixed palette + self.assertEqual(extrema("L"), (0, 255)) + self.assertEqual(extrema("I"), (0, 255)) + self.assertEqual(extrema("F"), (0, 255)) + self.assertEqual(extrema("P"), (0, 225)) # fixed palette self.assertEqual( - extrema("RGB"), ((61, 255), (26, 234), (44, 223))) + extrema("RGB"), ((0, 255), (0, 255), (0, 255))) self.assertEqual( - extrema("RGBA"), ((61, 255), (26, 234), (44, 223), (255, 255))) + extrema("RGBA"), ((0, 255), (0, 255), (0, 255), (255, 255))) self.assertEqual( - extrema("CMYK"), ((0, 194), (21, 229), (32, 211), (0, 0))) + extrema("CMYK"), (((0, 255), (0, 255), (0, 255), (0, 0)))) if __name__ == '__main__': diff --git a/Tests/test_image_histogram.py b/Tests/test_image_histogram.py index 4bf8d2f80..aa849a138 100644 --- a/Tests/test_image_histogram.py +++ b/Tests/test_image_histogram.py @@ -9,15 +9,15 @@ class TestImageHistogram(PillowTestCase): h = hopper(mode).histogram() return len(h), min(h), max(h) - self.assertEqual(histogram("1"), (256, 0, 8872)) - self.assertEqual(histogram("L"), (256, 0, 199)) - self.assertEqual(histogram("I"), (256, 0, 199)) - self.assertEqual(histogram("F"), (256, 0, 199)) - self.assertEqual(histogram("P"), (256, 0, 2912)) - self.assertEqual(histogram("RGB"), (768, 0, 285)) + self.assertEqual(histogram("1"), (256, 0, 10994)) + self.assertEqual(histogram("L"), (256, 0, 638)) + self.assertEqual(histogram("I"), (256, 0, 638)) + self.assertEqual(histogram("F"), (256, 0, 638)) + self.assertEqual(histogram("P"), (256, 0, 1871)) + self.assertEqual(histogram("RGB"), (768, 4, 675)) self.assertEqual(histogram("RGBA"), (1024, 0, 16384)) self.assertEqual(histogram("CMYK"), (1024, 0, 16384)) - self.assertEqual(histogram("YCbCr"), (768, 0, 741)) + self.assertEqual(histogram("YCbCr"), (768, 0, 1908)) if __name__ == '__main__': diff --git a/Tests/test_imagestat.py b/Tests/test_imagestat.py index fbb96599a..4d5e42b3f 100644 --- a/Tests/test_imagestat.py +++ b/Tests/test_imagestat.py @@ -35,11 +35,11 @@ class TestImageStat(PillowTestCase): st = ImageStat.Stat(im) # verify a few values - self.assertEqual(st.extrema[0], (61, 255)) - self.assertEqual(st.median[0], 197) - self.assertEqual(st.sum[0], 2954416) - self.assertEqual(st.sum[1], 2027250) - self.assertEqual(st.sum[2], 1727331) + self.assertEqual(st.extrema[0], (0, 255)) + self.assertEqual(st.median[0], 72) + self.assertEqual(st.sum[0], 1470218) + self.assertEqual(st.sum[1], 1311896) + self.assertEqual(st.sum[2], 1563008) def test_constant(self): From f10bdf7cd10ba8001c4b13fc1c51c46821f91c34 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 14 Sep 2014 21:21:16 +0300 Subject: [PATCH 07/11] Fix test --- Tests/test_image_transform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/test_image_transform.py b/Tests/test_image_transform.py index 885893bbe..c4111d0b6 100644 --- a/Tests/test_image_transform.py +++ b/Tests/test_image_transform.py @@ -32,7 +32,7 @@ class TestImageTransform(PillowTestCase): scaled = im.resize((w*2, h*2), Image.BILINEAR).crop((0, 0, w, h)) # undone -- precision? - self.assert_image_similar(transformed, scaled, 10) + self.assert_image_similar(transformed, scaled, 23) def test_quad(self): # one simple quad transform, equivalent to scale & crop upper left quad From 337b2224381a96569e344e1ee7fa29d5d3282305 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 14 Sep 2014 21:44:29 +0300 Subject: [PATCH 08/11] Add note to lena()/hopper() functions --- Tests/helper.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Tests/helper.py b/Tests/helper.py index 34dafa645..3d875983e 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -180,6 +180,7 @@ def tostring(im, format, **options): return out.getvalue() +# Note: hopper() should be used in place of lena(), which will be removed. def hopper(mode="RGB", cache={}): from PIL import Image im = None @@ -200,6 +201,7 @@ def hopper(mode="RGB", cache={}): return im +# Note: hopper() should be used instead lena(), which will be removed. def lena(mode="RGB", cache={}): from PIL import Image im = None From ba696ab7f8eae98881e218667e573fc89905cf63 Mon Sep 17 00:00:00 2001 From: hugovk Date: Sun, 14 Sep 2014 21:46:55 +0300 Subject: [PATCH 09/11] Re-enable fail fast for tests --- .travis.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index b89406fc0..704c0d949 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,9 +37,7 @@ script: - CFLAGS="-coverage" python setup.py build_ext --inplace - coverage run --append --include=PIL/* selftest.py - # FIXME: re-add -x option to fail fast - # - coverage run --append --include=PIL/* -m nose -vx Tests/test_*.py - - coverage run --append --include=PIL/* -m nose -v Tests/test_*.py + - coverage run --append --include=PIL/* -m nose -vx Tests/test_*.py after_success: # gather the coverage data From bdf845d6df8dbc73af98ebb0f55d6754c27cec98 Mon Sep 17 00:00:00 2001 From: hugovk Date: Mon, 15 Sep 2014 08:59:28 +0300 Subject: [PATCH 10/11] Fix typo: fihopperme -> filename --- Tests/test_image_draft.py | 10 +++++----- Tests/test_mode_i16.py | 6 +++--- Tests/test_pickle.py | 7 ++++--- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/Tests/test_image_draft.py b/Tests/test_image_draft.py index c7cd90e95..68676687c 100644 --- a/Tests/test_image_draft.py +++ b/Tests/test_image_draft.py @@ -2,13 +2,13 @@ from helper import unittest, PillowTestCase, fromstring, tostring from PIL import Image -codecs = dir(Image.core) -fihopperme = "Tests/images/hopper.jpg" -data = tostring(Image.open(fihopperme).resize((512, 512)), "JPEG") +CODECS = dir(Image.core) +FILENAME = "Tests/images/hopper.jpg" +DATA = tostring(Image.open(FILENAME).resize((512, 512)), "JPEG") def draft(mode, size): - im = fromstring(data) + im = fromstring(DATA) im.draft(mode, size) return im @@ -16,7 +16,7 @@ def draft(mode, size): class TestImageDraft(PillowTestCase): def setUp(self): - if "jpeg_encoder" not in codecs or "jpeg_decoder" not in codecs: + if "jpeg_encoder" not in CODECS or "jpeg_decoder" not in CODECS: self.skipTest("jpeg support not available") def test_size(self): diff --git a/Tests/test_mode_i16.py b/Tests/test_mode_i16.py index 4c6c181a8..0bd2b9a86 100644 --- a/Tests/test_mode_i16.py +++ b/Tests/test_mode_i16.py @@ -39,10 +39,10 @@ class TestModeI16(PillowTestCase): imOut = imIn.transform((w, h), Image.EXTENT, (0, 0, w, h)) self.verify(imOut) # transform - fihopperme = self.tempfile("temp.im") - imIn.save(fihopperme) + filename = self.tempfile("temp.im") + imIn.save(filename) - imOut = Image.open(fihopperme) + imOut = Image.open(filename) self.verify(imIn) self.verify(imOut) diff --git a/Tests/test_pickle.py b/Tests/test_pickle.py index 595141cb7..59dfd5948 100644 --- a/Tests/test_pickle.py +++ b/Tests/test_pickle.py @@ -6,13 +6,14 @@ from PIL import Image class TestPickle(PillowTestCase): def helper_pickle_file(self, pickle, protocol=0): + # Arrange im = Image.open('Tests/images/hopper.jpg') - fihopperme = self.tempfile('temp.pkl') + filename = self.tempfile('temp.pkl') # Act - with open(fihopperme, 'wb') as f: + with open(filename, 'wb') as f: pickle.dump(im, f, protocol) - with open(fihopperme, 'rb') as f: + with open(filename, 'rb') as f: loaded_im = pickle.load(f) # Assert From af672b1d7e8a4545400777acdd6ce514f37d6cee Mon Sep 17 00:00:00 2001 From: wiredfool Date: Sat, 20 Sep 2014 10:27:52 -0700 Subject: [PATCH 11/11] Fix for handling P + transparency -> RGBA conversions --- PIL/Image.py | 10 ++++++++++ Tests/test_file_png.py | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/PIL/Image.py b/PIL/Image.py index 5e1416a33..058511b18 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -867,7 +867,17 @@ class Image: trns = trns_im.getpixel((0,0)) elif self.mode == 'P' and mode == 'RGBA': + t = self.info['transparency'] delete_trns = True + + if isinstance(t, bytes): + self.im.putpalettealphas(t) + elif isinstance(t, int): + self.im.putpalettealpha(t,0) + else: + raise ValueError("Transparency for P mode should" + + " be bytes or int") + if mode == "P" and palette == ADAPTIVE: im = self.im.quantize(colors) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index e4d495330..b8f5ceb08 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -347,8 +347,8 @@ class TestFilePng(PillowTestCase): im2 = Image.open(f) self.assertIn('transparency', im2.info) - self.assert_image_similar(im2.convert('RGBA'), im.convert('RGBA'), - 16) + self.assert_image_equal(im2.convert('RGBA'), + im.convert('RGBA')) def test_save_icc_profile_none(self): # check saving files with an ICC profile set to None (omit profile)