Skip to content

Commit

Permalink
Merge pull request #7743 from radarhere/type_hint_test_font
Browse files Browse the repository at this point in the history
  • Loading branch information
hugovk committed Jan 24, 2024
2 parents 1185fb8 + 4814bee commit be1508f
Show file tree
Hide file tree
Showing 8 changed files with 46 additions and 32 deletions.
4 changes: 2 additions & 2 deletions Tests/check_j2k_overflow.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
from __future__ import annotations

from pathlib import PosixPath
from pathlib import Path

import pytest

from PIL import Image


def test_j2k_overflow(tmp_path: PosixPath) -> None:
def test_j2k_overflow(tmp_path: Path) -> None:
im = Image.new("RGBA", (1024, 131584))
target = str(tmp_path / "temp.jpc")
with pytest.raises(OSError):
Expand Down
8 changes: 4 additions & 4 deletions Tests/check_large_memory.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from __future__ import annotations

import sys
from pathlib import PosixPath
from pathlib import Path
from types import ModuleType

import pytest
Expand Down Expand Up @@ -31,18 +31,18 @@
pytestmark = pytest.mark.skipif(sys.maxsize <= 2**32, reason="requires 64-bit system")


def _write_png(tmp_path: PosixPath, xdim: int, ydim: int) -> None:
def _write_png(tmp_path: Path, xdim: int, ydim: int) -> None:
f = str(tmp_path / "temp.png")
im = Image.new("L", (xdim, ydim), 0)
im.save(f)


def test_large(tmp_path: PosixPath) -> None:
def test_large(tmp_path: Path) -> None:
"""succeeded prepatch"""
_write_png(tmp_path, XDIM, YDIM)


def test_2gpx(tmp_path: PosixPath) -> None:
def test_2gpx(tmp_path: Path) -> None:
"""failed prepatch"""
_write_png(tmp_path, XDIM, XDIM)

Expand Down
8 changes: 4 additions & 4 deletions Tests/check_large_memory_numpy.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from __future__ import annotations

import sys
from pathlib import PosixPath
from pathlib import Path

import pytest

Expand All @@ -25,19 +25,19 @@
pytestmark = pytest.mark.skipif(sys.maxsize <= 2**32, reason="requires 64-bit system")


def _write_png(tmp_path: PosixPath, xdim: int, ydim: int) -> None:
def _write_png(tmp_path: Path, xdim: int, ydim: int) -> None:
dtype = np.uint8
a = np.zeros((xdim, ydim), dtype=dtype)
f = str(tmp_path / "temp.png")
im = Image.fromarray(a, "L")
im.save(f)


def test_large(tmp_path: PosixPath) -> None:
def test_large(tmp_path: Path) -> None:
"""succeeded prepatch"""
_write_png(tmp_path, XDIM, YDIM)


def test_2gpx(tmp_path: PosixPath) -> None:
def test_2gpx(tmp_path: Path) -> None:
"""failed prepatch"""
_write_png(tmp_path, XDIM, XDIM)
4 changes: 2 additions & 2 deletions Tests/test_font_bdf.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@
filename = "Tests/images/courB08.bdf"


def test_sanity():
def test_sanity() -> None:
with open(filename, "rb") as test_file:
font = BdfFontFile.BdfFontFile(test_file)

assert isinstance(font, FontFile.FontFile)
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)
4 changes: 2 additions & 2 deletions Tests/test_font_crash.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@


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")
Expand All @@ -18,7 +18,7 @@ def _fuzz_font(self, font):
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)
6 changes: 3 additions & 3 deletions Tests/test_font_leaks.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -20,7 +20,7 @@ def _test_font(self, font):
)

@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)

Expand All @@ -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)
21 changes: 12 additions & 9 deletions Tests/test_font_pcf.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from __future__ import annotations

import os
from pathlib import Path

import pytest

Expand All @@ -20,7 +21,7 @@
pytestmark = skip_unless_feature("zlib")


def save_font(request, tmp_path):
def save_font(request: pytest.FixtureRequest, tmp_path: Path) -> str:
with open(fontname, "rb") as test_file:
font = PcfFontFile.PcfFontFile(test_file)
assert isinstance(font, FontFile.FontFile)
Expand All @@ -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:
Expand All @@ -47,25 +48,25 @@ def delete_tempfile():
return tempname


def test_sanity(request, tmp_path):
def test_sanity(request: pytest.FixtureRequest, tmp_path: Path) -> 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)
# check the number of characters in the font
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: Path) -> None:
tempname = save_font(request, tmp_path)
font = ImageFont.load(tempname)
im = Image.new("L", (130, 30), "white")
Expand All @@ -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: Path) -> None:
tempname = save_font(request, tmp_path)
font = ImageFont.load(tempname)
for i in range(255):
Expand All @@ -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: Path, message: str | bytes
) -> None:
tempname = save_font(request, tmp_path)
font = ImageFont.load(tempname)
im = Image.new("L", (750, 30), "white")
Expand All @@ -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: Path) -> None:
message = "".join(chr(i + 1) for i in range(140, 232))
_test_high_characters(request, tmp_path, message)
# accept bytes instances.
Expand Down
23 changes: 17 additions & 6 deletions Tests/test_font_pcf_charsets.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from __future__ import annotations

import os
from pathlib import Path
from typing import TypedDict

import pytest

Expand All @@ -14,7 +16,14 @@

fontname = "Tests/fonts/ter-x20b.pcf"

charsets = {

class Charset(TypedDict):
glyph_count: int
message: str
image1: str


charsets: dict[str, Charset] = {
"iso8859-1": {
"glyph_count": 223,
"message": "hello, world",
Expand All @@ -36,7 +45,7 @@
pytestmark = skip_unless_feature("zlib")


def save_font(request, tmp_path, encoding):
def save_font(request: pytest.FixtureRequest, tmp_path: Path, encoding: str) -> str:
with open(fontname, "rb") as test_file:
font = PcfFontFile.PcfFontFile(test_file, encoding)
assert isinstance(font, FontFile.FontFile)
Expand All @@ -45,7 +54,7 @@ def save_font(request, tmp_path, encoding):

tempname = str(tmp_path / "temp.pil")

def delete_tempfile():
def delete_tempfile() -> None:
try:
os.remove(tempname[:-4] + ".pbm")
except OSError:
Expand All @@ -64,12 +73,12 @@ def delete_tempfile():


@pytest.mark.parametrize("encoding", ("iso8859-1", "iso8859-2", "cp1250"))
def test_sanity(request, tmp_path, encoding):
def test_sanity(request: pytest.FixtureRequest, tmp_path: Path, 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: Path, encoding: str) -> None:
tempname = save_font(request, tmp_path, encoding)
font = ImageFont.load(tempname)
im = Image.new("L", (150, 30), "white")
Expand All @@ -80,7 +89,9 @@ def test_draw(request, tmp_path, encoding):


@pytest.mark.parametrize("encoding", ("iso8859-1", "iso8859-2", "cp1250"))
def test_textsize(request, tmp_path, encoding):
def test_textsize(
request: pytest.FixtureRequest, tmp_path: Path, encoding: str
) -> None:
tempname = save_font(request, tmp_path, encoding)
font = ImageFont.load(tempname)
for i in range(255):
Expand Down

0 comments on commit be1508f

Please sign in to comment.