mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-10-31 16:07:30 +03:00 
			
		
		
		
	Merge pull request #8090 from radarhere/type_hints_tests
This commit is contained in:
		
						commit
						a49a42aeea
					
				|  | @ -174,12 +174,13 @@ def skip_unless_feature(feature: str) -> pytest.MarkDecorator: | ||||||
| def skip_unless_feature_version( | def skip_unless_feature_version( | ||||||
|     feature: str, required: str, reason: str | None = None |     feature: str, required: str, reason: str | None = None | ||||||
| ) -> pytest.MarkDecorator: | ) -> pytest.MarkDecorator: | ||||||
|     if not features.check(feature): |     version = features.version(feature) | ||||||
|  |     if version is None: | ||||||
|         return pytest.mark.skip(f"{feature} not available") |         return pytest.mark.skip(f"{feature} not available") | ||||||
|     if reason is None: |     if reason is None: | ||||||
|         reason = f"{feature} is older than {required}" |         reason = f"{feature} is older than {required}" | ||||||
|     version_required = parse_version(required) |     version_required = parse_version(required) | ||||||
|     version_available = parse_version(features.version(feature)) |     version_available = parse_version(version) | ||||||
|     return pytest.mark.skipif(version_available < version_required, reason=reason) |     return pytest.mark.skipif(version_available < version_required, reason=reason) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -189,12 +190,13 @@ def mark_if_feature_version( | ||||||
|     version_blacklist: str, |     version_blacklist: str, | ||||||
|     reason: str | None = None, |     reason: str | None = None, | ||||||
| ) -> pytest.MarkDecorator: | ) -> pytest.MarkDecorator: | ||||||
|     if not features.check(feature): |     version = features.version(feature) | ||||||
|  |     if version is None: | ||||||
|         return pytest.mark.pil_noop_mark() |         return pytest.mark.pil_noop_mark() | ||||||
|     if reason is None: |     if reason is None: | ||||||
|         reason = f"{feature} is {version_blacklist}" |         reason = f"{feature} is {version_blacklist}" | ||||||
|     version_required = parse_version(version_blacklist) |     version_required = parse_version(version_blacklist) | ||||||
|     version_available = parse_version(features.version(feature)) |     version_available = parse_version(version) | ||||||
|     if ( |     if ( | ||||||
|         version_available.major == version_required.major |         version_available.major == version_required.major | ||||||
|         and version_available.minor == version_required.minor |         and version_available.minor == version_required.minor | ||||||
|  | @ -220,16 +222,11 @@ class PillowLeakTestCase: | ||||||
|         from resource import RUSAGE_SELF, getrusage |         from resource import RUSAGE_SELF, getrusage | ||||||
| 
 | 
 | ||||||
|         mem = getrusage(RUSAGE_SELF).ru_maxrss |         mem = getrusage(RUSAGE_SELF).ru_maxrss | ||||||
|         if sys.platform == "darwin": |         # man 2 getrusage: | ||||||
|             # man 2 getrusage: |         #     ru_maxrss | ||||||
|             #     ru_maxrss |         # This is the maximum resident set size utilized | ||||||
|             # This is the maximum resident set size utilized (in bytes). |         # in bytes on macOS, in kilobytes on Linux | ||||||
|             return mem / 1024  # Kb |         return mem / 1024 if sys.platform == "darwin" else mem | ||||||
|         # linux |  | ||||||
|         # man 2 getrusage |  | ||||||
|         #        ru_maxrss (since Linux 2.6.32) |  | ||||||
|         #  This is the maximum resident set size used (in kilobytes). |  | ||||||
|         return mem  # Kb |  | ||||||
| 
 | 
 | ||||||
|     def _test_leak(self, core: Callable[[], None]) -> None: |     def _test_leak(self, core: Callable[[], None]) -> None: | ||||||
|         start_mem = self._get_mem_usage() |         start_mem = self._get_mem_usage() | ||||||
|  |  | ||||||
|  | @ -52,8 +52,9 @@ def test_write_animation_L(tmp_path: Path) -> None: | ||||||
|             assert_image_similar(im, orig.convert("RGBA"), 32.9) |             assert_image_similar(im, orig.convert("RGBA"), 32.9) | ||||||
| 
 | 
 | ||||||
|             if is_big_endian(): |             if is_big_endian(): | ||||||
|                 webp = parse_version(features.version_module("webp")) |                 version = features.version_module("webp") | ||||||
|                 if webp < parse_version("1.2.2"): |                 assert version is not None | ||||||
|  |                 if parse_version(version) < parse_version("1.2.2"): | ||||||
|                     pytest.skip("Fails with libwebp earlier than 1.2.2") |                     pytest.skip("Fails with libwebp earlier than 1.2.2") | ||||||
|             orig.seek(orig.n_frames - 1) |             orig.seek(orig.n_frames - 1) | ||||||
|             im.seek(im.n_frames - 1) |             im.seek(im.n_frames - 1) | ||||||
|  | @ -78,8 +79,9 @@ def test_write_animation_RGB(tmp_path: Path) -> None: | ||||||
| 
 | 
 | ||||||
|             # Compare second frame to original |             # Compare second frame to original | ||||||
|             if is_big_endian(): |             if is_big_endian(): | ||||||
|                 webp = parse_version(features.version_module("webp")) |                 version = features.version_module("webp") | ||||||
|                 if webp < parse_version("1.2.2"): |                 assert version is not None | ||||||
|  |                 if parse_version(version) < parse_version("1.2.2"): | ||||||
|                     pytest.skip("Fails with libwebp earlier than 1.2.2") |                     pytest.skip("Fails with libwebp earlier than 1.2.2") | ||||||
|             im.seek(1) |             im.seek(1) | ||||||
|             im.load() |             im.load() | ||||||
|  |  | ||||||
|  | @ -60,10 +60,13 @@ def test_sanity() -> None: | ||||||
|     assert list(map(type, v)) == [str, str, str, str] |     assert list(map(type, v)) == [str, str, str, str] | ||||||
| 
 | 
 | ||||||
|     # internal version number |     # internal version number | ||||||
|     assert re.search(r"\d+\.\d+(\.\d+)?$", features.version_module("littlecms2")) |     version = features.version_module("littlecms2") | ||||||
|  |     assert version is not None | ||||||
|  |     assert re.search(r"\d+\.\d+(\.\d+)?$", version) | ||||||
| 
 | 
 | ||||||
|     skip_missing() |     skip_missing() | ||||||
|     i = ImageCms.profileToProfile(hopper(), SRGB, SRGB) |     i = ImageCms.profileToProfile(hopper(), SRGB, SRGB) | ||||||
|  |     assert i is not None | ||||||
|     assert_image(i, "RGB", (128, 128)) |     assert_image(i, "RGB", (128, 128)) | ||||||
| 
 | 
 | ||||||
|     i = hopper() |     i = hopper() | ||||||
|  | @ -72,23 +75,27 @@ def test_sanity() -> None: | ||||||
| 
 | 
 | ||||||
|     t = ImageCms.buildTransform(SRGB, SRGB, "RGB", "RGB") |     t = ImageCms.buildTransform(SRGB, SRGB, "RGB", "RGB") | ||||||
|     i = ImageCms.applyTransform(hopper(), t) |     i = ImageCms.applyTransform(hopper(), t) | ||||||
|  |     assert i is not None | ||||||
|     assert_image(i, "RGB", (128, 128)) |     assert_image(i, "RGB", (128, 128)) | ||||||
| 
 | 
 | ||||||
|     with hopper() as i: |     with hopper() as i: | ||||||
|         t = ImageCms.buildTransform(SRGB, SRGB, "RGB", "RGB") |         t = ImageCms.buildTransform(SRGB, SRGB, "RGB", "RGB") | ||||||
|         ImageCms.applyTransform(hopper(), t, inPlace=True) |         ImageCms.applyTransform(hopper(), t, inPlace=True) | ||||||
|  |         assert i is not None | ||||||
|         assert_image(i, "RGB", (128, 128)) |         assert_image(i, "RGB", (128, 128)) | ||||||
| 
 | 
 | ||||||
|     p = ImageCms.createProfile("sRGB") |     p = ImageCms.createProfile("sRGB") | ||||||
|     o = ImageCms.getOpenProfile(SRGB) |     o = ImageCms.getOpenProfile(SRGB) | ||||||
|     t = ImageCms.buildTransformFromOpenProfiles(p, o, "RGB", "RGB") |     t = ImageCms.buildTransformFromOpenProfiles(p, o, "RGB", "RGB") | ||||||
|     i = ImageCms.applyTransform(hopper(), t) |     i = ImageCms.applyTransform(hopper(), t) | ||||||
|  |     assert i is not None | ||||||
|     assert_image(i, "RGB", (128, 128)) |     assert_image(i, "RGB", (128, 128)) | ||||||
| 
 | 
 | ||||||
|     t = ImageCms.buildProofTransform(SRGB, SRGB, SRGB, "RGB", "RGB") |     t = ImageCms.buildProofTransform(SRGB, SRGB, SRGB, "RGB", "RGB") | ||||||
|     assert t.inputMode == "RGB" |     assert t.inputMode == "RGB" | ||||||
|     assert t.outputMode == "RGB" |     assert t.outputMode == "RGB" | ||||||
|     i = ImageCms.applyTransform(hopper(), t) |     i = ImageCms.applyTransform(hopper(), t) | ||||||
|  |     assert i is not None | ||||||
|     assert_image(i, "RGB", (128, 128)) |     assert_image(i, "RGB", (128, 128)) | ||||||
| 
 | 
 | ||||||
|     # test PointTransform convenience API |     # test PointTransform convenience API | ||||||
|  | @ -260,7 +267,7 @@ def test_simple_lab() -> None: | ||||||
|     t = ImageCms.buildTransform(psRGB, pLab, "RGB", "LAB") |     t = ImageCms.buildTransform(psRGB, pLab, "RGB", "LAB") | ||||||
| 
 | 
 | ||||||
|     i_lab = ImageCms.applyTransform(i, t) |     i_lab = ImageCms.applyTransform(i, t) | ||||||
| 
 |     assert i_lab is not None | ||||||
|     assert i_lab.mode == "LAB" |     assert i_lab.mode == "LAB" | ||||||
| 
 | 
 | ||||||
|     k = i_lab.getpixel((0, 0)) |     k = i_lab.getpixel((0, 0)) | ||||||
|  | @ -284,6 +291,7 @@ def test_lab_color() -> None: | ||||||
|     # Need to add a type mapping for some PIL type to TYPE_Lab_8 in findLCMSType, and |     # Need to add a type mapping for some PIL type to TYPE_Lab_8 in findLCMSType, and | ||||||
|     # have that mapping work back to a PIL mode (likely RGB). |     # have that mapping work back to a PIL mode (likely RGB). | ||||||
|     i = ImageCms.applyTransform(hopper(), t) |     i = ImageCms.applyTransform(hopper(), t) | ||||||
|  |     assert i is not None | ||||||
|     assert_image(i, "LAB", (128, 128)) |     assert_image(i, "LAB", (128, 128)) | ||||||
| 
 | 
 | ||||||
|     # i.save('temp.lab.tif')  # visually verified vs PS. |     # i.save('temp.lab.tif')  # visually verified vs PS. | ||||||
|  | @ -298,6 +306,7 @@ def test_lab_srgb() -> None: | ||||||
| 
 | 
 | ||||||
|     with Image.open("Tests/images/hopper.Lab.tif") as img: |     with Image.open("Tests/images/hopper.Lab.tif") as img: | ||||||
|         img_srgb = ImageCms.applyTransform(img, t) |         img_srgb = ImageCms.applyTransform(img, t) | ||||||
|  |     assert img_srgb is not None | ||||||
| 
 | 
 | ||||||
|     # img_srgb.save('temp.srgb.tif') # visually verified vs ps. |     # img_srgb.save('temp.srgb.tif') # visually verified vs ps. | ||||||
| 
 | 
 | ||||||
|  | @ -317,11 +326,11 @@ def test_lab_roundtrip() -> None: | ||||||
|     t2 = ImageCms.buildTransform(pLab, psRGB, "LAB", "RGB") |     t2 = ImageCms.buildTransform(pLab, psRGB, "LAB", "RGB") | ||||||
| 
 | 
 | ||||||
|     i = ImageCms.applyTransform(hopper(), t) |     i = ImageCms.applyTransform(hopper(), t) | ||||||
| 
 |     assert i is not None | ||||||
|     assert i.info["icc_profile"] == ImageCmsProfile(pLab).tobytes() |     assert i.info["icc_profile"] == ImageCmsProfile(pLab).tobytes() | ||||||
| 
 | 
 | ||||||
|     out = ImageCms.applyTransform(i, t2) |     out = ImageCms.applyTransform(i, t2) | ||||||
| 
 |     assert out is not None | ||||||
|     assert_image_similar(hopper(), out, 2) |     assert_image_similar(hopper(), out, 2) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -657,7 +666,7 @@ def test_auxiliary_channels_isolated() -> None: | ||||||
|                 reference_image = ImageCms.applyTransform( |                 reference_image = ImageCms.applyTransform( | ||||||
|                     source_image.convert(src_format[2]), reference_transform |                     source_image.convert(src_format[2]), reference_transform | ||||||
|                 ) |                 ) | ||||||
| 
 |                 assert reference_image is not None | ||||||
|                 assert_image_equal(test_image.convert(dst_format[2]), reference_image) |                 assert_image_equal(test_image.convert(dst_format[2]), reference_image) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -202,6 +202,8 @@ class TestImageFile: | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class MockPyDecoder(ImageFile.PyDecoder): | class MockPyDecoder(ImageFile.PyDecoder): | ||||||
|  |     last: MockPyDecoder | ||||||
|  | 
 | ||||||
|     def __init__(self, mode: str, *args: Any) -> None: |     def __init__(self, mode: str, *args: Any) -> None: | ||||||
|         MockPyDecoder.last = self |         MockPyDecoder.last = self | ||||||
| 
 | 
 | ||||||
|  | @ -213,6 +215,8 @@ class MockPyDecoder(ImageFile.PyDecoder): | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class MockPyEncoder(ImageFile.PyEncoder): | class MockPyEncoder(ImageFile.PyEncoder): | ||||||
|  |     last: MockPyEncoder | None | ||||||
|  | 
 | ||||||
|     def __init__(self, mode: str, *args: Any) -> None: |     def __init__(self, mode: str, *args: Any) -> None: | ||||||
|         MockPyEncoder.last = self |         MockPyEncoder.last = self | ||||||
| 
 | 
 | ||||||
|  | @ -315,6 +319,7 @@ class TestPyEncoder(CodecsTest): | ||||||
|             im, fp, [("MOCK", (xoff, yoff, xoff + xsize, yoff + ysize), 0, "RGB")] |             im, fp, [("MOCK", (xoff, yoff, xoff + xsize, yoff + ysize), 0, "RGB")] | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|  |         assert MockPyEncoder.last | ||||||
|         assert MockPyEncoder.last.state.xoff == xoff |         assert MockPyEncoder.last.state.xoff == xoff | ||||||
|         assert MockPyEncoder.last.state.yoff == yoff |         assert MockPyEncoder.last.state.yoff == yoff | ||||||
|         assert MockPyEncoder.last.state.xsize == xsize |         assert MockPyEncoder.last.state.xsize == xsize | ||||||
|  | @ -329,6 +334,7 @@ class TestPyEncoder(CodecsTest): | ||||||
|         fp = BytesIO() |         fp = BytesIO() | ||||||
|         ImageFile._save(im, fp, [("MOCK", None, 0, "RGB")]) |         ImageFile._save(im, fp, [("MOCK", None, 0, "RGB")]) | ||||||
| 
 | 
 | ||||||
|  |         assert MockPyEncoder.last | ||||||
|         assert MockPyEncoder.last.state.xoff == 0 |         assert MockPyEncoder.last.state.xoff == 0 | ||||||
|         assert MockPyEncoder.last.state.yoff == 0 |         assert MockPyEncoder.last.state.yoff == 0 | ||||||
|         assert MockPyEncoder.last.state.xsize == 200 |         assert MockPyEncoder.last.state.xsize == 200 | ||||||
|  |  | ||||||
|  | @ -34,7 +34,9 @@ pytestmark = skip_unless_feature("freetype2") | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def test_sanity() -> None: | def test_sanity() -> None: | ||||||
|     assert re.search(r"\d+\.\d+\.\d+$", features.version_module("freetype2")) |     version = features.version_module("freetype2") | ||||||
|  |     assert version is not None | ||||||
|  |     assert re.search(r"\d+\.\d+\.\d+$", version) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @pytest.fixture( | @pytest.fixture( | ||||||
|  | @ -547,11 +549,10 @@ def test_find_font( | ||||||
|             def loadable_font( |             def loadable_font( | ||||||
|                 filepath: str, size: int, index: int, encoding: str, *args: Any |                 filepath: str, size: int, index: int, encoding: str, *args: Any | ||||||
|             ): |             ): | ||||||
|  |                 _freeTypeFont = getattr(ImageFont, "_FreeTypeFont") | ||||||
|                 if filepath == path_to_fake: |                 if filepath == path_to_fake: | ||||||
|                     return ImageFont._FreeTypeFont( |                     return _freeTypeFont(FONT_PATH, size, index, encoding, *args) | ||||||
|                         FONT_PATH, size, index, encoding, *args |                 return _freeTypeFont(filepath, size, index, encoding, *args) | ||||||
|                     ) |  | ||||||
|                 return ImageFont._FreeTypeFont(filepath, size, index, encoding, *args) |  | ||||||
| 
 | 
 | ||||||
|             m.setattr(ImageFont, "FreeTypeFont", loadable_font) |             m.setattr(ImageFont, "FreeTypeFont", loadable_font) | ||||||
|             font = ImageFont.truetype(fontname) |             font = ImageFont.truetype(fontname) | ||||||
|  | @ -630,7 +631,9 @@ def test_complex_font_settings() -> None: | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def test_variation_get(font: ImageFont.FreeTypeFont) -> None: | def test_variation_get(font: ImageFont.FreeTypeFont) -> None: | ||||||
|     freetype = parse_version(features.version_module("freetype2")) |     version = features.version_module("freetype2") | ||||||
|  |     assert version is not None | ||||||
|  |     freetype = parse_version(version) | ||||||
|     if freetype < parse_version("2.9.1"): |     if freetype < parse_version("2.9.1"): | ||||||
|         with pytest.raises(NotImplementedError): |         with pytest.raises(NotImplementedError): | ||||||
|             font.get_variation_names() |             font.get_variation_names() | ||||||
|  | @ -700,7 +703,9 @@ def _check_text(font: ImageFont.FreeTypeFont, path: str, epsilon: float) -> None | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def test_variation_set_by_name(font: ImageFont.FreeTypeFont) -> None: | def test_variation_set_by_name(font: ImageFont.FreeTypeFont) -> None: | ||||||
|     freetype = parse_version(features.version_module("freetype2")) |     version = features.version_module("freetype2") | ||||||
|  |     assert version is not None | ||||||
|  |     freetype = parse_version(version) | ||||||
|     if freetype < parse_version("2.9.1"): |     if freetype < parse_version("2.9.1"): | ||||||
|         with pytest.raises(NotImplementedError): |         with pytest.raises(NotImplementedError): | ||||||
|             font.set_variation_by_name("Bold") |             font.set_variation_by_name("Bold") | ||||||
|  | @ -725,7 +730,9 @@ def test_variation_set_by_name(font: ImageFont.FreeTypeFont) -> None: | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def test_variation_set_by_axes(font: ImageFont.FreeTypeFont) -> None: | def test_variation_set_by_axes(font: ImageFont.FreeTypeFont) -> None: | ||||||
|     freetype = parse_version(features.version_module("freetype2")) |     version = features.version_module("freetype2") | ||||||
|  |     assert version is not None | ||||||
|  |     freetype = parse_version(version) | ||||||
|     if freetype < parse_version("2.9.1"): |     if freetype < parse_version("2.9.1"): | ||||||
|         with pytest.raises(NotImplementedError): |         with pytest.raises(NotImplementedError): | ||||||
|             font.set_variation_by_axes([100]) |             font.set_variation_by_axes([100]) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user