|
8 | 8 |
|
9 | 9 | import pytest |
10 | 10 |
|
| 11 | +from mock import call |
| 12 | + |
11 | 13 | from docx.compat import BytesIO |
12 | 14 | from docx.image.constants import JPEG_MARKER_CODE |
13 | 15 | from docx.image.helpers import BIG_ENDIAN, StreamReader |
14 | 16 | from docx.image.jpeg import ( |
15 | | - _App0Marker, Jfif, _JfifMarkers, _Marker, _MarkerParser, _SofMarker |
| 17 | + _App0Marker, Jfif, _JfifMarkers, _Marker, _MarkerFinder, _MarkerParser, |
| 18 | + _SofMarker |
16 | 19 | ) |
17 | 20 |
|
18 | 21 | from ..unitutil import class_mock, initializer_mock, instance_mock |
@@ -159,18 +162,84 @@ def it_can_construct_from_a_jfif_stream(self, from_stream_fixture): |
159 | 162 | _MarkerParser__init_.assert_called_once_with(stream_reader_) |
160 | 163 | assert isinstance(marker_parser, _MarkerParser) |
161 | 164 |
|
| 165 | + def it_can_iterate_over_the_jfif_markers_in_its_stream( |
| 166 | + self, iter_markers_fixture): |
| 167 | + (marker_parser, stream_, _MarkerFinder_, marker_finder_, |
| 168 | + _MarkerFactory_, marker_codes, offsets, |
| 169 | + marker_lst) = iter_markers_fixture |
| 170 | + markers = [marker for marker in marker_parser.iter_markers()] |
| 171 | + _MarkerFinder_.from_stream.assert_called_once_with(stream_) |
| 172 | + assert marker_finder_.next.call_args_list == [ |
| 173 | + call(0), call(2), call(20) |
| 174 | + ] |
| 175 | + assert _MarkerFactory_.call_args_list == [ |
| 176 | + call(marker_codes[0], stream_, offsets[0]), |
| 177 | + call(marker_codes[1], stream_, offsets[1]), |
| 178 | + call(marker_codes[2], stream_, offsets[2]), |
| 179 | + ] |
| 180 | + assert markers == marker_lst |
| 181 | + |
162 | 182 | # fixtures ------------------------------------------------------- |
163 | 183 |
|
| 184 | + @pytest.fixture |
| 185 | + def app0_(self, request): |
| 186 | + return instance_mock(request, _App0Marker, segment_length=16) |
| 187 | + |
| 188 | + @pytest.fixture |
| 189 | + def eoi_(self, request): |
| 190 | + return instance_mock(request, _Marker, segment_length=0) |
| 191 | + |
164 | 192 | @pytest.fixture |
165 | 193 | def from_stream_fixture( |
166 | 194 | self, stream_, StreamReader_, _MarkerParser__init_, |
167 | 195 | stream_reader_): |
168 | 196 | return stream_, StreamReader_, _MarkerParser__init_, stream_reader_ |
169 | 197 |
|
| 198 | + @pytest.fixture |
| 199 | + def iter_markers_fixture( |
| 200 | + self, stream_reader_, _MarkerFinder_, marker_finder_, |
| 201 | + _MarkerFactory_, soi_, app0_, eoi_): |
| 202 | + marker_parser = _MarkerParser(stream_reader_) |
| 203 | + offsets = [2, 4, 22] |
| 204 | + marker_lst = [soi_, app0_, eoi_] |
| 205 | + marker_finder_.next.side_effect = [ |
| 206 | + (JPEG_MARKER_CODE.SOI, offsets[0]), |
| 207 | + (JPEG_MARKER_CODE.APP0, offsets[1]), |
| 208 | + (JPEG_MARKER_CODE.EOI, offsets[2]), |
| 209 | + ] |
| 210 | + marker_codes = [ |
| 211 | + JPEG_MARKER_CODE.SOI, JPEG_MARKER_CODE.APP0, JPEG_MARKER_CODE.EOI |
| 212 | + ] |
| 213 | + return ( |
| 214 | + marker_parser, stream_reader_, _MarkerFinder_, marker_finder_, |
| 215 | + _MarkerFactory_, marker_codes, offsets, marker_lst |
| 216 | + ) |
| 217 | + |
| 218 | + @pytest.fixture |
| 219 | + def _MarkerFactory_(self, request, soi_, app0_, eoi_): |
| 220 | + return class_mock( |
| 221 | + request, 'docx.image.jpeg._MarkerFactory', |
| 222 | + side_effect=[soi_, app0_, eoi_] |
| 223 | + ) |
| 224 | + |
| 225 | + @pytest.fixture |
| 226 | + def _MarkerFinder_(self, request, marker_finder_): |
| 227 | + _MarkerFinder_ = class_mock(request, 'docx.image.jpeg._MarkerFinder') |
| 228 | + _MarkerFinder_.from_stream.return_value = marker_finder_ |
| 229 | + return _MarkerFinder_ |
| 230 | + |
| 231 | + @pytest.fixture |
| 232 | + def marker_finder_(self, request): |
| 233 | + return instance_mock(request, _MarkerFinder) |
| 234 | + |
170 | 235 | @pytest.fixture |
171 | 236 | def _MarkerParser__init_(self, request): |
172 | 237 | return initializer_mock(request, _MarkerParser) |
173 | 238 |
|
| 239 | + @pytest.fixture |
| 240 | + def soi_(self, request): |
| 241 | + return instance_mock(request, _Marker, segment_length=0) |
| 242 | + |
174 | 243 | @pytest.fixture |
175 | 244 | def stream_(self, request): |
176 | 245 | return instance_mock(request, BytesIO) |
|
0 commit comments