diff options
Diffstat (limited to 'gerber/tests/test_layers.py')
-rw-r--r-- | gerber/tests/test_layers.py | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/gerber/tests/test_layers.py b/gerber/tests/test_layers.py new file mode 100644 index 0000000..2178787 --- /dev/null +++ b/gerber/tests/test_layers.py @@ -0,0 +1,158 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# copyright 2016 Hamilton Kibbe <ham@hamiltonkib.be> +# +# 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 |