Added type hints

This commit is contained in:
Andrew Murray 2024-01-22 18:42:43 +11:00
parent 1185fb8296
commit a09e056a4c
5 changed files with 53 additions and 41 deletions

View File

@ -7,7 +7,7 @@ from PIL import BdfFontFile, FontFile
filename = "Tests/images/courB08.bdf"
def test_sanity():
def test_sanity() -> None:
with open(filename, "rb") as test_file:
font = BdfFontFile.BdfFontFile(test_file)
@ -15,7 +15,7 @@ def test_sanity():
assert len([_f for _f in font.glyph if _f]) == 190
def test_invalid_file():
def test_invalid_file() -> None:
with open("Tests/images/flower.jpg", "rb") as fp:
with pytest.raises(SyntaxError):
BdfFontFile.BdfFontFile(fp)

View File

@ -8,7 +8,7 @@ from .helper import skip_unless_feature
class TestFontCrash:
def _fuzz_font(self, font):
def _fuzz_font(self, font: ImageFont.FreeTypeFont) -> None:
# from fuzzers.fuzz_font
font.getbbox("ABC")
font.getmask("test text")
@ -18,7 +18,7 @@ class TestFontCrash:
draw.text((10, 10), "Test Text", font=font, fill="#000")
@skip_unless_feature("freetype2")
def test_segfault(self):
def test_segfault(self) -> None:
with pytest.raises(OSError):
font = ImageFont.truetype("Tests/fonts/fuzz_font-5203009437302784")
self._fuzz_font(font)

View File

@ -10,7 +10,7 @@ class TestTTypeFontLeak(PillowLeakTestCase):
iterations = 10
mem_limit = 4096 # k
def _test_font(self, font):
def _test_font(self, font: ImageFont.FreeTypeFont) -> None:
im = Image.new("RGB", (255, 255), "white")
draw = ImageDraw.ImageDraw(im)
self._test_leak(
@ -20,7 +20,7 @@ class TestTTypeFontLeak(PillowLeakTestCase):
)
@skip_unless_feature("freetype2")
def test_leak(self):
def test_leak(self) -> None:
ttype = ImageFont.truetype("Tests/fonts/FreeMono.ttf", 20)
self._test_font(ttype)
@ -30,6 +30,6 @@ class TestDefaultFontLeak(TestTTypeFontLeak):
iterations = 100
mem_limit = 1024 # k
def test_leak(self):
def test_leak(self) -> None:
default_font = ImageFont.load_default()
self._test_font(default_font)

View File

@ -1,6 +1,7 @@
from __future__ import annotations
import os
from pathlib import PosixPath
import pytest
@ -20,7 +21,7 @@ message = "hello, world"
pytestmark = skip_unless_feature("zlib")
def save_font(request, tmp_path):
def save_font(request: pytest.FixtureRequest, tmp_path: PosixPath) -> str:
with open(fontname, "rb") as test_file:
font = PcfFontFile.PcfFontFile(test_file)
assert isinstance(font, FontFile.FontFile)
@ -29,7 +30,7 @@ def save_font(request, tmp_path):
tempname = str(tmp_path / "temp.pil")
def delete_tempfile():
def delete_tempfile() -> None:
try:
os.remove(tempname[:-4] + ".pbm")
except OSError:
@ -47,11 +48,11 @@ def save_font(request, tmp_path):
return tempname
def test_sanity(request, tmp_path):
def test_sanity(request: pytest.FixtureRequest, tmp_path: PosixPath) -> None:
save_font(request, tmp_path)
def test_less_than_256_characters():
def test_less_than_256_characters() -> None:
with open("Tests/fonts/10x20-ISO8859-1-fewer-characters.pcf", "rb") as test_file:
font = PcfFontFile.PcfFontFile(test_file)
assert isinstance(font, FontFile.FontFile)
@ -59,13 +60,13 @@ def test_less_than_256_characters():
assert len([_f for _f in font.glyph if _f]) == 127
def test_invalid_file():
def test_invalid_file() -> None:
with open("Tests/images/flower.jpg", "rb") as fp:
with pytest.raises(SyntaxError):
PcfFontFile.PcfFontFile(fp)
def test_draw(request, tmp_path):
def test_draw(request: pytest.FixtureRequest, tmp_path: PosixPath) -> None:
tempname = save_font(request, tmp_path)
font = ImageFont.load(tempname)
im = Image.new("L", (130, 30), "white")
@ -74,7 +75,7 @@ def test_draw(request, tmp_path):
assert_image_similar_tofile(im, "Tests/images/test_draw_pbm_target.png", 0)
def test_textsize(request, tmp_path):
def test_textsize(request: pytest.FixtureRequest, tmp_path: PosixPath) -> None:
tempname = save_font(request, tmp_path)
font = ImageFont.load(tempname)
for i in range(255):
@ -90,7 +91,9 @@ def test_textsize(request, tmp_path):
assert font.getbbox(msg) == (0, 0, len(msg) * 10, 20)
def _test_high_characters(request, tmp_path, message):
def _test_high_characters(
request: pytest.FixtureRequest, tmp_path: PosixPath, message: str | bytes
) -> None:
tempname = save_font(request, tmp_path)
font = ImageFont.load(tempname)
im = Image.new("L", (750, 30), "white")
@ -99,7 +102,7 @@ def _test_high_characters(request, tmp_path, message):
assert_image_similar_tofile(im, "Tests/images/high_ascii_chars.png", 0)
def test_high_characters(request, tmp_path):
def test_high_characters(request: pytest.FixtureRequest, tmp_path: PosixPath) -> None:
message = "".join(chr(i + 1) for i in range(140, 232))
_test_high_characters(request, tmp_path, message)
# accept bytes instances.

