#! /usr/bin/env python # -*- coding: utf-8 -*- # copyright 2016 Hamilton Kibbe # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import os from ..layers import * from ..common import read NCDRILL_FILE = os.path.join(os.path.dirname(__file__), "resources/ncdrill.DRD") NETLIST_FILE = os.path.join(os.path.dirname(__file__), "resources/ipc-d-356.ipc") COPPER_FILE = os.path.join(os.path.dirname(__file__), "resources/top_copper.GTL") def test_guess_layer_class(): """ Test layer type inferred correctly from filename """ # Add any specific test cases here (filename, layer_class) test_vectors = [ (None, "unknown"), ("NCDRILL.TXT", "unknown"), ("example_board.gtl", "top"), ("exampmle_board.sst", "topsilk"), ("ipc-d-356.ipc", "ipc_netlist"), ] for hint in hints: for ext in hint.ext: assert hint.layer == guess_layer_class("board.{}".format(ext)) for name in hint.name: assert hint.layer == guess_layer_class("{}.pho".format(name)) for filename, layer_class in test_vectors: assert layer_class == guess_layer_class(filename) def test_guess_layer_class_regex(): """ Test regular expressions for layer matching """ # Add any specific test case (filename, layer_class) test_vectors = [("test - top copper.gbr", "top"), ("test - copper top.gbr", "top")] # Add custom regular expressions layer_hints = [ Hint( layer="top", ext=[], name=[], regex=r"(.*)(\scopper top|\stop copper).gbr", content=[], ) ] hints.extend(layer_hints) for filename, layer_class in test_vectors: assert layer_class == guess_layer_class(filename) def test_guess_layer_class_by_content(): """ Test layer class by checking content """ expected_layer_class = "bottom" filename = os.path.join( os.path.dirname(__file__), "resources/example_guess_by_content.g0" ) layer_hints = [ Hint( layer="bottom", ext=[], name=[], regex="", content=["G04 Layer name: Bottom"], ) ] hints.extend(layer_hints) assert expected_layer_class == guess_layer_class_by_content(filename) def test_sort_layers(): """ Test layer ordering """ layers = [ PCBLayer(layer_class="drawing"), PCBLayer(layer_class="drill"), PCBLayer(layer_class="bottompaste"), PCBLayer(layer_class="bottomsilk"), PCBLayer(layer_class="bottommask"), PCBLayer(layer_class="bottom"), PCBLayer(layer_class="internal"), PCBLayer(layer_class="top"), PCBLayer(layer_class="topmask"), PCBLayer(layer_class="topsilk"), PCBLayer(layer_class="toppaste"), PCBLayer(layer_class="outline"), ] layer_order = [ "outline", "toppaste", "topsilk", "topmask", "top", "internal", "bottom", "bottommask", "bottomsilk", "bottompaste", "drill", "drawing", ] bottom_order = list(reversed(layer_order[:10])) + layer_order[10:] assert [l.layer_class for l in sort_layers(layers)] == layer_order assert [l.layer_class for l in sort_layers(layers, from_top=False)] == bottom_order def test_PCBLayer_from_file(): layer = PCBLayer.from_cam(read(COPPER_FILE)) assert isinstance(layer, PCBLayer) layer = PCBLayer.from_cam(read(NCDRILL_FILE)) assert isinstance(layer, DrillLayer) layer = PCBLayer.from_cam(read(NETLIST_FILE)) assert isinstance(layer, PCBLayer) assert layer.layer_class == "ipc_netlist" def test_PCBLayer_bounds(): source = read(COPPER_FILE) layer = PCBLayer.from_cam(source) assert source.bounds == layer.bounds def test_DrillLayer_from_cam(): no_exceptions = True try: layer = DrillLayer.from_cam(read(NCDRILL_FILE)) assert isinstance(layer, DrillLayer) except: no_exceptions = False assert no_exceptions