|
14 | 14 | from docx.image.constants import MIME_TYPE, PNG_CHUNK_TYPE, TAG |
15 | 15 | from docx.image.exceptions import InvalidImageStreamError |
16 | 16 | from docx.image.helpers import BIG_ENDIAN, StreamReader |
17 | | -from docx.image.png import _Chunk, _Chunks, _ChunkParser, Png, _PngParser |
| 17 | +from docx.image.png import ( |
| 18 | + _Chunk, _Chunks, _ChunkFactory, _ChunkParser, _IHDRChunk, _pHYsChunk, |
| 19 | + Png, _PngParser |
| 20 | +) |
18 | 21 |
|
19 | 22 | from ..unitutil import ( |
20 | 23 | function_mock, class_mock, initializer_mock, instance_mock, method_mock, |
@@ -438,3 +441,66 @@ def stream_(self, request): |
438 | 441 | @pytest.fixture |
439 | 442 | def stream_rdr_(self, request): |
440 | 443 | return instance_mock(request, StreamReader) |
| 444 | + |
| 445 | + |
| 446 | +class Describe_ChunkFactory(object): |
| 447 | + |
| 448 | + def it_constructs_the_appropriate_Chunk_subclass(self, call_fixture): |
| 449 | + chunk_type, stream_rdr_, offset, chunk_cls_ = call_fixture |
| 450 | + chunk = _ChunkFactory(chunk_type, stream_rdr_, offset) |
| 451 | + chunk_cls_.from_offset.assert_called_once_with( |
| 452 | + chunk_type, stream_rdr_, offset |
| 453 | + ) |
| 454 | + assert isinstance(chunk, _Chunk) |
| 455 | + |
| 456 | + # fixtures ------------------------------------------------------- |
| 457 | + |
| 458 | + @pytest.fixture(params=[ |
| 459 | + PNG_CHUNK_TYPE.IHDR, |
| 460 | + PNG_CHUNK_TYPE.pHYs, |
| 461 | + PNG_CHUNK_TYPE.IEND, |
| 462 | + ]) |
| 463 | + def call_fixture( |
| 464 | + self, request, _IHDRChunk_, _pHYsChunk_, _Chunk_, stream_rdr_): |
| 465 | + chunk_type = request.param |
| 466 | + chunk_cls_ = { |
| 467 | + PNG_CHUNK_TYPE.IHDR: _IHDRChunk_, |
| 468 | + PNG_CHUNK_TYPE.pHYs: _pHYsChunk_, |
| 469 | + PNG_CHUNK_TYPE.IEND: _Chunk_, |
| 470 | + }[chunk_type] |
| 471 | + offset = 999 |
| 472 | + return chunk_type, stream_rdr_, offset, chunk_cls_ |
| 473 | + |
| 474 | + @pytest.fixture |
| 475 | + def _Chunk_(self, request, chunk_): |
| 476 | + _Chunk_ = class_mock(request, 'docx.image.png._Chunk') |
| 477 | + _Chunk_.from_offset.return_value = chunk_ |
| 478 | + return _Chunk_ |
| 479 | + |
| 480 | + @pytest.fixture |
| 481 | + def chunk_(self, request): |
| 482 | + return instance_mock(request, _Chunk) |
| 483 | + |
| 484 | + @pytest.fixture |
| 485 | + def _IHDRChunk_(self, request, ihdr_chunk_): |
| 486 | + _IHDRChunk_ = class_mock(request, 'docx.image.png._IHDRChunk') |
| 487 | + _IHDRChunk_.from_offset.return_value = ihdr_chunk_ |
| 488 | + return _IHDRChunk_ |
| 489 | + |
| 490 | + @pytest.fixture |
| 491 | + def ihdr_chunk_(self, request): |
| 492 | + return instance_mock(request, _IHDRChunk) |
| 493 | + |
| 494 | + @pytest.fixture |
| 495 | + def _pHYsChunk_(self, request, phys_chunk_): |
| 496 | + _pHYsChunk_ = class_mock(request, 'docx.image.png._pHYsChunk') |
| 497 | + _pHYsChunk_.from_offset.return_value = phys_chunk_ |
| 498 | + return _pHYsChunk_ |
| 499 | + |
| 500 | + @pytest.fixture |
| 501 | + def phys_chunk_(self, request): |
| 502 | + return instance_mock(request, _pHYsChunk) |
| 503 | + |
| 504 | + @pytest.fixture |
| 505 | + def stream_rdr_(self, request): |
| 506 | + return instance_mock(request, StreamReader) |
0 commit comments