summaryrefslogtreecommitdiff
path: root/gerber/tests
diff options
context:
space:
mode:
Diffstat (limited to 'gerber/tests')
-rw-r--r--gerber/tests/golden/example_am_exposure_modifier.pngbin0 -> 10091 bytes
-rw-r--r--gerber/tests/golden/example_holes_dont_clear.pngbin0 -> 11552 bytes
-rw-r--r--gerber/tests/golden/example_two_square_boxes.gbr16
-rw-r--r--gerber/tests/resources/example_am_exposure_modifier.gbr16
-rw-r--r--gerber/tests/resources/example_holes_dont_clear.gbr13
-rw-r--r--gerber/tests/test_cairo_backend.py17
-rw-r--r--gerber/tests/test_primitives.py18
-rw-r--r--gerber/tests/test_rs274x_backend.py185
8 files changed, 254 insertions, 11 deletions
diff --git a/gerber/tests/golden/example_am_exposure_modifier.png b/gerber/tests/golden/example_am_exposure_modifier.png
new file mode 100644
index 0000000..dac951f
--- /dev/null
+++ b/gerber/tests/golden/example_am_exposure_modifier.png
Binary files differ
diff --git a/gerber/tests/golden/example_holes_dont_clear.png b/gerber/tests/golden/example_holes_dont_clear.png
new file mode 100644
index 0000000..7efb67b
--- /dev/null
+++ b/gerber/tests/golden/example_holes_dont_clear.png
Binary files differ
diff --git a/gerber/tests/golden/example_two_square_boxes.gbr b/gerber/tests/golden/example_two_square_boxes.gbr
new file mode 100644
index 0000000..b5c60d1
--- /dev/null
+++ b/gerber/tests/golden/example_two_square_boxes.gbr
@@ -0,0 +1,16 @@
+%FSLAX25Y25*%
+%MOMM*%
+%ADD10C,0.01*%
+D10*
+%LPD*%
+G01X0Y0D02*
+X500000D01*
+Y500000D01*
+X0D01*
+Y0D01*
+X600000D02*
+X1100000D01*
+Y500000D01*
+X600000D01*
+Y0D01*
+M02*
diff --git a/gerber/tests/resources/example_am_exposure_modifier.gbr b/gerber/tests/resources/example_am_exposure_modifier.gbr
new file mode 100644
index 0000000..5f3f3dd
--- /dev/null
+++ b/gerber/tests/resources/example_am_exposure_modifier.gbr
@@ -0,0 +1,16 @@
+G04 Umaco example for exposure modifier and clearing area*
+%FSLAX26Y26*%
+%MOIN*%
+%AMSQUAREWITHHOLE*
+21,0.1,1,1,0,0,0*
+1,0,0.5,0,0*%
+%ADD10SQUAREWITHHOLE*%
+%ADD11C,1*%
+G01*
+%LPD*%
+D11*
+X-1000000Y-250000D02*
+X1000000Y250000D01*
+D10*
+X0Y0D03*
+M02* \ No newline at end of file
diff --git a/gerber/tests/resources/example_holes_dont_clear.gbr b/gerber/tests/resources/example_holes_dont_clear.gbr
new file mode 100644
index 0000000..deeebd0
--- /dev/null
+++ b/gerber/tests/resources/example_holes_dont_clear.gbr
@@ -0,0 +1,13 @@
+G04 Demonstrates that apertures with holes do not clear the area - only the aperture hole*
+%FSLAX26Y26*%
+%MOIN*%
+%ADD10C,1X0.5*%
+%ADD11C,0.1*%
+G01*
+%LPD*%
+D11*
+X-1000000Y-250000D02*
+X1000000Y250000D01*
+D10*
+X0Y0D03*
+M02* \ No newline at end of file
diff --git a/gerber/tests/test_cairo_backend.py b/gerber/tests/test_cairo_backend.py
index 38cffba..f358235 100644
--- a/gerber/tests/test_cairo_backend.py
+++ b/gerber/tests/test_cairo_backend.py
@@ -6,7 +6,7 @@ import io
import os
from ..render.cairo_backend import GerberCairoContext
-from ..rs274x import read, GerberFile
+from ..rs274x import read
from .tests import *
from nose.tools import assert_tuple_equal
@@ -121,7 +121,20 @@ def test_flash_obround():
def test_flash_polygon():
"""Umaco example a simple polygon flash with and without a hole"""
- _test_render('resources/example_flash_polygon.gbr', 'golden/example_flash_polygon.png', 'golden/example_flash_polygon.png')
+ _test_render('resources/example_flash_polygon.gbr', 'golden/example_flash_polygon.png')
+
+
+def test_holes_dont_clear():
+ """Umaco example that an aperture with a hole does not clear the area"""
+
+ _test_render('resources/example_holes_dont_clear.gbr', 'golden/example_holes_dont_clear.png')
+
+
+def test_render_am_exposure_modifier():
+ """Umaco example that an aperture macro with a hole does not clear the area"""
+
+ _test_render('resources/example_am_exposure_modifier.gbr', 'golden/example_am_exposure_modifier.png')
+
def _resolve_path(path):
return os.path.join(os.path.dirname(__file__),
diff --git a/gerber/tests/test_primitives.py b/gerber/tests/test_primitives.py
index bc67891..61cf22d 100644
--- a/gerber/tests/test_primitives.py
+++ b/gerber/tests/test_primitives.py
@@ -256,18 +256,18 @@ def test_circle_conversion():
c.to_metric() #shouldn't do antyhing
assert_equal(c.position, (2.54, 25.4))
assert_equal(c.diameter, 254.)
- assert_equal(c.hole_diameter, 0.)
+ assert_equal(c.hole_diameter, None)
c.to_inch()
assert_equal(c.position, (0.1, 1.))
assert_equal(c.diameter, 10.)
- assert_equal(c.hole_diameter, 0)
+ assert_equal(c.hole_diameter, None)
#no effect
c.to_inch()
assert_equal(c.position, (0.1, 1.))
assert_equal(c.diameter, 10.)
- assert_equal(c.hole_diameter, 0)
+ assert_equal(c.hole_diameter, None)
# Circle initially metric, with hole
c = Circle((2.54, 25.4), 254.0, 127.0, units='metric')
@@ -294,18 +294,18 @@ def test_circle_conversion():
c.to_inch()
assert_equal(c.position, (0.1, 1.))
assert_equal(c.diameter, 10.)
- assert_equal(c.hole_diameter, 0)
+ assert_equal(c.hole_diameter, None)
c.to_metric()
assert_equal(c.position, (2.54, 25.4))
assert_equal(c.diameter, 254.)
- assert_equal(c.hole_diameter, 0)
+ assert_equal(c.hole_diameter, None)
#no effect
c.to_metric()
assert_equal(c.position, (2.54, 25.4))
assert_equal(c.diameter, 254.)
- assert_equal(c.hole_diameter, 0)
+ assert_equal(c.hole_diameter, None)
c = Circle((0.1, 1.0), 10.0, 5.0, units='inch')
#No effect
@@ -820,12 +820,12 @@ def test_polygon_ctor():
test_cases = (((0,0), 3, 5, 0),
((0, 0), 5, 6, 0),
((1,1), 7, 7, 45))
- for pos, sides, radius, hole_radius in test_cases:
- p = Polygon(pos, sides, radius, hole_radius)
+ for pos, sides, radius, hole_diameter in test_cases:
+ p = Polygon(pos, sides, radius, hole_diameter)
assert_equal(p.position, pos)
assert_equal(p.sides, sides)
assert_equal(p.radius, radius)
- assert_equal(p.hole_radius, hole_radius)
+ assert_equal(p.hole_diameter, hole_diameter)
def test_polygon_bounds():
""" Test polygon bounding box calculation
diff --git a/gerber/tests/test_rs274x_backend.py b/gerber/tests/test_rs274x_backend.py
new file mode 100644
index 0000000..89512f0
--- /dev/null
+++ b/gerber/tests/test_rs274x_backend.py
@@ -0,0 +1,185 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Author: Garret Fick <garret@ficksworkshop.com>
+import io
+import os
+
+from ..render.rs274x_backend import Rs274xContext
+from ..rs274x import read
+from .tests import *
+
+def test_render_two_boxes():
+ """Umaco exapmle of two boxes"""
+ _test_render('resources/example_two_square_boxes.gbr', 'golden/example_two_square_boxes.gbr')
+
+
+def _test_render_single_quadrant():
+ """Umaco exapmle of a single quadrant arc"""
+
+ # TODO there is probably a bug here
+ _test_render('resources/example_single_quadrant.gbr', 'golden/example_single_quadrant.gbr')
+
+
+def _test_render_simple_contour():
+ """Umaco exapmle of a simple arrow-shaped contour"""
+ _test_render('resources/example_simple_contour.gbr', 'golden/example_simple_contour.gbr')
+
+
+def _test_render_single_contour_1():
+ """Umaco example of a single contour
+
+ The resulting image for this test is used by other tests because they must generate the same output."""
+ _test_render('resources/example_single_contour_1.gbr', 'golden/example_single_contour.gbr')
+
+
+def _test_render_single_contour_2():
+ """Umaco exapmle of a single contour, alternate contour end order
+
+ The resulting image for this test is used by other tests because they must generate the same output."""
+ _test_render('resources/example_single_contour_2.gbr', 'golden/example_single_contour.gbr')
+
+
+def _test_render_single_contour_3():
+ """Umaco exapmle of a single contour with extra line"""
+ _test_render('resources/example_single_contour_3.gbr', 'golden/example_single_contour_3.gbr')
+
+
+def _test_render_not_overlapping_contour():
+ """Umaco example of D02 staring a second contour"""
+ _test_render('resources/example_not_overlapping_contour.gbr', 'golden/example_not_overlapping_contour.gbr')
+
+
+def _test_render_not_overlapping_touching():
+ """Umaco example of D02 staring a second contour"""
+ _test_render('resources/example_not_overlapping_touching.gbr', 'golden/example_not_overlapping_touching.gbr')
+
+
+def _test_render_overlapping_touching():
+ """Umaco example of D02 staring a second contour"""
+ _test_render('resources/example_overlapping_touching.gbr', 'golden/example_overlapping_touching.gbr')
+
+
+def _test_render_overlapping_contour():
+ """Umaco example of D02 staring a second contour"""
+ _test_render('resources/example_overlapping_contour.gbr', 'golden/example_overlapping_contour.gbr')
+
+
+def _DISABLED_test_render_level_holes():
+ """Umaco example of using multiple levels to create multiple holes"""
+
+ # TODO This is clearly rendering wrong. I'm temporarily checking this in because there are more
+ # rendering fixes in the related repository that may resolve these.
+ _test_render('resources/example_level_holes.gbr', 'golden/example_overlapping_contour.gbr')
+
+
+def _DISABLED_test_render_cutin():
+ """Umaco example of using a cutin"""
+
+ # TODO This is clearly rendering wrong.
+ _test_render('resources/example_cutin.gbr', 'golden/example_cutin.gbr')
+
+
+def _test_render_fully_coincident():
+ """Umaco example of coincident lines rendering two contours"""
+
+ _test_render('resources/example_fully_coincident.gbr', 'golden/example_fully_coincident.gbr')
+
+
+def _test_render_coincident_hole():
+ """Umaco example of coincident lines rendering a hole in the contour"""
+
+ _test_render('resources/example_coincident_hole.gbr', 'golden/example_coincident_hole.gbr')
+
+
+def _test_render_cutin_multiple():
+ """Umaco example of a region with multiple cutins"""
+
+ _test_render('resources/example_cutin_multiple.gbr', 'golden/example_cutin_multiple.gbr')
+
+
+def _test_flash_circle():
+ """Umaco example a simple circular flash with and without a hole"""
+
+ _test_render('resources/example_flash_circle.gbr', 'golden/example_flash_circle.gbr')
+
+
+def _test_flash_rectangle():
+ """Umaco example a simple rectangular flash with and without a hole"""
+
+ _test_render('resources/example_flash_rectangle.gbr', 'golden/example_flash_rectangle.gbr')
+
+
+def _test_flash_obround():
+ """Umaco example a simple obround flash with and without a hole"""
+
+ _test_render('resources/example_flash_obround.gbr', 'golden/example_flash_obround.gbr')
+
+
+def _test_flash_polygon():
+ """Umaco example a simple polygon flash with and without a hole"""
+
+ _test_render('resources/example_flash_polygon.gbr', 'golden/example_flash_polygon.gbr')
+
+
+def _test_holes_dont_clear():
+ """Umaco example that an aperture with a hole does not clear the area"""
+
+ _test_render('resources/example_holes_dont_clear.gbr', 'golden/example_holes_dont_clear.gbr')
+
+
+def _test_render_am_exposure_modifier():
+ """Umaco example that an aperture macro with a hole does not clear the area"""
+
+ _test_render('resources/example_am_exposure_modifier.gbr', 'golden/example_am_exposure_modifier.gbr')
+
+
+def _resolve_path(path):
+ return os.path.join(os.path.dirname(__file__),
+ path)
+
+
+def _test_render(gerber_path, png_expected_path, create_output_path = None):
+ """Render the gerber file and compare to the expected PNG output.
+
+ Parameters
+ ----------
+ gerber_path : string
+ Path to Gerber file to open
+ png_expected_path : string
+ Path to the PNG file to compare to
+ create_output : string|None
+ If not None, write the generated PNG to the specified path.
+ This is primarily to help with
+ """
+
+ gerber_path = _resolve_path(gerber_path)
+ png_expected_path = _resolve_path(png_expected_path)
+ if create_output_path:
+ create_output_path = _resolve_path(create_output_path)
+
+ gerber = read(gerber_path)
+
+ # Create GBR output from the input file
+ ctx = Rs274xContext(gerber.settings)
+ gerber.render(ctx)
+
+ actual_contents = ctx.dump()
+
+ # If we want to write the file bytes, do it now. This happens
+ if create_output_path:
+ with open(create_output_path, 'wb') as out_file:
+ out_file.write(actual_contents.getvalue())
+ # Creating the output is dangerous - it could overwrite the expected result.
+ # So if we are creating the output, we make the test fail on purpose so you
+ # won't forget to disable this
+ assert_false(True, 'Test created the output %s. This needs to be disabled to make sure the test behaves correctly' % (create_output_path,))
+
+ # Read the expected PNG file
+
+ with open(png_expected_path, 'r') as expected_file:
+ expected_contents = expected_file.read()
+
+ assert_equal(expected_contents, actual_contents.getvalue())
+
+ return gerber