/** * fkStateToDriverG92.test.js * Unit-Tests für server/fkStateToDriverG92.cjs * * Sichert ab, dass der FK-State korrekt in die Driver-G92-Konvention umgerechnet * wird — insbesondere B = 180 + b (nicht 180 − b, was Hand in die falsche * Richtung knickt, siehe doc/Homing_8_G92_B_Flip.md). */ const { fkStateToDriverG92 } = require('../server/fkStateToDriverG92.cjs'); describe('fkStateToDriverG92', () => { describe('B-Achse (Hand-Knick)', () => { test('gerade Hand (b=0) → B = 180', () => { expect(fkStateToDriverG92({ b: 0 }).b).toBeCloseTo(180, 5); }); test('b=−70.14° → B = 109.86° (Beweis aus doc: Hand nach oben)', () => { // Beweisdaten aus Homing_8_G92_B_Flip.md: falsch wäre 250.14, richtig 109.86 expect(fkStateToDriverG92({ b: -70.14 }).b).toBeCloseTo(109.86, 2); }); test('b=−8.16° → B ≈ 171.84° (Gegenprobe mit realem Driver-IK-Wert 170.78°)', () => { // Driver-IK lieferte 170.78° für dieselbe Pose; 180 + (−8.16) = 171.84 ≈ 170.78 ✓ expect(fkStateToDriverG92({ b: -8.16 }).b).toBeCloseTo(171.84, 2); }); test('b fehlt (null) → b wird nicht gesetzt', () => { const result = fkStateToDriverG92({ b: null, x: 10 }); expect(result.b).toBeNull(); expect(result.x).toBe(10); }); test('b fehlt (undefined) → b bleibt undefined', () => { const result = fkStateToDriverG92({ x: 5 }); expect(result.b).toBeUndefined(); }); }); describe('C-Achse (Palm-Roll)', () => { test('c=0 (neutral) → C = 90', () => { expect(fkStateToDriverG92({ c: 0 }).c).toBeCloseTo(90, 5); }); test('c=−64.9° → C ≈ 25.1°', () => { expect(fkStateToDriverG92({ c: -64.9 }).c).toBeCloseTo(25.1, 1); }); test('c fehlt (null) → c wird nicht verändert', () => { expect(fkStateToDriverG92({ c: null }).c).toBeNull(); }); }); describe('Z-Achse (Ellbogen, relativ → absolut)', () => { test('y + z ergibt absoluten Beta-Winkel', () => { expect(fkStateToDriverG92({ y: 35, z: -30 }).z).toBeCloseTo(5, 5); }); test('z fehlt (null) → z wird nicht umgerechnet', () => { const result = fkStateToDriverG92({ y: 35, z: null }); expect(result.z).toBeNull(); }); test('y fehlt → z wird nicht umgerechnet', () => { const result = fkStateToDriverG92({ z: -30 }); expect(result.z).toBe(-30); }); }); describe('Alle Achsen kombiniert (typischer 4b-State)', () => { test('vollständiger State mit allen Konvertierungen', () => { const input = { x: 192.73, y: 35.99, z: -30.88, a: -1.70, b: 12.34 }; const result = fkStateToDriverG92(input); expect(result.x).toBeCloseTo(192.73, 2); expect(result.y).toBeCloseTo(35.99, 2); expect(result.z).toBeCloseTo(35.99 + (-30.88), 2); // absolut expect(result.a).toBeCloseTo(-1.70, 2); expect(result.b).toBeCloseTo(180 + 12.34, 2); // 192.34 }); test('Input-Objekt bleibt unverändert (kein Seiteneffekt)', () => { const input = { b: -70, c: 0, y: 10, z: -5 }; fkStateToDriverG92(input); expect(input.b).toBe(-70); expect(input.c).toBe(0); expect(input.z).toBe(-5); }); }); });