92 lines
3.2 KiB
JavaScript
92 lines
3.2 KiB
JavaScript
/**
|
||
* 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);
|
||
});
|
||
});
|
||
|
||
});
|