gerbonara/gerber/tests/test_excellon_statements.py
Paulo Henrique Silva ef589a0640
Migrate to pytest (#111)
* Migrate to pytest

All tests were update to use pytest.

Tests were alse black formatted. Eventually all code
will be black formatted but need to merge some PRs first.
2019-11-26 00:37:41 -03:00

734 lines
19 KiB
Python

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Hamilton Kibbe <ham@hamiltonkib.be>
import pytest
from ..excellon_statements import *
from ..cam import FileSettings
def test_excellon_statement_implementation():
stmt = ExcellonStatement()
pytest.raises(NotImplementedError, stmt.from_excellon, None)
pytest.raises(NotImplementedError, stmt.to_excellon)
def test_excellontstmt():
""" Smoke test ExcellonStatement
"""
stmt = ExcellonStatement()
stmt.to_inch()
stmt.to_metric()
stmt.offset()
def test_excellontool_factory():
""" Test ExcellonTool factory methods
"""
exc_line = "T8F01B02S00003H04Z05C0.12500"
settings = FileSettings(
format=(2, 5), zero_suppression="trailing", units="inch", notation="absolute"
)
tool = ExcellonTool.from_excellon(exc_line, settings)
assert tool.number == 8
assert tool.diameter == 0.125
assert tool.feed_rate == 1
assert tool.retract_rate == 2
assert tool.rpm == 3
assert tool.max_hit_count == 4
assert tool.depth_offset == 5
stmt = {
"number": 8,
"feed_rate": 1,
"retract_rate": 2,
"rpm": 3,
"diameter": 0.125,
"max_hit_count": 4,
"depth_offset": 5,
}
tool = ExcellonTool.from_dict(settings, stmt)
assert tool.number == 8
assert tool.diameter == 0.125
assert tool.feed_rate == 1
assert tool.retract_rate == 2
assert tool.rpm == 3
assert tool.max_hit_count == 4
assert tool.depth_offset == 5
def test_excellontool_dump():
""" Test ExcellonTool to_excellon()
"""
exc_lines = [
"T01F0S0C0.01200",
"T02F0S0C0.01500",
"T03F0S0C0.01968",
"T04F0S0C0.02800",
"T05F0S0C0.03300",
"T06F0S0C0.03800",
"T07F0S0C0.04300",
"T08F0S0C0.12500",
"T09F0S0C0.13000",
"T08B01F02H03S00003C0.12500Z04",
"T01F0S300.999C0.01200",
]
settings = FileSettings(
format=(2, 5), zero_suppression="trailing", units="inch", notation="absolute"
)
for line in exc_lines:
tool = ExcellonTool.from_excellon(line, settings)
assert tool.to_excellon() == line
def test_excellontool_order():
settings = FileSettings(
format=(2, 5), zero_suppression="trailing", units="inch", notation="absolute"
)
line = "T8F00S00C0.12500"
tool1 = ExcellonTool.from_excellon(line, settings)
line = "T8C0.12500F00S00"
tool2 = ExcellonTool.from_excellon(line, settings)
assert tool1.diameter == tool2.diameter
assert tool1.feed_rate == tool2.feed_rate
assert tool1.rpm == tool2.rpm
def test_excellontool_conversion():
tool = ExcellonTool.from_dict(
FileSettings(units="metric"), {"number": 8, "diameter": 25.4}
)
tool.to_inch()
assert tool.diameter == 1.0
tool = ExcellonTool.from_dict(
FileSettings(units="inch"), {"number": 8, "diameter": 1.0}
)
tool.to_metric()
assert tool.diameter == 25.4
# Shouldn't change units if we're already using target units
tool = ExcellonTool.from_dict(
FileSettings(units="inch"), {"number": 8, "diameter": 25.4}
)
tool.to_inch()
assert tool.diameter == 25.4
tool = ExcellonTool.from_dict(
FileSettings(units="metric"), {"number": 8, "diameter": 1.0}
)
tool.to_metric()
assert tool.diameter == 1.0
def test_excellontool_repr():
tool = ExcellonTool.from_dict(FileSettings(), {"number": 8, "diameter": 0.125})
assert str(tool) == "<ExcellonTool 08: 0.125in. dia.>"
tool = ExcellonTool.from_dict(
FileSettings(units="metric"), {"number": 8, "diameter": 0.125}
)
assert str(tool) == "<ExcellonTool 08: 0.125mm dia.>"
def test_excellontool_equality():
t = ExcellonTool.from_dict(FileSettings(), {"number": 8, "diameter": 0.125})
t1 = ExcellonTool.from_dict(FileSettings(), {"number": 8, "diameter": 0.125})
assert t == t1
t1 = ExcellonTool.from_dict(
FileSettings(units="metric"), {"number": 8, "diameter": 0.125}
)
assert t != t1
def test_toolselection_factory():
""" Test ToolSelectionStmt factory method
"""
stmt = ToolSelectionStmt.from_excellon("T01")
assert stmt.tool == 1
assert stmt.compensation_index == None
stmt = ToolSelectionStmt.from_excellon("T0223")
assert stmt.tool == 2
assert stmt.compensation_index == 23
stmt = ToolSelectionStmt.from_excellon("T042")
assert stmt.tool == 42
assert stmt.compensation_index == None
def test_toolselection_dump():
""" Test ToolSelectionStmt to_excellon()
"""
lines = ["T01", "T0223", "T10", "T09", "T0000"]
for line in lines:
stmt = ToolSelectionStmt.from_excellon(line)
assert stmt.to_excellon() == line
def test_z_axis_infeed_rate_factory():
""" Test ZAxisInfeedRateStmt factory method
"""
stmt = ZAxisInfeedRateStmt.from_excellon("F01")
assert stmt.rate == 1
stmt = ZAxisInfeedRateStmt.from_excellon("F2")
assert stmt.rate == 2
stmt = ZAxisInfeedRateStmt.from_excellon("F03")
assert stmt.rate == 3
def test_z_axis_infeed_rate_dump():
""" Test ZAxisInfeedRateStmt to_excellon()
"""
inputs = [("F01", "F01"), ("F2", "F02"), ("F00003", "F03")]
for input_rate, expected_output in inputs:
stmt = ZAxisInfeedRateStmt.from_excellon(input_rate)
assert stmt.to_excellon() == expected_output
def test_coordinatestmt_factory():
""" Test CoordinateStmt factory method
"""
settings = FileSettings(
format=(2, 5), zero_suppression="trailing", units="inch", notation="absolute"
)
line = "X0278207Y0065293"
stmt = CoordinateStmt.from_excellon(line, settings)
assert stmt.x == 2.78207
assert stmt.y == 0.65293
# line = 'X02945'
# stmt = CoordinateStmt.from_excellon(line)
# assert_equal(stmt.x, 2.945)
# line = 'Y00575'
# stmt = CoordinateStmt.from_excellon(line)
# assert_equal(stmt.y, 0.575)
settings = FileSettings(
format=(2, 4), zero_suppression="leading", units="inch", notation="absolute"
)
line = "X9660Y4639"
stmt = CoordinateStmt.from_excellon(line, settings)
assert stmt.x == 0.9660
assert stmt.y == 0.4639
assert stmt.to_excellon(settings) == "X9660Y4639"
assert stmt.units == "inch"
settings.units = "metric"
stmt = CoordinateStmt.from_excellon(line, settings)
assert stmt.units == "metric"
def test_coordinatestmt_dump():
""" Test CoordinateStmt to_excellon()
"""
lines = [
"X278207Y65293",
"X243795",
"Y82528",
"Y86028",
"X251295Y81528",
"X2525Y78",
"X255Y575",
"Y52",
"X2675",
"Y575",
"X2425",
"Y52",
"X23",
]
settings = FileSettings(
format=(2, 4), zero_suppression="leading", units="inch", notation="absolute"
)
for line in lines:
stmt = CoordinateStmt.from_excellon(line, settings)
assert stmt.to_excellon(settings) == line
def test_coordinatestmt_conversion():
settings = FileSettings()
settings.units = "metric"
stmt = CoordinateStmt.from_excellon("X254Y254", settings)
# No effect
stmt.to_metric()
assert stmt.x == 25.4
assert stmt.y == 25.4
stmt.to_inch()
assert stmt.units == "inch"
assert stmt.x == 1.0
assert stmt.y == 1.0
# No effect
stmt.to_inch()
assert stmt.x == 1.0
assert stmt.y == 1.0
settings.units = "inch"
stmt = CoordinateStmt.from_excellon("X01Y01", settings)
# No effect
stmt.to_inch()
assert stmt.x == 1.0
assert stmt.y == 1.0
stmt.to_metric()
assert stmt.units == "metric"
assert stmt.x == 25.4
assert stmt.y == 25.4
# No effect
stmt.to_metric()
assert stmt.x == 25.4
assert stmt.y == 25.4
def test_coordinatestmt_offset():
stmt = CoordinateStmt.from_excellon("X01Y01", FileSettings())
stmt.offset()
assert stmt.x == 1
assert stmt.y == 1
stmt.offset(1, 0)
assert stmt.x == 2.0
assert stmt.y == 1.0
stmt.offset(0, 1)
assert stmt.x == 2.0
assert stmt.y == 2.0
def test_coordinatestmt_string():
settings = FileSettings(
format=(2, 4), zero_suppression="leading", units="inch", notation="absolute"
)
stmt = CoordinateStmt.from_excellon("X9660Y4639", settings)
assert str(stmt) == "<Coordinate Statement: X: 0.966 Y: 0.4639 >"
def test_repeathole_stmt_factory():
stmt = RepeatHoleStmt.from_excellon(
"R0004X015Y32", FileSettings(zeros="leading", units="inch")
)
assert stmt.count == 4
assert stmt.xdelta == 1.5
assert stmt.ydelta == 32
assert stmt.units == "inch"
stmt = RepeatHoleStmt.from_excellon(
"R0004X015Y32", FileSettings(zeros="leading", units="metric")
)
assert stmt.units == "metric"
def test_repeatholestmt_dump():
line = "R4X015Y32"
stmt = RepeatHoleStmt.from_excellon(line, FileSettings())
assert stmt.to_excellon(FileSettings()) == line
def test_repeatholestmt_conversion():
line = "R4X0254Y254"
settings = FileSettings()
settings.units = "metric"
stmt = RepeatHoleStmt.from_excellon(line, settings)
# No effect
stmt.to_metric()
assert stmt.xdelta == 2.54
assert stmt.ydelta == 25.4
stmt.to_inch()
assert stmt.units == "inch"
assert stmt.xdelta == 0.1
assert stmt.ydelta == 1.0
# no effect
stmt.to_inch()
assert stmt.xdelta == 0.1
assert stmt.ydelta == 1.0
line = "R4X01Y1"
settings.units = "inch"
stmt = RepeatHoleStmt.from_excellon(line, settings)
# no effect
stmt.to_inch()
assert stmt.xdelta == 1.0
assert stmt.ydelta == 10.0
stmt.to_metric()
assert stmt.units == "metric"
assert stmt.xdelta == 25.4
assert stmt.ydelta == 254.0
# No effect
stmt.to_metric()
assert stmt.xdelta == 25.4
assert stmt.ydelta == 254.0
def test_repeathole_str():
stmt = RepeatHoleStmt.from_excellon("R4X015Y32", FileSettings())
assert str(stmt) == "<Repeat Hole: 4 times, offset X: 1.5 Y: 32>"
def test_commentstmt_factory():
""" Test CommentStmt factory method
"""
line = ";Layer_Color=9474304"
stmt = CommentStmt.from_excellon(line)
assert stmt.comment == line[1:]
line = ";FILE_FORMAT=2:5"
stmt = CommentStmt.from_excellon(line)
assert stmt.comment == line[1:]
line = ";TYPE=PLATED"
stmt = CommentStmt.from_excellon(line)
assert stmt.comment == line[1:]
def test_commentstmt_dump():
""" Test CommentStmt to_excellon()
"""
lines = [";Layer_Color=9474304", ";FILE_FORMAT=2:5", ";TYPE=PLATED"]
for line in lines:
stmt = CommentStmt.from_excellon(line)
assert stmt.to_excellon() == line
def test_header_begin_stmt():
stmt = HeaderBeginStmt()
assert stmt.to_excellon(None) == "M48"
def test_header_end_stmt():
stmt = HeaderEndStmt()
assert stmt.to_excellon(None) == "M95"
def test_rewindstop_stmt():
stmt = RewindStopStmt()
assert stmt.to_excellon(None) == "%"
def test_z_axis_rout_position_stmt():
stmt = ZAxisRoutPositionStmt()
assert stmt.to_excellon(None) == "M15"
def test_retract_with_clamping_stmt():
stmt = RetractWithClampingStmt()
assert stmt.to_excellon(None) == "M16"
def test_retract_without_clamping_stmt():
stmt = RetractWithoutClampingStmt()
assert stmt.to_excellon(None) == "M17"
def test_cutter_compensation_off_stmt():
stmt = CutterCompensationOffStmt()
assert stmt.to_excellon(None) == "G40"
def test_cutter_compensation_left_stmt():
stmt = CutterCompensationLeftStmt()
assert stmt.to_excellon(None) == "G41"
def test_cutter_compensation_right_stmt():
stmt = CutterCompensationRightStmt()
assert stmt.to_excellon(None) == "G42"
def test_endofprogramstmt_factory():
settings = FileSettings(units="inch")
stmt = EndOfProgramStmt.from_excellon("M30X01Y02", settings)
assert stmt.x == 1.0
assert stmt.y == 2.0
assert stmt.units == "inch"
settings.units = "metric"
stmt = EndOfProgramStmt.from_excellon("M30X01", settings)
assert stmt.x == 1.0
assert stmt.y == None
assert stmt.units == "metric"
stmt = EndOfProgramStmt.from_excellon("M30Y02", FileSettings())
assert stmt.x == None
assert stmt.y == 2.0
def test_endofprogramStmt_dump():
lines = ["M30X01Y02"]
for line in lines:
stmt = EndOfProgramStmt.from_excellon(line, FileSettings())
assert stmt.to_excellon(FileSettings()) == line
def test_endofprogramstmt_conversion():
settings = FileSettings()
settings.units = "metric"
stmt = EndOfProgramStmt.from_excellon("M30X0254Y254", settings)
# No effect
stmt.to_metric()
assert stmt.x == 2.54
assert stmt.y == 25.4
stmt.to_inch()
assert stmt.units == "inch"
assert stmt.x == 0.1
assert stmt.y == 1.0
# No effect
stmt.to_inch()
assert stmt.x == 0.1
assert stmt.y == 1.0
settings.units = "inch"
stmt = EndOfProgramStmt.from_excellon("M30X01Y1", settings)
# No effect
stmt.to_inch()
assert stmt.x == 1.0
assert stmt.y == 10.0
stmt.to_metric()
assert stmt.units == "metric"
assert stmt.x == 25.4
assert stmt.y == 254.0
# No effect
stmt.to_metric()
assert stmt.x == 25.4
assert stmt.y == 254.0
def test_endofprogramstmt_offset():
stmt = EndOfProgramStmt(1, 1)
stmt.offset()
assert stmt.x == 1
assert stmt.y == 1
stmt.offset(1, 0)
assert stmt.x == 2.0
assert stmt.y == 1.0
stmt.offset(0, 1)
assert stmt.x == 2.0
assert stmt.y == 2.0
def test_unitstmt_factory():
""" Test UnitStmt factory method
"""
line = "INCH,LZ"
stmt = UnitStmt.from_excellon(line)
assert stmt.units == "inch"
assert stmt.zeros == "leading"
line = "INCH,TZ"
stmt = UnitStmt.from_excellon(line)
assert stmt.units == "inch"
assert stmt.zeros == "trailing"
line = "METRIC,LZ"
stmt = UnitStmt.from_excellon(line)
assert stmt.units == "metric"
assert stmt.zeros == "leading"
line = "METRIC,TZ"
stmt = UnitStmt.from_excellon(line)
assert stmt.units == "metric"
assert stmt.zeros == "trailing"
def test_unitstmt_dump():
""" Test UnitStmt to_excellon()
"""
lines = ["INCH,LZ", "INCH,TZ", "METRIC,LZ", "METRIC,TZ"]
for line in lines:
stmt = UnitStmt.from_excellon(line)
assert stmt.to_excellon() == line
def test_unitstmt_conversion():
stmt = UnitStmt.from_excellon("METRIC,TZ")
stmt.to_inch()
assert stmt.units == "inch"
stmt = UnitStmt.from_excellon("INCH,TZ")
stmt.to_metric()
assert stmt.units == "metric"
def test_incrementalmode_factory():
""" Test IncrementalModeStmt factory method
"""
line = "ICI,ON"
stmt = IncrementalModeStmt.from_excellon(line)
assert stmt.mode == "on"
line = "ICI,OFF"
stmt = IncrementalModeStmt.from_excellon(line)
assert stmt.mode == "off"
def test_incrementalmode_dump():
""" Test IncrementalModeStmt to_excellon()
"""
lines = ["ICI,ON", "ICI,OFF"]
for line in lines:
stmt = IncrementalModeStmt.from_excellon(line)
assert stmt.to_excellon() == line
def test_incrementalmode_validation():
""" Test IncrementalModeStmt input validation
"""
pytest.raises(ValueError, IncrementalModeStmt, "OFF-ISH")
def test_versionstmt_factory():
""" Test VersionStmt factory method
"""
line = "VER,1"
stmt = VersionStmt.from_excellon(line)
assert stmt.version == 1
line = "VER,2"
stmt = VersionStmt.from_excellon(line)
assert stmt.version == 2
def test_versionstmt_dump():
""" Test VersionStmt to_excellon()
"""
lines = ["VER,1", "VER,2"]
for line in lines:
stmt = VersionStmt.from_excellon(line)
assert stmt.to_excellon() == line
def test_versionstmt_validation():
""" Test VersionStmt input validation
"""
pytest.raises(ValueError, VersionStmt, 3)
def test_formatstmt_factory():
""" Test FormatStmt factory method
"""
line = "FMAT,1"
stmt = FormatStmt.from_excellon(line)
assert stmt.format == 1
line = "FMAT,2"
stmt = FormatStmt.from_excellon(line)
assert stmt.format == 2
def test_formatstmt_dump():
""" Test FormatStmt to_excellon()
"""
lines = ["FMAT,1", "FMAT,2"]
for line in lines:
stmt = FormatStmt.from_excellon(line)
assert stmt.to_excellon() == line
def test_formatstmt_validation():
""" Test FormatStmt input validation
"""
pytest.raises(ValueError, FormatStmt, 3)
def test_linktoolstmt_factory():
""" Test LinkToolStmt factory method
"""
line = "1/2/3/4"
stmt = LinkToolStmt.from_excellon(line)
assert stmt.linked_tools == [1, 2, 3, 4]
line = "01/02/03/04"
stmt = LinkToolStmt.from_excellon(line)
assert stmt.linked_tools == [1, 2, 3, 4]
def test_linktoolstmt_dump():
""" Test LinkToolStmt to_excellon()
"""
lines = ["1/2/3/4", "5/6/7"]
for line in lines:
stmt = LinkToolStmt.from_excellon(line)
assert stmt.to_excellon() == line
def test_measmodestmt_factory():
""" Test MeasuringModeStmt factory method
"""
line = "M72"
stmt = MeasuringModeStmt.from_excellon(line)
assert stmt.units == "inch"
line = "M71"
stmt = MeasuringModeStmt.from_excellon(line)
assert stmt.units == "metric"
def test_measmodestmt_dump():
""" Test MeasuringModeStmt to_excellon()
"""
lines = ["M71", "M72"]
for line in lines:
stmt = MeasuringModeStmt.from_excellon(line)
assert stmt.to_excellon() == line
def test_measmodestmt_validation():
""" Test MeasuringModeStmt input validation
"""
pytest.raises(ValueError, MeasuringModeStmt.from_excellon, "M70")
pytest.raises(ValueError, MeasuringModeStmt, "millimeters")
def test_measmodestmt_conversion():
line = "M72"
stmt = MeasuringModeStmt.from_excellon(line)
assert stmt.units == "inch"
stmt.to_metric()
assert stmt.units == "metric"
line = "M71"
stmt = MeasuringModeStmt.from_excellon(line)
assert stmt.units == "metric"
stmt.to_inch()
assert stmt.units == "inch"
def test_routemode_stmt():
stmt = RouteModeStmt()
assert stmt.to_excellon(FileSettings()) == "G00"
def test_linearmode_stmt():
stmt = LinearModeStmt()
assert stmt.to_excellon(FileSettings()) == "G01"
def test_drillmode_stmt():
stmt = DrillModeStmt()
assert stmt.to_excellon(FileSettings()) == "G05"
def test_absolutemode_stmt():
stmt = AbsoluteModeStmt()
assert stmt.to_excellon(FileSettings()) == "G90"
def test_unknownstmt():
stmt = UnknownStmt("TEST")
assert stmt.stmt == "TEST"
assert str(stmt) == "<Unknown Statement: TEST>"
def test_unknownstmt_dump():
stmt = UnknownStmt("TEST")
assert stmt.to_excellon(FileSettings()) == "TEST"