11from __future__ import annotations
22
3+ from typing import Any
4+
35import pytest
46
57from PIL import Image , ImageMath
@@ -21,40 +23,45 @@ def pixel(im: Image.Image | int) -> str | int:
2123A2 = A .resize ((2 , 2 ))
2224B2 = B .resize ((2 , 2 ))
2325
24- images = {"A" : A , "B" : B , "F" : F , "I" : I }
26+ images : dict [ str , Any ] = {"A" : A , "B" : B , "F" : F , "I" : I }
2527
2628
2729def test_sanity () -> None :
2830 assert ImageMath .unsafe_eval ("1" ) == 1
2931 assert ImageMath .unsafe_eval ("1+A" , A = 2 ) == 3
3032 assert pixel (ImageMath .unsafe_eval ("A+B" , A = A , B = B )) == "I 3"
31- assert pixel (ImageMath .unsafe_eval ("A+B" , images )) == "I 3"
32- assert pixel (ImageMath .unsafe_eval ("float(A)+B" , images )) == "F 3.0"
33- assert pixel (ImageMath .unsafe_eval ("int(float(A)+B)" , images )) == "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"
3436
3537
3638def test_eval_deprecated () -> None :
3739 with pytest .warns (DeprecationWarning ):
3840 assert ImageMath .eval ("1" ) == 1
3941
4042
43+ def test_options_deprecated () -> None :
44+ with pytest .warns (DeprecationWarning ):
45+ assert ImageMath .unsafe_eval ("1" , images ) == 1
46+
47+
4148def test_ops () -> None :
42- assert pixel (ImageMath .unsafe_eval ("-A" , images )) == "I -1"
43- assert pixel (ImageMath .unsafe_eval ("+B" , images )) == "L 2"
49+ assert pixel (ImageMath .unsafe_eval ("-A" , ** images )) == "I -1"
50+ assert pixel (ImageMath .unsafe_eval ("+B" , ** images )) == "L 2"
4451
45- assert pixel (ImageMath .unsafe_eval ("A+B" , images )) == "I 3"
46- assert pixel (ImageMath .unsafe_eval ("A-B" , images )) == "I -1"
47- assert pixel (ImageMath .unsafe_eval ("A*B" , images )) == "I 2"
48- assert pixel (ImageMath .unsafe_eval ("A/B" , images )) == "I 0"
49- assert pixel (ImageMath .unsafe_eval ("B**2" , images )) == "I 4"
50- assert pixel (ImageMath .unsafe_eval ("B**33" , images )) == "I 2147483647"
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"
5158
52- assert pixel (ImageMath .unsafe_eval ("float(A)+B" , images )) == "F 3.0"
53- assert pixel (ImageMath .unsafe_eval ("float(A)-B" , images )) == "F -1.0"
54- assert pixel (ImageMath .unsafe_eval ("float(A)*B" , images )) == "F 2.0"
55- assert pixel (ImageMath .unsafe_eval ("float(A)/B" , images )) == "F 0.5"
56- assert pixel (ImageMath .unsafe_eval ("float(B)**2" , images )) == "F 4.0"
57- assert pixel (ImageMath .unsafe_eval ("float(B)**33" , images )) == "F 8589934592.0"
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"
5865
5966
6067@pytest .mark .parametrize (
@@ -72,33 +79,33 @@ def test_prevent_exec(expression: str) -> None:
7279
7380def test_prevent_double_underscores () -> None :
7481 with pytest .raises (ValueError ):
75- ImageMath .unsafe_eval ("1" , { "__" : None } )
82+ ImageMath .unsafe_eval ("1" , __ = None )
7683
7784
7885def test_prevent_builtins () -> None :
7986 with pytest .raises (ValueError ):
80- ImageMath .unsafe_eval ("(lambda: exec('exit()'))()" , { " exec" : None } )
87+ ImageMath .unsafe_eval ("(lambda: exec('exit()'))()" , exec = None )
8188
8289
8390def test_logical () -> None :
84- assert pixel (ImageMath .unsafe_eval ("not A" , images )) == 0
85- assert pixel (ImageMath .unsafe_eval ("A and B" , images )) == "L 2"
86- assert pixel (ImageMath .unsafe_eval ("A or B" , images )) == "L 1"
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"
8794
8895
8996def test_convert () -> None :
90- assert pixel (ImageMath .unsafe_eval ("convert(A+B, 'L')" , images )) == "L 3"
91- assert pixel (ImageMath .unsafe_eval ("convert(A+B, '1')" , images )) == "1 0"
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"
9299 assert (
93- pixel (ImageMath .unsafe_eval ("convert(A+B, 'RGB')" , images )) == "RGB (3, 3, 3)"
100+ pixel (ImageMath .unsafe_eval ("convert(A+B, 'RGB')" , ** images )) == "RGB (3, 3, 3)"
94101 )
95102
96103
97104def test_compare () -> None :
98- assert pixel (ImageMath .unsafe_eval ("min(A, B)" , images )) == "I 1"
99- assert pixel (ImageMath .unsafe_eval ("max(A, B)" , images )) == "I 2"
100- assert pixel (ImageMath .unsafe_eval ("A == 1" , images )) == "I 1"
101- assert pixel (ImageMath .unsafe_eval ("A == 2" , images )) == "I 0"
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"
102109
103110
104111def test_one_image_larger () -> None :
0 commit comments