View File

@ -1,6 +1,7 @@
from __future__ import annotations
import os
from pathlib import PosixPath
import pytest
@ -14,38 +15,40 @@ from .helper import (
fontname = "Tests/fonts/ter-x20b.pcf"
charsets = {
"iso8859-1": {
"glyph_count": 223,
"message": "hello, world",
"image1": "Tests/images/test_draw_pbm_ter_en_target.png",
},
"iso8859-2": {
"glyph_count": 223,
"message": "witaj świecie",
"image1": "Tests/images/test_draw_pbm_ter_pl_target.png",
},
"cp1250": {
"glyph_count": 250,
"message": "witaj świecie",
"image1": "Tests/images/test_draw_pbm_ter_pl_target.png",
},
charsets: dict[str, tuple[int, str, str]] = {
"iso8859-1": (
223,
"hello, world",
"Tests/images/test_draw_pbm_ter_en_target.png",
),
"iso8859-2": (
223,
"witaj świecie",
"Tests/images/test_draw_pbm_ter_pl_target.png",
),
"cp1250": (
250,
"witaj świecie",
"Tests/images/test_draw_pbm_ter_pl_target.png",
),
}
pytestmark = skip_unless_feature("zlib")
def save_font(request, tmp_path, encoding):
def save_font(
request: pytest.FixtureRequest, tmp_path: PosixPath, encoding: str
) -> str:
with open(fontname, "rb") as test_file:
font = PcfFontFile.PcfFontFile(test_file, encoding)
assert isinstance(font, FontFile.FontFile)
# check the number of characters in the font
assert len([_f for _f in font.glyph if _f]) == charsets[encoding]["glyph_count"]
assert len([_f for _f in font.glyph if _f]) == charsets[encoding][0]
tempname = str(tmp_path / "temp.pil")
def delete_tempfile():
def delete_tempfile() -> None:
try:
os.remove(tempname[:-4] + ".pbm")
except OSError:
@ -64,23 +67,29 @@ def save_font(request, tmp_path, encoding):
@pytest.mark.parametrize("encoding", ("iso8859-1", "iso8859-2", "cp1250"))
def test_sanity(request, tmp_path, encoding):
def test_sanity(
request: pytest.FixtureRequest, tmp_path: PosixPath, encoding: str
) -> None:
save_font(request, tmp_path, encoding)
@pytest.mark.parametrize("encoding", ("iso8859-1", "iso8859-2", "cp1250"))
def test_draw(request, tmp_path, encoding):
def test_draw(
request: pytest.FixtureRequest, tmp_path: PosixPath, encoding: str
) -> None:
tempname = save_font(request, tmp_path, encoding)
font = ImageFont.load(tempname)
im = Image.new("L", (150, 30), "white")
draw = ImageDraw.Draw(im)
message = charsets[encoding]["message"].encode(encoding)
message = charsets[encoding][1].encode(encoding)
draw.text((0, 0), message, "black", font=font)
assert_image_similar_tofile(im, charsets[encoding]["image1"], 0)
assert_image_similar_tofile(im, charsets[encoding][2], 0)
@pytest.mark.parametrize("encoding", ("iso8859-1", "iso8859-2", "cp1250"))
def test_textsize(request, tmp_path, encoding):
def test_textsize(
request: pytest.FixtureRequest, tmp_path: PosixPath, encoding: str
) -> None:
tempname = save_font(request, tmp_path, encoding)
font = ImageFont.load(tempname)
for i in range(255):
@ -90,7 +99,7 @@ def test_textsize(request, tmp_path, encoding):
assert dy == 20
assert dx in (0, 10)
assert font.getlength(bytearray([i])) == dx
message = charsets[encoding]["message"].encode(encoding)
message = charsets[encoding][1].encode(encoding)
for i in range(len(message)):
msg = message[: i + 1]
assert font.getlength(msg) == len(msg) * 10