Pillow

Форк
0
/
test_imagemath_unsafe_eval.py 
228 строк · 8.6 Кб
1
from __future__ import annotations
2

3
from typing import Any
4

5
import pytest
6

7
from PIL import Image, ImageMath
8

9

10
def pixel(im: Image.Image | int) -> str | int:
11
    if isinstance(im, int):
12
        return int(im)  # hack to deal with booleans
13

14
    return f"{im.mode} {repr(im.getpixel((0, 0)))}"
15

16

17
A = Image.new("L", (1, 1), 1)
18
B = Image.new("L", (1, 1), 2)
19
Z = Image.new("L", (1, 1), 0)  # Z for zero
20
F = Image.new("F", (1, 1), 3)
21
I = Image.new("I", (1, 1), 4)  # noqa: E741
22

23
A2 = A.resize((2, 2))
24
B2 = B.resize((2, 2))
25

26
images: dict[str, Any] = {"A": A, "B": B, "F": F, "I": I}
27

28

29
def test_sanity() -> None:
30
    assert ImageMath.unsafe_eval("1") == 1
31
    assert ImageMath.unsafe_eval("1+A", A=2) == 3
32
    assert pixel(ImageMath.unsafe_eval("A+B", A=A, B=B)) == "I 3"
33
    assert pixel(ImageMath.unsafe_eval("A+B", **images)) == "I 3"
34
    assert pixel(ImageMath.unsafe_eval("float(A)+B", **images)) == "F 3.0"
35
    assert pixel(ImageMath.unsafe_eval("int(float(A)+B)", **images)) == "I 3"
36

37

38
def test_eval_deprecated() -> None:
39
    with pytest.warns(DeprecationWarning):
40
        assert ImageMath.eval("1") == 1
41

42

43
def test_options_deprecated() -> None:
44
    with pytest.warns(DeprecationWarning):
45
        assert ImageMath.unsafe_eval("1", images) == 1
46

47

48
def test_ops() -> None:
49
    assert pixel(ImageMath.unsafe_eval("-A", **images)) == "I -1"
50
    assert pixel(ImageMath.unsafe_eval("+B", **images)) == "L 2"
51

52
    assert pixel(ImageMath.unsafe_eval("A+B", **images)) == "I 3"
53
    assert pixel(ImageMath.unsafe_eval("A-B", **images)) == "I -1"
54
    assert pixel(ImageMath.unsafe_eval("A*B", **images)) == "I 2"
55
    assert pixel(ImageMath.unsafe_eval("A/B", **images)) == "I 0"
56
    assert pixel(ImageMath.unsafe_eval("B**2", **images)) == "I 4"
57
    assert pixel(ImageMath.unsafe_eval("B**33", **images)) == "I 2147483647"
58

59
    assert pixel(ImageMath.unsafe_eval("float(A)+B", **images)) == "F 3.0"
60
    assert pixel(ImageMath.unsafe_eval("float(A)-B", **images)) == "F -1.0"
61
    assert pixel(ImageMath.unsafe_eval("float(A)*B", **images)) == "F 2.0"
62
    assert pixel(ImageMath.unsafe_eval("float(A)/B", **images)) == "F 0.5"
63
    assert pixel(ImageMath.unsafe_eval("float(B)**2", **images)) == "F 4.0"
64
    assert pixel(ImageMath.unsafe_eval("float(B)**33", **images)) == "F 8589934592.0"
65

66

67
@pytest.mark.parametrize(
68
    "expression",
69
    (
70
        "exec('pass')",
71
        "(lambda: exec('pass'))()",
72
        "(lambda: (lambda: exec('pass'))())()",
73
    ),
74
)
75
def test_prevent_exec(expression: str) -> None:
76
    with pytest.raises(ValueError):
77
        ImageMath.unsafe_eval(expression)
78

79

80
def test_prevent_double_underscores() -> None:
81
    with pytest.raises(ValueError):
82
        ImageMath.unsafe_eval("1", __=None)
83

84

85
def test_prevent_builtins() -> None:
86
    with pytest.raises(ValueError):
87
        ImageMath.unsafe_eval("(lambda: exec('exit()'))()", exec=None)
88

89

90
def test_logical() -> None:
91
    assert pixel(ImageMath.unsafe_eval("not A", **images)) == 0
92
    assert pixel(ImageMath.unsafe_eval("A and B", **images)) == "L 2"
93
    assert pixel(ImageMath.unsafe_eval("A or B", **images)) == "L 1"
94

95

96
def test_convert() -> None:
97
    assert pixel(ImageMath.unsafe_eval("convert(A+B, 'L')", **images)) == "L 3"
