diff --git a/test/calculateAction.01_Fetch.test.js b/test/calculateAction.01_Fetch.test.js deleted file mode 100755 index 5e76aac..0000000 --- a/test/calculateAction.01_Fetch.test.js +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @jest-environment jsdom - */ - -const fs = require('fs'); -const path = require('path'); - -describe("calculate() Snapshot-Test Fetch", () => { - - let calculate; - - beforeEach(() => { - // DOM vorbereiten - document.body.innerHTML = ` - - `; - - // Fetch mocken, aber so, dass die CSV real geladen wird - global.fetch = jest.fn(async () => { - const csvPath = path.join( - __dirname, - "./snapshots/snapshot_video0_1774805028717_two_cam.csv" - ); - - const csvContent = fs.readFileSync(csvPath, "utf8"); - - return { - ok: true, - headers: { - get: () => "text/csv" - }, - text: async () => csvContent - }; - }); - - // Modul *nach* DOM‑Mock laden! - ({ calculate } = require("../public/calculateActions.js")); - }); - - test("calculate() lädt Snapshot über fetch()", async () => { - - await calculate(); // 👉 Aufruf, fetch wird getriggert - - // Nur erster Check: wurde fetch überhaupt aufgerufen? - expect(global.fetch).toHaveBeenCalledWith("/api/latest-snapshot"); - - // Und die Log-Ausgabe wurde befüllt? - const logValue = document.getElementById("analysis-log").value; - expect(logValue).toMatch(/Starte Berechnung/); - }); - -}); \ No newline at end of file diff --git a/test/calculateAction.02_FetchDifferentCSV.test.js b/test/calculateAction.02_FetchDifferentCSV.test.js deleted file mode 100755 index b295918..0000000 --- a/test/calculateAction.02_FetchDifferentCSV.test.js +++ /dev/null @@ -1,99 +0,0 @@ -/** - * @jest-environment jsdom - */ - -const fs = require("fs"); -const path = require("path"); - -describe("calculate() Snapshot Tests", () => { - - let calculate; - let snapshotFile; - - beforeEach(() => { - - // Standard: irgendeine Datei setzen, falls Test nichts setzt - snapshotFile = "snapshot_default.csv"; - - // DOM erzeugen - document.body.innerHTML = ` - - `; - - // Fetch dynamisch mocken - global.fetch = jest.fn(async () => { - - const csvPath = path.join(__dirname, "snapshots", snapshotFile); - const csvContent = fs.readFileSync(csvPath, "utf8"); - - return { - ok: true, - headers: { get: () => "text/csv" }, - text: async () => csvContent - }; - }); - - // Modul erst JETZT laden (DOM existiert) - ({ calculate } = require("../public/calculateActions.js")); - }); - - // ✅ Beispiel 1: Die Datei aus deiner Frage - test("Snapshot 1774805028717 wird korrekt geladen", async () => { - - snapshotFile = "snapshot_video0_1774805028717_two_cam.csv"; - - var result = await calculate(); - - expect(global.fetch).toHaveBeenCalledWith("/api/latest-snapshot"); - - // Problem: (zMotor = -137.28° = -2.3960 rad) aus roll_deg von ID = 226 - //console.log("Berechnungsergebnis:", result.features["forearm.angleZ"].valueDeg); - }); - - - test("Snapshot 1774805028717 wird korrekt geladen", async () => { - - snapshotFile = "snapshot_video0_1774805686335_two_cam.csv"; - - await calculate(); - - expect(global.fetch).toHaveBeenCalledWith("/api/latest-snapshot"); - - //const logValue = document.getElementById("analysis-log").value; - //console.log("Log Value:", logValue); - //expect(logValue).toMatch(/Starte Berechnung/); - //expect(logValue).toMatch(/CSV-Daten geladen/); - }); - - - - test("Snapshot 1775053356508 wird korrekt geladen. Hatte in der Vergangenheit Fehler", async () => { - - snapshotFile = "snapshot_video0_1775053356508_two_cam.csv"; - - await calculate(); - - expect(global.fetch).toHaveBeenCalledWith("/api/latest-snapshot"); - - //expect(logValue).toMatch(/Starte Berechnung/); - //expect(logValue).toMatch(/CSV-Daten geladen/); - }); - - test("Snapshot video0_1775055007798 wird korrekt geladen. Hatte in der Vergangenheit Fehler", async () => { - - snapshotFile = "snapshot_video0_1775055007798_two_cam.csv"; - - var result =await calculate(); - - expect(global.fetch).toHaveBeenCalledWith("/api/latest-snapshot"); - - var valueDeg = result.features["forearm.angleZ"].valueDeg - - // expect(valueDeg).toBeCloseTo(7.4595, 1); // Erwartet ca. -137.28° mit 1 Dezimalstelle Genauigkeit - - //expect(logValue).toMatch(/Starte Berechnung/); - //expect(logValue).toMatch(/CSV-Daten geladen/); - }); - - -}); \ No newline at end of file diff --git a/test/calculateAction.03_EasyCSV.test.js b/test/calculateAction.03_EasyCSV.test.js deleted file mode 100644 index 64fa65e..0000000 --- a/test/calculateAction.03_EasyCSV.test.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @jest-environment jsdom - */ - -const fs = require("fs"); -const path = require("path"); - -describe("calculate() Snapshot Tests", () => { - - let calculate; - let snapshotFile; - - beforeEach(() => { - - // Standard: irgendeine Datei setzen, falls Test nichts setzt - snapshotFile = "snapshot_default.csv"; - - // DOM erzeugen - document.body.innerHTML = ` - - `; - - // Fetch dynamisch mocken - global.fetch = jest.fn(async () => { - - const csvPath = path.join(__dirname, "snapshots", snapshotFile); - const csvContent = fs.readFileSync(csvPath, "utf8"); - - return { - ok: true, - headers: { get: () => "text/csv" }, - text: async () => csvContent - }; - }); - - // Modul erst JETZT laden (DOM existiert) - ({ calculate } = require("../public/calculateActions.js")); - }); - - // ✅ Beispiel 1: Die Datei aus deiner Frage - test("Snapshot 1775406055428 wird korrekt geladen", async () => { - - snapshotFile = "snapshot_video0_1775406055428_two_cam.csv"; - - var result = await calculate(); - - expect(global.fetch).toHaveBeenCalledWith("/api/latest-snapshot"); - - //console.log("Berechnungsergebnis:", result.features["forearm.angleZ"].valueDeg); - const r = result.features["forearm.angleZ"].valueDeg - expect(r).toBeCloseTo(131.3436, 1); - }); -}); \ No newline at end of file diff --git a/test/calculateAction.03_ellbowRotation.test.js b/test/calculateAction.03_ellbowRotation.test.js deleted file mode 100644 index 29e7557..0000000 --- a/test/calculateAction.03_ellbowRotation.test.js +++ /dev/null @@ -1,265 +0,0 @@ -/** - * @jest-environment jsdom - */ - -const fs = require("fs"); -const path = require("path"); - -describe("calculate() row223 Ellbow-Rotation Tests", () => { - - let calculate; - - beforeEach(() => { - // DOM erzeugen - document.body.innerHTML = ` - - `; - - // Fetch mocken - wird pro Test konfiguriert - global.fetch = jest.fn(); - - // Modul erst JETZT laden (DOM existiert) - ({ calculate } = require("../public/calculateActions.js")); - }); - - /** - * Hilfsfunktion: Erstellt ein CSV mit definierten row223.x_mm und x226 Wert - * @param {number} row223_x_mm - x_mm Wert für row223 (id=223) - * @param {number} x226_base - Basis-x_mm Wert für x226-Punkt (wird durch mehrere Punkte erreicht) - */ - function createTestCSV(row223_x_mm, x226_base) { - const csvContent = `id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,seen_by -222,${x226_base},120,65,0,0,3 -226,${x226_base},115,61,0,0,3 -229,${x226_base - 90},110,55,0,0,3 -223,${row223_x_mm},125,62,0,0,3 -`; - return csvContent; - } - - /** - * Berechnet den erwarteten Winkel basierend auf Formel aus calculateActions.js - * angleRad = Math.asin(dx / 35) - * angleDeg = 90 - angleRad * 180 / Math.PI - */ - function calculateExpectedAngle(row223_x_mm, x226) { - const dx = row223_x_mm - x226; - if (Math.abs(dx) > 35) { - return null; // Math.asin() erlaubt nur Werte zwischen -1 und 1 - } - const angleRad = Math.asin(dx / 35); - const angleDeg = 90 - angleRad * 180 / Math.PI; - return { angleRad, angleDeg, dx }; - } - - // Test 1: row223 mit x_mm = x226 (dx = 0, erwarteter Winkel = 90°) - test("row223.x_mm = x226 sollte Winkel von 90° ergeben", async () => { - const x226_base = 100; - const row223_x_mm = x226_base; // dx = 0 - const csvContent = createTestCSV(row223_x_mm, x226_base); - - global.fetch.mockResolvedValueOnce({ - ok: true, - headers: { get: () => "text/csv" }, - text: async () => csvContent - }); - - const result = await calculate(); - - // xCount sollte > 2 sein (wir haben 4 Zeilen) - expect(result.status).toBe("ok"); - - // Überprüfe, ob die elbowRotationAFromX223 Berechnung vorhanden ist - const elbowRotationCalc = result.calculations.find( - c => c.type === "elbowRotationAFromX223" - ); - - expect(elbowRotationCalc).toBeDefined(); - expect(elbowRotationCalc.output.angleDeg).toBeCloseTo(90, 1); - expect(elbowRotationCalc.output.angleRad).toBeCloseTo(0, 4); - }); - - // Test 2: row223 mit x_mm = x226 + 17.5 (dx = 17.5, erwarteter Winkel = 45°) - test("row223.x_mm = x226 + 17.5 sollte Winkel von 45° ergeben", async () => { - const x226_base = 100; - const row223_x_mm = x226_base + 17.5; // dx = 17.5 - const csvContent = createTestCSV(row223_x_mm, x226_base); - - global.fetch.mockResolvedValueOnce({ - ok: true, - headers: { get: () => "text/csv" }, - text: async () => csvContent - }); - - const result = await calculate(); - const expected = calculateExpectedAngle(row223_x_mm, x226_base); - - expect(result.status).toBe("ok"); - - const elbowRotationCalc = result.calculations.find( - c => c.type === "elbowRotationAFromX223" - ); - - expect(elbowRotationCalc).toBeDefined(); - expect(elbowRotationCalc.output.angleDeg).toBeCloseTo(expected.angleDeg, 1); - expect(elbowRotationCalc.output.angleRad).toBeCloseTo(expected.angleRad, 3); - }); - - // Test 3: row223 mit x_mm = x226 + 35 (dx = 35, erwarteter Winkel = 0°) - test("row223.x_mm = x226 + 35 sollte Winkel von 0° ergeben", async () => { - const x226_base = 100; - const row223_x_mm = x226_base + 35; // dx = 35, asin(1) = π/2 - const csvContent = createTestCSV(row223_x_mm, x226_base); - - global.fetch.mockResolvedValueOnce({ - ok: true, - headers: { get: () => "text/csv" }, - text: async () => csvContent - }); - - const result = await calculate(); - const expected = calculateExpectedAngle(row223_x_mm, x226_base); - - expect(result.status).toBe("ok"); - - const elbowRotationCalc = result.calculations.find( - c => c.type === "elbowRotationAFromX223" - ); - - expect(elbowRotationCalc).toBeDefined(); - expect(elbowRotationCalc.output.angleDeg).toBeCloseTo(expected.angleDeg, 1); - expect(elbowRotationCalc.output.angleRad).toBeCloseTo(expected.angleRad, 3); - }); - - // Test 4: row223 mit negativem dx (x_mm = x226 - 17.5, erwarteter Winkel = 135°) - test("row223.x_mm = x226 - 17.5 sollte Winkel von 135° ergeben", async () => { - const x226_base = 100; - const row223_x_mm = x226_base - 17.5; // dx = -17.5 - const csvContent = createTestCSV(row223_x_mm, x226_base); - - global.fetch.mockResolvedValueOnce({ - ok: true, - headers: { get: () => "text/csv" }, - text: async () => csvContent - }); - - const result = await calculate(); - const expected = calculateExpectedAngle(row223_x_mm, x226_base); - - expect(result.status).toBe("ok"); - - const elbowRotationCalc = result.calculations.find( - c => c.type === "elbowRotationAFromX223" - ); - - expect(elbowRotationCalc).toBeDefined(); - expect(elbowRotationCalc.output.angleDeg).toBeCloseTo(expected.angleDeg, 1); - expect(elbowRotationCalc.output.angleRad).toBeCloseTo(expected.angleRad, 3); - }); - - // Test 5: row223 mit x_mm = x226 - 35 (dx = -35, erwarteter Winkel = 180°) - test("row223.x_mm = x226 - 35 sollte Winkel von 180° ergeben", async () => { - const x226_base = 100; - const row223_x_mm = x226_base - 35; // dx = -35, asin(-1) = -π/2 - const csvContent = createTestCSV(row223_x_mm, x226_base); - - global.fetch.mockResolvedValueOnce({ - ok: true, - headers: { get: () => "text/csv" }, - text: async () => csvContent - }); - - const result = await calculate(); - const expected = calculateExpectedAngle(row223_x_mm, x226_base); - - expect(result.status).toBe("ok"); - - const elbowRotationCalc = result.calculations.find( - c => c.type === "elbowRotationAFromX223" - ); - - expect(elbowRotationCalc).toBeDefined(); - expect(elbowRotationCalc.output.angleDeg).toBeCloseTo(expected.angleDeg, 1); - expect(elbowRotationCalc.output.angleRad).toBeCloseTo(expected.angleRad, 3); - }); - - // Test 6: xCount > 2 Bedingung wird erfüllt - test("xCount muss > 2 sein, damit elbowRotationAFromX223 berechnet wird", async () => { - const x226_base = 100; - const row223_x_mm = x226_base + 10; - const csvContent = createTestCSV(row223_x_mm, x226_base); - - global.fetch.mockResolvedValueOnce({ - ok: true, - headers: { get: () => "text/csv" }, - text: async () => csvContent - }); - - const result = await calculate(); - - // Überprüfe, dass die Berechnung stattgefunden hat - const elbowXEstimate = result.calculations.find( - c => c.type === "elbowXEstimate" - ); - const elbowRotationCalc = result.calculations.find( - c => c.type === "elbowRotationAFromX223" - ); - - expect(elbowXEstimate).toBeDefined(); // xCount wurde berechnet - expect(elbowRotationCalc).toBeDefined(); // xCount > 2 und row223 existiert - }); - - // Test 7: Parametrisierter Test mit verschiedenen Winkeln - test.each([ - { dx: 0, expectedDeg: 90, desc: "dx=0" }, - { dx: 5, expectedDeg: 90 - Math.asin(5 / 35) * 180 / Math.PI, desc: "dx=5" }, - { dx: 10, expectedDeg: 90 - Math.asin(10 / 35) * 180 / Math.PI, desc: "dx=10" }, - { dx: -5, expectedDeg: 90 - Math.asin(-5 / 35) * 180 / Math.PI, desc: "dx=-5" }, - { dx: -10, expectedDeg: 90 - Math.asin(-10 / 35) * 180 / Math.PI, desc: "dx=-10" }, - ])( - "Verschiedene dx Werte sollten korrekte Winkel ergeben ($desc)", - async ({ dx, expectedDeg }) => { - const x226_base = 100; - const row223_x_mm = x226_base + dx; - const csvContent = createTestCSV(row223_x_mm, x226_base); - - global.fetch.mockResolvedValueOnce({ - ok: true, - headers: { get: () => "text/csv" }, - text: async () => csvContent - }); - - const result = await calculate(); - - const elbowRotationCalc = result.calculations.find( - c => c.type === "elbowRotationAFromX223" - ); - - expect(elbowRotationCalc).toBeDefined(); - expect(elbowRotationCalc.output.angleDeg).toBeCloseTo(expectedDeg, 1); - } - ); - - // Test 8: row223 Input wird korrekt in Output dokumentiert - test("row223.x_mm wird korrekt in Berechnung dokumentiert", async () => { - const x226_base = 100; - const row223_x_mm = 115; - const csvContent = createTestCSV(row223_x_mm, x226_base); - - global.fetch.mockResolvedValueOnce({ - ok: true, - headers: { get: () => "text/csv" }, - text: async () => csvContent - }); - - const result = await calculate(); - - const elbowRotationCalc = result.calculations.find( - c => c.type === "elbowRotationAFromX223" - ); - - expect(elbowRotationCalc).toBeDefined(); - expect(elbowRotationCalc.input.x223).toBe(row223_x_mm); - expect(elbowRotationCalc.input.x226).toBe(x226_base); - }); -});