Skip to content

Commit d19bce9

Browse files
committed
feat: added full tests
1 parent 82c252a commit d19bce9

File tree

6 files changed

+86
-14
lines changed

6 files changed

+86
-14
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33

44
all: clang-tidy mypy ruff flake8 pylint pytest-coverage
5-
echo 'All'
5+
66

77
python-install:
88
pip3 install cuda-toolkit[cudart,nvcc,nvjpeg]==12.4.1

src/python/app/io/bmp.py

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ def from_default(cls) -> 'DIBOS22Header':
217217
"""Additional constructor that allows to create this class object using default initialisation"""
218218

219219
return DIBOS22Header(planes=1,
220-
bits_per_pixel=8,
220+
bits_per_pixel=24,
221221
info_header=DIBInfoHeader.from_default())
222222

223223
def __post_init__(self) -> None:
@@ -303,11 +303,11 @@ def __post_init__(self) -> None:
303303
def get_bits_per_pixel(self) -> int:
304304
"""Getter for that bits per pixel field that handles the case if the os22 header is not present"""
305305

306-
return 8 if self.os22_header is None else self.os22_header.bits_per_pixel
306+
return 24 if self.os22_header is None else self.os22_header.bits_per_pixel
307307

308308

309309
@dataclass(slots=True)
310-
class BMP(Sized):
310+
class BMP:
311311
"""Class that represents the BMP file in a structured way"""
312312

313313
header: BitmapFileHeader
@@ -369,19 +369,12 @@ def to_numpy(self) -> np.ndarray:
369369
return np.frombuffer(bytes(image_bytes),
370370
dtype=np.uint8).reshape(height, width, num_colors_end)
371371

372-
def __post_init__(self) -> None:
373-
if len(self.image_data) != self.header.file_size - self.header.file_offset_to_pixel_array:
374-
raise InvalidFormatException('Invalid argument')
375-
376372
def __bytes__(self) -> bytes:
377373
return bytes(self.header)\
378374
+ bytes(self.dib_header)\
379375
+ (b'' if self.color_table is None else self.color_table)\
380376
+ self.image_data
381377

382-
def __len__(self) -> int:
383-
return len(self.header) + len(self.dib_header) + len(self.image_data)
384-
385378
def get_padding(self) -> int:
386379
"""Method that computes the number of bytes that are appended at the end of all the row"""
387380

@@ -406,6 +399,7 @@ def read_format(self, file: BinaryIO) -> Image:
406399
bmp = BMP.from_bytes(file)
407400
return Image(data=bmp.to_numpy())
408401

