forked from python-pillow/Pillow
/
test_file_fli.py
166 lines (118 loc) · 3.84 KB
/
test_file_fli.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
import warnings
import pytest
from PIL import FliImagePlugin, Image
from .helper import assert_image_equal, assert_image_equal_tofile, is_pypy
# created as an export of a palette image from Gimp2.6
# save as...-> hopper.fli, default options.
static_test_file = "Tests/images/hopper.fli"
# From https://samples.libav.org/fli-flc/
animated_test_file = "Tests/images/a.fli"
def test_sanity():
with Image.open(static_test_file) as im:
im.load()
assert im.mode == "P"
assert im.size == (128, 128)
assert im.format == "FLI"
assert not im.is_animated
with Image.open(animated_test_file) as im:
assert im.mode == "P"
assert im.size == (320, 200)
assert im.format == "FLI"
assert im.info["duration"] == 71
assert im.is_animated
@pytest.mark.skipif(is_pypy(), reason="Requires CPython")
def test_unclosed_file():
def open():
im = Image.open(static_test_file)
im.load()
pytest.warns(ResourceWarning, open)
def test_closed_file():
with warnings.catch_warnings():
im = Image.open(static_test_file)
im.load()
im.close()
def test_seek_after_close():
im = Image.open(animated_test_file)
im.seek(1)
im.close()
with pytest.raises(ValueError):
im.seek(0)
def test_context_manager():
with warnings.catch_warnings():
with Image.open(static_test_file) as im:
im.load()
def test_tell():
# Arrange
with Image.open(static_test_file) as im:
# Act
frame = im.tell()
# Assert
assert frame == 0
def test_invalid_file():
invalid_file = "Tests/images/flower.jpg"
with pytest.raises(SyntaxError):
FliImagePlugin.FliImageFile(invalid_file)
def test_palette_chunk_second():
with Image.open("Tests/images/hopper_palette_chunk_second.fli") as im:
with Image.open(static_test_file) as expected:
assert_image_equal(im.convert("RGB"), expected.convert("RGB"))
def test_n_frames():
with Image.open(static_test_file) as im:
assert im.n_frames == 1
assert not im.is_animated
with Image.open(animated_test_file) as im:
assert im.n_frames == 384
assert im.is_animated
def test_eoferror():
with Image.open(animated_test_file) as im:
n_frames = im.n_frames
# Test seeking past the last frame
with pytest.raises(EOFError):
im.seek(n_frames)
assert im.tell() < n_frames
# Test that seeking to the last frame does not raise an error
im.seek(n_frames - 1)
def test_seek_tell():
with Image.open(animated_test_file) as im:
layer_number = im.tell()
assert layer_number == 0
im.seek(0)
layer_number = im.tell()
assert layer_number == 0
im.seek(1)
layer_number = im.tell()
assert layer_number == 1
im.seek(2)
layer_number = im.tell()
assert layer_number == 2
im.seek(1)
layer_number = im.tell()
assert layer_number == 1
def test_seek():
with Image.open(animated_test_file) as im:
im.seek(50)
assert_image_equal_tofile(im, "Tests/images/a_fli.png")
@pytest.mark.parametrize(
"test_file",
[
"Tests/images/timeout-9139147ce93e20eb14088fe238e541443ffd64b3.fli",
"Tests/images/timeout-bff0a9dc7243a8e6ede2408d2ffa6a9964698b87.fli",
],
)
@pytest.mark.timeout(timeout=3)
def test_timeouts(test_file):
with open(test_file, "rb") as f:
with Image.open(f) as im:
with pytest.raises(OSError):
im.load()
@pytest.mark.parametrize(
"test_file",
[
"Tests/images/crash-5762152299364352.fli",
],
)
def test_crash(test_file):
with open(test_file, "rb") as f:
with Image.open(f) as im:
with pytest.raises(OSError):
im.load()