pygcode/tests/test_machine.py
2017-07-09 11:32:37 +10:00

124 lines
3.9 KiB
Python

import unittest
# Add relative pygcode to path
from testutils import add_pygcode_to_path, str_lines
add_pygcode_to_path()
# Units under test
from pygcode.machine import Position, Machine
from pygcode.line import Line
from pygcode.exceptions import MachineInvalidAxis
class PositionTests(unittest.TestCase):
def test_basics(self):
p = Position()
#
def test_default_axes(self):
p = Position() # no instantiation parameters
# all initialized to zero
for axis in 'XYZABCUVW':
self.assertEqual(getattr(p, axis), 0)
for axis in 'XYZABCUVW':
# set to 100
setattr(p, axis, 100)
self.assertEqual(getattr(p, axis), 100)
for inner_axis in set('XYZABCUVW') - {axis}: # no other axis has changed
self.assertEqual(getattr(p, inner_axis), 0), "axis '%s'" % inner_axis
# revert back to zero
setattr(p, axis, 0)
self.assertEqual(getattr(p, axis), 0)
# Equality
def test_equality(self):
p1 = Position(axes='XYZ', X=1, Y=2)
p2 = Position(axes='XYZ', X=1, Y=2, Z=0)
p3 = Position(axes='XYZ', X=1, Y=2, Z=1000)
p4 = Position(axes='XYZA', X=1, Y=2, Z=0)
# p1 <--> p2
self.assertTrue(p1 == p2)
self.assertFalse(p1 != p2) # negative case
# p2 <--> p3
self.assertTrue(p2 != p3)
self.assertFalse(p2 == p3) # negative case
# p2 <--> p4
self.assertTrue(p2 != p4)
self.assertFalse(p2 == p4) # negative case
# Arithmetic
def test_arithmetic_add(self):
p1 = Position(axes='XYZ', X=1, Y=2)
p2 = Position(axes='XYZ', Y=10, Z=-20)
self.assertEqual(p1 + p2, Position(axes='XYZ', X=1, Y=12, Z=-20))
p3 = Position(axes='XYZA')
with self.assertRaises(MachineInvalidAxis):
p1 + p3 # mismatched axes
with self.assertRaises(MachineInvalidAxis):
p3 + p1 # mismatched axes
def test_arithmetic_sub(self):
p1 = Position(axes='XYZ', X=1, Y=2)
p2 = Position(axes='XYZ', Y=10, Z=-20)
self.assertEqual(p1 - p2, Position(axes='XYZ', X=1, Y=-8, Z=20))
p3 = Position(axes='XYZA')
p3 - p1 # fine
with self.assertRaises(MachineInvalidAxis):
p1 - p3 # mismatched axes
def test_arithmetic_multiply(self):
p = Position(axes='XYZ', X=2, Y=10)
self.assertEqual(p * 2, Position(axes='XYZ', X=4, Y=20))
def test_arithmetic_divide(self):
p = Position(axes='XYZ', X=2, Y=10)
self.assertEqual(p / 2, Position(axes='XYZ', X=1, Y=5))
class MachineGCodeProcessingTests(unittest.TestCase):
def test_linear_movement(self):
m = Machine()
test_str = '''; move in a 10mm square
F100 M3 S1000 ; 0
g1 x0 y10 ; 1
g1 x10 y10 ; 2
g1 x10 y0 ; 3
g1 x0 y0 ; 4
'''
expected_pos = {
'0': m.Position(),
'1': m.Position(X=0, Y=10),
'2': m.Position(X=10, Y=10),
'3': m.Position(X=10, Y=0),
'4': m.Position(X=0, Y=0),
}
#print("\n%r\n%r" % (m.mode, m.state))
for line_text in str_lines(test_str):
line = Line(line_text)
if line.block:
#print("\n%s" % line.block)
m.process_block(line.block)
# Assert possition change correct
comment = line.comment.text
if comment in expected_pos:
self.assertEqual(m.pos, expected_pos[comment])
#print("%r\n%r\npos=%r" % (m.mode, m.state, m.pos))
#m = Machine()
#
#file = GCodeParser('part1.gcode')
#for line in file.iterlines():
# for (i, gcode) in enumerate(line.block.gcode):
# if isinstance(gcode, GCodeArcMove):
# arc = gcode
# line_params = arc.line_segments(precision=0.0005)
# for