402+
409403
@final
410404
class BMPWriter(IFormatWriter): # pylint: disable=too-few-public-methods
411405
"""Class that serializes Image to BMP format"""
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import io
2+
3+
import numpy as np
4+
import pytest
5+
6+
from app.image.image import Image
7+
from app.io.bmp import BMPReader, BMPWriter
8+
9+
10+
@pytest.mark.parametrize('data,expected', [
11+
(
12+
b'BMF\x00\x00\x00\x00\x00\x00\x006\x00\x00\x00(\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x01\x00\x18\x00\x00\x00\x00\x00\x01\x00\x00\x00\xc8\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00',
13+
np.array([[[255, 0, 0], [0, 255, 0]], [[0, 0, 255], [255, 255, 255]]], dtype=np.uint8),
14+
),
15+
(
16+
b'BMF\x00\x00\x00\x00\x00\x00\x006\x00\x00\x00(\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x01\x00\x18\x00\x00\x00\x00\x00\x01\x00\x00\x00\xc8\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x1c$\x00\xa2\xe8\x00\x00\xff\xf2\x00\xa3I\xa4\x00\x00',
17+
np.array([[[237, 28, 36], [0, 162, 232]], [[255, 242, 0], [163, 73, 164]]], dtype=np.uint8),
18+
),
19+
])
20+
def test_reader(data: bytes, expected: np.ndarray) -> None:
21+
buffer = io.BytesIO(data)
22+
reader = BMPReader()
23+
24+
assert np.all(reader.read_format(buffer).data == expected)
25+
26+
27+
@pytest.mark.parametrize('data', [
28+
b'BMF\x00\x00\x00\x00\x00\x00\x006\x00\x00\x00(\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x01\x00\x18\x00\x00\x00\x00\x00\x01\x00\x00\x00\xc8\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00',
29+
b'BMF\x00\x00\x00\x00\x00\x00\x006\x00\x00\x00(\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x01\x00\x18\x00\x00\x00\x00\x00\x01\x00\x00\x00\xc8\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x1c$\x00\xa2\xe8\x00\x00\xff\xf2\x00\xa3I\xa4\x00\x00',
30+
])
31+
def test_transcoding_from_reader(data: bytes):
32+
in_buffer = io.BytesIO(data)
33+
out_buffer = io.BytesIO()
34+
35+
reader = BMPReader()
36+
writer = BMPWriter()
37+
writer.write_format(out_buffer, reader.read_format(in_buffer))
38+
39+
assert out_buffer.getvalue() == data
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import io
2+
3+
import numpy as np
4+
import pytest
5+
6+
from app.image.image import Image
7+
from app.io.bmp import BMPWriter, BMPReader
8+
9+
10+
@pytest.mark.parametrize('data,expected', [
11+
(
12+
np.array([[[255, 0, 0], [0, 255, 0]], [[0, 0, 255], [255, 255, 255]]], dtype=np.uint8),
13+
b'BMF\x00\x00\x00\x00\x00\x00\x006\x00\x00\x00(\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x01\x00\x18\x00\x00\x00\x00\x00\x01\x00\x00\x00\xc8\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00',
14+
),
15+
(
16+
np.array([[[237, 28, 36], [0, 162, 232]], [[255, 242, 0], [163, 73, 164]]], dtype=np.uint8),
17+
b'BMF\x00\x00\x00\x00\x00\x00\x006\x00\x00\x00(\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x01\x00\x18\x00\x00\x00\x00\x00\x01\x00\x00\x00\xc8\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x1c$\x00\xa2\xe8\x00\x00\xff\xf2\x00\xa3I\xa4\x00\x00',
18+
),
19+
])
20+
def test_writer(data: np.ndarray, expected: bytes) -> None:
21+
buffer = io.BytesIO()
22+
writer = BMPWriter()
23+
writer.write_format(buffer, Image(data=data))
24+
25+
assert buffer.getvalue() == expected
26+
27+
28+
@pytest.mark.parametrize('data', [
29+
np.array([[[255, 0, 0], [0, 255, 0]], [[0, 0, 255], [255, 255, 255]]], dtype=np.uint8),
30+
np.array([[[237, 28, 36], [0, 162, 232]], [[255, 242, 0], [163, 73, 164]]], dtype=np.uint8),
31+
])
32+
def test_transcoding_from_writer(data: np.ndarray) -> None:
33+
out_buffer = io.BytesIO()
34+
35+
reader = BMPReader()
36+
writer = BMPWriter()
37+
writer.write_format(out_buffer, Image(data=data))
38+
39+
assert np.all(reader.read_format(io.BytesIO(out_buffer.getvalue())).data == data)

tests/python/app/io/bmp/test_core_header.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ def test_bmp_header_length_no_trailer(dib_header_size: int, image_width: int, im
9393
1, 15, 7211, 323,
9494
])
9595
@pytest.mark.parametrize('trailer,expected_length', [
96-
(None, 8,),
97-
(DIBOS22Header.from_default(), 8,),
96+
(None, 24,),
97+
(DIBOS22Header.from_default(), 24,),
9898
(DIBOS22Header.from_bytes(b'\x01\x00\x18\x00'), 24,),
9999
(DIBOS22Header.from_bytes(b'\x01\x00 \x00'), 32,),
100100
])

tests/python/app/io/bmp/test_os22_header.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
def test_bmp_header_from_default() -> None:
88
default_header = DIBOS22Header.from_default()
9-
expected_header = DIBOS22Header(1, 8, DIBInfoHeader.from_default())
9+
expected_header = DIBOS22Header(1, 24, DIBInfoHeader.from_default())
1010

1111
assert default_header == expected_header
1212
assert len(default_header) == len(expected_header)

0 commit comments

Comments
 (0)