141 lines
4.7 KiB
Python
141 lines
4.7 KiB
Python
"""
|
|
Tests for the KiCost output.
|
|
|
|
For debug information use:
|
|
pytest-3 --log-cli-level debug
|
|
"""
|
|
import os.path as op
|
|
import re
|
|
from . import context
|
|
import logging
|
|
import subprocess
|
|
|
|
OUT_DIR = 'KiCost'
|
|
|
|
|
|
def convert2csv(ctx, xlsx, skip_empty=False, sheet=None):
|
|
xlsx = ctx.get_out_path(op.join(OUT_DIR, xlsx))
|
|
csv = xlsx[:-4]+'csv'
|
|
logging.debug('Converting to CSV')
|
|
cmd = ['xlsx2csv']
|
|
if skip_empty:
|
|
cmd.append('--skipemptycolumns')
|
|
if sheet:
|
|
cmd.extend(['-n', sheet])
|
|
cmd.append(xlsx)
|
|
cmd.append(csv)
|
|
subprocess.check_output(cmd)
|
|
with open(csv, 'rt') as f:
|
|
content = f.read()
|
|
content = re.sub(r'(\$|Prj) date:,[^,]+', r'\1 date:,', content, count=3)
|
|
content = re.sub(r'KiCost[^,]+', 'KiCost', content, count=1)
|
|
content = re.sub(r'KiCad Version:,[^,]+', 'KiCad Version:,', content)
|
|
content = re.sub(r'Created:,[^,]+', 'Created:,', content, count=1)
|
|
with open(csv, 'wt') as f:
|
|
f.write(content)
|
|
|
|
|
|
def check_simple(ctx, variant, prj='simple'):
|
|
if variant:
|
|
variant = '_'+variant
|
|
name = prj+variant+'.xlsx'
|
|
ctx.expect_out_file_d(name)
|
|
convert2csv(ctx, name, skip_empty=True)
|
|
ctx.compare_txt_d2(name[:-4]+'csv')
|
|
|
|
|
|
def test_kicost_simple(test_dir):
|
|
""" External KiCost using variants, very simple case """
|
|
prj = 'kibom-variant_kicost'
|
|
ctx = context.TestContextSCH(test_dir, prj, 'kicost_simple', OUT_DIR)
|
|
ctx.run()
|
|
check_simple(ctx, '')
|
|
check_simple(ctx, 'default')
|
|
check_simple(ctx, 'production')
|
|
check_simple(ctx, 'test')
|
|
ctx.clean_up()
|
|
|
|
|
|
def test_kicost_int_variant(test_dir):
|
|
""" External KiCost using internal variants """
|
|
prj = 'kibom-variant_kicost'
|
|
ctx = context.TestContextSCH(test_dir, prj, 'kicost_int_variant', OUT_DIR)
|
|
ctx.run(extra_debug=True)
|
|
check_simple(ctx, '')
|
|
check_simple(ctx, 'default')
|
|
check_simple(ctx, 'production')
|
|
check_simple(ctx, 'test')
|
|
ctx.clean_up()
|
|
|
|
|
|
def test_kicost_merge(test_dir):
|
|
""" External KiCost multiple projects and field translation """
|
|
prj = 'multipart'
|
|
ctx = context.TestContextSCH(test_dir, prj, 'kicost_merge', OUT_DIR)
|
|
ctx.run(extra_debug=True)
|
|
check_simple(ctx, '', prj)
|
|
ctx.clean_up()
|
|
|
|
|
|
def test_kicost_bom_simple(test_dir):
|
|
""" Internal BoM + KiCost, very simple case. With DNF sheet. """
|
|
prj = 'kibom-variant_2c'
|
|
ctx = context.TestContextSCH(test_dir, prj, 'int_bom_kicost_simple_xlsx', OUT_DIR)
|
|
ctx.run(kicost=True) # , extra_debug=True
|
|
output = prj+'-bom.xlsx'
|
|
ctx.expect_out_file_d(output)
|
|
convert2csv(ctx, output, sheet='Costs')
|
|
csv = output[:-4]+'csv'
|
|
ctx.compare_txt_d2(csv, 'ks_'+csv)
|
|
convert2csv(ctx, output, sheet='Costs (DNF)')
|
|
ctx.compare_txt_d2(csv, 'ks_'+output[:-5]+'_dnf.csv')
|
|
convert2csv(ctx, output, sheet='Specs')
|
|
ctx.compare_txt_d2(csv, 'ks_'+output[:-5]+'_spec.csv')
|
|
convert2csv(ctx, output, sheet='Specs (DNF)')
|
|
ctx.compare_txt_d2(csv, 'ks_'+output[:-5]+'_spec_dnf.csv')
|
|
ctx.clean_up()
|
|
|
|
|
|
def test_kicost_bom_sel_dist_1(test_dir):
|
|
""" Internal BoM + KiCost, select distributors (Mouser+Digi-Key). With DNF sheet. """
|
|
prj = 'kibom-variant_2c'
|
|
ctx = context.TestContextSCH(test_dir, prj, 'int_bom_kicost_sel_dist_1_xlsx', OUT_DIR)
|
|
ctx.run(kicost=True, extra_debug=True) # , extra_debug=True
|
|
output = prj+'-bom.xlsx'
|
|
ctx.expect_out_file_d(output)
|
|
convert2csv(ctx, output, sheet='Costs')
|
|
csv = output[:-4]+'csv'
|
|
ctx.compare_txt_d2(csv, output[:-5]+'_dk_mou.csv')
|
|
convert2csv(ctx, output, sheet='Costs (DNF)')
|
|
ctx.compare_txt_d2(csv, output[:-5]+'_dk_mou_dnf.csv')
|
|
ctx.clean_up()
|
|
|
|
|
|
def test_kicost_bom_merge_1(test_dir):
|
|
""" Internal BoM + KiCost, merging 3 projects. """
|
|
prj = 'merge_1'
|
|
yaml = 'int_bom_kicost_merge_xlsx'
|
|
if context.ki6():
|
|
yaml += '_k6'
|
|
ctx = context.TestContextSCH(test_dir, prj, yaml, OUT_DIR)
|
|
ctx.run(kicost=True) # , extra_debug=True
|
|
output = prj+'-bom.xlsx'
|
|
ctx.expect_out_file_d(output)
|
|
convert2csv(ctx, output, sheet='Costs')
|
|
csv = output[:-4]+'csv'
|
|
ctx.compare_txt_d2(csv)
|
|
|
|
|
|
def test_kicost_spec_to_field_1(test_dir):
|
|
""" Internal BoM + KiCost, select distributors (Mouser+Digi-Key). With DNF sheet.
|
|
Then copy the RoHS spec to a variant schematic """
|
|
prj = 'kibom-variant_2c'
|
|
ctx = context.TestContextSCH(test_dir, prj, 'spec_to_field_1', OUT_DIR)
|
|
ctx.run(kicost=True, extra_debug=True)
|
|
output = prj+'-bom.xlsx'
|
|
ctx.expect_out_file_d(output)
|
|
ctx.search_err([r'WARNING:\(.*\) C1 field `Tolerance` collision, has `20%`, found `10%`',
|
|
r'WARNING:\(.*\) R1 field `Tolerance` collision, has `1%`, found `5%`',
|
|
'C1 RoHS: ROHS3 Compliant'])
|
|
ctx.clean_up()
|