forked from arti/vt1200
64 lines
1.7 KiB
Python
64 lines
1.7 KiB
Python
import numpy as np
|
|
|
|
from pipeline.movie import (
|
|
Rect,
|
|
TileRecord,
|
|
FrameRecord,
|
|
MovieHeader,
|
|
MovieFormatError,
|
|
encode_frame,
|
|
decode_frame,
|
|
write_movie,
|
|
read_movie,
|
|
)
|
|
|
|
|
|
def test_rect_full_tile_bias_roundtrip():
|
|
rec = FrameRecord(1, 0, [TileRecord(0, 0, [Rect(0, 0, 32, 32)])])
|
|
back, off = decode_frame(encode_frame(rec), 0)
|
|
assert back.tiles[0].rects[0] == Rect(0, 0, 32, 32)
|
|
assert off == len(encode_frame(rec))
|
|
|
|
|
|
def test_more_than_127_rects_roundtrip():
|
|
rects = [Rect(i % 32, i // 32, 1, 1) for i in range(200)]
|
|
rec = FrameRecord(1, 0, [TileRecord(3, 0, rects)])
|
|
back, _ = decode_frame(encode_frame(rec), 0)
|
|
assert len(back.tiles[0].rects) == 200
|
|
|
|
|
|
def test_rect_outside_tile_raises():
|
|
rec = FrameRecord(1, 0, [TileRecord(0, 0, [Rect(31, 0, 2, 1)])])
|
|
try:
|
|
encode_frame(rec)
|
|
except MovieFormatError:
|
|
return
|
|
assert False, "rect crossing a tile boundary was accepted"
|
|
|
|
|
|
def test_truncated_record_raises():
|
|
data = encode_frame(
|
|
FrameRecord(1, 0, [TileRecord(0, 0, [Rect(0, 0, 4, 4)])]))
|
|
try:
|
|
decode_frame(data[:-1], 0)
|
|
except MovieFormatError:
|
|
return
|
|
assert False, "truncated record was accepted"
|
|
|
|
|
|
def test_write_movie_refuses_over_cap(tmp_path):
|
|
frames = [FrameRecord(1, 0, []) for _ in range(10)]
|
|
header = MovieHeader(640, 512, 2, 32, 20, 16, 10, 60, 72)
|
|
import pipeline.movie as m
|
|
|
|
old = m.MAX_DATA_BYTES
|
|
m.MAX_DATA_BYTES = 8
|
|
try:
|
|
try:
|
|
write_movie(str(tmp_path / "x.bin"), frames, header)
|
|
except MovieFormatError:
|
|
return
|
|
assert False, "cap not enforced"
|
|
finally:
|
|
m.MAX_DATA_BYTES = old
|