|
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.helpers import BIG_ENDIAN, LITTLE_ENDIAN, StreamReader |
13 | 15 | from docx.image.tiff import ( |
14 | 16 | _IfdEntries, _IfdEntry, _IfdParser, Tiff, _TiffParser |
15 | 17 | ) |
16 | 18 |
|
17 | 19 | from ..unitutil import ( |
18 | | - initializer_mock, class_mock, instance_mock, method_mock |
| 20 | + function_mock, class_mock, initializer_mock, instance_mock, method_mock |
19 | 21 | ) |
20 | 22 |
|
21 | 23 |
|
@@ -207,3 +209,45 @@ def offset_(self, request): |
207 | 209 | @pytest.fixture |
208 | 210 | def stream_(self, request): |
209 | 211 | return instance_mock(request, BytesIO) |
| 212 | + |
| 213 | + |
| 214 | +class Describe_IfdParser(object): |
| 215 | + |
| 216 | + def it_can_iterate_through_the_directory_entries_in_an_IFD( |
| 217 | + self, iter_fixture): |
| 218 | + (ifd_parser, _IfdEntryFactory_, stream_rdr, offsets, |
| 219 | + expected_entries) = iter_fixture |
| 220 | + entries = [e for e in ifd_parser.iter_entries()] |
| 221 | + assert _IfdEntryFactory_.call_args_list == [ |
| 222 | + call(stream_rdr, offsets[0]), |
| 223 | + call(stream_rdr, offsets[1]), |
| 224 | + ] |
| 225 | + assert entries == expected_entries |
| 226 | + |
| 227 | + # fixtures ------------------------------------------------------- |
| 228 | + |
| 229 | + @pytest.fixture |
| 230 | + def ifd_entry_(self, request): |
| 231 | + return instance_mock(request, _IfdEntry, tag=1, value=42) |
| 232 | + |
| 233 | + @pytest.fixture |
| 234 | + def ifd_entry_2_(self, request): |
| 235 | + return instance_mock(request, _IfdEntry, tag=2, value=24) |
| 236 | + |
| 237 | + @pytest.fixture |
| 238 | + def _IfdEntryFactory_(self, request, ifd_entry_, ifd_entry_2_): |
| 239 | + return function_mock( |
| 240 | + request, 'docx.image.tiff._IfdEntryFactory', |
| 241 | + side_effect=[ifd_entry_, ifd_entry_2_] |
| 242 | + ) |
| 243 | + |
| 244 | + @pytest.fixture |
| 245 | + def iter_fixture(self, _IfdEntryFactory_, ifd_entry_, ifd_entry_2_): |
| 246 | + stream_rdr = StreamReader(BytesIO(b'\x00\x02'), BIG_ENDIAN) |
| 247 | + offsets = [2, 14] |
| 248 | + ifd_parser = _IfdParser(stream_rdr, offset=0) |
| 249 | + expected_entries = [ifd_entry_, ifd_entry_2_] |
| 250 | + return ( |
| 251 | + ifd_parser, _IfdEntryFactory_, stream_rdr, offsets, |
| 252 | + expected_entries |
| 253 | + ) |
0 commit comments