1# vim: set fileencoding=utf-8 :
2
3import pytest
4
5import pyvips
6
7
8class TestProgress:
9    def test_progress(self):
10        # py27 requires this pattern for non-local modification
11        notes = {}
12
13        def preeval_cb(image, progress):
14            notes['seen_preeval'] = True
15
16        def eval_cb(image, progress):
17            notes['seen_eval'] = True
18
19        def posteval_cb(image, progress):
20            notes['seen_posteval'] = True
21
22        image = pyvips.Image.black(1, 100000)
23        image.set_progress(True)
24        image.signal_connect('preeval', preeval_cb)
25        image.signal_connect('eval', eval_cb)
26        image.signal_connect('posteval', posteval_cb)
27        image.avg()
28
29        assert notes['seen_preeval']
30        assert notes['seen_eval']
31        assert notes['seen_posteval']
32
33    def test_progress_fields(self):
34        def preeval_cb(image, progress):
35            assert progress.run == 0
36            assert progress.eta == 0
37            assert progress.percent == 0
38            assert progress.tpels == 10000
39            assert progress.npels == 0
40
41        def eval_cb(image, progress):
42            pass
43
44        def posteval_cb(image, progress):
45            assert progress.percent == 100
46            assert progress.tpels == 10000
47            assert progress.npels == 10000
48
49        image = pyvips.Image.black(10, 1000)
50        image.set_progress(True)
51        image.signal_connect('preeval', preeval_cb)
52        image.signal_connect('eval', eval_cb)
53        image.signal_connect('posteval', posteval_cb)
54        image.avg()
55
56    def test_progress_kill(self):
57        def preeval_cb(image, progress):
58            pass
59
60        def eval_cb(image, progress):
61            image.set_kill(True)
62
63        def posteval_cb(image, progress):
64            pass
65
66        # has to be very tall to ensure the kill has enough threadpool loops
67        # to work
68        image = pyvips.Image.black(1, 1000000)
69        image.set_progress(True)
70        image.signal_connect('preeval', preeval_cb)
71        image.signal_connect('eval', eval_cb)
72        image.signal_connect('posteval', posteval_cb)
73
74        with pytest.raises(Exception):
75            image.copy_memory()
76