summaryrefslogtreecommitdiff
path: root/gerbonara/gerber/tests/test_gerber_statements.py
diff options
context:
space:
mode:
Diffstat (limited to 'gerbonara/gerber/tests/test_gerber_statements.py')
-rw-r--r--gerbonara/gerber/tests/test_gerber_statements.py959
1 files changed, 959 insertions, 0 deletions
diff --git a/gerbonara/gerber/tests/test_gerber_statements.py b/gerbonara/gerber/tests/test_gerber_statements.py
new file mode 100644
index 0000000..140cbd1
--- /dev/null
+++ b/gerbonara/gerber/tests/test_gerber_statements.py
@@ -0,0 +1,959 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Author: Hamilton Kibbe <ham@hamiltonkib.be>
+
+import pytest
+from ..gerber_statements import *
+from ..cam import FileSettings
+
+
+def test_Statement_smoketest():
+ stmt = Statement("Test")
+ assert stmt.type == "Test"
+ stmt.to_metric()
+ assert "units=metric" in str(stmt)
+ stmt.to_inch()
+ assert "units=inch" in str(stmt)
+ stmt.to_metric()
+ stmt.offset(1, 1)
+ assert "type=Test" in str(stmt)
+
+
+def test_FSParamStmt_factory():
+ """ Test FSParamStruct factory
+ """
+ stmt = {"param": "FS", "zero": "L", "notation": "A", "x": "27"}
+ fs = FSParamStmt.from_dict(stmt)
+ assert fs.param == "FS"
+ assert fs.zero_suppression == "leading"
+ assert fs.notation == "absolute"
+ assert fs.format == (2, 7)
+
+ stmt = {"param": "FS", "zero": "T", "notation": "I", "x": "27"}
+ fs = FSParamStmt.from_dict(stmt)
+ assert fs.param == "FS"
+ assert fs.zero_suppression == "trailing"
+ assert fs.notation == "incremental"
+ assert fs.format == (2, 7)
+
+
+def test_FSParamStmt():
+ """ Test FSParamStmt initialization
+ """
+ param = "FS"
+ zeros = "trailing"
+ notation = "absolute"
+ fmt = (2, 5)
+ stmt = FSParamStmt(param, zeros, notation, fmt)
+ assert stmt.param == param
+ assert stmt.zero_suppression == zeros
+ assert stmt.notation == notation
+ assert stmt.format == fmt
+
+
+def test_FSParamStmt_dump():
+ """ Test FSParamStmt to_gerber()
+ """
+ stmt = {"param": "FS", "zero": "L", "notation": "A", "x": "27"}
+ fs = FSParamStmt.from_dict(stmt)
+ assert fs.to_gerber() == "%FSLAX27Y27*%"
+
+ stmt = {"param": "FS", "zero": "T", "notation": "I", "x": "25"}
+ fs = FSParamStmt.from_dict(stmt)
+ assert fs.to_gerber() == "%FSTIX25Y25*%"
+
+ settings = FileSettings(zero_suppression="leading", notation="absolute")
+ assert fs.to_gerber(settings) == "%FSLAX25Y25*%"
+
+
+def test_FSParamStmt_string():
+ """ Test FSParamStmt.__str__()
+ """
+ stmt = {"param": "FS", "zero": "L", "notation": "A", "x": "27"}
+ fs = FSParamStmt.from_dict(stmt)
+ assert str(fs) == "<Format Spec: 2:7 leading zero suppression absolute notation>"
+
+ stmt = {"param": "FS", "zero": "T", "notation": "I", "x": "25"}
+ fs = FSParamStmt.from_dict(stmt)
+ assert (
+ str(fs) == "<Format Spec: 2:5 trailing zero suppression incremental notation>"
+ )
+
+
+def test_MOParamStmt_factory():
+ """ Test MOParamStruct factory
+ """
+ stmts = [{"param": "MO", "mo": "IN"}, {"param": "MO", "mo": "in"}]
+ for stmt in stmts:
+ mo = MOParamStmt.from_dict(stmt)
+ assert mo.param == "MO"
+ assert mo.mode == "inch"
+
+ stmts = [{"param": "MO", "mo": "MM"}, {"param": "MO", "mo": "mm"}]
+ for stmt in stmts:
+ mo = MOParamStmt.from_dict(stmt)
+ assert mo.param == "MO"
+ assert mo.mode == "metric"
+
+ stmt = {"param": "MO"}
+ mo = MOParamStmt.from_dict(stmt)
+ assert mo.mode == None
+ stmt = {"param": "MO", "mo": "degrees kelvin"}
+ pytest.raises(ValueError, MOParamStmt.from_dict, stmt)
+
+
+def test_MOParamStmt():
+ """ Test MOParamStmt initialization
+ """
+ param = "MO"
+ mode = "inch"
+ stmt = MOParamStmt(param, mode)
+ assert stmt.param == param
+
+ for mode in ["inch", "metric"]:
+ stmt = MOParamStmt(param, mode)
+ assert stmt.mode == mode
+
+
+def test_MOParamStmt_dump():
+ """ Test MOParamStmt to_gerber()
+ """
+ stmt = {"param": "MO", "mo": "IN"}
+ mo = MOParamStmt.from_dict(stmt)
+ assert mo.to_gerber() == "%MOIN*%"
+
+ stmt = {"param": "MO", "mo": "MM"}
+ mo = MOParamStmt.from_dict(stmt)
+ assert mo.to_gerber() == "%MOMM*%"
+
+
+def test_MOParamStmt_conversion():
+ stmt = {"param": "MO", "mo": "MM"}
+ mo = MOParamStmt.from_dict(stmt)
+ mo.to_inch()
+ assert mo.mode == "inch"
+
+ stmt = {"param": "MO", "mo": "IN"}
+ mo = MOParamStmt.from_dict(stmt)
+ mo.to_metric()
+ assert mo.mode == "metric"
+
+
+def test_MOParamStmt_string():
+ """ Test MOParamStmt.__str__()
+ """
+ stmt = {"param": "MO", "mo": "IN"}
+ mo = MOParamStmt.from_dict(stmt)
+ assert str(mo) == "<Mode: inches>"
+
+ stmt = {"param": "MO", "mo": "MM"}
+ mo = MOParamStmt.from_dict(stmt)
+ assert str(mo) == "<Mode: millimeters>"
+
+
+def test_IPParamStmt_factory():
+ """ Test IPParamStruct factory
+ """
+ stmt = {"param": "IP", "ip": "POS"}
+ ip = IPParamStmt.from_dict(stmt)
+ assert ip.ip == "positive"
+
+ stmt = {"param": "IP", "ip": "NEG"}
+ ip = IPParamStmt.from_dict(stmt)
+ assert ip.ip == "negative"
+
+
+def test_IPParamStmt():
+ """ Test IPParamStmt initialization
+ """
+ param = "IP"
+ for ip in ["positive", "negative"]:
+ stmt = IPParamStmt(param, ip)
+ assert stmt.param == param
+ assert stmt.ip == ip
+
+
+def test_IPParamStmt_dump():
+ """ Test IPParamStmt to_gerber()
+ """
+ stmt = {"param": "IP", "ip": "POS"}
+ ip = IPParamStmt.from_dict(stmt)
+ assert ip.to_gerber() == "%IPPOS*%"
+
+ stmt = {"param": "IP", "ip": "NEG"}
+ ip = IPParamStmt.from_dict(stmt)
+ assert ip.to_gerber() == "%IPNEG*%"
+
+
+def test_IPParamStmt_string():
+ stmt = {"param": "IP", "ip": "POS"}
+ ip = IPParamStmt.from_dict(stmt)
+ assert str(ip) == "<Image Polarity: positive>"
+
+ stmt = {"param": "IP", "ip": "NEG"}
+ ip = IPParamStmt.from_dict(stmt)
+ assert str(ip) == "<Image Polarity: negative>"
+
+
+def test_IRParamStmt_factory():
+ stmt = {"param": "IR", "angle": "45"}
+ ir = IRParamStmt.from_dict(stmt)
+ assert ir.param == "IR"
+ assert ir.angle == 45
+
+
+def test_IRParamStmt_dump():
+ stmt = {"param": "IR", "angle": "45"}
+ ir = IRParamStmt.from_dict(stmt)
+ assert ir.to_gerber() == "%IR45*%"
+
+
+def test_IRParamStmt_string():
+ stmt = {"param": "IR", "angle": "45"}
+ ir = IRParamStmt.from_dict(stmt)
+ assert str(ir) == "<Image Angle: 45>"
+
+
+def test_OFParamStmt_factory():
+ """ Test OFParamStmt factory
+ """
+ stmt = {"param": "OF", "a": "0.1234567", "b": "0.1234567"}
+ of = OFParamStmt.from_dict(stmt)
+ assert of.a == 0.1234567
+ assert of.b == 0.1234567
+
+
+def test_OFParamStmt():
+ """ Test IPParamStmt initialization
+ """
+ param = "OF"
+ for val in [0.0, -3.4567]:
+ stmt = OFParamStmt(param, val, val)
+ assert stmt.param == param
+ assert stmt.a == val
+ assert stmt.b == val
+
+
+def test_OFParamStmt_dump():
+ """ Test OFParamStmt to_gerber()
+ """
+ stmt = {"param": "OF", "a": "0.123456", "b": "0.123456"}
+ of = OFParamStmt.from_dict(stmt)
+ assert of.to_gerber() == "%OFA0.12345B0.12345*%"
+
+
+def test_OFParamStmt_conversion():
+ stmt = {"param": "OF", "a": "2.54", "b": "25.4"}
+ of = OFParamStmt.from_dict(stmt)
+ of.units = "metric"
+
+ # No effect
+ of.to_metric()
+ assert of.a == 2.54
+ assert of.b == 25.4
+
+ of.to_inch()
+ assert of.units == "inch"
+ assert of.a == 0.1
+ assert of.b == 1.0
+
+ # No effect
+ of.to_inch()
+ assert of.a == 0.1
+ assert of.b == 1.0
+
+ stmt = {"param": "OF", "a": "0.1", "b": "1.0"}
+ of = OFParamStmt.from_dict(stmt)
+ of.units = "inch"
+
+ # No effect
+ of.to_inch()
+ assert of.a == 0.1
+ assert of.b == 1.0
+
+ of.to_metric()
+ assert of.units == "metric"
+ assert of.a == 2.54
+ assert of.b == 25.4
+
+ # No effect
+ of.to_metric()
+ assert of.a == 2.54
+ assert of.b == 25.4
+
+
+def test_OFParamStmt_offset():
+ s = OFParamStmt("OF", 0, 0)
+ s.offset(1, 0)
+ assert s.a == 1.0
+ assert s.b == 0.0
+ s.offset(0, 1)
+ assert s.a == 1.0
+ assert s.b == 1.0
+
+
+def test_OFParamStmt_string():
+ """ Test OFParamStmt __str__
+ """
+ stmt = {"param": "OF", "a": "0.123456", "b": "0.123456"}
+ of = OFParamStmt.from_dict(stmt)
+ assert str(of) == "<Offset: X: 0.123456 Y: 0.123456 >"
+
+
+def test_SFParamStmt_factory():
+ stmt = {"param": "SF", "a": "1.4", "b": "0.9"}
+ sf = SFParamStmt.from_dict(stmt)
+ assert sf.param == "SF"
+ assert sf.a == 1.4
+ assert sf.b == 0.9
+
+
+def test_SFParamStmt_dump():
+ stmt = {"param": "SF", "a": "1.4", "b": "0.9"}
+ sf = SFParamStmt.from_dict(stmt)
+ assert sf.to_gerber() == "%SFA1.4B0.9*%"
+
+
+def test_SFParamStmt_conversion():
+ stmt = {"param": "OF", "a": "2.54", "b": "25.4"}
+ of = SFParamStmt.from_dict(stmt)
+ of.units = "metric"
+ of.to_metric()
+
+ # No effect
+ assert of.a == 2.54
+ assert of.b == 25.4
+
+ of.to_inch()
+ assert of.units == "inch"
+ assert of.a == 0.1
+ assert of.b == 1.0
+
+ # No effect
+ of.to_inch()
+ assert of.a == 0.1
+ assert of.b == 1.0
+
+ stmt = {"param": "OF", "a": "0.1", "b": "1.0"}
+ of = SFParamStmt.from_dict(stmt)
+ of.units = "inch"
+
+ # No effect
+ of.to_inch()
+ assert of.a == 0.1
+ assert of.b == 1.0
+
+ of.to_metric()
+ assert of.units == "metric"
+ assert of.a == 2.54
+ assert of.b == 25.4
+
+ # No effect
+ of.to_metric()
+ assert of.a == 2.54
+ assert of.b == 25.4
+
+
+def test_SFParamStmt_offset():
+ s = SFParamStmt("OF", 0, 0)
+ s.offset(1, 0)
+ assert s.a == 1.0
+ assert s.b == 0.0
+ s.offset(0, 1)
+ assert s.a == 1.0
+ assert s.b == 1.0
+
+
+def test_SFParamStmt_string():
+ stmt = {"param": "SF", "a": "1.4", "b": "0.9"}
+ sf = SFParamStmt.from_dict(stmt)
+ assert str(sf) == "<Scale Factor: X: 1.4 Y: 0.9>"
+
+
+def test_LPParamStmt_factory():
+ """ Test LPParamStmt factory
+ """
+ stmt = {"param": "LP", "lp": "C"}
+ lp = LPParamStmt.from_dict(stmt)
+ assert lp.lp == "clear"
+
+ stmt = {"param": "LP", "lp": "D"}
+ lp = LPParamStmt.from_dict(stmt)
+ assert lp.lp == "dark"
+
+
+def test_LPParamStmt_dump():
+ """ Test LPParamStmt to_gerber()
+ """
+ stmt = {"param": "LP", "lp": "C"}
+ lp = LPParamStmt.from_dict(stmt)
+ assert lp.to_gerber() == "%LPC*%"
+
+ stmt = {"param": "LP", "lp": "D"}
+ lp = LPParamStmt.from_dict(stmt)
+ assert lp.to_gerber() == "%LPD*%"
+
+
+def test_LPParamStmt_string():
+ """ Test LPParamStmt.__str__()
+ """
+ stmt = {"param": "LP", "lp": "D"}
+ lp = LPParamStmt.from_dict(stmt)
+ assert str(lp) == "<Level Polarity: dark>"
+
+ stmt = {"param": "LP", "lp": "C"}
+ lp = LPParamStmt.from_dict(stmt)
+ assert str(lp) == "<Level Polarity: clear>"
+
+
+def test_AMParamStmt_factory():
+ name = "DONUTVAR"
+ macro = """0 Test Macro. *
+1,1,1.5,0,0*
+20,1,0.9,0,0.45,12,0.45,0*
+21,1,6.8,1.2,3.4,0.6,0*
+22,1,6.8,1.2,0,0,0*
+4,1,4,0.1,0.1,0.5,0.1,0.5,0.5,0.1,0.5,0.1,0.1,0*
+5,1,8,0,0,8,0*
+6,0,0,5,0.5,0.5,2,0.1,6,0*
+7,0,0,7,6,0.2,0*
+8,THIS IS AN UNSUPPORTED PRIMITIVE*
+"""
+ s = AMParamStmt.from_dict({"param": "AM", "name": name, "macro": macro})
+ s.build()
+ assert len(s.primitives) == 10
+ assert isinstance(s.primitives[0], AMCommentPrimitive)
+ assert isinstance(s.primitives[1], AMCirclePrimitive)
+ assert isinstance(s.primitives[2], AMVectorLinePrimitive)
+ assert isinstance(s.primitives[3], AMCenterLinePrimitive)
+ assert isinstance(s.primitives[4], AMLowerLeftLinePrimitive)
+ assert isinstance(s.primitives[5], AMOutlinePrimitive)
+ assert isinstance(s.primitives[6], AMPolygonPrimitive)
+ assert isinstance(s.primitives[7], AMMoirePrimitive)
+ assert isinstance(s.primitives[8], AMThermalPrimitive)
+ assert isinstance(s.primitives[9], AMUnsupportPrimitive)
+
+
+def testAMParamStmt_conversion():
+ name = "POLYGON"
+ macro = "5,1,8,25.4,25.4,25.4,0*"
+ s = AMParamStmt.from_dict({"param": "AM", "name": name, "macro": macro})
+
+ s.build()
+ s.units = "metric"
+
+ # No effect
+ s.to_metric()
+ assert s.primitives[0].position == (25.4, 25.4)
+ assert s.primitives[0].diameter == 25.4
+
+ s.to_inch()
+ assert s.units == "inch"
+ assert s.primitives[0].position == (1.0, 1.0)
+ assert s.primitives[0].diameter == 1.0
+
+ # No effect
+ s.to_inch()
+ assert s.primitives[0].position == (1.0, 1.0)
+ assert s.primitives[0].diameter == 1.0
+
+ macro = "5,1,8,1,1,1,0*"
+ s = AMParamStmt.from_dict({"param": "AM", "name": name, "macro": macro})
+ s.build()
+ s.units = "inch"
+
+ # No effect
+ s.to_inch()
+ assert s.primitives[0].position == (1.0, 1.0)
+ assert s.primitives[0].diameter == 1.0
+
+ s.to_metric()
+ assert s.units == "metric"
+ assert s.primitives[0].position == (25.4, 25.4)
+ assert s.primitives[0].diameter == 25.4
+
+ # No effect
+ s.to_metric()
+ assert s.primitives[0].position == (25.4, 25.4)
+ assert s.primitives[0].diameter == 25.4
+
+
+def test_AMParamStmt_dump():
+ name = "POLYGON"
+ macro = "5,1,8,25.4,25.4,25.4,0.0"
+ s = AMParamStmt.from_dict({"param": "AM", "name": name, "macro": macro})
+ s.build()
+ assert s.to_gerber() == "%AMPOLYGON*5,1,8,25.4,25.4,25.4,0.0*%"
+
+ # TODO - Store Equations and update on unit change...
+ s = AMParamStmt.from_dict(
+ {"param": "AM", "name": "OC8", "macro": "5,1,8,0,0,1.08239X$1,22.5"}
+ )
+ s.build()
+ # assert_equal(s.to_gerber(), '%AMOC8*5,1,8,0,0,1.08239X$1,22.5*%')
+ assert s.to_gerber() == "%AMOC8*5,1,8,0,0,0,22.5*%"
+
+
+def test_AMParamStmt_string():
+ name = "POLYGON"
+ macro = "5,1,8,25.4,25.4,25.4,0*"
+ s = AMParamStmt.from_dict({"param": "AM", "name": name, "macro": macro})
+ s.build()
+ assert str(s) == "<Aperture Macro POLYGON: 5,1,8,25.4,25.4,25.4,0*>"
+
+
+def test_ASParamStmt_factory():
+ stmt = {"param": "AS", "mode": "AXBY"}
+ s = ASParamStmt.from_dict(stmt)
+ assert s.param == "AS"
+ assert s.mode == "AXBY"
+
+
+def test_ASParamStmt_dump():
+ stmt = {"param": "AS", "mode": "AXBY"}
+ s = ASParamStmt.from_dict(stmt)
+ assert s.to_gerber() == "%ASAXBY*%"
+
+
+def test_ASParamStmt_string():
+ stmt = {"param": "AS", "mode": "AXBY"}
+ s = ASParamStmt.from_dict(stmt)
+ assert str(s) == "<Axis Select: AXBY>"
+
+
+def test_INParamStmt_factory():
+ """ Test INParamStmt factory
+ """
+ stmt = {"param": "IN", "name": "test"}
+ inp = INParamStmt.from_dict(stmt)
+ assert inp.name == "test"
+
+
+def test_INParamStmt_dump():
+ """ Test INParamStmt to_gerber()
+ """
+ stmt = {"param": "IN", "name": "test"}
+ inp = INParamStmt.from_dict(stmt)
+ assert inp.to_gerber() == "%INtest*%"
+
+
+def test_INParamStmt_string():
+ stmt = {"param": "IN", "name": "test"}
+ inp = INParamStmt.from_dict(stmt)
+ assert str(inp) == "<Image Name: test>"
+
+
+def test_LNParamStmt_factory():
+ """ Test LNParamStmt factory
+ """
+ stmt = {"param": "LN", "name": "test"}
+ lnp = LNParamStmt.from_dict(stmt)
+ assert lnp.name == "test"
+
+
+def test_LNParamStmt_dump():
+ """ Test LNParamStmt to_gerber()
+ """
+ stmt = {"param": "LN", "name": "test"}
+ lnp = LNParamStmt.from_dict(stmt)
+ assert lnp.to_gerber() == "%LNtest*%"
+
+
+def test_LNParamStmt_string():
+ stmt = {"param": "LN", "name": "test"}
+ lnp = LNParamStmt.from_dict(stmt)
+ assert str(lnp) == "<Level Name: test>"
+
+
+def test_comment_stmt():
+ """ Test comment statement
+ """
+ stmt = CommentStmt("A comment")
+ assert stmt.type == "COMMENT"
+ assert stmt.comment == "A comment"
+
+
+def test_comment_stmt_dump():
+ """ Test CommentStmt to_gerber()
+ """
+ stmt = CommentStmt("A comment")
+ assert stmt.to_gerber() == "G04A comment*"
+
+
+def test_comment_stmt_string():
+ stmt = CommentStmt("A comment")
+ assert str(stmt) == "<Comment: A comment>"
+
+
+def test_eofstmt():
+ """ Test EofStmt
+ """
+ stmt = EofStmt()
+ assert stmt.type == "EOF"
+
+
+def test_eofstmt_dump():
+ """ Test EofStmt to_gerber()
+ """
+ stmt = EofStmt()
+ assert stmt.to_gerber() == "M02*"
+
+
+def test_eofstmt_string():
+ assert str(EofStmt()) == "<EOF Statement>"
+
+
+def test_quadmodestmt_factory():
+ """ Test QuadrantModeStmt.from_gerber()
+ """
+ line = "G74*"
+ stmt = QuadrantModeStmt.from_gerber(line)
+ assert stmt.type == "QuadrantMode"
+ assert stmt.mode == "single-quadrant"
+
+ line = "G75*"
+ stmt = QuadrantModeStmt.from_gerber(line)
+ assert stmt.mode == "multi-quadrant"
+
+
+def test_quadmodestmt_validation():
+ """ Test QuadrantModeStmt input validation
+ """
+ line = "G76*"
+ pytest.raises(ValueError, QuadrantModeStmt.from_gerber, line)
+ pytest.raises(ValueError, QuadrantModeStmt, "quadrant-ful")
+
+
+def test_quadmodestmt_dump():
+ """ Test QuadrantModeStmt.to_gerber()
+ """
+ for line in ("G74*", "G75*"):
+ stmt = QuadrantModeStmt.from_gerber(line)
+ assert stmt.to_gerber() == line
+
+
+def test_regionmodestmt_factory():
+ """ Test RegionModeStmt.from_gerber()
+ """
+ line = "G36*"
+ stmt = RegionModeStmt.from_gerber(line)
+ assert stmt.type == "RegionMode"
+ assert stmt.mode == "on"
+
+ line = "G37*"
+ stmt = RegionModeStmt.from_gerber(line)
+ assert stmt.mode == "off"
+
+
+def test_regionmodestmt_validation():
+ """ Test RegionModeStmt input validation
+ """
+ line = "G38*"
+ pytest.raises(ValueError, RegionModeStmt.from_gerber, line)
+ pytest.raises(ValueError, RegionModeStmt, "off-ish")
+
+
+def test_regionmodestmt_dump():
+ """ Test RegionModeStmt.to_gerber()
+ """
+ for line in ("G36*", "G37*"):
+ stmt = RegionModeStmt.from_gerber(line)
+ assert stmt.to_gerber() == line
+
+
+def test_unknownstmt():
+ """ Test UnknownStmt
+ """
+ line = "G696969*"
+ stmt = UnknownStmt(line)
+ assert stmt.type == "UNKNOWN"
+ assert stmt.line == line
+
+
+def test_unknownstmt_dump():
+ """ Test UnknownStmt.to_gerber()
+ """
+ lines = ("G696969*", "M03*")
+ for line in lines:
+ stmt = UnknownStmt(line)
+ assert stmt.to_gerber() == line
+
+
+def test_statement_string():
+ """ Test Statement.__str__()
+ """
+ stmt = Statement("PARAM")
+ assert "type=PARAM" in str(stmt)
+ stmt.test = "PASS"
+ assert "test=PASS" in str(stmt)
+ assert "type=PARAM" in str(stmt)
+
+
+def test_ADParamStmt_factory():
+ """ Test ADParamStmt factory
+ """
+ stmt = {"param": "AD", "d": 0, "shape": "C"}
+ ad = ADParamStmt.from_dict(stmt)
+ assert ad.d == 0
+ assert ad.shape == "C"
+
+ stmt = {"param": "AD", "d": 1, "shape": "R"}
+ ad = ADParamStmt.from_dict(stmt)
+ assert ad.d == 1
+ assert ad.shape == "R"
+
+ stmt = {"param": "AD", "d": 1, "shape": "C", "modifiers": "1.42"}
+ ad = ADParamStmt.from_dict(stmt)
+ assert ad.d == 1
+ assert ad.shape == "C"
+ assert ad.modifiers == [(1.42,)]
+
+ stmt = {"param": "AD", "d": 1, "shape": "C", "modifiers": "1.42X"}
+ ad = ADParamStmt.from_dict(stmt)
+ assert ad.d == 1
+ assert ad.shape == "C"
+ assert ad.modifiers == [(1.42,)]
+
+ stmt = {"param": "AD", "d": 1, "shape": "R", "modifiers": "1.42X1.24"}
+ ad = ADParamStmt.from_dict(stmt)
+ assert ad.d == 1
+ assert ad.shape == "R"
+ assert ad.modifiers == [(1.42, 1.24)]
+
+
+def test_ADParamStmt_conversion():
+ stmt = {"param": "AD", "d": 0, "shape": "C", "modifiers": "25.4X25.4,25.4X25.4"}
+ ad = ADParamStmt.from_dict(stmt)
+ ad.units = "metric"
+
+ # No effect
+ ad.to_metric()
+ assert ad.modifiers[0] == (25.4, 25.4)
+ assert ad.modifiers[1] == (25.4, 25.4)
+
+ ad.to_inch()
+ assert ad.units == "inch"
+ assert ad.modifiers[0] == (1.0, 1.0)
+ assert ad.modifiers[1] == (1.0, 1.0)
+
+ # No effect
+ ad.to_inch()
+ assert ad.modifiers[0] == (1.0, 1.0)
+ assert ad.modifiers[1] == (1.0, 1.0)
+
+ stmt = {"param": "AD", "d": 0, "shape": "C", "modifiers": "1X1,1X1"}
+ ad = ADParamStmt.from_dict(stmt)
+ ad.units = "inch"
+
+ # No effect
+ ad.to_inch()
+ assert ad.modifiers[0] == (1.0, 1.0)
+ assert ad.modifiers[1] == (1.0, 1.0)
+
+ ad.to_metric()
+ assert ad.modifiers[0] == (25.4, 25.4)
+ assert ad.modifiers[1] == (25.4, 25.4)
+
+ # No effect
+ ad.to_metric()
+ assert ad.modifiers[0] == (25.4, 25.4)
+ assert ad.modifiers[1] == (25.4, 25.4)
+
+
+def test_ADParamStmt_dump():
+ stmt = {"param": "AD", "d": 0, "shape": "C"}
+ ad = ADParamStmt.from_dict(stmt)
+ assert ad.to_gerber() == "%ADD0C*%"
+ stmt = {"param": "AD", "d": 0, "shape": "C", "modifiers": "1X1,1X1"}
+ ad = ADParamStmt.from_dict(stmt)
+ assert ad.to_gerber() == "%ADD0C,1X1,1X1*%"
+
+
+def test_ADPamramStmt_string():
+ stmt = {"param": "AD", "d": 0, "shape": "C"}
+ ad = ADParamStmt.from_dict(stmt)
+ assert str(ad) == "<Aperture Definition: 0: circle>"
+
+ stmt = {"param": "AD", "d": 0, "shape": "R"}
+ ad = ADParamStmt.from_dict(stmt)
+ assert str(ad) == "<Aperture Definition: 0: rectangle>"
+
+ stmt = {"param": "AD", "d": 0, "shape": "O"}
+ ad = ADParamStmt.from_dict(stmt)
+ assert str(ad) == "<Aperture Definition: 0: obround>"
+
+ stmt = {"param": "AD", "d": 0, "shape": "test"}
+ ad = ADParamStmt.from_dict(stmt)
+ assert str(ad) == "<Aperture Definition: 0: test>"
+
+
+def test_MIParamStmt_factory():
+ stmt = {"param": "MI", "a": 1, "b": 1}
+ mi = MIParamStmt.from_dict(stmt)
+ assert mi.a == 1
+ assert mi.b == 1
+
+
+def test_MIParamStmt_dump():
+ stmt = {"param": "MI", "a": 1, "b": 1}
+ mi = MIParamStmt.from_dict(stmt)
+ assert mi.to_gerber() == "%MIA1B1*%"
+ stmt = {"param": "MI", "a": 1}
+ mi = MIParamStmt.from_dict(stmt)
+ assert mi.to_gerber() == "%MIA1B0*%"
+ stmt = {"param": "MI", "b": 1}
+ mi = MIParamStmt.from_dict(stmt)
+ assert mi.to_gerber() == "%MIA0B1*%"
+
+
+def test_MIParamStmt_string():
+ stmt = {"param": "MI", "a": 1, "b": 1}
+ mi = MIParamStmt.from_dict(stmt)
+ assert str(mi) == "<Image Mirror: A=1 B=1>"
+
+ stmt = {"param": "MI", "b": 1}
+ mi = MIParamStmt.from_dict(stmt)
+ assert str(mi) == "<Image Mirror: A=0 B=1>"
+
+ stmt = {"param": "MI", "a": 1}
+ mi = MIParamStmt.from_dict(stmt)
+ assert str(mi) == "<Image Mirror: A=1 B=0>"
+
+
+def test_coordstmt_ctor():
+ cs = CoordStmt("G04", 0.0, 0.1, 0.2, 0.3, "D01", FileSettings())
+ assert cs.function == "G04"
+ assert cs.x == 0.0
+ assert cs.y == 0.1
+ assert cs.i == 0.2
+ assert cs.j == 0.3
+ assert cs.op == "D01"
+
+
+def test_coordstmt_factory():
+ stmt = {
+ "function": "G04",
+ "x": "0",
+ "y": "001",
+ "i": "002",
+ "j": "003",
+ "op": "D01",
+ }
+ cs = CoordStmt.from_dict(stmt, FileSettings())
+ assert cs.function == "G04"
+ assert cs.x == 0.0
+ assert cs.y == 0.1
+ assert cs.i == 0.2
+ assert cs.j == 0.3
+ assert cs.op == "D01"
+
+
+def test_coordstmt_dump():
+ cs = CoordStmt("G04", 0.0, 0.1, 0.2, 0.3, "D01", FileSettings())
+ assert cs.to_gerber(FileSettings()) == "G04X0Y001I002J003D01*"
+
+
+def test_coordstmt_conversion():
+ cs = CoordStmt("G71", 25.4, 25.4, 25.4, 25.4, "D01", FileSettings())
+ cs.units = "metric"
+
+ # No effect
+ cs.to_metric()
+ assert cs.x == 25.4
+ assert cs.y == 25.4
+ assert cs.i == 25.4
+ assert cs.j == 25.4
+ assert cs.function == "G71"
+
+ cs.to_inch()
+ assert cs.units == "inch"
+ assert cs.x == 1.0
+ assert cs.y == 1.0
+ assert cs.i == 1.0
+ assert cs.j == 1.0
+ assert cs.function == "G70"
+
+ # No effect
+ cs.to_inch()
+ assert cs.x == 1.0
+ assert cs.y == 1.0
+ assert cs.i == 1.0
+ assert cs.j == 1.0
+ assert cs.function == "G70"
+
+ cs = CoordStmt("G70", 1.0, 1.0, 1.0, 1.0, "D01", FileSettings())
+ cs.units = "inch"
+
+ # No effect
+ cs.to_inch()
+ assert cs.x == 1.0
+ assert cs.y == 1.0
+ assert cs.i == 1.0
+ assert cs.j == 1.0
+ assert cs.function == "G70"
+
+ cs.to_metric()
+ assert cs.x == 25.4
+ assert cs.y == 25.4
+ assert cs.i == 25.4
+ assert cs.j == 25.4
+ assert cs.function == "G71"
+
+ # No effect
+ cs.to_metric()
+ assert cs.x == 25.4
+ assert cs.y == 25.4
+ assert cs.i == 25.4
+ assert cs.j == 25.4
+ assert cs.function == "G71"
+
+
+def test_coordstmt_offset():
+ c = CoordStmt("G71", 0, 0, 0, 0, "D01", FileSettings())
+ c.offset(1, 0)
+ assert c.x == 1.0
+ assert c.y == 0.0
+ assert c.i == 1.0
+ assert c.j == 0.0
+ c.offset(0, 1)
+ assert c.x == 1.0
+ assert c.y == 1.0
+ assert c.i == 1.0
+ assert c.j == 1.0
+
+
+def test_coordstmt_string():
+ cs = CoordStmt("G04", 0, 1, 2, 3, "D01", FileSettings())
+ assert (
+ str(cs) == "<Coordinate Statement: Fn: G04 X: 0 Y: 1 I: 2 J: 3 Op: Lights On>"
+ )
+ cs = CoordStmt("G04", None, None, None, None, "D02", FileSettings())
+ assert str(cs) == "<Coordinate Statement: Fn: G04 Op: Lights Off>"
+ cs = CoordStmt("G04", None, None, None, None, "D03", FileSettings())
+ assert str(cs) == "<Coordinate Statement: Fn: G04 Op: Flash>"
+ cs = CoordStmt("G04", None, None, None, None, "TEST", FileSettings())
+ assert str(cs) == "<Coordinate Statement: Fn: G04 Op: TEST>"
+
+
+def test_aperturestmt_ctor():
+ ast = ApertureStmt(3, False)
+ assert ast.d == 3
+ assert ast.deprecated == False
+ ast = ApertureStmt(4, True)
+ assert ast.d == 4
+ assert ast.deprecated == True
+ ast = ApertureStmt(4, 1)
+ assert ast.d == 4
+ assert ast.deprecated == True
+ ast = ApertureStmt(3)
+ assert ast.d == 3
+ assert ast.deprecated == False
+
+
+def test_aperturestmt_dump():
+ ast = ApertureStmt(3, False)
+ assert ast.to_gerber() == "D3*"
+ ast = ApertureStmt(3, True)
+ assert ast.to_gerber() == "G54D3*"
+ assert str(ast) == "<Aperture: 3>"