Feb-20-2024, 02:21 PM
code test.py:
however without changing the code test.py, codes the scripts encoding, image and pixel so when performing 'pytest test.py' there is no error.
my pixel.py:
import pytest #################### PHASE 1 #################### def test_imports(): from pixel import Pixel from image import Image from encoding import Encoder, Decoder def test_pixel_no_negative(): from pixel import Pixel with pytest.raises(Exception): B = Pixel(0, 0xFF, -1) def test_pixel_eq(): from pixel import Pixel RED = Pixel(0xFF, 0, 0) GREEN = Pixel(0, 0xFF, 0) BLUE = Pixel(0, 0, 0xFF) RED2 = Pixel(0xFF, 0, 0) assert RED == RED2 def test_pixel_neq(): from pixel import Pixel RED = Pixel(0xFF, 0, 0) GREEN = Pixel(0, 0xFF, 0) BLUE = Pixel(0, 0, 0xFF) assert RED != GREEN assert GREEN != BLUE assert RED != BLUE def test_image_init_raises_exception(): from pixel import Pixel from image import Image with pytest.raises(Exception): Image(4, 4, [Pixel(0, 0, 0)]) with pytest.raises(Exception): Image(1, 1, [(0, 0, 0)]) def test_image_getitem(): from image import Image from pixel import Pixel BLACK = Pixel(0x00, 0x00, 0x00) WHITE = Pixel(0xFF, 0xFF, 0xFF) img = Image(2, 1, [BLACK, WHITE]) assert img[0,0] == BLACK assert img[1,0] == WHITE def test_image_setitem(): from pixel import Pixel from image import Image BLACK = Pixel(0x00, 0x00, 0x00) WHITE = Pixel(0xFF, 0xFF, 0xFF) img = Image(3, 1, [BLACK, WHITE, BLACK]) img[0,0] = WHITE assert img[0,0] == img[1,0] == WHITE assert img[2,0] == BLACK def test_image_setitem_raises_indexerror(): from pixel import Pixel from image import Image img = Image(1, 1, [Pixel(0, 0, 0)]) with pytest.raises(IndexError): img[1,1] = Pixel(0, 0xFF, 0) def test_img_eq(): from pixel import Pixel from image import Image BLACK = Pixel(0x00, 0x00, 0x00) WHITE = Pixel(0xFF, 0xFF, 0xFF) img1 = Image(3, 1, [BLACK, WHITE, BLACK]) img2 = Image(3, 1, [BLACK, WHITE, BLACK]) assert img1 == img2 def test_img_neq(): from pixel import Pixel from image import Image BLACK = Pixel(0x00, 0x00, 0x00) WHITE = Pixel(0xFF, 0xFF, 0xFF) img1 = Image(3, 1, [BLACK, WHITE, BLACK]) img2 = Image(3, 1, [BLACK, BLACK, BLACK]) assert img1 != img2 def _get_squares_img(): from pixel import Pixel from image import Image BLACK = Pixel(0, 0, 0) WHITE = Pixel(0xFF, 0xFF, 0xFF) return Image(2, 2, [BLACK, WHITE, BLACK, WHITE]) def _get_file_content(path: str): return open(path, 'rb').read() def _set_file_content(path: str, content: bytes): open(path, 'wb').write(content) def _get_tempfile(): import tempfile return tempfile.mktemp() def _image_as_bytes(image, *args, **kwargs): from encoding import Encoder path = _get_tempfile() Encoder(image, *args, **kwargs).save_to(path) return _get_file_content(path) def _bytes_as_img(b): from encoding import Decoder path = _get_tempfile() _set_file_content(path, b) return Decoder.load_from(path) SQUARES_ULBMP1_CONTENT = bytes.fromhex('554c424d50010c0002000200000000ffffff000000ffffff') def test_encode_squares_ulbmp1(): assert _image_as_bytes(_get_squares_img()) == SQUARES_ULBMP1_CONTENT def test_decode_squares_ulbmp1(): assert _bytes_as_img(SQUARES_ULBMP1_CONTENT) == _get_squares_img() def test_load_from_corrupt(): bad_content = b'ULBPM\x01\x08\x00' with pytest.raises(Exception): _bytes_as_img(bad_content) def test_load_from_incomplete(): incomplete_content = b'ULBMP\x01\x0c\x00\x02\x00\x02\x00\x00\x00\x00' with pytest.raises(Exception): _bytes_as_img(incomplete_content)work to be done:
however without changing the code test.py, codes the scripts encoding, image and pixel so when performing 'pytest test.py' there is no error.
my pixel.py:
class Pixel: def __init__(self, red: int, green: int, blue: int): if not all(0 <= c <= 255 for c in (red, green, blue)): raise Exception("RGB values must be between 0 and 255") self._red = red self._green = green self._blue = blue @property def red(self): return self._red @property def green(self): return self._green @property def blue(self): return self._blue def __eq__(self, other): if not isinstance(other, Pixel): return False return self._red == other._red and self._green == other._green and self._blue == other._bluemy encoding.py:
from image import Image from pixel import Pixel class Encoder: def __init__(self, img: Image): self._img = img def save_to(self, path: str) -> None: with open(path, 'wb') as f: f.write(b'ULBMP') f.write(b'\x01') # Version 1 header_size = 12 f.write(header_size.to_bytes(2, 'little')) f.write(self._img._width.to_bytes(2, 'little')) f.write(self._img._height.to_bytes(2, 'little')) for pixel in self._img._pixels: f.write(bytes([pixel.red, pixel.green, pixel.blue])) class Decoder: @staticmethod def load_from(path: str) -> Image: with open(path, 'rb') as f: signature = f.read(5) if signature != b'ULBMP': raise Exception("Invalid ULBMP file") version = int.from_bytes(f.read(1), 'little') if version != 1: raise Exception(f"Unsupported ULBMP version: {version}") header_size = int.from_bytes(f.read(2), 'little') width = int.from_bytes(f.read(2), 'little') height = int.from_bytes(f.read(2), 'little') pixels = [] for _ in range(width * height): red = int.from_bytes(f.read(1), 'little') green = int.from_bytes(f.read(1), 'little') blue = int.from_bytes(f.read(1), 'little') pixels.append(Pixel(red, green, blue)) if len(pixels) != width * height: raise Exception("Incomplete ULBMP file") return Image(width, height, pixels)my image.py:
from pixel import Pixel class Image: def __init__(self, _width: int, _height: int, _pixels: list): if _width <= 0 or _height <= 0: raise Exception("Les dimensions de l'image doivent être des entiers positifs") if len(_pixels) != _width * _height: raise Exception("La liste de pixels ne correspond pas aux dimensions de l'image") self._width = _width self._height = _height self._pixels = _pixels def __getitem__(self, pos: tuple[int,int]) -> Pixel: x, y = pos if not (0 <= x < self._width and 0 <= y < self._height): raise IndexError("Position out of bounds") return self._pixels[y * self._width + x] def __setitem__(self, pos: tuple[int,int], pix: Pixel) -> None: x, y = pos if not (0 <= x < self._width and 0 <= y < self._height): raise IndexError("Position out of bounds") self._pixels[y * self._width + x] = pix def __eq__(self, other: 'Image') -> bool: if not isinstance(other, Image): return False return (self._width, self._height, self._pixels) == (other._width, other._height, other._pixels)but when I do pytest test.py I have the following test results:
Output:batchayw@batchayw-Precision-5520:~/Téléchargements/Yassin/phase1$ pytest test.py
============================= test session starts ==============================
platform linux -- Python 3.10.12, pytest-8.0.1, pluggy-1.4.0
rootdir: /home/batchayw/Téléchargements/Yassin/phase1
plugins: anyio-4.2.0
collected 14 items
test.py ....F........F [100%]
=================================== FAILURES ===================================
_______________________ test_image_init_raises_exception _______________________
def test_image_init_raises_exception():
from pixel import Pixel
from image import Image
with pytest.raises(Exception):
Image(4, 4, [Pixel(0, 0, 0)])
> with pytest.raises(Exception):
E Failed: DID NOT RAISE <class 'Exception'>
test.py:37: Failed
__________________________ test_load_from_incomplete ___________________________
def test_load_from_incomplete():
incomplete_content = b'ULBMP\x01\x0c\x00\x02\x00\x02\x00\x00\x00\x00'
> with pytest.raises(Exception):
E Failed: DID NOT RAISE <class 'Exception'>
test.py:128: Failed
=========================== short test summary info ============================
FAILED test.py::test_image_init_raises_exception - Failed: DID NOT RAISE <class 'Exception'>
FAILED test.py::test_load_from_incomplete - Failed: DID NOT RAISE <class 'Exception'>
========================= 2 failed, 12 passed in 0.11s =========================
batchayw@batchayw-Precision-5520:~/Téléchargements/Yassin/phase1$