atrcopy/test/test_create.py

85 lines
2.8 KiB
Python

from __future__ import print_function
from builtins import object
import numpy as np
from mock import *
from atrcopy import SegmentData, AtariDosDiskImage, Dos33DiskImage, DefaultSegment
from atrcopy import errors
def get_image(file_name, diskimage_type):
data = np.fromfile(file_name, dtype=np.uint8)
rawdata = SegmentData(data)
image = diskimage_type(rawdata)
return image
class BaseCreateTest:
diskimage_type = None
def get_exe_segments(self):
data1 = np.arange(4096, dtype=np.uint8)
data1[1::2] = np.repeat(np.arange(16, dtype=np.uint8), 128)
data2 = np.arange(4096, dtype=np.uint8)
data2[0::4] = np.repeat(np.arange(8, dtype=np.uint8), 128)
raw = [
(data1, 0x4000),
(data2, 0x8000),
]
segments = []
for data, origin in raw:
rawdata = SegmentData(data)
s = DefaultSegment(rawdata, origin)
segments.append(s)
return segments
def check_exe(self, sample_file, diskimage_type, run_addr, expected):
image = get_image(sample_file, diskimage_type)
segments = self.get_exe_segments()
try:
_ = issubclass(errors.AtrError, expected)
with pytest.raises(errors.InvalidBinaryFile) as e:
file_data, filetype = image.create_executable_file_image(sample_file, segments, run_addr)
except TypeError:
file_data, filetype = image.create_executable_file_image(sample_file, segments, run_addr)
print(image)
print(file_data, filetype)
assert len(file_data) == expected
@pytest.mark.parametrize("sample_file", ["../test_data/dos_sd_test1.atr"])
class TestAtariDosSDImage(BaseCreateTest):
diskimage_type = AtariDosDiskImage
@pytest.mark.parametrize("run_addr,expected", [
(0x2000, errors.InvalidBinaryFile),
(None, (2 + 6 + (4 + 0x1000) + (4 + 0x1000))),
(0x4000, (2 + 6 + (4 + 0x1000) + (4 + 0x1000))),
(0x8000, (2 + 6 + (4 + 0x1000) + (4 + 0x1000))),
(0xffff, errors.InvalidBinaryFile),
])
def test_exe(self, run_addr, expected, sample_file):
self.check_exe(sample_file, self.diskimage_type, run_addr, expected)
@pytest.mark.parametrize("sample_file", ["../test_data/dos33_master.dsk"])
class TestDos33Image(BaseCreateTest):
diskimage_type = Dos33DiskImage
@pytest.mark.parametrize("run_addr,expected", [
(0x2000, errors.InvalidBinaryFile),
(None, (4 + (0x9000 - 0x4000))),
(0x4000, (4 + (0x9000 - 0x4000))),
(0x8000, (4 + 3 + (0x9000 - 0x4000))),
(0xffff, errors.InvalidBinaryFile),
])
def test_exe(self, run_addr, expected, sample_file):
self.check_exe(sample_file, self.diskimage_type, run_addr, expected)
if __name__ == "__main__":
t = TestAtariDosSDImage()
t.setup()
t.test_exe()