#! /usr/bin/env python # -*- coding: utf-8 -*- # Author: Hamilton Kibbe 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) == "" tool = ExcellonTool.from_dict( FileSettings(units="metric"), {"number": 8, "diameter": 0.125} ) assert str(tool) == "" 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) == "" 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) == "" 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) == "" def test_unknownstmt_dump(): stmt = UnknownStmt("TEST") assert stmt.to_excellon(FileSettings()) == "TEST"