98
    assert pixel(ImageMath.unsafe_eval("convert(A+B, '1')", **images)) == "1 0"
99
    assert (
100
        pixel(ImageMath.unsafe_eval("convert(A+B, 'RGB')", **images)) == "RGB (3, 3, 3)"
101
    )
102

103

104
def test_compare() -> None:
105
    assert pixel(ImageMath.unsafe_eval("min(A, B)", **images)) == "I 1"
106
    assert pixel(ImageMath.unsafe_eval("max(A, B)", **images)) == "I 2"
107
    assert pixel(ImageMath.unsafe_eval("A == 1", **images)) == "I 1"
108
    assert pixel(ImageMath.unsafe_eval("A == 2", **images)) == "I 0"
109

110

111
def test_one_image_larger() -> None:
112
    assert pixel(ImageMath.unsafe_eval("A+B", A=A2, B=B)) == "I 3"
113
    assert pixel(ImageMath.unsafe_eval("A+B", A=A, B=B2)) == "I 3"
114

115

116
def test_abs() -> None:
117
    assert pixel(ImageMath.unsafe_eval("abs(A)", A=A)) == "I 1"
118
    assert pixel(ImageMath.unsafe_eval("abs(B)", B=B)) == "I 2"
119

120

121
def test_binary_mod() -> None:
122
    assert pixel(ImageMath.unsafe_eval("A%A", A=A)) == "I 0"
123
    assert pixel(ImageMath.unsafe_eval("B%B", B=B)) == "I 0"
124
    assert pixel(ImageMath.unsafe_eval("A%B", A=A, B=B)) == "I 1"
125
    assert pixel(ImageMath.unsafe_eval("B%A", A=A, B=B)) == "I 0"
126
    assert pixel(ImageMath.unsafe_eval("Z%A", A=A, Z=Z)) == "I 0"
127
    assert pixel(ImageMath.unsafe_eval("Z%B", B=B, Z=Z)) == "I 0"
128

129

130
def test_bitwise_invert() -> None:
131
    assert pixel(ImageMath.unsafe_eval("~Z", Z=Z)) == "I -1"
132
    assert pixel(ImageMath.unsafe_eval("~A", A=A)) == "I -2"
133
    assert pixel(ImageMath.unsafe_eval("~B", B=B)) == "I -3"
134

135

136
def test_bitwise_and() -> None:
137
    assert pixel(ImageMath.unsafe_eval("Z&Z", A=A, Z=Z)) == "I 0"
138
    assert pixel(ImageMath.unsafe_eval("Z&A", A=A, Z=Z)) == "I 0"
139
    assert pixel(ImageMath.unsafe_eval("A&Z", A=A, Z=Z)) == "I 0"
140
    assert pixel(ImageMath.unsafe_eval("A&A", A=A, Z=Z)) == "I 1"
141

142

143
def test_bitwise_or() -> None:
144
    assert pixel(ImageMath.unsafe_eval("Z|Z", A=A, Z=Z)) == "I 0"
145
    assert pixel(ImageMath.unsafe_eval("Z|A", A=A, Z=Z)) == "I 1"
146
    assert pixel(ImageMath.unsafe_eval("A|Z", A=A, Z=Z)) == "I 1"
147
    assert pixel(ImageMath.unsafe_eval("A|A", A=A, Z=Z)) == "I 1"
148

149

150
def test_bitwise_xor() -> None:
151
    assert pixel(ImageMath.unsafe_eval("Z^Z", A=A, Z=Z)) == "I 0"
152
    assert pixel(ImageMath.unsafe_eval("Z^A", A=A, Z=Z)) == "I 1"
153
    assert pixel(ImageMath.unsafe_eval("A^Z", A=A, Z=Z)) == "I 1"
154
    assert pixel(ImageMath.unsafe_eval("A^A", A=A, Z=Z)) == "I 0"
155

156

157
def test_bitwise_leftshift() -> None:
158
    assert pixel(ImageMath.unsafe_eval("Z<<0", Z=Z)) == "I 0"
159
    assert pixel(ImageMath.unsafe_eval("Z<<1", Z=Z)) == "I 0"
160
    assert pixel(ImageMath.unsafe_eval("A<<0", A=A)) == "I 1"
161
    assert pixel(ImageMath.unsafe_eval("A<<1", A=A)) == "I 2"
162

163

164
def test_bitwise_rightshift() -> None:
165
    assert pixel(ImageMath.unsafe_eval("Z>>0", Z=Z)) == "I 0"
