208 lines
6.4 KiB
Python
208 lines
6.4 KiB
Python
"""
|
|
Tests for PcbDraw.
|
|
|
|
For debug information use:
|
|
pytest-3 --log-cli-level debug
|
|
"""
|
|
import coverage
|
|
import logging
|
|
from shutil import which
|
|
from os import access
|
|
from . import context
|
|
from kibot.mcpyrate import activate # noqa: F401
|
|
|
|
OUT_DIR = 'PcbDraw'
|
|
cov = coverage.Coverage()
|
|
|
|
|
|
def test_pcbdraw_3Rs(test_dir):
|
|
prj = '3Rs'
|
|
ctx = context.TestContext(test_dir, prj, 'pcbdraw', OUT_DIR)
|
|
ctx.run()
|
|
ctx.expect_out_file_d(prj+'-top.svg')
|
|
ctx.expect_out_file_d(prj+'-bottom.svg')
|
|
ctx.clean_up()
|
|
|
|
|
|
def test_pcbdraw_simple(test_dir):
|
|
prj = 'bom'
|
|
ctx = context.TestContext(test_dir, prj, 'pcbdraw_simple', OUT_DIR)
|
|
ctx.run()
|
|
ctx.expect_out_file_d(prj+'-top.png')
|
|
ctx.expect_out_file_d(prj+'-bottom.jpg')
|
|
ctx.clean_up()
|
|
|
|
|
|
def no_rsvg_convert(name):
|
|
logging.debug('no_rsvg_convert called')
|
|
if name == 'rsvg-convert':
|
|
logging.debug('no_rsvg_convert returns None')
|
|
return None
|
|
return which(name)
|
|
|
|
|
|
def no_rsvg_convert_access(name, attrs):
|
|
logging.debug('no_rsvg_convert_access')
|
|
if name.endswith('/rsvg-convert'):
|
|
logging.debug('no_rsvg_convert_access returns False')
|
|
return False
|
|
return access(name, attrs)
|
|
|
|
|
|
def no_convert(name):
|
|
logging.debug('no_convert called')
|
|
if name == 'convert':
|
|
logging.debug('no_convert returns None')
|
|
return None
|
|
return which(name)
|
|
|
|
|
|
def no_convert_access(name, attrs):
|
|
logging.debug('no_convert_access')
|
|
if name.endswith('/convert'):
|
|
logging.debug('no_convert_access returns False')
|
|
return False
|
|
return access(name, attrs)
|
|
|
|
|
|
def no_run(cmd, stderr, text=False):
|
|
return b""
|
|
|
|
|
|
def platform_system_bogus():
|
|
return 'Bogus'
|
|
|
|
|
|
class DummyPcbDraw(object):
|
|
def __init__(self):
|
|
self.type = 'pcbdraw'
|
|
|
|
|
|
DEPS = {'Dependencies': [{'name': 'pcbdraw', 'command': 'pcbdraw', 'role': 'mandatory'},
|
|
{'name': 'RSVG', 'command': 'rsvg-convert', 'role': 'XXXX', 'debian': 'librsvg2-bin'},
|
|
{'name': 'ImageMagick', 'command': 'convert', 'role': 'XXXX', 'debian': 'imagemagick'}]}
|
|
|
|
|
|
# def test_pcbdraw_miss_rsvg(caplog, monkeypatch):
|
|
# """ Check missing rsvg-convert """
|
|
# with monkeypatch.context() as m:
|
|
# # Make which('rsvg-convert') fail
|
|
# m.setattr("shutil.which", no_rsvg_convert)
|
|
# # Make the call to determine the version fail
|
|
# m.setattr("subprocess.check_output", no_run)
|
|
# # Make os.access(...rsvg-convert', EXEC) fail
|
|
# m.setattr("os.access", no_rsvg_convert_access)
|
|
# # Make platform.system() return a bogus OS
|
|
# m.setattr("platform.system", platform_system_bogus)
|
|
# # Reload the module so we get the above patches
|
|
# mod = reload(kibot.dep_downloader)
|
|
# mod.register_deps('pcbdraw', DEPS)
|
|
# logging.error(mod.used_deps)
|
|
# old_lev = kibot.log.debug_level
|
|
# kibot.log.debug_level = 2
|
|
# o = PcbDrawOptions()
|
|
# o.style = ''
|
|
# o.remap = None
|
|
# o.format = 'jpg'
|
|
# o.config(None)
|
|
# o._parent = DummyPcbDraw()
|
|
# cov.load()
|
|
# cov.start()
|
|
# o.run('')
|
|
# cov.stop()
|
|
# cov.save()
|
|
# kibot.log.debug_level = old_lev
|
|
# assert 'using unreliable PNG/JPG' in caplog.text, caplog.text
|
|
# assert 'librsvg2-bin' in caplog.text, caplog.text
|
|
#
|
|
#
|
|
# def test_pcbdraw_miss_convert(caplog, monkeypatch):
|
|
# """ Check missing convert """
|
|
# with monkeypatch.context() as m:
|
|
# m.setattr("shutil.which", no_convert)
|
|
# m.setattr("subprocess.check_output", no_run)
|
|
# m.setattr("os.access", no_convert_access)
|
|
# # Make platform.system() return a bogus OS
|
|
# m.setattr("platform.system", platform_system_bogus)
|
|
# # Reload the module so we get the above patches
|
|
# mod = reload(kibot.dep_downloader)
|
|
# mod.register_deps('pcbdraw', DEPS)
|
|
# o = PcbDrawOptions()
|
|
# o.style = ''
|
|
# o.remap = None
|
|
# o.format = 'jpg'
|
|
# o.config(None)
|
|
# o._parent = DummyPcbDraw()
|
|
# cov.load()
|
|
# cov.start()
|
|
# o.run('')
|
|
# cov.stop()
|
|
# cov.save()
|
|
# assert 'using unreliable PNG/JPG' in caplog.text, caplog.text
|
|
# assert 'imagemagick' in caplog.text, caplog.text
|
|
|
|
|
|
def test_pcbdraw_variant_1(test_dir):
|
|
prj = 'kibom-variant_3'
|
|
ctx = context.TestContext(test_dir, prj, 'pcbdraw_variant_1', '')
|
|
ctx.run()
|
|
# Check all outputs are there
|
|
fname = prj+'-top.png'
|
|
ctx.expect_out_file(fname)
|
|
# We use 40% because different versions of the tools are generating large differences
|
|
# in the borders. With 40% these differences are removed and we still detect is a
|
|
# components was removed.
|
|
# Expected: R1 and R2 populated
|
|
ctx.compare_image(fname, fuzz='40%', height='100%')
|
|
ctx.clean_up(keep_project=True)
|
|
|
|
|
|
def test_pcbdraw_variant_2(test_dir):
|
|
prj = 'kibom-variant_3'
|
|
ctx = context.TestContext(test_dir, prj, 'pcbdraw_variant_2', '')
|
|
ctx.run()
|
|
# Check all outputs are there
|
|
fname = prj+'-top-C1.png'
|
|
ctx.expect_out_file(fname)
|
|
# Expected: R1 and R2 populated + C1 manually added
|
|
ctx.compare_image(fname, fuzz='40%', height='100%', tol=30)
|
|
ctx.clean_up(keep_project=True)
|
|
|
|
|
|
def test_pcbdraw_variant_3(test_dir):
|
|
prj = 'kibom-variant_3'
|
|
ctx = context.TestContext(test_dir, prj, 'pcbdraw_variant_3', '')
|
|
ctx.run()
|
|
# Check all outputs are there
|
|
fname = prj+'-top.png'
|
|
ctx.expect_out_file(fname)
|
|
ctx.compare_image(fname, fuzz='40%', height='100%')
|
|
ctx.clean_up(keep_project=True)
|
|
|
|
|
|
def test_pcbdraw_sub_pcb_bp(test_dir):
|
|
""" Test a multiboard example """
|
|
prj = 'batteryPack'
|
|
ctx = context.TestContext(test_dir, prj, 'pcbdraw_sub_pcb_bp', '')
|
|
ctx.run()
|
|
# Check all outputs are there
|
|
fname_b = prj+'-top_'
|
|
ctx.expect_out_file(fname_b+'battery.svg')
|
|
ctx.expect_out_file(fname_b+'charger.svg')
|
|
ctx.expect_out_file(fname_b+'connector.svg')
|
|
ctx.compare_image(fname_b+'connector.svg', height='100%', tol=10)
|
|
ctx.clean_up(keep_project=True)
|
|
|
|
|
|
def test_pcbdraw_sub_pcb_2(test_dir):
|
|
""" Test a multiboard example """
|
|
prj = 'multiboard'
|
|
ctx = context.TestContext(test_dir, prj, 'pcbdraw_sub_pcb_2', '')
|
|
ctx.run()
|
|
# Check all outputs are there
|
|
fname_b = prj+'-top_'
|
|
ctx.expect_out_file(fname_b+'battery.svg')
|
|
ctx.expect_out_file(fname_b+'charger.svg')
|
|
ctx.expect_out_file(fname_b+'connector.svg')
|
|
ctx.clean_up(keep_project=True)
|