const GCode = require('../robot/GCode') const createDummyRobot = require('./helpers/createDummyRobot') describe('GCode.receiveGCode', () => { test('G90 setzt Absolutmodus', () => { const robot = createDummyRobot() robot.moveRelative = true GCode.receiveGCode(robot, 'G90') expect(robot.moveRelative).toBe(false) expect(robot.calculateAngles3D).not.toHaveBeenCalled() expect(robot.sendCommand).not.toHaveBeenCalled() }) test('G91 setzt Relativmodus', () => { const robot = createDummyRobot() GCode.receiveGCode(robot, 'G91') expect(robot.moveRelative).toBe(true) }) test('G1 absolut setzt Koordinaten', () => { const robot = createDummyRobot() GCode.receiveGCode(robot, 'G90 G1 X10 Y20 Z30') expect(robot.x).toBe(10) expect(robot.y).toBe(20) expect(robot.z).toBe(30) expect(robot.calculateAngles3D).toHaveBeenCalledTimes(1) expect(robot.sendCommand).toHaveBeenCalledTimes(1) }) test('G1 relativ addiert Koordinaten', () => { const robot = createDummyRobot() robot.moveRelative = true robot.x = 5 robot.y = 5 GCode.receiveGCode(robot, 'G1 X2 Y3') expect(robot.x).toBe(7) expect(robot.y).toBe(8) }) test('G1 ignore Jogg', () => { const robot = createDummyRobot() robot.moveRelative = true robot.x = 5 robot.y = 5 GCode.receiveGCode(robot, '$J=G91 G1 X2 Y3') expect(robot.x).toBe(7) expect(robot.y).toBe(8) }) test('G1 ignore Jogg absolute, G21 = mm ist OK', () => { const robot = createDummyRobot() robot.moveRelative = true robot.x = 5 robot.y = 5 GCode.receiveGCode(robot, '$J=G90 G21 G1 X20 Y30') expect(robot.x).toBe(20) expect(robot.y).toBe(30) }) test('M1 relativ verändert Motorwerte', () => { const robot = createDummyRobot() robot.moveRelative = true GCode.receiveGCode(robot, 'M1 X10 Y20 Z30 A1 B2 C3') expect(robot.xMotor).toBe(10) expect(robot.alpha).toBe(20) expect(robot.beta).toBe(30) expect(robot.a).toBe(1) expect(robot.b).toBe(2) expect(robot.c).toBe(3) expect(robot.calculatePositionFromMotorAngles).toHaveBeenCalled() expect(robot.sendCommand).toHaveBeenCalled() }) test('G28 setzt Home-Motorwerte direkt (Singularität), lässt aber den Greifer unangetastet', () => { const robot = createDummyRobot() robot.e = 7 // vorher gesetzte Greifer-Öffnung ... robot.eMotor = 3 // ... darf von G28 NICHT bewegt werden (sonst e−b−c-Slam bei b=π) GCode.receiveGCode(robot, 'G28') // Voll ausgestreckt = Handgelenk-Singularität -> Arm-Motorwerte DIREKT, dann FK (nicht IK). expect(robot.xMotor).toBe(0) expect(robot.alpha).toBe(0) expect(robot.beta).toBe(0) expect(robot.a).toBe(0) expect(robot.b).toBe(0) // gerade Hand (Phase-2-Konvention: b=0) expect(robot.c).toBe(0) // Greifer unverändert -> kein Finger-Slam am Anschlag expect(robot.e).toBe(7) expect(robot.eMotor).toBe(3) expect(robot.calculateAngles3D).not.toHaveBeenCalled() expect(robot.calculatePositionFromMotorAngles).toHaveBeenCalledTimes(1) expect(robot.sendCommand).toHaveBeenCalledTimes(1) }) test('Sende falsches Format', () =>{ const robot = createDummyRobot(); GCode.receiveGCode(robot, 'X324'); }) test('receiveGCode verarbeitet Buffer korrekt (UTF-8)', () => { const robot = createDummyRobot() const buffer = Buffer.from('G90 G1 X12 Y34 Z56', 'utf8') GCode.receiveGCode(robot, buffer) expect(robot.moveRelative).toBe(false) expect(robot.x).toBe(12) expect(robot.y).toBe(34) expect(robot.z).toBe(56) expect(robot.calculateAngles3D).toHaveBeenCalledTimes(1) expect(robot.sendCommand).toHaveBeenCalledTimes(1) }) })