166
    assert pixel(ImageMath.unsafe_eval("Z>>1", Z=Z)) == "I 0"
167
    assert pixel(ImageMath.unsafe_eval("A>>0", A=A)) == "I 1"
168
    assert pixel(ImageMath.unsafe_eval("A>>1", A=A)) == "I 0"
169

170

171
def test_logical_eq() -> None:
172
    assert pixel(ImageMath.unsafe_eval("A==A", A=A)) == "I 1"
173
    assert pixel(ImageMath.unsafe_eval("B==B", B=B)) == "I 1"
174
    assert pixel(ImageMath.unsafe_eval("A==B", A=A, B=B)) == "I 0"
175
    assert pixel(ImageMath.unsafe_eval("B==A", A=A, B=B)) == "I 0"
176

177

178
def test_logical_ne() -> None:
179
    assert pixel(ImageMath.unsafe_eval("A!=A", A=A)) == "I 0"
180
    assert pixel(ImageMath.unsafe_eval("B!=B", B=B)) == "I 0"
181
    assert pixel(ImageMath.unsafe_eval("A!=B", A=A, B=B)) == "I 1"
182
    assert pixel(ImageMath.unsafe_eval("B!=A", A=A, B=B)) == "I 1"
183

184

185
def test_logical_lt() -> None:
186
    assert pixel(ImageMath.unsafe_eval("A<A", A=A)) == "I 0"
187
    assert pixel(ImageMath.unsafe_eval("B<B", B=B)) == "I 0"
188
    assert pixel(ImageMath.unsafe_eval("A<B", A=A, B=B)) == "I 1"
189
    assert pixel(ImageMath.unsafe_eval("B<A", A=A, B=B)) == "I 0"
190

191

192
def test_logical_le() -> None:
193
    assert pixel(ImageMath.unsafe_eval("A<=A", A=A)) == "I 1"
194
    assert pixel(ImageMath.unsafe_eval("B<=B", B=B)) == "I 1"
195
    assert pixel(ImageMath.unsafe_eval("A<=B", A=A, B=B)) == "I 1"
196
    assert pixel(ImageMath.unsafe_eval("B<=A", A=A, B=B)) == "I 0"
197

198

199
def test_logical_gt() -> None:
200
    assert pixel(ImageMath.unsafe_eval("A>A", A=A)) == "I 0"
201
    assert pixel(ImageMath.unsafe_eval("B>B", B=B)) == "I 0"
202
    assert pixel(ImageMath.unsafe_eval("A>B", A=A, B=B)) == "I 0"
203
    assert pixel(ImageMath.unsafe_eval("B>A", A=A, B=B)) == "I 1"
204

205

206
def test_logical_ge() -> None:
207
    assert pixel(ImageMath.unsafe_eval("A>=A", A=A)) == "I 1"
208
    assert pixel(ImageMath.unsafe_eval("B>=B", B=B)) == "I 1"
209
    assert pixel(ImageMath.unsafe_eval("A>=B", A=A, B=B)) == "I 0"
210
    assert pixel(ImageMath.unsafe_eval("B>=A", A=A, B=B)) == "I 1"
211

212

213
def test_logical_equal() -> None:
214
    assert pixel(ImageMath.unsafe_eval("equal(A, A)", A=A)) == "I 1"
215
    assert pixel(ImageMath.unsafe_eval("equal(B, B)", B=B)) == "I 1"
216
    assert pixel(ImageMath.unsafe_eval("equal(Z, Z)", Z=Z)) == "I 1"
217
    assert pixel(ImageMath.unsafe_eval("equal(A, B)", A=A, B=B)) == "I 0"
218
    assert pixel(ImageMath.unsafe_eval("equal(B, A)", A=A, B=B)) == "I 0"
219
    assert pixel(ImageMath.unsafe_eval("equal(A, Z)", A=A, Z=Z)) == "I 0"
220

221

222
def test_logical_not_equal() -> None:
223
    assert pixel(ImageMath.unsafe_eval("notequal(A, A)", A=A)) == "I 0"
224
    assert pixel(ImageMath.unsafe_eval("notequal(B, B)", B=B)) == "I 0"
225
    assert pixel(ImageMath.unsafe_eval("notequal(Z, Z)", Z=Z)) == "I 0"
226
    assert pixel(ImageMath.unsafe_eval("notequal(A, B)", A=A, B=B)) == "I 1"
227
    assert pixel(ImageMath.unsafe_eval("notequal(B, A)", A=A, B=B)) == "I 1"
228
    assert pixel(ImageMath.unsafe_eval("notequal(A, Z)", A=A, Z=Z)) == "I 1"
229

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.