summaryrefslogtreecommitdiff
path: root/gerbonara/gerber/tests/test_layers.py
diff options
context:
space:
mode:
Diffstat (limited to 'gerbonara/gerber/tests/test_layers.py')
-rw-r--r--gerbonara/gerber/tests/test_layers.py158
1 files changed, 158 insertions, 0 deletions
diff --git a/gerbonara/gerber/tests/test_layers.py b/gerbonara/gerber/tests/test_layers.py
new file mode 100644
index 0000000..2178787
--- /dev/null
+++ b/gerbonara/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