mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-03-23 19:44:13 +03:00
Merge pull request #6968 from akx/pytest-style
Fix up some pytest style issues
This commit is contained in:
commit
1457d2c146
|
@ -177,13 +177,14 @@ class TestEnvVars:
|
||||||
Image._apply_env_variables({"PILLOW_BLOCK_SIZE": "2m"})
|
Image._apply_env_variables({"PILLOW_BLOCK_SIZE": "2m"})
|
||||||
assert Image.core.get_block_size() == 2 * 1024 * 1024
|
assert Image.core.get_block_size() == 2 * 1024 * 1024
|
||||||
|
|
||||||
def test_warnings(self):
|
@pytest.mark.parametrize(
|
||||||
pytest.warns(
|
"var",
|
||||||
UserWarning, Image._apply_env_variables, {"PILLOW_ALIGNMENT": "15"}
|
(
|
||||||
)
|
{"PILLOW_ALIGNMENT": "15"},
|
||||||
pytest.warns(
|
{"PILLOW_BLOCK_SIZE": "1024"},
|
||||||
UserWarning, Image._apply_env_variables, {"PILLOW_BLOCK_SIZE": "1024"}
|
{"PILLOW_BLOCKS_MAX": "wat"},
|
||||||
)
|
),
|
||||||
pytest.warns(
|
)
|
||||||
UserWarning, Image._apply_env_variables, {"PILLOW_BLOCKS_MAX": "wat"}
|
def test_warnings(self, var):
|
||||||
)
|
with pytest.warns(UserWarning):
|
||||||
|
Image._apply_env_variables(var)
|
||||||
|
|
|
@ -36,12 +36,10 @@ class TestDecompressionBomb:
|
||||||
Image.MAX_IMAGE_PIXELS = 128 * 128 - 1
|
Image.MAX_IMAGE_PIXELS = 128 * 128 - 1
|
||||||
assert Image.MAX_IMAGE_PIXELS == 128 * 128 - 1
|
assert Image.MAX_IMAGE_PIXELS == 128 * 128 - 1
|
||||||
|
|
||||||
def open():
|
with pytest.warns(Image.DecompressionBombWarning):
|
||||||
with Image.open(TEST_FILE):
|
with Image.open(TEST_FILE):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
pytest.warns(Image.DecompressionBombWarning, open)
|
|
||||||
|
|
||||||
def test_exception(self):
|
def test_exception(self):
|
||||||
# Set limit to trigger exception on the test file
|
# Set limit to trigger exception on the test file
|
||||||
Image.MAX_IMAGE_PIXELS = 64 * 128 - 1
|
Image.MAX_IMAGE_PIXELS = 64 * 128 - 1
|
||||||
|
@ -87,7 +85,8 @@ class TestDecompressionCrop:
|
||||||
# same decompression bomb warnings on them.
|
# same decompression bomb warnings on them.
|
||||||
with hopper() as src:
|
with hopper() as src:
|
||||||
box = (0, 0, src.width * 2, src.height * 2)
|
box = (0, 0, src.width * 2, src.height * 2)
|
||||||
pytest.warns(Image.DecompressionBombWarning, src.crop, box)
|
with pytest.warns(Image.DecompressionBombWarning):
|
||||||
|
src.crop(box)
|
||||||
|
|
||||||
def test_crop_decompression_checks(self):
|
def test_crop_decompression_checks(self):
|
||||||
im = Image.new("RGB", (100, 100))
|
im = Image.new("RGB", (100, 100))
|
||||||
|
@ -95,7 +94,8 @@ class TestDecompressionCrop:
|
||||||
for value in ((-9999, -9999, -9990, -9990), (-999, -999, -990, -990)):
|
for value in ((-9999, -9999, -9990, -9990), (-999, -999, -990, -990)):
|
||||||
assert im.crop(value).size == (9, 9)
|
assert im.crop(value).size == (9, 9)
|
||||||
|
|
||||||
pytest.warns(Image.DecompressionBombWarning, im.crop, (-160, -160, 99, 99))
|
with pytest.warns(Image.DecompressionBombWarning):
|
||||||
|
im.crop((-160, -160, 99, 99))
|
||||||
|
|
||||||
with pytest.raises(Image.DecompressionBombError):
|
with pytest.raises(Image.DecompressionBombError):
|
||||||
im.crop((-99909, -99990, 99999, 99999))
|
im.crop((-99909, -99990, 99999, 99999))
|
||||||
|
|
|
@ -263,13 +263,11 @@ def test_apng_chunk_errors():
|
||||||
with Image.open("Tests/images/apng/chunk_no_actl.png") as im:
|
with Image.open("Tests/images/apng/chunk_no_actl.png") as im:
|
||||||
assert not im.is_animated
|
assert not im.is_animated
|
||||||
|
|
||||||
def open():
|
with pytest.warns(UserWarning):
|
||||||
with Image.open("Tests/images/apng/chunk_multi_actl.png") as im:
|
with Image.open("Tests/images/apng/chunk_multi_actl.png") as im:
|
||||||
im.load()
|
im.load()
|
||||||
assert not im.is_animated
|
assert not im.is_animated
|
||||||
|
|
||||||
pytest.warns(UserWarning, open)
|
|
||||||
|
|
||||||
with Image.open("Tests/images/apng/chunk_actl_after_idat.png") as im:
|
with Image.open("Tests/images/apng/chunk_actl_after_idat.png") as im:
|
||||||
assert not im.is_animated
|
assert not im.is_animated
|
||||||
|
|
||||||
|
@ -287,21 +285,17 @@ def test_apng_chunk_errors():
|
||||||
|
|
||||||
|
|
||||||
def test_apng_syntax_errors():
|
def test_apng_syntax_errors():
|
||||||
def open_frames_zero():
|
with pytest.warns(UserWarning):
|
||||||
with Image.open("Tests/images/apng/syntax_num_frames_zero.png") as im:
|
with Image.open("Tests/images/apng/syntax_num_frames_zero.png") as im:
|
||||||
assert not im.is_animated
|
assert not im.is_animated
|
||||||
with pytest.raises(OSError):
|
with pytest.raises(OSError):
|
||||||
im.load()
|
im.load()
|
||||||
|
|
||||||
pytest.warns(UserWarning, open_frames_zero)
|
with pytest.warns(UserWarning):
|
||||||
|
|
||||||
def open_frames_zero_default():
|
|
||||||
with Image.open("Tests/images/apng/syntax_num_frames_zero_default.png") as im:
|
with Image.open("Tests/images/apng/syntax_num_frames_zero_default.png") as im:
|
||||||
assert not im.is_animated
|
assert not im.is_animated
|
||||||
im.load()
|
im.load()
|
||||||
|
|
||||||
pytest.warns(UserWarning, open_frames_zero_default)
|
|
||||||
|
|
||||||
# we can handle this case gracefully
|
# we can handle this case gracefully
|
||||||
exception = None
|
exception = None
|
||||||
with Image.open("Tests/images/apng/syntax_num_frames_low.png") as im:
|
with Image.open("Tests/images/apng/syntax_num_frames_low.png") as im:
|
||||||
|
@ -316,13 +310,11 @@ def test_apng_syntax_errors():
|
||||||
im.seek(im.n_frames - 1)
|
im.seek(im.n_frames - 1)
|
||||||
im.load()
|
im.load()
|
||||||
|
|
||||||
def open():
|
with pytest.warns(UserWarning):
|
||||||
with Image.open("Tests/images/apng/syntax_num_frames_invalid.png") as im:
|
with Image.open("Tests/images/apng/syntax_num_frames_invalid.png") as im:
|
||||||
assert not im.is_animated
|
assert not im.is_animated
|
||||||
im.load()
|
im.load()
|
||||||
|
|
||||||
pytest.warns(UserWarning, open)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"test_file",
|
"test_file",
|
||||||
|
|
|
@ -28,7 +28,8 @@ def test_unclosed_file():
|
||||||
im = Image.open(TEST_FILE)
|
im = Image.open(TEST_FILE)
|
||||||
im.load()
|
im.load()
|
||||||
|
|
||||||
pytest.warns(ResourceWarning, open)
|
with pytest.warns(ResourceWarning):
|
||||||
|
open()
|
||||||
|
|
||||||
|
|
||||||
def test_closed_file():
|
def test_closed_file():
|
||||||
|
|
|
@ -36,7 +36,8 @@ def test_unclosed_file():
|
||||||
im = Image.open(static_test_file)
|
im = Image.open(static_test_file)
|
||||||
im.load()
|
im.load()
|
||||||
|
|
||||||
pytest.warns(ResourceWarning, open)
|
with pytest.warns(ResourceWarning):
|
||||||
|
open()
|
||||||
|
|
||||||
|
|
||||||
def test_closed_file():
|
def test_closed_file():
|
||||||
|
|
|
@ -36,7 +36,8 @@ def test_unclosed_file():
|
||||||
im = Image.open(TEST_GIF)
|
im = Image.open(TEST_GIF)
|
||||||
im.load()
|
im.load()
|
||||||
|
|
||||||
pytest.warns(ResourceWarning, open)
|
with pytest.warns(ResourceWarning):
|
||||||
|
open()
|
||||||
|
|
||||||
|
|
||||||
def test_closed_file():
|
def test_closed_file():
|
||||||
|
@ -1087,7 +1088,8 @@ def test_rgb_transparency(tmp_path):
|
||||||
im = Image.new("RGB", (1, 1))
|
im = Image.new("RGB", (1, 1))
|
||||||
im.info["transparency"] = b""
|
im.info["transparency"] = b""
|
||||||
ims = [Image.new("RGB", (1, 1))]
|
ims = [Image.new("RGB", (1, 1))]
|
||||||
pytest.warns(UserWarning, im.save, out, save_all=True, append_images=ims)
|
with pytest.warns(UserWarning):
|
||||||
|
im.save(out, save_all=True, append_images=ims)
|
||||||
|
|
||||||
with Image.open(out) as reloaded:
|
with Image.open(out) as reloaded:
|
||||||
assert "transparency" not in reloaded.info
|
assert "transparency" not in reloaded.info
|
||||||
|
|
|
@ -212,12 +212,10 @@ def test_save_append_images(tmp_path):
|
||||||
def test_unexpected_size():
|
def test_unexpected_size():
|
||||||
# This image has been manually hexedited to state that it is 16x32
|
# This image has been manually hexedited to state that it is 16x32
|
||||||
# while the image within is still 16x16
|
# while the image within is still 16x16
|
||||||
def open():
|
with pytest.warns(UserWarning):
|
||||||
with Image.open("Tests/images/hopper_unexpected.ico") as im:
|
with Image.open("Tests/images/hopper_unexpected.ico") as im:
|
||||||
assert im.size == (16, 16)
|
assert im.size == (16, 16)
|
||||||
|
|
||||||
pytest.warns(UserWarning, open)
|
|
||||||
|
|
||||||
|
|
||||||
def test_draw_reloaded(tmp_path):
|
def test_draw_reloaded(tmp_path):
|
||||||
with Image.open(TEST_ICO_FILE) as im:
|
with Image.open(TEST_ICO_FILE) as im:
|
||||||
|
|
|
@ -32,7 +32,8 @@ def test_unclosed_file():
|
||||||
im = Image.open(TEST_IM)
|
im = Image.open(TEST_IM)
|
||||||
im.load()
|
im.load()
|
||||||
|
|
||||||
pytest.warns(ResourceWarning, open)
|
with pytest.warns(ResourceWarning):
|
||||||
|
open()
|
||||||
|
|
||||||
|
|
||||||
def test_closed_file():
|
def test_closed_file():
|
||||||
|
|
|
@ -42,7 +42,8 @@ def test_unclosed_file():
|
||||||
im = Image.open(test_files[0])
|
im = Image.open(test_files[0])
|
||||||
im.load()
|
im.load()
|
||||||
|
|
||||||
pytest.warns(ResourceWarning, open)
|
with pytest.warns(ResourceWarning):
|
||||||
|
open()
|
||||||
|
|
||||||
|
|
||||||
def test_closed_file():
|
def test_closed_file():
|
||||||
|
|
|
@ -27,7 +27,8 @@ def test_unclosed_file():
|
||||||
im = Image.open(test_file)
|
im = Image.open(test_file)
|
||||||
im.load()
|
im.load()
|
||||||
|
|
||||||
pytest.warns(ResourceWarning, open)
|
with pytest.warns(ResourceWarning):
|
||||||
|
open()
|
||||||
|
|
||||||
|
|
||||||
def test_closed_file():
|
def test_closed_file():
|
||||||
|
|
|
@ -25,7 +25,8 @@ def test_unclosed_file():
|
||||||
im = Image.open(TEST_FILE)
|
im = Image.open(TEST_FILE)
|
||||||
im.load()
|
im.load()
|
||||||
|
|
||||||
pytest.warns(ResourceWarning, open)
|
with pytest.warns(ResourceWarning):
|
||||||
|
open()
|
||||||
|
|
||||||
|
|
||||||
def test_closed_file():
|
def test_closed_file():
|
||||||
|
|
|
@ -29,11 +29,9 @@ def test_sanity(codec, test_path, format):
|
||||||
|
|
||||||
@pytest.mark.skipif(is_pypy(), reason="Requires CPython")
|
@pytest.mark.skipif(is_pypy(), reason="Requires CPython")
|
||||||
def test_unclosed_file():
|
def test_unclosed_file():
|
||||||
def open():
|
with pytest.warns(ResourceWarning):
|
||||||
TarIO.TarIO(TEST_TAR_FILE, "hopper.jpg")
|
TarIO.TarIO(TEST_TAR_FILE, "hopper.jpg")
|
||||||
|
|
||||||
pytest.warns(ResourceWarning, open)
|
|
||||||
|
|
||||||
|
|
||||||
def test_close():
|
def test_close():
|
||||||
with warnings.catch_warnings():
|
with warnings.catch_warnings():
|
||||||
|
|
|
@ -163,7 +163,9 @@ def test_save_id_section(tmp_path):
|
||||||
|
|
||||||
# Save with custom id section greater than 255 characters
|
# Save with custom id section greater than 255 characters
|
||||||
id_section = b"Test content" * 25
|
id_section = b"Test content" * 25
|
||||||
pytest.warns(UserWarning, lambda: im.save(out, id_section=id_section))
|
with pytest.warns(UserWarning):
|
||||||
|
im.save(out, id_section=id_section)
|
||||||
|
|
||||||
with Image.open(out) as test_im:
|
with Image.open(out) as test_im:
|
||||||
assert test_im.info["id_section"] == id_section[:255]
|
assert test_im.info["id_section"] == id_section[:255]
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,8 @@ class TestFileTiff:
|
||||||
im = Image.open("Tests/images/multipage.tiff")
|
im = Image.open("Tests/images/multipage.tiff")
|
||||||
im.load()
|
im.load()
|
||||||
|
|
||||||
pytest.warns(ResourceWarning, open)
|
with pytest.warns(ResourceWarning):
|
||||||
|
open()
|
||||||
|
|
||||||
def test_closed_file(self):
|
def test_closed_file(self):
|
||||||
with warnings.catch_warnings():
|
with warnings.catch_warnings():
|
||||||
|
@ -231,7 +232,8 @@ class TestFileTiff:
|
||||||
def test_bad_exif(self):
|
def test_bad_exif(self):
|
||||||
with Image.open("Tests/images/hopper_bad_exif.jpg") as i:
|
with Image.open("Tests/images/hopper_bad_exif.jpg") as i:
|
||||||
# Should not raise struct.error.
|
# Should not raise struct.error.
|
||||||
pytest.warns(UserWarning, i._getexif)
|
with pytest.warns(UserWarning):
|
||||||
|
i._getexif()
|
||||||
|
|
||||||
def test_save_rgba(self, tmp_path):
|
def test_save_rgba(self, tmp_path):
|
||||||
im = hopper("RGBA")
|
im = hopper("RGBA")
|
||||||
|
|
|
@ -252,7 +252,8 @@ def test_empty_metadata():
|
||||||
head = f.read(8)
|
head = f.read(8)
|
||||||
info = TiffImagePlugin.ImageFileDirectory(head)
|
info = TiffImagePlugin.ImageFileDirectory(head)
|
||||||
# Should not raise struct.error.
|
# Should not raise struct.error.
|
||||||
pytest.warns(UserWarning, info.load, f)
|
with pytest.warns(UserWarning):
|
||||||
|
info.load(f)
|
||||||
|
|
||||||
|
|
||||||
def test_iccprofile(tmp_path):
|
def test_iccprofile(tmp_path):
|
||||||
|
@ -418,11 +419,12 @@ def test_too_many_entries():
|
||||||
ifd = TiffImagePlugin.ImageFileDirectory_v2()
|
ifd = TiffImagePlugin.ImageFileDirectory_v2()
|
||||||
|
|
||||||
# 277: ("SamplesPerPixel", SHORT, 1),
|
# 277: ("SamplesPerPixel", SHORT, 1),
|
||||||
ifd._tagdata[277] = struct.pack("hh", 4, 4)
|
ifd._tagdata[277] = struct.pack("<hh", 4, 4)
|
||||||
ifd.tagtype[277] = TiffTags.SHORT
|
ifd.tagtype[277] = TiffTags.SHORT
|
||||||
|
|
||||||
# Should not raise ValueError.
|
# Should not raise ValueError.
|
||||||
pytest.warns(UserWarning, lambda: ifd[277])
|
with pytest.warns(UserWarning):
|
||||||
|
assert ifd[277] == 4
|
||||||
|
|
||||||
|
|
||||||
def test_tag_group_data():
|
def test_tag_group_data():
|
||||||
|
|
|
@ -29,7 +29,10 @@ class TestUnsupportedWebp:
|
||||||
WebPImagePlugin.SUPPORTED = False
|
WebPImagePlugin.SUPPORTED = False
|
||||||
|
|
||||||
file_path = "Tests/images/hopper.webp"
|
file_path = "Tests/images/hopper.webp"
|
||||||
pytest.warns(UserWarning, lambda: pytest.raises(OSError, Image.open, file_path))
|
with pytest.warns(UserWarning):
|
||||||
|
with pytest.raises(OSError):
|
||||||
|
with Image.open(file_path):
|
||||||
|
pass
|
||||||
|
|
||||||
if HAVE_WEBP:
|
if HAVE_WEBP:
|
||||||
WebPImagePlugin.SUPPORTED = True
|
WebPImagePlugin.SUPPORTED = True
|
||||||
|
|
|
@ -351,7 +351,8 @@ def test_rotated_transposed_font(font, orientation):
|
||||||
assert bbox_b[3] == 20 + bbox_a[2] - bbox_a[0]
|
assert bbox_b[3] == 20 + bbox_a[2] - bbox_a[0]
|
||||||
|
|
||||||
# text length is undefined for vertical text
|
# text length is undefined for vertical text
|
||||||
pytest.raises(ValueError, draw.textlength, word)
|
with pytest.raises(ValueError):
|
||||||
|
draw.textlength(word)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
|
@ -872,25 +873,23 @@ def test_anchor_invalid(font):
|
||||||
d.font = font
|
d.font = font
|
||||||
|
|
||||||
for anchor in ["", "l", "a", "lax", "sa", "xa", "lx"]:
|
for anchor in ["", "l", "a", "lax", "sa", "xa", "lx"]:
|
||||||
pytest.raises(ValueError, lambda: font.getmask2("hello", anchor=anchor))
|
with pytest.raises(ValueError):
|
||||||
pytest.raises(ValueError, lambda: font.getbbox("hello", anchor=anchor))
|
font.getmask2("hello", anchor=anchor)
|
||||||
pytest.raises(ValueError, lambda: d.text((0, 0), "hello", anchor=anchor))
|
with pytest.raises(ValueError):
|
||||||
pytest.raises(ValueError, lambda: d.textbbox((0, 0), "hello", anchor=anchor))
|
font.getbbox("hello", anchor=anchor)
|
||||||
pytest.raises(
|
with pytest.raises(ValueError):
|
||||||
ValueError, lambda: d.multiline_text((0, 0), "foo\nbar", anchor=anchor)
|
d.text((0, 0), "hello", anchor=anchor)
|
||||||
)
|
with pytest.raises(ValueError):
|
||||||
pytest.raises(
|
d.textbbox((0, 0), "hello", anchor=anchor)
|
||||||
ValueError,
|
with pytest.raises(ValueError):
|
||||||
lambda: d.multiline_textbbox((0, 0), "foo\nbar", anchor=anchor),
|
d.multiline_text((0, 0), "foo\nbar", anchor=anchor)
|
||||||
)
|
with pytest.raises(ValueError):
|
||||||
|
d.multiline_textbbox((0, 0), "foo\nbar", anchor=anchor)
|
||||||
for anchor in ["lt", "lb"]:
|
for anchor in ["lt", "lb"]:
|
||||||
pytest.raises(
|
with pytest.raises(ValueError):
|
||||||
ValueError, lambda: d.multiline_text((0, 0), "foo\nbar", anchor=anchor)
|
d.multiline_text((0, 0), "foo\nbar", anchor=anchor)
|
||||||
)
|
with pytest.raises(ValueError):
|
||||||
pytest.raises(
|
d.multiline_textbbox((0, 0), "foo\nbar", anchor=anchor)
|
||||||
ValueError,
|
|
||||||
lambda: d.multiline_textbbox((0, 0), "foo\nbar", anchor=anchor),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("bpp", (1, 2, 4, 8))
|
@pytest.mark.parametrize("bpp", (1, 2, 4, 8))
|
||||||
|
|
|
@ -360,37 +360,20 @@ def test_anchor_invalid_ttb():
|
||||||
d.font = font
|
d.font = font
|
||||||
|
|
||||||
for anchor in ["", "l", "a", "lax", "xa", "la", "ls", "ld", "lx"]:
|
for anchor in ["", "l", "a", "lax", "xa", "la", "ls", "ld", "lx"]:
|
||||||
pytest.raises(
|
with pytest.raises(ValueError):
|
||||||
ValueError, lambda: font.getmask2("hello", anchor=anchor, direction="ttb")
|
font.getmask2("hello", anchor=anchor, direction="ttb")
|
||||||
)
|
with pytest.raises(ValueError):
|
||||||
pytest.raises(
|
font.getbbox("hello", anchor=anchor, direction="ttb")
|
||||||
ValueError, lambda: font.getbbox("hello", anchor=anchor, direction="ttb")
|
with pytest.raises(ValueError):
|
||||||
)
|
d.text((0, 0), "hello", anchor=anchor, direction="ttb")
|
||||||
pytest.raises(
|
with pytest.raises(ValueError):
|
||||||
ValueError, lambda: d.text((0, 0), "hello", anchor=anchor, direction="ttb")
|
d.textbbox((0, 0), "hello", anchor=anchor, direction="ttb")
|
||||||
)
|
with pytest.raises(ValueError):
|
||||||
pytest.raises(
|
d.multiline_text((0, 0), "foo\nbar", anchor=anchor, direction="ttb")
|
||||||
ValueError,
|
with pytest.raises(ValueError):
|
||||||
lambda: d.textbbox((0, 0), "hello", anchor=anchor, direction="ttb"),
|
d.multiline_textbbox((0, 0), "foo\nbar", anchor=anchor, direction="ttb")
|
||||||
)
|
|
||||||
pytest.raises(
|
|
||||||
ValueError,
|
|
||||||
lambda: d.multiline_text(
|
|
||||||
(0, 0), "foo\nbar", anchor=anchor, direction="ttb"
|
|
||||||
),
|
|
||||||
)
|
|
||||||
pytest.raises(
|
|
||||||
ValueError,
|
|
||||||
lambda: d.multiline_textbbox(
|
|
||||||
(0, 0), "foo\nbar", anchor=anchor, direction="ttb"
|
|
||||||
),
|
|
||||||
)
|
|
||||||
# ttb multiline text does not support anchors at all
|
# ttb multiline text does not support anchors at all
|
||||||
pytest.raises(
|
with pytest.raises(ValueError):
|
||||||
ValueError,
|
d.multiline_text((0, 0), "foo\nbar", anchor="mm", direction="ttb")
|
||||||
lambda: d.multiline_text((0, 0), "foo\nbar", anchor="mm", direction="ttb"),
|
with pytest.raises(ValueError):
|
||||||
)
|
d.multiline_textbbox((0, 0), "foo\nbar", anchor="mm", direction="ttb")
|
||||||
pytest.raises(
|
|
||||||
ValueError,
|
|
||||||
lambda: d.multiline_textbbox((0, 0), "foo\nbar", anchor="mm", direction="ttb"),
|
|
||||||
)
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user