""" Tests various errors in the config file - Wrong kibot - No kibot.version - Typo in kibot.version - Wrong kibot.version - Missing drill map type - Wrong drill map type - Wrong step origin - Wrong step min_distance - Wrong layer: - Incorrect name - Inner.1, but no inner layers - Inner_1 (malformed) - Not a list - Unknown attribute - No layer attribute - No output: - name - type - layers - Output: - with unknown attribute - Not a list - Filters: - Not a list - Empty number - No number - Empty regex - No regex - No filter - Pre-flight: - Not a list - Unknown entry - Wrong type for entry (run_drc) - YAML syntax - Unknown section - HPGL wrong pen_number - KiBoM wrong format - Invalid column name - Failed to get columns - Column without field - PcbDraw - Wrong color For debug information use: pytest-3 --log-cli-level debug """ import pytest import os from . import context from kibot.misc import (EXIT_BAD_CONFIG, PLOT_ERROR, BOM_ERROR, WRONG_ARGUMENTS) PRJ = 'fail-project' @pytest.mark.indep def test_no_version(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_no_version') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err('YAML config needs `kibot.version`.') ctx.clean_up() @pytest.mark.indep def test_wrong_version(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_wrong_version') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err('Unknown KiBot config version: 20') ctx.clean_up() @pytest.mark.indep def test_wrong_version_2(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_wrong_version_2') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err('Incorrect .?kibot.? section') ctx.clean_up() @pytest.mark.indep def test_wrong_version_3(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_wrong_version_3') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err('YAML config needs .?kibot.version.?') ctx.clean_up() @pytest.mark.indep def test_drill_map_no_type_1(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_drill_map_no_type') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Empty option .?map.?") ctx.clean_up() @pytest.mark.indep def test_drill_map_no_type_2(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_drill_map_no_type_2') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Unknown option .?types.?") ctx.clean_up() @pytest.mark.indep def test_drill_map_wrong_type_1(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_drill_map_wrong_type') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Option .?type.? must be any of") ctx.clean_up() @pytest.mark.indep def test_drill_map_wrong_type_2(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_drill_map_wrong_type_2') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Option .?type.? must be a string") ctx.clean_up() @pytest.mark.indep def test_drill_map_wrong_type_3(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_drill_map_wrong_type_3') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Option .?map.? must be any of") ctx.clean_up() @pytest.mark.indep def test_drill_report_no_type_1(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_drill_report_no_type') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Empty option .?report.?") ctx.clean_up() @pytest.mark.indep def test_drill_report_no_type_2(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_drill_report_no_type_2') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Unknown option .?filenames.?") ctx.clean_up() @pytest.mark.indep def test_drill_report_wrong_type_2(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_drill_report_wrong_type_2') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Option .?filename.? must be a string") ctx.clean_up() @pytest.mark.indep def test_drill_report_wrong_type_3(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_drill_report_wrong_type_3') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Option .?report.? must be any of") ctx.clean_up() @pytest.mark.indep def test_wrong_layer_1(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_wrong_layer_1') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Unknown layer name: .?F.Bogus.?") ctx.clean_up() @pytest.mark.indep def test_wrong_layer_2(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_wrong_layer_2') ctx.run(PLOT_ERROR) assert ctx.search_err("Inner layer (.*) is not valid for this board") ctx.clean_up() @pytest.mark.indep def test_wrong_layer_3(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_wrong_layer_3') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Malformed inner layer name: .?Inner_1.?,") ctx.clean_up() @pytest.mark.indep def test_wrong_layer_4(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_wrong_layer_4') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(".?layers.? must be any of") ctx.clean_up() @pytest.mark.indep def test_wrong_layer_5(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_wrong_layer_5') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Unknown option .?bogus.?") ctx.clean_up() @pytest.mark.indep def test_wrong_layer_6(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_wrong_layer_6') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Missing or empty .?layer.? attribute") ctx.clean_up() @pytest.mark.indep def test_wrong_layer_7(test_dir): """ List of numbers """ ctx = context.TestContext(test_dir, '3Rs', 'error_wrong_layer_7') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(".?layers.? must be any of") ctx.clean_up() @pytest.mark.indep def test_wrong_layer_9(test_dir): """ A bogus string """ ctx = context.TestContext(test_dir, '3Rs', 'error_wrong_layer_9') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Unknown layer spec: .?nada.?") ctx.clean_up() @pytest.mark.indep def test_wrong_layer_8(test_dir): """ List of strings, but number in middle """ ctx = context.TestContext(test_dir, '3Rs', 'error_wrong_layer_8') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(".?4.? must be any of") ctx.clean_up() @pytest.mark.indep def test_no_name(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_no_name') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Output needs a name") ctx.clean_up() @pytest.mark.indep def test_empty_name(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_empty_name') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Output needs a name") ctx.clean_up() @pytest.mark.indep def test_no_type(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_no_type') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Output .PDF. needs a type") ctx.clean_up() @pytest.mark.indep def test_out_unknown_attr(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_unk_attr') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Unknown option .?directory.?") ctx.clean_up() @pytest.mark.indep def test_out_needs_type(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_needs_type') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("needs a type") ctx.clean_up() # Now is valid # @pytest.mark.indep # def test_no_options(test_dir): # ctx = context.TestContext(test_dir, '3Rs', 'error_no_options') # ctx.run(EXIT_BAD_CONFIG) # assert ctx.search_err("Output .PDF. needs options") # ctx.clean_up() @pytest.mark.indep def test_no_layers(test_dir): ctx = context.TestContext(test_dir, '3Rs', 'error_no_layers') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Missing .?layers.? list") ctx.clean_up() @pytest.mark.indep def test_error_step_origin(test_dir): ctx = context.TestContext(test_dir, 'bom', 'error_step_origin') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Origin must be") ctx.clean_up() @pytest.mark.indep def test_error_step_min_distance(test_dir): ctx = context.TestContext(test_dir, 'bom', 'error_step_min_distance') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(".?min_distance.? must be a number") ctx.clean_up() @pytest.mark.indep def test_filter_not_list(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_filter_not_list') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(r"Option .?filters.? must be a list\(dict\) not `dict`") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_filter_no_number_1(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_filter_no_number') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Empty option .?number.?") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_filter_no_number_2(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_filter_no_number_2') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Missing .?error.?") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_filter_no_regex_1(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_filter_no_regex') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Empty option .?regex.?") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_filter_wrong_entry(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_filter_wrong_entry') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Unknown option .?numerito.?") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_error_pre_list(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_pre_list') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Incorrect .?preflight.? section") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_error_pre_unk(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_pre_unk') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Unknown preflight: .?run_drcs.?") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_error_wrong_type_1(test_dir): """ run_drc = number """ ctx = context.TestContext(test_dir, PRJ, 'error_pre_wrong_type_1') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("In preflight 'run_drc': must be boolean") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_error_wrong_type_2(test_dir): """ ignore_unconnected = string """ ctx = context.TestContext(test_dir, PRJ, 'error_pre_wrong_type_2') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("In preflight 'ignore_unconnected': must be boolean") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_error_wrong_type_3(test_dir): """ run_erc = number """ ctx = context.TestContext(test_dir, PRJ, 'error_pre_wrong_type_3') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("In preflight 'run_erc': must be boolean") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_error_wrong_type_4(test_dir): """ update_xml = number """ ctx = context.TestContextSCH(test_dir, 'bom', 'error_pre_wrong_type_4') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("In preflight 'update_xml': must be boolean") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_error_wrong_type_5(test_dir): """ check_zone_fills = number """ ctx = context.TestContext(test_dir, PRJ, 'error_pre_wrong_type_5') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("In preflight 'check_zone_fills': must be boolean") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_error_yaml(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_yaml') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Error loading YAML") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_out_not_list(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_out_not_list') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(".?outputs.? must be a list") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_unk_section(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_unk_section') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Unknown section .?bogus.? in config") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_error_hpgl_pen_num(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_hpgl_pen_num') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Option .?pen_number.? outside its range") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_error_bom_wrong_format(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_bom_wrong_format') ctx.run(EXIT_BAD_CONFIG, no_board_file=True, extra=['-e', os.path.join(ctx.get_board_dir(), 'bom'+context.KICAD_SCH_EXT)]) assert ctx.search_err("Option .?format.? must be any of") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_error_bom_column(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_bom_column') ctx.run(EXIT_BAD_CONFIG, no_board_file=True, extra=['-e', os.path.join(ctx.get_board_dir(), 'bom'+context.KICAD_SCH_EXT)]) assert ctx.search_err("Invalid column name .?Impossible.?") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_error_bom_no_columns(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_bom_column') ctx.run(BOM_ERROR, no_board_file=True, extra=['-e', os.path.join(ctx.get_board_dir(), 'bom_no_xml'+context.KICAD_SCH_EXT)]) assert ctx.search_err("Failed to get the column names") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_error_bom_no_field(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_bom_no_field') ctx.run(EXIT_BAD_CONFIG, no_board_file=True, extra=['-e', os.path.join(ctx.get_board_dir(), 'fail-erc'+context.KICAD_SCH_EXT)]) assert ctx.search_err("Missing or empty .?field.?") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_error_wrong_boolean(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_wrong_boolean') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(".?exclude_edge_layer.? must be a boolean") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_error_gerber_precision(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_gerber_precision') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(".?gerber_precision.? must be 4.5 or 4.6") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_error_wrong_drill_marks_1(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_wrong_drill_marks') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(r"Option `drill_marks` must be any of \['none', 'small', 'full'\] not `bogus`") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_error_print_pcb_no_layer(test_dir): prj = 'bom' ctx = context.TestContext(test_dir, prj, 'error_print_pcb_no_layer') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Missing .?layers.? list") ctx.clean_up() @pytest.mark.indep def test_error_color(test_dir): ctx = context.TestContext(test_dir, 'bom', 'error_color') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Invalid color for .?board.?") ctx.clean_up() @pytest.mark.indep def test_wrong_global(test_dir): ctx = context.TestContext(test_dir, 'bom', 'error_wrong_global') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Incorrect .?global.? section") ctx.clean_up() @pytest.mark.indep def test_goutput_not_string(test_dir): ctx = context.TestContext(test_dir, 'bom', 'error_goutput_not_string') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Option .?output.? must be a string") ctx.clean_up() @pytest.mark.indep def test_unk_global(test_dir): ctx = context.TestContext(test_dir, 'bom', 'error_unk_global') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Unknown global option") ctx.clean_up() @pytest.mark.indep def test_error_int_bom_no_field(test_dir): ctx = context.TestContextSCH(test_dir, 'links', 'error_int_bom_no_field') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Missing or empty `field` in columns list") ctx.clean_up() @pytest.mark.indep def test_error_int_bom_miss_logo(test_dir): ctx = context.TestContextSCH(test_dir, 'links', 'error_int_bom_miss_logo') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Missing logo file") ctx.clean_up() @pytest.mark.indep def test_error_int_bom_miss_style(test_dir): ctx = context.TestContextSCH(test_dir, 'links', 'error_int_bom_miss_style') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Missing style file") ctx.clean_up() @pytest.mark.indep def test_error_int_bom_unknown_style(test_dir): ctx = context.TestContextSCH(test_dir, 'links', 'error_int_bom_unknown_style') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Unknown style .?bogus.?") ctx.clean_up() @pytest.mark.indep def test_error_int_bom_invalid_col(test_dir): ctx = context.TestContextSCH(test_dir, 'links', 'error_int_bom_invalid_col') ctx.run() assert ctx.search_err("Invalid column name") ctx.clean_up() @pytest.mark.indep def test_error_int_bom_logo_format(test_dir): ctx = context.TestContextSCH(test_dir, 'links', 'error_int_bom_logo_format') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Only PNG images are supported for the logo") ctx.clean_up() @pytest.mark.indep def test_error_var_no_name(test_dir): ctx = context.TestContextSCH(test_dir, 'links', 'error_var_no_name') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Variant needs a name in:") ctx.clean_up() @pytest.mark.indep def test_error_var_empty_name(test_dir): ctx = context.TestContextSCH(test_dir, 'links', 'error_var_empty_name') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Variant needs a name in:") ctx.clean_up() @pytest.mark.indep def test_error_var_wrong_type(test_dir): ctx = context.TestContextSCH(test_dir, 'links', 'error_var_wrong_type') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Unknown variant type") ctx.clean_up() @pytest.mark.indep def test_error_var_no_type(test_dir): ctx = context.TestContextSCH(test_dir, 'links', 'error_var_no_type') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Variant (.*) needs a type") ctx.clean_up() @pytest.mark.indep def test_error_var_empty_type(test_dir): ctx = context.TestContextSCH(test_dir, 'links', 'error_var_empty_type') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Variant (.*) needs a type") ctx.clean_up() @pytest.mark.indep def test_error_var_no_list(test_dir): ctx = context.TestContextSCH(test_dir, 'links', 'error_var_no_list') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(".?variants.? must be a list") ctx.clean_up() @pytest.mark.indep def test_error_fil_no_list(test_dir): ctx = context.TestContextSCH(test_dir, 'links', 'error_fil_no_list') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(".?filters.? must be a list") ctx.clean_up() @pytest.mark.indep def test_error_fil_unknown(test_dir): ctx = context.TestContextSCH(test_dir, 'links', 'error_fil_unknown') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Unknown filter (.*) used for ") ctx.clean_up() @pytest.mark.indep def test_error_var_unknown(test_dir): ctx = context.TestContextSCH(test_dir, 'links', 'error_unk_variant') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Unknown variant name") ctx.clean_up() @pytest.mark.indep def test_error_wrong_fil_name(test_dir): ctx = context.TestContextSCH(test_dir, 'links', 'error_wrong_fil_name') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Filter names starting with (.*) are reserved") ctx.clean_up() @pytest.mark.indep def test_error_pcbdraw_comp_key(test_dir): ctx = context.TestContext(test_dir, 'bom', 'error_pcbdraw_comp_key') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Option .?show_components.? must be any of") ctx.clean_up() @pytest.mark.indep def test_error_rot_not_two(test_dir): ctx = context.TestContext(test_dir, 'bom', 'error_rot_not_two') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Each regex/angle pair must contain exactly two values") ctx.clean_up() @pytest.mark.indep def test_error_rot_not_number(test_dir): ctx = context.TestContext(test_dir, 'bom', 'error_rot_not_number') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("The second value in the regex/angle pairs must be a number") ctx.clean_up() @pytest.mark.indep def test_error_rot_no_rotations(test_dir): ctx = context.TestContext(test_dir, 'bom', 'error_rot_no_rotations') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("No rotations and/or offsets provided") ctx.clean_up() @pytest.mark.indep def test_error_makefile_wrong_out(test_dir): ctx = context.TestContext(test_dir, 'bom', 'error_makefile_wrong_out') ctx.run(WRONG_ARGUMENTS) assert ctx.search_err("Unknown output `position` selected in") ctx.clean_up() @pytest.mark.indep def test_error_no_column_id(test_dir): ctx = context.TestContext(test_dir, 'bom', 'error_no_column_id') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Missing or empty `id` in columns list") ctx.clean_up() @pytest.mark.indep def test_error_aggregate_no_file(test_dir): ctx = context.TestContext(test_dir, 'bom', 'error_aggregate_no_file') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Missing or empty `file` in aggregate list") ctx.clean_up() @pytest.mark.indep def test_error_aggregate_miss_file(test_dir): yaml = 'error_aggregate_miss_file' if context.ki6(): yaml += '_k6' ctx = context.TestContext(test_dir, 'bom', yaml, '') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err("Missing `dummy`") ctx.clean_up() @pytest.mark.indep def test_error_wrong_import_type(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_wrong_import_type') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(r"Incorrect `import` section \(must be a list\)") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_error_import_not_str(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_import_not_str') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(r"`import` items must be strings") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_error_import_miss_file(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_import_miss_file') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(r"issing import file") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_error_import_no_outputs(test_dir): ctx = context.TestContext(test_dir, PRJ, 'error_import_no_outputs') ctx.run() assert ctx.search_err(r"No outputs found in `(.*)drc.kibot.yaml`") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_same_name_1(test_dir): """ 2 outputs with the same name in the same file """ ctx = context.TestContext(test_dir, PRJ, 'error_same_name_1') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(r"Output name `position` already defined") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_same_name_2(test_dir): """ Using import, but the 2nd is in the main file """ ctx = context.TestContext(test_dir, PRJ, 'error_same_name_2') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(r"Output name `position` already defined") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_same_name_3(test_dir): """ Using import and the 2nd is from the import """ ctx = context.TestContext(test_dir, PRJ, 'error_same_name_3') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(r"Output name `position` already defined, while importing from") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_extends_1(test_dir): """ Extend an undefined output """ ctx = context.TestContext(test_dir, PRJ, 'error_extends_1') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(r"In section 'position_mine' \(position\): Unknown output `position2` in `extends`") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_pre_list_instead_of_dict(test_dir): """ Extend an undefined output """ ctx = context.TestContext(test_dir, PRJ, 'error_pre_list_instead_of_dict_issue_360') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(r"Found .*list.* instead of dict") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_import_not_list(test_dir): """ Import preflights, but give a number """ ctx = context.TestContext(test_dir, PRJ, 'error_import_not_list') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(r"`preflights` must be a string or a list") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_import_item_not_str(test_dir): """ Import preflights, but give a number in the list """ ctx = context.TestContext(test_dir, PRJ, 'error_import_item_not_str') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(r"`preflights` items must be strings") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_import_defs_not_dict(test_dir): """ Import definitions, but not a dict """ ctx = context.TestContext(test_dir, PRJ, 'error_import_defs_not_dict') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(r"definitions must be a dict") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_import_unk_entry(test_dir): """ Import unknown entry (pre-flight) """ ctx = context.TestContext(test_dir, PRJ, 'error_import_unk_entry') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(r"Unknown import entry `pre-flights` .* in .unnamed. import") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_import_no_file(test_dir): """ Import no file name """ ctx = context.TestContext(test_dir, PRJ, 'error_import_no_file') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(r"`import` entry without `file`") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_import_no_str_or_dict(test_dir): """ Import no file name """ ctx = context.TestContext(test_dir, PRJ, 'error_import_no_str_or_dict') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(r"`import` items must be strings or dicts") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_download_datasheets_no_field(test_dir): """ Download datasheet no field specified """ ctx = context.TestContext(test_dir, 'bom', 'error_download_datasheets_no_field') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(r"Empty `field`") ctx.clean_up(keep_project=True) @pytest.mark.indep def test_download_datasheets_no_output(test_dir): """ Download datasheet no output specified """ ctx = context.TestContext(test_dir, 'bom', 'error_download_datasheets_no_output') ctx.run(EXIT_BAD_CONFIG) assert ctx.search_err(r"Empty `output`") ctx.clean_up(keep_project=True)