summaryrefslogtreecommitdiff
path: root/gerber/tests/test_primitives.py
diff options
context:
space:
mode:
Diffstat (limited to 'gerber/tests/test_primitives.py')
-rw-r--r--gerber/tests/test_primitives.py1429
1 files changed, 0 insertions, 1429 deletions
diff --git a/gerber/tests/test_primitives.py b/gerber/tests/test_primitives.py
deleted file mode 100644
index ad5b34f..0000000
--- a/gerber/tests/test_primitives.py
+++ /dev/null
@@ -1,1429 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# Author: Hamilton Kibbe <ham@hamiltonkib.be>
-
-import pytest
-from operator import add
-from ..primitives import *
-
-
-def test_primitive_smoketest():
- p = Primitive()
- try:
- p.bounding_box
- assert not True, "should have thrown the exception"
- except NotImplementedError:
- pass
- # pytest.raises(NotImplementedError, p.bounding_box)
-
- p.to_metric()
- p.to_inch()
- # try:
- # p.offset(1, 1)
- # assert_false(True, 'should have thrown the exception')
- # except NotImplementedError:
- # pass
-
-
-def test_line_angle():
- """ Test Line primitive angle calculation
- """
- cases = [
- ((0, 0), (1, 0), math.radians(0)),
- ((0, 0), (1, 1), math.radians(45)),
- ((0, 0), (0, 1), math.radians(90)),
- ((0, 0), (-1, 1), math.radians(135)),
- ((0, 0), (-1, 0), math.radians(180)),
- ((0, 0), (-1, -1), math.radians(225)),
- ((0, 0), (0, -1), math.radians(270)),
- ((0, 0), (1, -1), math.radians(315)),
- ]
- for start, end, expected in cases:
- l = Line(start, end, 0)
- line_angle = (l.angle + 2 * math.pi) % (2 * math.pi)
- pytest.approx(line_angle, expected)
-
-
-def test_line_bounds():
- """ Test Line primitive bounding box calculation
- """
- cases = [
- ((0, 0), (1, 1), ((-1, 2), (-1, 2))),
- ((-1, -1), (1, 1), ((-2, 2), (-2, 2))),
- ((1, 1), (-1, -1), ((-2, 2), (-2, 2))),
- ((-1, 1), (1, -1), ((-2, 2), (-2, 2))),
- ]
-
- c = Circle((0, 0), 2)
- r = Rectangle((0, 0), 2, 2)
- for shape in (c, r):
- for start, end, expected in cases:
- l = Line(start, end, shape)
- assert l.bounding_box == expected
- # Test a non-square rectangle
- r = Rectangle((0, 0), 3, 2)
- cases = [
- ((0, 0), (1, 1), ((-1.5, 2.5), (-1, 2))),
- ((-1, -1), (1, 1), ((-2.5, 2.5), (-2, 2))),
- ((1, 1), (-1, -1), ((-2.5, 2.5), (-2, 2))),
- ((-1, 1), (1, -1), ((-2.5, 2.5), (-2, 2))),
- ]
- for start, end, expected in cases:
- l = Line(start, end, r)
- assert l.bounding_box == expected
-
-
-def test_line_vertices():
- c = Circle((0, 0), 2)
- l = Line((0, 0), (1, 1), c)
- assert l.vertices == None
-
- # All 4 compass points, all 4 quadrants and the case where start == end
- test_cases = [
- ((0, 0), (1, 0), ((-1, -1), (-1, 1), (2, 1), (2, -1))),
- ((0, 0), (1, 1), ((-1, -1), (-1, 1), (0, 2), (2, 2), (2, 0), (1, -1))),
- ((0, 0), (0, 1), ((-1, -1), (-1, 2), (1, 2), (1, -1))),
- ((0, 0), (-1, 1), ((-1, -1), (-2, 0), (-2, 2), (0, 2), (1, 1), (1, -1))),
- ((0, 0), (-1, 0), ((-2, -1), (-2, 1), (1, 1), (1, -1))),
- ((0, 0), (-1, -1), ((-2, -2), (1, -1), (1, 1), (-1, 1), (-2, 0), (0, -2))),
- ((0, 0), (0, -1), ((-1, -2), (-1, 1), (1, 1), (1, -2))),
- ((0, 0), (1, -1), ((-1, -1), (0, -2), (2, -2), (2, 0), (1, 1), (-1, 1))),
- ((0, 0), (0, 0), ((-1, -1), (-1, 1), (1, 1), (1, -1))),
- ]
- r = Rectangle((0, 0), 2, 2)
-
- for start, end, vertices in test_cases:
- l = Line(start, end, r)
- assert set(vertices) == set(l.vertices)
-
-
-def test_line_conversion():
- c = Circle((0, 0), 25.4, units="metric")
- l = Line((2.54, 25.4), (254.0, 2540.0), c, units="metric")
-
- # No effect
- l.to_metric()
- assert l.start == (2.54, 25.4)
- assert l.end == (254.0, 2540.0)
- assert l.aperture.diameter == 25.4
-
- l.to_inch()
- assert l.start == (0.1, 1.0)
- assert l.end == (10.0, 100.0)
- assert l.aperture.diameter == 1.0
-
- # No effect
- l.to_inch()
- assert l.start == (0.1, 1.0)
- assert l.end == (10.0, 100.0)
- assert l.aperture.diameter == 1.0
-
- c = Circle((0, 0), 1.0, units="inch")
- l = Line((0.1, 1.0), (10.0, 100.0), c, units="inch")
-
- # No effect
- l.to_inch()
- assert l.start == (0.1, 1.0)
- assert l.end == (10.0, 100.0)
- assert l.aperture.diameter == 1.0
-
- l.to_metric()
- assert l.start == (2.54, 25.4)
- assert l.end == (254.0, 2540.0)
- assert l.aperture.diameter == 25.4
-
- # No effect
- l.to_metric()
- assert l.start == (2.54, 25.4)
- assert l.end == (254.0, 2540.0)
- assert l.aperture.diameter == 25.4
-
- r = Rectangle((0, 0), 25.4, 254.0, units="metric")
- l = Line((2.54, 25.4), (254.0, 2540.0), r, units="metric")
- l.to_inch()
- assert l.start == (0.1, 1.0)
- assert l.end == (10.0, 100.0)
- assert l.aperture.width == 1.0
- assert l.aperture.height == 10.0
-
- r = Rectangle((0, 0), 1.0, 10.0, units="inch")
- l = Line((0.1, 1.0), (10.0, 100.0), r, units="inch")
- l.to_metric()
- assert l.start == (2.54, 25.4)
- assert l.end == (254.0, 2540.0)
- assert l.aperture.width == 25.4
- assert l.aperture.height == 254.0
-
-
-def test_line_offset():
- c = Circle((0, 0), 1)
- l = Line((0, 0), (1, 1), c)
- l.offset(1, 0)
- assert l.start == (1.0, 0.0)
- assert l.end == (2.0, 1.0)
- l.offset(0, 1)
- assert l.start == (1.0, 1.0)
- assert l.end == (2.0, 2.0)
-
-
-def test_arc_radius():
- """ Test Arc primitive radius calculation
- """
- cases = [((-3, 4), (5, 0), (0, 0), 5), ((0, 1), (1, 0), (0, 0), 1)]
-
- for start, end, center, radius in cases:
- a = Arc(start, end, center, "clockwise", 0, "single-quadrant")
- assert a.radius == radius
-
-
-def test_arc_sweep_angle():
- """ Test Arc primitive sweep angle calculation
- """
- cases = [
- ((1, 0), (0, 1), (0, 0), "counterclockwise", math.radians(90)),
- ((1, 0), (0, 1), (0, 0), "clockwise", math.radians(270)),
- ((1, 0), (-1, 0), (0, 0), "clockwise", math.radians(180)),
- ((1, 0), (-1, 0), (0, 0), "counterclockwise", math.radians(180)),
- ]
-
- for start, end, center, direction, sweep in cases:
- c = Circle((0, 0), 1)
- a = Arc(start, end, center, direction, c, "single-quadrant")
- assert a.sweep_angle == sweep
-
-
-def test_arc_bounds():
- """ Test Arc primitive bounding box calculation
- """
- cases = [
- ((1, 0), (0, 1), (0, 0), "clockwise", ((-1.5, 1.5), (-1.5, 1.5))),
- ((1, 0), (0, 1), (0, 0), "counterclockwise", ((-0.5, 1.5), (-0.5, 1.5))),
- ((0, 1), (-1, 0), (0, 0), "clockwise", ((-1.5, 1.5), (-1.5, 1.5))),
- ((0, 1), (-1, 0), (0, 0), "counterclockwise", ((-1.5, 0.5), (-0.5, 1.5))),
- ((-1, 0), (0, -1), (0, 0), "clockwise", ((-1.5, 1.5), (-1.5, 1.5))),
- ((-1, 0), (0, -1), (0, 0), "counterclockwise", ((-1.5, 0.5), (-1.5, 0.5))),
- ((0, -1), (1, 0), (0, 0), "clockwise", ((-1.5, 1.5), (-1.5, 1.5))),
- ((0, -1), (1, 0), (0, 0), "counterclockwise", ((-0.5, 1.5), (-1.5, 0.5))),
- # Arcs with the same start and end point render a full circle
- ((1, 0), (1, 0), (0, 0), "clockwise", ((-1.5, 1.5), (-1.5, 1.5))),
- ((1, 0), (1, 0), (0, 0), "counterclockwise", ((-1.5, 1.5), (-1.5, 1.5))),
- ]
- for start, end, center, direction, bounds in cases:
- c = Circle((0, 0), 1)
- a = Arc(start, end, center, direction, c, "multi-quadrant")
- assert a.bounding_box == bounds
-
-
-def test_arc_bounds_no_aperture():
- """ Test Arc primitive bounding box calculation ignoring aperture
- """
- cases = [
- ((1, 0), (0, 1), (0, 0), "clockwise", ((-1.0, 1.0), (-1.0, 1.0))),
- ((1, 0), (0, 1), (0, 0), "counterclockwise", ((0.0, 1.0), (0.0, 1.0))),
- ((0, 1), (-1, 0), (0, 0), "clockwise", ((-1.0, 1.0), (-1.0, 1.0))),
- ((0, 1), (-1, 0), (0, 0), "counterclockwise", ((-1.0, 0.0), (0.0, 1.0))),
- ((-1, 0), (0, -1), (0, 0), "clockwise", ((-1.0, 1.0), (-1.0, 1.0))),
- ((-1, 0), (0, -1), (0, 0), "counterclockwise", ((-1.0, 0.0), (-1.0, 0.0))),
- ((0, -1), (1, 0), (0, 0), "clockwise", ((-1.0, 1.0), (-1.0, 1.0))),
- ((0, -1), (1, 0), (0, 0), "counterclockwise", ((-0.0, 1.0), (-1.0, 0.0))),
- # Arcs with the same start and end point render a full circle
- ((1, 0), (1, 0), (0, 0), "clockwise", ((-1.0, 1.0), (-1.0, 1.0))),
- ((1, 0), (1, 0), (0, 0), "counterclockwise", ((-1.0, 1.0), (-1.0, 1.0))),
- ]
- for start, end, center, direction, bounds in cases:
- c = Circle((0, 0), 1)
- a = Arc(start, end, center, direction, c, "multi-quadrant")
- assert a.bounding_box_no_aperture == bounds
-
-
-def test_arc_conversion():
- c = Circle((0, 0), 25.4, units="metric")
- a = Arc(
- (2.54, 25.4),
- (254.0, 2540.0),
- (25400.0, 254000.0),
- "clockwise",
- c,
- "single-quadrant",
- units="metric",
- )
-
- # No effect
- a.to_metric()
- assert a.start == (2.54, 25.4)
- assert a.end == (254.0, 2540.0)
- assert a.center == (25400.0, 254000.0)
- assert a.aperture.diameter == 25.4
-
- a.to_inch()
- assert a.start == (0.1, 1.0)
- assert a.end == (10.0, 100.0)
- assert a.center == (1000.0, 10000.0)
- assert a.aperture.diameter == 1.0
-
- # no effect
- a.to_inch()
- assert a.start == (0.1, 1.0)
- assert a.end == (10.0, 100.0)
- assert a.center == (1000.0, 10000.0)
- assert a.aperture.diameter == 1.0
-
- c = Circle((0, 0), 1.0, units="inch")
- a = Arc(
- (0.1, 1.0),
- (10.0, 100.0),
- (1000.0, 10000.0),
- "clockwise",
- c,
- "single-quadrant",
- units="inch",
- )
- a.to_metric()
- assert a.start == (2.54, 25.4)
- assert a.end == (254.0, 2540.0)
- assert a.center == (25400.0, 254000.0)
- assert a.aperture.diameter == 25.4
-
-
-def test_arc_offset():
- c = Circle((0, 0), 1)
- a = Arc((0, 0), (1, 1), (2, 2), "clockwise", c, "single-quadrant")
- a.offset(1, 0)
- assert a.start == (1.0, 0.0)
- assert a.end == (2.0, 1.0)
- assert a.center == (3.0, 2.0)
- a.offset(0, 1)
- assert a.start == (1.0, 1.0)
- assert a.end == (2.0, 2.0)
- assert a.center == (3.0, 3.0)
-
-
-def test_circle_radius():
- """ Test Circle primitive radius calculation
- """
- c = Circle((1, 1), 2)
- assert c.radius == 1
-
-
-def test_circle_hole_radius():
- """ Test Circle primitive hole radius calculation
- """
- c = Circle((1, 1), 4, 2)
- assert c.hole_radius == 1
-
-
-def test_circle_bounds():
- """ Test Circle bounding box calculation
- """
- c = Circle((1, 1), 2)
- assert c.bounding_box == ((0, 2), (0, 2))
-
-
-def test_circle_conversion():
- """Circle conversion of units"""
- # Circle initially metric, no hole
- c = Circle((2.54, 25.4), 254.0, units="metric")
-
- c.to_metric() # shouldn't do antyhing
- assert c.position == (2.54, 25.4)
- assert c.diameter == 254.0
- assert c.hole_diameter == None
-
- c.to_inch()
- assert c.position == (0.1, 1.0)
- assert c.diameter == 10.0
- assert c.hole_diameter == None
-
- # no effect
- c.to_inch()
- assert c.position == (0.1, 1.0)
- assert c.diameter == 10.0
- assert c.hole_diameter == None
-
- # Circle initially metric, with hole
- c = Circle((2.54, 25.4), 254.0, 127.0, units="metric")
-
- c.to_metric() # shouldn't do antyhing
- assert c.position == (2.54, 25.4)
- assert c.diameter == 254.0
- assert c.hole_diameter == 127.0
-
- c.to_inch()
- assert c.position == (0.1, 1.0)
- assert c.diameter == 10.0
- assert c.hole_diameter == 5.0
-
- # no effect
- c.to_inch()
- assert c.position == (0.1, 1.0)
- assert c.diameter == 10.0
- assert c.hole_diameter == 5.0
-
- # Circle initially inch, no hole
- c = Circle((0.1, 1.0), 10.0, units="inch")
- # No effect
- c.to_inch()
- assert c.position == (0.1, 1.0)
- assert c.diameter == 10.0
- assert c.hole_diameter == None
-
- c.to_metric()
- assert c.position == (2.54, 25.4)
- assert c.diameter == 254.0
- assert c.hole_diameter == None
-
- # no effect
- c.to_metric()
- assert c.position == (2.54, 25.4)
- assert c.diameter == 254.0
- assert c.hole_diameter == None
-
- c = Circle((0.1, 1.0), 10.0, 5.0, units="inch")
- # No effect
- c.to_inch()
- assert c.position == (0.1, 1.0)
- assert c.diameter == 10.0
- assert c.hole_diameter == 5.0
-
- c.to_metric()
- assert c.position == (2.54, 25.4)
- assert c.diameter == 254.0
- assert c.hole_diameter == 127.0
-
- # no effect
- c.to_metric()
- assert c.position == (2.54, 25.4)
- assert c.diameter == 254.0
- assert c.hole_diameter == 127.0
-
-
-def test_circle_offset():
- c = Circle((0, 0), 1)
- c.offset(1, 0)
- assert c.position == (1.0, 0.0)
- c.offset(0, 1)
- assert c.position == (1.0, 1.0)
-
-
-def test_ellipse_ctor():
- """ Test ellipse creation
- """
- e = Ellipse((2, 2), 3, 2)
- assert e.position == (2, 2)
- assert e.width == 3
- assert e.height == 2
-
-
-def test_ellipse_bounds():
- """ Test ellipse bounding box calculation
- """
- e = Ellipse((2, 2), 4, 2)
- assert e.bounding_box == ((0, 4), (1, 3))
- e = Ellipse((2, 2), 4, 2, rotation=90)
- assert e.bounding_box == ((1, 3), (0, 4))
- e = Ellipse((2, 2), 4, 2, rotation=180)
- assert e.bounding_box == ((0, 4), (1, 3))
- e = Ellipse((2, 2), 4, 2, rotation=270)
- assert e.bounding_box == ((1, 3), (0, 4))
-
-
-def test_ellipse_conversion():
- e = Ellipse((2.54, 25.4), 254.0, 2540.0, units="metric")
-
- # No effect
- e.to_metric()
- assert e.position == (2.54, 25.4)
- assert e.width == 254.0
- assert e.height == 2540.0
-
- e.to_inch()
- assert e.position == (0.1, 1.0)
- assert e.width == 10.0
- assert e.height == 100.0
-
- # No effect
- e.to_inch()
- assert e.position == (0.1, 1.0)
- assert e.width == 10.0
- assert e.height == 100.0
-
- e = Ellipse((0.1, 1.0), 10.0, 100.0, units="inch")
-
- # no effect
- e.to_inch()
- assert e.position == (0.1, 1.0)
- assert e.width == 10.0
- assert e.height == 100.0
-
- e.to_metric()
- assert e.position == (2.54, 25.4)
- assert e.width == 254.0
- assert e.height == 2540.0
-
- # No effect
- e.to_metric()
- assert e.position == (2.54, 25.4)
- assert e.width == 254.0
- assert e.height == 2540.0
-
-
-def test_ellipse_offset():
- e = Ellipse((0, 0), 1, 2)
- e.offset(1, 0)
- assert e.position == (1.0, 0.0)
- e.offset(0, 1)
- assert e.position == (1.0, 1.0)
-
-
-def test_rectangle_ctor():
- """ Test rectangle creation
- """
- test_cases = (((0, 0), 1, 1), ((0, 0), 1, 2), ((1, 1), 1, 2))
- for pos, width, height in test_cases:
- r = Rectangle(pos, width, height)
- assert r.position == pos
- assert r.width == width
- assert r.height == height
-
-
-def test_rectangle_hole_radius():
- """ Test rectangle hole diameter calculation
- """
- r = Rectangle((0, 0), 2, 2)
- assert 0 == r.hole_radius
-
- r = Rectangle((0, 0), 2, 2, 1)
- assert 0.5 == r.hole_radius
-
-
-def test_rectangle_bounds():
- """ Test rectangle bounding box calculation
- """
- r = Rectangle((0, 0), 2, 2)
- xbounds, ybounds = r.bounding_box
- pytest.approx(xbounds, (-1, 1))
- pytest.approx(ybounds, (-1, 1))
- r = Rectangle((0, 0), 2, 2, rotation=45)
- xbounds, ybounds = r.bounding_box
- pytest.approx(xbounds, (-math.sqrt(2), math.sqrt(2)))
- pytest.approx(ybounds, (-math.sqrt(2), math.sqrt(2)))
-
-
-def test_rectangle_vertices():
- sqrt2 = math.sqrt(2.0)
- TEST_VECTORS = [
- ((0, 0), 2.0, 2.0, 0.0, ((-1.0, -1.0), (-1.0, 1.0), (1.0, 1.0), (1.0, -1.0))),
- ((0, 0), 2.0, 3.0, 0.0, ((-1.0, -1.5), (-1.0, 1.5), (1.0, 1.5), (1.0, -1.5))),
- ((0, 0), 2.0, 2.0, 90.0, ((-1.0, -1.0), (-1.0, 1.0), (1.0, 1.0), (1.0, -1.0))),
- ((0, 0), 3.0, 2.0, 90.0, ((-1.0, -1.5), (-1.0, 1.5), (1.0, 1.5), (1.0, -1.5))),
- (
- (0, 0),
- 2.0,
- 2.0,
- 45.0,
- ((-sqrt2, 0.0), (0.0, sqrt2), (sqrt2, 0), (0, -sqrt2)),
- ),
- ]
- for pos, width, height, rotation, expected in TEST_VECTORS:
- r = Rectangle(pos, width, height, rotation=rotation)
- for test, expect in zip(sorted(r.vertices), sorted(expected)):
- pytest.approx(test, expect)
-
- r = Rectangle((0, 0), 2.0, 2.0, rotation=0.0)
- r.rotation = 45.0
- for test, expect in zip(
- sorted(r.vertices),
- sorted(((-sqrt2, 0.0), (0.0, sqrt2), (sqrt2, 0), (0, -sqrt2))),
- ):
- pytest.approx(test, expect)
-
-
-def test_rectangle_segments():
-
- r = Rectangle((0, 0), 2.0, 2.0)
- expected = [vtx for segment in r.segments for vtx in segment]
- for vertex in r.vertices:
- assert vertex in expected
-
-
-def test_rectangle_conversion():
- """Test converting rectangles between units"""
-
- # Initially metric no hole
- r = Rectangle((2.54, 25.4), 254.0, 2540.0, units="metric")
-
- r.to_metric()
- assert r.position == (2.54, 25.4)
- assert r.width == 254.0
- assert r.height == 2540.0
-
- r.to_inch()
- assert r.position == (0.1, 1.0)
- assert r.width == 10.0
- assert r.height == 100.0
-
- r.to_inch()
- assert r.position == (0.1, 1.0)
- assert r.width == 10.0
- assert r.height == 100.0
-
- # Initially metric with hole
- r = Rectangle((2.54, 25.4), 254.0, 2540.0, 127.0, units="metric")
-
- r.to_metric()
- assert r.position == (2.54, 25.4)
- assert r.width == 254.0
- assert r.height == 2540.0
- assert r.hole_diameter == 127.0
-
- r.to_inch()
- assert r.position == (0.1, 1.0)
- assert r.width == 10.0
- assert r.height == 100.0
- assert r.hole_diameter == 5.0
-
- r.to_inch()
- assert r.position == (0.1, 1.0)
- assert r.width == 10.0
- assert r.height == 100.0
- assert r.hole_diameter == 5.0
-
- # Initially inch, no hole
- r = Rectangle((0.1, 1.0), 10.0, 100.0, units="inch")
- r.to_inch()
- assert r.position == (0.1, 1.0)
- assert r.width == 10.0
- assert r.height == 100.0
-
- r.to_metric()
- assert r.position == (2.54, 25.4)
- assert r.width == 254.0
- assert r.height == 2540.0
-
- r.to_metric()
- assert r.position == (2.54, 25.4)
- assert r.width == 254.0
- assert r.height == 2540.0
-
- # Initially inch with hole
- r = Rectangle((0.1, 1.0), 10.0, 100.0, 5.0, units="inch")
- r.to_inch()
- assert r.position == (0.1, 1.0)
- assert r.width == 10.0
- assert r.height == 100.0
- assert r.hole_diameter == 5.0
-
- r.to_metric()
- assert r.position == (2.54, 25.4)
- assert r.width == 254.0
- assert r.height == 2540.0
- assert r.hole_diameter == 127.0
-
- r.to_metric()
- assert r.position == (2.54, 25.4)
- assert r.width == 254.0
- assert r.height == 2540.0
- assert r.hole_diameter == 127.0
-
-
-def test_rectangle_offset():
- r = Rectangle((0, 0), 1, 2)
- r.offset(1, 0)
- assert r.position == (1.0, 0.0)
- r.offset(0, 1)
- assert r.position == (1.0, 1.0)
-
-
-def test_diamond_ctor():
- """ Test diamond creation
- """
- test_cases = (((0, 0), 1, 1), ((0, 0), 1, 2), ((1, 1), 1, 2))
- for pos, width, height in test_cases:
- d = Diamond(pos, width, height)
- assert d.position == pos
- assert d.width == width
- assert d.height == height
-
-
-def test_diamond_bounds():
- """ Test diamond bounding box calculation
- """
- d = Diamond((0, 0), 2, 2)
- xbounds, ybounds = d.bounding_box
- pytest.approx(xbounds, (-1, 1))
- pytest.approx(ybounds, (-1, 1))
- d = Diamond((0, 0), math.sqrt(2), math.sqrt(2), rotation=45)
- xbounds, ybounds = d.bounding_box
- pytest.approx(xbounds, (-1, 1))
- pytest.approx(ybounds, (-1, 1))
-
-
-def test_diamond_conversion():
- d = Diamond((2.54, 25.4), 254.0, 2540.0, units="metric")
-
- d.to_metric()
- assert d.position == (2.54, 25.4)
- assert d.width == 254.0
- assert d.height == 2540.0
-
- d.to_inch()
- assert d.position == (0.1, 1.0)
- assert d.width == 10.0
- assert d.height == 100.0
-
- d.to_inch()
- assert d.position == (0.1, 1.0)
- assert d.width == 10.0
- assert d.height == 100.0
-
- d = Diamond((0.1, 1.0), 10.0, 100.0, units="inch")
-
- d.to_inch()
- assert d.position == (0.1, 1.0)
- assert d.width == 10.0
- assert d.height == 100.0
-
- d.to_metric()
- assert d.position == (2.54, 25.4)
- assert d.width == 254.0
- assert d.height == 2540.0
-
- d.to_metric()
- assert d.position == (2.54, 25.4)
- assert d.width == 254.0
- assert d.height == 2540.0
-
-
-def test_diamond_offset():
- d = Diamond((0, 0), 1, 2)
- d.offset(1, 0)
- assert d.position == (1.0, 0.0)
- d.offset(0, 1)
- assert d.position == (1.0, 1.0)
-
-
-def test_chamfer_rectangle_ctor():
- """ Test chamfer rectangle creation
- """
- test_cases = (
- ((0, 0), 1, 1, 0.2, (True, True, False, False)),
- ((0, 0), 1, 2, 0.3, (True, True, True, True)),
- ((1, 1), 1, 2, 0.4, (False, False, False, False)),
- )
- for pos, width, height, chamfer, corners in test_cases:
- r = ChamferRectangle(pos, width, height, chamfer, corners)
- assert r.position == pos
- assert r.width == width
- assert r.height == height
- assert r.chamfer == chamfer
- pytest.approx(r.corners, corners)
-
-
-def test_chamfer_rectangle_bounds():
- """ Test chamfer rectangle bounding box calculation
- """
- r = ChamferRectangle((0, 0), 2, 2, 0.2, (True, True, False, False))
- xbounds, ybounds = r.bounding_box
- pytest.approx(xbounds, (-1, 1))
- pytest.approx(ybounds, (-1, 1))
- r = ChamferRectangle((0, 0), 2, 2, 0.2, (True, True, False, False), rotation=45)
- xbounds, ybounds = r.bounding_box
- pytest.approx(xbounds, (-math.sqrt(2), math.sqrt(2)))
- pytest.approx(ybounds, (-math.sqrt(2), math.sqrt(2)))
-
-
-def test_chamfer_rectangle_conversion():
- r = ChamferRectangle(
- (2.54, 25.4), 254.0, 2540.0, 0.254, (True, True, False, False), units="metric"
- )
-
- r.to_metric()
- assert r.position == (2.54, 25.4)
- assert r.width == 254.0
- assert r.height == 2540.0
- assert r.chamfer == 0.254
-
- r.to_inch()
- assert r.position == (0.1, 1.0)
- assert r.width == 10.0
- assert r.height == 100.0
- assert r.chamfer == 0.01
-
- r.to_inch()
- assert r.position == (0.1, 1.0)
- assert r.width == 10.0
- assert r.height == 100.0
- assert r.chamfer == 0.01
-
- r = ChamferRectangle(
- (0.1, 1.0), 10.0, 100.0, 0.01, (True, True, False, False), units="inch"
- )
- r.to_inch()
- assert r.position == (0.1, 1.0)
- assert r.width == 10.0
- assert r.height == 100.0
- assert r.chamfer == 0.01
-
- r.to_metric()
- assert r.position == (2.54, 25.4)
- assert r.width == 254.0
- assert r.height == 2540.0
- assert r.chamfer == 0.254
-
- r.to_metric()
- assert r.position == (2.54, 25.4)
- assert r.width == 254.0
- assert r.height == 2540.0
- assert r.chamfer == 0.254
-
-
-def test_chamfer_rectangle_offset():
- r = ChamferRectangle((0, 0), 1, 2, 0.01, (True, True, False, False))
- r.offset(1, 0)
- assert r.position == (1.0, 0.0)
- r.offset(0, 1)
- assert r.position == (1.0, 1.0)
-
-
-def test_chamfer_rectangle_vertices():
- TEST_VECTORS = [
- (
- 1.0,
- (True, True, True, True),
- (
- (-2.5, -1.5),
- (-2.5, 1.5),
- (-1.5, 2.5),
- (1.5, 2.5),
- (2.5, 1.5),
- (2.5, -1.5),
- (1.5, -2.5),
- (-1.5, -2.5),
- ),
- ),
- (
- 1.0,
- (True, False, False, False),
- ((-2.5, -2.5), (-2.5, 2.5), (1.5, 2.5), (2.5, 1.5), (2.5, -2.5)),
- ),
- (
- 1.0,
- (False, True, False, False),
- ((-2.5, -2.5), (-2.5, 1.5), (-1.5, 2.5), (2.5, 2.5), (2.5, -2.5)),
- ),
- (
- 1.0,
- (False, False, True, False),
- ((-2.5, -1.5), (-2.5, 2.5), (2.5, 2.5), (2.5, -2.5), (-1.5, -2.5)),
- ),
- (
- 1.0,
- (False, False, False, True),
- ((-2.5, -2.5), (-2.5, 2.5), (2.5, 2.5), (2.5, -1.5), (1.5, -2.5)),
- ),
- ]
- for chamfer, corners, expected in TEST_VECTORS:
- r = ChamferRectangle((0, 0), 5, 5, chamfer, corners)
- assert set(r.vertices) == set(expected)
-
-
-def test_round_rectangle_ctor():
- """ Test round rectangle creation
- """
- test_cases = (
- ((0, 0), 1, 1, 0.2, (True, True, False, False)),
- ((0, 0), 1, 2, 0.3, (True, True, True, True)),
- ((1, 1), 1, 2, 0.4, (False, False, False, False)),
- )
- for pos, width, height, radius, corners in test_cases:
- r = RoundRectangle(pos, width, height, radius, corners)
- assert r.position == pos
- assert r.width == width
- assert r.height == height
- assert r.radius == radius
- pytest.approx(r.corners, corners)
-
-
-def test_round_rectangle_bounds():
- """ Test round rectangle bounding box calculation
- """
- r = RoundRectangle((0, 0), 2, 2, 0.2, (True, True, False, False))
- xbounds, ybounds = r.bounding_box
- pytest.approx(xbounds, (-1, 1))
- pytest.approx(ybounds, (-1, 1))
- r = RoundRectangle((0, 0), 2, 2, 0.2, (True, True, False, False), rotation=45)
- xbounds, ybounds = r.bounding_box
- pytest.approx(xbounds, (-math.sqrt(2), math.sqrt(2)))
- pytest.approx(ybounds, (-math.sqrt(2), math.sqrt(2)))
-
-
-def test_round_rectangle_conversion():
- r = RoundRectangle(
- (2.54, 25.4), 254.0, 2540.0, 0.254, (True, True, False, False), units="metric"
- )
-
- r.to_metric()
- assert r.position == (2.54, 25.4)
- assert r.width == 254.0
- assert r.height == 2540.0
- assert r.radius == 0.254
-
- r.to_inch()
- assert r.position == (0.1, 1.0)
- assert r.width == 10.0
- assert r.height == 100.0
- assert r.radius == 0.01
-
- r.to_inch()
- assert r.position == (0.1, 1.0)
- assert r.width == 10.0
- assert r.height == 100.0
- assert r.radius == 0.01
-
- r = RoundRectangle(
- (0.1, 1.0), 10.0, 100.0, 0.01, (True, True, False, False), units="inch"
- )
-
- r.to_inch()
- assert r.position == (0.1, 1.0)
- assert r.width == 10.0
- assert r.height == 100.0
- assert r.radius == 0.01
-
- r.to_metric()
- assert r.position == (2.54, 25.4)
- assert r.width == 254.0
- assert r.height == 2540.0
- assert r.radius == 0.254
-
- r.to_metric()
- assert r.position == (2.54, 25.4)
- assert r.width == 254.0
- assert r.height == 2540.0
- assert r.radius == 0.254
-
-
-def test_round_rectangle_offset():
- r = RoundRectangle((0, 0), 1, 2, 0.01, (True, True, False, False))
- r.offset(1, 0)
- assert r.position == (1.0, 0.0)
- r.offset(0, 1)
- assert r.position == (1.0, 1.0)
-
-
-def test_obround_ctor():
- """ Test obround creation
- """
- test_cases = (((0, 0), 1, 1), ((0, 0), 1, 2), ((1, 1), 1, 2))
- for pos, width, height in test_cases:
- o = Obround(pos, width, height)
- assert o.position == pos
- assert o.width == width
- assert o.height == height
-
-
-def test_obround_bounds():
- """ Test obround bounding box calculation
- """
- o = Obround((2, 2), 2, 4)
- xbounds, ybounds = o.bounding_box
- pytest.approx(xbounds, (1, 3))
- pytest.approx(ybounds, (0, 4))
- o = Obround((2, 2), 4, 2)
- xbounds, ybounds = o.bounding_box
- pytest.approx(xbounds, (0, 4))
- pytest.approx(ybounds, (1, 3))
-
-
-def test_obround_orientation():
- o = Obround((0, 0), 2, 1)
- assert o.orientation == "horizontal"
- o = Obround((0, 0), 1, 2)
- assert o.orientation == "vertical"
-
-
-def test_obround_subshapes():
- o = Obround((0, 0), 1, 4)
- ss = o.subshapes
- pytest.approx(ss["rectangle"].position, (0, 0))
- pytest.approx(ss["circle1"].position, (0, 1.5))
- pytest.approx(ss["circle2"].position, (0, -1.5))
- o = Obround((0, 0), 4, 1)
- ss = o.subshapes
- pytest.approx(ss["rectangle"].position, (0, 0))
- pytest.approx(ss["circle1"].position, (1.5, 0))
- pytest.approx(ss["circle2"].position, (-1.5, 0))
-
-
-def test_obround_conversion():
- o = Obround((2.54, 25.4), 254.0, 2540.0, units="metric")
-
- # No effect
- o.to_metric()
- assert o.position == (2.54, 25.4)
- assert o.width == 254.0
- assert o.height == 2540.0
-
- o.to_inch()
- assert o.position == (0.1, 1.0)
- assert o.width == 10.0
- assert o.height == 100.0
-
- # No effect
- o.to_inch()
- assert o.position == (0.1, 1.0)
- assert o.width == 10.0
- assert o.height == 100.0
-
- o = Obround((0.1, 1.0), 10.0, 100.0, units="inch")
-
- # No effect
- o.to_inch()
- assert o.position == (0.1, 1.0)
- assert o.width == 10.0
- assert o.height == 100.0
-
- o.to_metric()
- assert o.position == (2.54, 25.4)
- assert o.width == 254.0
- assert o.height == 2540.0
-
- # No effect
- o.to_metric()
- assert o.position == (2.54, 25.4)
- assert o.width == 254.0
- assert o.height == 2540.0
-
-
-def test_obround_offset():
- o = Obround((0, 0), 1, 2)
- o.offset(1, 0)
- assert o.position == (1.0, 0.0)
- o.offset(0, 1)
- assert o.position == (1.0, 1.0)
-
-
-def test_polygon_ctor():
- """ Test polygon creation
- """
- test_cases = (((0, 0), 3, 5, 0), ((0, 0), 5, 6, 0), ((1, 1), 7, 7, 45))
- for pos, sides, radius, hole_diameter in test_cases:
- p = Polygon(pos, sides, radius, hole_diameter)
- assert p.position == pos
- assert p.sides == sides
- assert p.radius == radius
- assert p.hole_diameter == hole_diameter
-
-
-def test_polygon_bounds():
- """ Test polygon bounding box calculation
- """
- p = Polygon((2, 2), 3, 2, 0)
- xbounds, ybounds = p.bounding_box
- pytest.approx(xbounds, (0, 4))
- pytest.approx(ybounds, (0, 4))
- p = Polygon((2, 2), 3, 4, 0)
- xbounds, ybounds = p.bounding_box
- pytest.approx(xbounds, (-2, 6))
- pytest.approx(ybounds, (-2, 6))
-
-
-def test_polygon_conversion():
- p = Polygon((2.54, 25.4), 3, 254.0, 0, units="metric")
-
- # No effect
- p.to_metric()
- assert p.position == (2.54, 25.4)
- assert p.radius == 254.0
-
- p.to_inch()
- assert p.position == (0.1, 1.0)
- assert p.radius == 10.0
-
- # No effect
- p.to_inch()
- assert p.position == (0.1, 1.0)
- assert p.radius == 10.0
-
- p = Polygon((0.1, 1.0), 3, 10.0, 0, units="inch")
-
- # No effect
- p.to_inch()
- assert p.position == (0.1, 1.0)
- assert p.radius == 10.0
-
- p.to_metric()
- assert p.position == (2.54, 25.4)
- assert p.radius == 254.0
-
- # No effect
- p.to_metric()
- assert p.position == (2.54, 25.4)
- assert p.radius == 254.0
-
-
-def test_polygon_offset():
- p = Polygon((0, 0), 5, 10, 0)
- p.offset(1, 0)
- assert p.position == (1.0, 0.0)
- p.offset(0, 1)
- assert p.position == (1.0, 1.0)
-
-
-def test_region_ctor():
- """ Test Region creation
- """
- apt = Circle((0, 0), 0)
- lines = (
- Line((0, 0), (1, 0), apt),
- Line((1, 0), (1, 1), apt),
- Line((1, 1), (0, 1), apt),
- Line((0, 1), (0, 0), apt),
- )
- points = ((0, 0), (1, 0), (1, 1), (0, 1))
- r = Region(lines)
- for i, p in enumerate(lines):
- assert r.primitives[i] == p
-
-
-def test_region_bounds():
- """ Test region bounding box calculation
- """
- apt = Circle((0, 0), 0)
- lines = (
- Line((0, 0), (1, 0), apt),
- Line((1, 0), (1, 1), apt),
- Line((1, 1), (0, 1), apt),
- Line((0, 1), (0, 0), apt),
- )
- r = Region(lines)
- xbounds, ybounds = r.bounding_box
- pytest.approx(xbounds, (0, 1))
- pytest.approx(ybounds, (0, 1))
-
-
-def test_region_offset():
- apt = Circle((0, 0), 0)
- lines = (
- Line((0, 0), (1, 0), apt),
- Line((1, 0), (1, 1), apt),
- Line((1, 1), (0, 1), apt),
- Line((0, 1), (0, 0), apt),
- )
- r = Region(lines)
- xlim, ylim = r.bounding_box
- r.offset(0, 1)
- new_xlim, new_ylim = r.bounding_box
- pytest.approx(new_xlim, xlim)
- pytest.approx(new_ylim, tuple([y + 1 for y in ylim]))
-
-
-def test_round_butterfly_ctor():
- """ Test round butterfly creation
- """
- test_cases = (((0, 0), 3), ((0, 0), 5), ((1, 1), 7))
- for pos, diameter in test_cases:
- b = RoundButterfly(pos, diameter)
- assert b.position == pos
- assert b.diameter == diameter
- assert b.radius == diameter / 2.0
-
-
-def test_round_butterfly_ctor_validation():
- """ Test RoundButterfly argument validation
- """
- pytest.raises(TypeError, RoundButterfly, 3, 5)
- pytest.raises(TypeError, RoundButterfly, (3, 4, 5), 5)
-
-
-def test_round_butterfly_conversion():
- b = RoundButterfly((2.54, 25.4), 254.0, units="metric")
-
- # No Effect
- b.to_metric()
- assert b.position == (2.54, 25.4)
- assert b.diameter == (254.0)
-
- b.to_inch()
- assert b.position == (0.1, 1.0)
- assert b.diameter == 10.0
-
- # No effect
- b.to_inch()
- assert b.position == (0.1, 1.0)
- assert b.diameter == 10.0
-
- b = RoundButterfly((0.1, 1.0), 10.0, units="inch")
-
- # No effect
- b.to_inch()
- assert b.position == (0.1, 1.0)
- assert b.diameter == 10.0
-
- b.to_metric()
- assert b.position == (2.54, 25.4)
- assert b.diameter == (254.0)
-
- # No Effect
- b.to_metric()
- assert b.position == (2.54, 25.4)
- assert b.diameter == (254.0)
-
-
-def test_round_butterfly_offset():
- b = RoundButterfly((0, 0), 1)
- b.offset(1, 0)
- assert b.position == (1.0, 0.0)
- b.offset(0, 1)
- assert b.position == (1.0, 1.0)
-
-
-def test_round_butterfly_bounds():
- """ Test RoundButterfly bounding box calculation
- """
- b = RoundButterfly((0, 0), 2)
- xbounds, ybounds = b.bounding_box
- pytest.approx(xbounds, (-1, 1))
- pytest.approx(ybounds, (-1, 1))
-
-
-def test_square_butterfly_ctor():
- """ Test SquareButterfly creation
- """
- test_cases = (((0, 0), 3), ((0, 0), 5), ((1, 1), 7))
- for pos, side in test_cases:
- b = SquareButterfly(pos, side)
- assert b.position == pos
- assert b.side == side
-
-
-def test_square_butterfly_ctor_validation():
- """ Test SquareButterfly argument validation
- """
- pytest.raises(TypeError, SquareButterfly, 3, 5)
- pytest.raises(TypeError, SquareButterfly, (3, 4, 5), 5)
-
-
-def test_square_butterfly_bounds():
- """ Test SquareButterfly bounding box calculation
- """
- b = SquareButterfly((0, 0), 2)
- xbounds, ybounds = b.bounding_box
- pytest.approx(xbounds, (-1, 1))
- pytest.approx(ybounds, (-1, 1))
-
-
-def test_squarebutterfly_conversion():
- b = SquareButterfly((2.54, 25.4), 254.0, units="metric")
-
- # No effect
- b.to_metric()
- assert b.position == (2.54, 25.4)
- assert b.side == (254.0)
-
- b.to_inch()
- assert b.position == (0.1, 1.0)
- assert b.side == 10.0
-
- # No effect
- b.to_inch()
- assert b.position == (0.1, 1.0)
- assert b.side == 10.0
-
- b = SquareButterfly((0.1, 1.0), 10.0, units="inch")
-
- # No effect
- b.to_inch()
- assert b.position == (0.1, 1.0)
- assert b.side == 10.0
-
- b.to_metric()
- assert b.position == (2.54, 25.4)
- assert b.side == (254.0)
-
- # No effect
- b.to_metric()
- assert b.position == (2.54, 25.4)
- assert b.side == (254.0)
-
-
-def test_square_butterfly_offset():
- b = SquareButterfly((0, 0), 1)
- b.offset(1, 0)
- assert b.position == (1.0, 0.0)
- b.offset(0, 1)
- assert b.position == (1.0, 1.0)
-
-
-def test_donut_ctor():
- """ Test Donut primitive creation
- """
- test_cases = (
- ((0, 0), "round", 3, 5),
- ((0, 0), "square", 5, 7),
- ((1, 1), "hexagon", 7, 9),
- ((2, 2), "octagon", 9, 11),
- )
- for pos, shape, in_d, out_d in test_cases:
- d = Donut(pos, shape, in_d, out_d)
- assert d.position == pos
- assert d.shape == shape
- assert d.inner_diameter == in_d
- assert d.outer_diameter == out_d
-
-
-def test_donut_ctor_validation():
- pytest.raises(TypeError, Donut, 3, "round", 5, 7)
- pytest.raises(TypeError, Donut, (3, 4, 5), "round", 5, 7)
- pytest.raises(ValueError, Donut, (0, 0), "triangle", 3, 5)
- pytest.raises(ValueError, Donut, (0, 0), "round", 5, 3)
-
-
-def test_donut_bounds():
- d = Donut((0, 0), "round", 0.0, 2.0)
- xbounds, ybounds = d.bounding_box
- assert xbounds == (-1.0, 1.0)
- assert ybounds == (-1.0, 1.0)
-
-
-def test_donut_conversion():
- d = Donut((2.54, 25.4), "round", 254.0, 2540.0, units="metric")
-
- # No effect
- d.to_metric()
- assert d.position == (2.54, 25.4)
- assert d.inner_diameter == 254.0
- assert d.outer_diameter == 2540.0
-
- d.to_inch()
- assert d.position == (0.1, 1.0)
- assert d.inner_diameter == 10.0
- assert d.outer_diameter == 100.0
-
- # No effect
- d.to_inch()
- assert d.position == (0.1, 1.0)
- assert d.inner_diameter == 10.0
- assert d.outer_diameter == 100.0
-
- d = Donut((0.1, 1.0), "round", 10.0, 100.0, units="inch")
-
- # No effect
- d.to_inch()
- assert d.position == (0.1, 1.0)
- assert d.inner_diameter == 10.0
- assert d.outer_diameter == 100.0
-
- d.to_metric()
- assert d.position == (2.54, 25.4)
- assert d.inner_diameter == 254.0
- assert d.outer_diameter == 2540.0
-
- # No effect
- d.to_metric()
- assert d.position == (2.54, 25.4)
- assert d.inner_diameter == 254.0
- assert d.outer_diameter == 2540.0
-
-
-def test_donut_offset():
- d = Donut((0, 0), "round", 1, 10)
- d.offset(1, 0)
- assert d.position == (1.0, 0.0)
- d.offset(0, 1)
- assert d.position == (1.0, 1.0)
-
-
-def test_drill_ctor():
- """ Test drill primitive creation
- """
- test_cases = (((0, 0), 2), ((1, 1), 3), ((2, 2), 5))
- for position, diameter in test_cases:
- d = Drill(position, diameter)
- assert d.position == position
- assert d.diameter == diameter
- assert d.radius == diameter / 2.0
-
-
-def test_drill_ctor_validation():
- """ Test drill argument validation
- """
- pytest.raises(TypeError, Drill, 3, 5)
- pytest.raises(TypeError, Drill, (3, 4, 5), 5)
-
-
-def test_drill_bounds():
- d = Drill((0, 0), 2)
- xbounds, ybounds = d.bounding_box
- pytest.approx(xbounds, (-1, 1))
- pytest.approx(ybounds, (-1, 1))
- d = Drill((1, 2), 2)
- xbounds, ybounds = d.bounding_box
- pytest.approx(xbounds, (0, 2))
- pytest.approx(ybounds, (1, 3))
-
-
-def test_drill_conversion():
- d = Drill((2.54, 25.4), 254.0, units="metric")
-
- # No effect
- d.to_metric()
- assert d.position == (2.54, 25.4)
- assert d.diameter == 254.0
-
- d.to_inch()
- assert d.position == (0.1, 1.0)
- assert d.diameter == 10.0
-
- # No effect
- d.to_inch()
- assert d.position == (0.1, 1.0)
- assert d.diameter == 10.0
-
- d = Drill((0.1, 1.0), 10.0, units="inch")
-
- # No effect
- d.to_inch()
- assert d.position == (0.1, 1.0)
- assert d.diameter == 10.0
-
- d.to_metric()
- assert d.position == (2.54, 25.4)
- assert d.diameter == 254.0
-
- # No effect
- d.to_metric()
- assert d.position == (2.54, 25.4)
- assert d.diameter == 254.0
-
-
-def test_drill_offset():
- d = Drill((0, 0), 1.0)
- d.offset(1, 0)
- assert d.position == (1.0, 0.0)
- d.offset(0, 1)
- assert d.position == (1.0, 1.0)
-
-
-def test_drill_equality():
- d = Drill((2.54, 25.4), 254.0)
- d1 = Drill((2.54, 25.4), 254.0)
- assert d == d1
- d1 = Drill((2.54, 25.4), 254.2)
- assert d != d1
-
-
-def test_slot_bounds():
- """ Test Slot primitive bounding box calculation
- """
- cases = [
- ((0, 0), (1, 1), ((-1, 2), (-1, 2))),
- ((-1, -1), (1, 1), ((-2, 2), (-2, 2))),
- ((1, 1), (-1, -1), ((-2, 2), (-2, 2))),
- ((-1, 1), (1, -1), ((-2, 2), (-2, 2))),
- ]
-
- for start, end, expected in cases:
- s = Slot(start, end, 2.0)
- assert s.bounding_box == expected