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 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344
|
from __future__ import print_function
from pytest import mark, raises
from wand.api import library
from wand.image import Image
def expire(image):
"""Expire image's sequence cache."""
image.sequence.instances = []
def test_length(fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as img:
assert len(img.sequence) == 4
def test_validate_position_error(fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as img:
with raises(TypeError):
img.sequence.validate_position(0.001)
def test_validate_slice_error(fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as img:
with raises(ValueError):
img.sequence.validate_slice(slice(0, 10, 3))
def test_getitem(fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as img:
size = img.size
assert size == img.sequence[img.sequence.current_index].size
assert img.sequence[0].size == (32, 32)
assert img.sequence[1].size == (16, 16)
assert img.sequence[2].size == (32, 32)
assert img.sequence[3].size == (16, 16)
with raises(IndexError):
img.sequence[4]
assert img.sequence[-1].size == (16, 16)
assert img.sequence[-2].size == (32, 32)
assert img.sequence[-3].size == (16, 16)
assert img.sequence[-4].size == (32, 32)
with raises(IndexError):
img.sequence[-5]
assert img.size == size
def test_setitem(fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as imga:
with Image(filename=str(fx_asset.joinpath('google.ico'))) as imgg:
imga.sequence[2] = imgg
assert len(imga.sequence) == 4
assert imga.sequence[2].size == (16, 16)
expire(imga)
assert imga.sequence[2].size == (16, 16)
with raises(TypeError):
imga.sequence[3] = 0xDEADBEEF
def test_delitem(fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as img:
detached = img.sequence[0]
del img.sequence[0]
assert len(img.sequence) == 3
assert img.sequence[0] is not detached
assert img.sequence[0].size == (16, 16)
expire(img)
assert len(img.sequence) == 3
assert img.sequence[0] is not detached
assert img.sequence[0].size == (16, 16)
assert img.sequence[1].size == (32, 32)
assert img.sequence[2].size == (16, 16)
def test_delitem_not_loaded(fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as img:
del img.sequence[1]
assert len(img.sequence) == 3
slices = {
'to_end': slice(2, None, None),
'from_first': slice(None, 2, None),
'from_back': slice(-2, None, None),
'to_back': slice(None, -2, None),
'middle': slice(1, 3, None),
'from_overflow': slice(10, None, None),
'to_overflow': slice(None, 10, None)
}
slice_items = list(sorted(slices.items(), key=lambda k: k[0]))
@mark.parametrize(('slice_name', 'slice_'), slice_items)
def test_getitem_slice(slice_name, slice_, fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as img:
assert list(img.sequence[slice_]) == list(img.sequence)[slice_]
@mark.parametrize(('slice_name', 'slice_'), slice_items)
def test_setitem_slice(slice_name, slice_, fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as imga:
instances = list(imga.sequence)
with Image(filename=str(fx_asset.joinpath('github.ico'))) as imgg:
instances[slice_] = imgg.sequence
imga.sequence[slice_] = imgg.sequence
assert instances == list(imga.sequence)
expire(imga)
assert instances == list(imga.sequence)
@mark.parametrize(('slice_name', 'slice_'), slice_items)
def test_delitem_slice(slice_name, slice_, fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as img:
instances = list(img.sequence)
del instances[slice_]
del img.sequence[slice_]
assert list(img.sequence) == instances
expire(img)
assert list(img.sequence) == instances
def test_iterator(fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as img:
container_size = img.sequence[img.sequence.current_index].size
actual = []
expected = [(32, 32), (16, 16), (32, 32), (16, 16)]
for i in img.sequence:
actual.append(i.size)
assert img.size == container_size
assert actual == expected
def test_append(fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as imga:
with Image(filename=str(fx_asset.joinpath('google.ico'))) as imgg:
imga.sequence.append(imgg)
assert imga.sequence[4] == imgg.sequence[0]
expire(imga)
assert imga.sequence[4] == imgg.sequence[0]
assert len(imga.sequence) == 5
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as imga:
with Image(filename=str(fx_asset.joinpath('github.ico'))) as imgg:
imga.sequence.append(imgg)
assert imga.sequence[4] == imgg.sequence[0]
expire(imga)
assert imga.sequence[4] == imgg.sequence[0]
assert len(imga.sequence) == 5
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as imga:
with Image(filename=str(fx_asset.joinpath('github.ico'))) as imgg:
imga.sequence.append(imgg.sequence[1])
assert imga.sequence[4] == imgg.sequence[1]
expire(imga)
assert imga.sequence[4] == imgg.sequence[1]
assert len(imga.sequence) == 5
def test_insert(fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as imga:
instances = [imga.sequence[i] for i in range(2, 4)]
assert len(imga.sequence) == 4
with Image(filename=str(fx_asset.joinpath('github.ico'))) as imgg:
imga.sequence.insert(2, imgg)
assert imga.sequence[2] == imgg.sequence[0]
assert len(imga.sequence) == 5
for i, instance in enumerate(instances):
assert instance == imga.sequence[3 + i]
expire(imga)
assert imga.sequence[2] == imgg.sequence[0]
for i, instance in enumerate(instances):
assert instance == imga.sequence[3 + i]
with raises(TypeError):
imga.sequence.insert(0xDEADBEEF)
def test_insert_first(fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as imga:
assert len(imga.sequence) == 4
with Image(filename=str(fx_asset.joinpath('github.ico'))) as imgg:
imga.sequence.insert(0, imgg)
assert imga.sequence[0] == imgg.sequence[0]
expire(imga)
assert imga.sequence[0] == imgg.sequence[0]
assert len(imga.sequence) == 5
def test_extend(fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as a:
length = len(a.sequence)
with Image(filename=str(fx_asset.joinpath('github.ico'))) as b:
a.sequence.extend(list(b.sequence)[::-1])
assert a.sequence[length] == b.sequence[1]
assert a.sequence[length + 1] == b.sequence[0]
expire(a)
assert a.sequence[length] == b.sequence[1]
assert a.sequence[length + 1] == b.sequence[0]
assert len(a.sequence) == 6
with raises(TypeError):
a.sequence.extend([0xDEADBEEF])
def test_extend_sequence(fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as a:
length = len(a.sequence)
with Image(filename=str(fx_asset.joinpath('github.ico'))) as b:
a.sequence.extend(b.sequence)
for i in range(2):
assert a.sequence[length + i] == b.sequence[i]
expire(a)
for i in range(2):
assert a.sequence[length + i] == b.sequence[i]
assert len(a.sequence) == 6
@mark.parametrize('how_many', range(2, 5))
def test_extend_offset(fx_asset, how_many):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as a:
instances = list(a.sequence)
with Image(filename=str(fx_asset.joinpath('github.ico'))) as b:
added = list(b.sequence)[::-1] + [b.sequence[0]] * (how_many - 2)
a.sequence.extend(added, 2)
instances[2:2] = added
assert list(a.sequence) == instances
expire(a)
assert list(a.sequence) == instances
assert len(a.sequence) == 4 + how_many
def test_extend_offset_sequence(fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as a:
instances = list(a.sequence)
with Image(filename=str(fx_asset.joinpath('github.ico'))) as b:
a.sequence.extend(b.sequence, 2)
instances[2:2] = list(b.sequence)
assert list(a.sequence) == instances
expire(a)
assert list(a.sequence) == instances
assert len(a.sequence) == 6
def test_extend_first(fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as a:
instances = list(a.sequence)
with Image(filename=str(fx_asset.joinpath('github.ico'))) as b:
a.sequence.extend(list(b.sequence)[::-1], 0)
instances[:0] = list(b.sequence)[::-1]
assert list(a.sequence) == instances
expire(a)
assert list(a.sequence) == instances
assert len(a.sequence) == 6
def test_extend_first_sequence(fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as a:
instances = list(a.sequence)
with Image(filename=str(fx_asset.joinpath('github.ico'))) as b:
a.sequence.extend(b.sequence, 0)
instances[:0] = list(b.sequence)
assert list(a.sequence) == instances
expire(a)
assert list(a.sequence) == instances
assert len(a.sequence) == 6
def test_container(fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as img:
for single in img.sequence:
assert single.container is img
def test_index(fx_asset):
with Image(filename=str(fx_asset.joinpath('nocomments.gif'))) as img:
for i, single in enumerate(img.sequence):
assert single.index == i
del img.sequence[0]
for i, single in enumerate(img.sequence):
assert single.index == i
with Image(filename=str(fx_asset.joinpath('nocomments.gif'))) as img:
del img.sequence[2]
for i, single in enumerate(img.sequence):
assert single.index == i
@mark.parametrize(('cmp_name', 'f'), [
('equals', lambda i: i), # identity
('hash_equals', hash),
('signature_equals', lambda i: i.signature)
])
def test_equals(cmp_name, f, fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as a:
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as b:
assert f(a) == f(b)
assert f(a.sequence[0]) == f(b.sequence[0])
assert f(a) != f(b.sequence[1])
assert f(a.sequence[0]) != f(b.sequence[1])
assert f(a.sequence[1]) == f(b.sequence[1])
def test_clone(fx_asset):
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as img:
with img.sequence[2].clone() as single:
assert single.wand != img.wand
assert len(single.sequence) == 1
assert len(list(single.sequence)) == 1
assert single.size == img.sequence[2].size
def test_changes_reflected_back(fx_asset):
"""Changes on each single image should be reflected back to
the container image.
"""
with Image(filename=str(fx_asset.joinpath('apple.ico'))) as img:
with img.sequence[3] as single:
single.resize(32, 32)
assert single.size == (32, 32)
img.sequence.instances[3] = None # to make new instance
uncommitted = img.sequence[3]
assert uncommitted.size == (16, 16)
img.sequence.instances[3] = None
with img.sequence[3] as committed:
assert committed.size == (32, 32)
def test_delay(fx_asset):
fpath = str(fx_asset.joinpath('nocomments-delay-100.gif'))
with Image(filename=fpath) as img:
for s in img.sequence:
assert s.delay == 100
def test_set_delay(fx_asset):
with Image(filename=str(fx_asset.joinpath('nocomments.gif'))) as img:
with img.sequence[2] as frame:
assert frame.delay == 0
frame.delay = 10
with img.sequence.index_context(2):
assert library.MagickGetImageDelay(img.wand) == 10
with raises(TypeError):
img.sequence[2].delay = 0.0001
with raises(ValueError):
img.sequence[2].delay = -1
|