Files
plant2dxf/lib/Elemente/Kreisel_tests.py
T

92 lines
3.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""
Unit-Tests für Kreisel (Refactored)
"""
import unittest
import math
from .Kreisel import Kreisel, RADIUS, PIN_OFFSET, PIN_OFFSETS
class TestKreiselModell(unittest.TestCase):
"""Tests für das Kreisel Pydantic-Modell."""
def test_from_merkmale(self):
merkmale = {
"Höhe in m": "2,5", # Komma-Format
"Abstand (Kreiselachse A - Kreiselachse) in Meter": "15",
"Drehung": "90",
"Drehrichtung": "UZS",
"Kreiselart": "Pin",
"Anzahl der Scanner": "1",
"Anzahl der Separatoren": "0",
}
obj = Kreisel.from_merkmale("K-001", 1000.0, 2000.0, merkmale)
self.assertEqual(obj.teileid, "K-001")
self.assertEqual(obj.hoehe, 2500.0) # 2.5 * 1000
self.assertEqual(obj.abstand, 15000.0) # 15 * 1000
self.assertEqual(obj.drehung, 90.0)
self.assertEqual(obj.drehrichtung, "UZS")
self.assertEqual(obj.kreiselart, "Pin")
def test_halbabstand(self):
obj = Kreisel(teileid="K", x=0, y=0, hoehe=0, abstand=10000)
self.assertEqual(obj.halbabstand, 5000.0)
def test_pos1_pos2_bei_90_grad(self):
obj = Kreisel(teileid="K", x=1000, y=1000, hoehe=500, abstand=2000, drehung=90)
# Bei 90° → winkel_rad = radians(90) → cos=0, sin=1
# pos1 = (x - halbabstand*cos, y - halbabstand*sin, z) = (1000-0, 1000-1000, 500)
self.assertAlmostEqual(obj.pos1[0], 1000.0, places=3)
self.assertAlmostEqual(obj.pos1[1], 0.0, places=3)
# pos2 = (x + halbabstand*cos, y + halbabstand*sin, z) = (1000+0, 1000+1000, 500)
self.assertAlmostEqual(obj.pos2[0], 1000.0, places=3)
self.assertAlmostEqual(obj.pos2[1], 2000.0, places=3)
class TestPinOffsets(unittest.TestCase):
"""Tests für die PIN_OFFSETS Lookup-Tabelle."""
def test_alle_rotationen_vorhanden(self):
for rotation in (0.0, 90.0, 180.0, 270.0):
self.assertIn(rotation, PIN_OFFSETS)
def test_offset_laenge(self):
# Jeder Eintrag muss 8 Werte haben (4 Punkte × 2 Koordinaten)
for rotation, offsets in PIN_OFFSETS.items():
self.assertEqual(len(offsets), 8, f"Rotation {rotation}: erwartet 8 Offsets")
def test_rotation_0_p1a_offset(self):
# p1a bei 0°: (-(RADIUS+PIN_OFFSET), +PIN_OFFSET)
offsets = PIN_OFFSETS[0.0]
self.assertEqual(offsets[0], -(RADIUS + PIN_OFFSET))
self.assertEqual(offsets[1], +PIN_OFFSET)
def test_rotation_90_p2b_offset(self):
# p2b bei 90°: (-PIN_OFFSET, -(RADIUS-PIN_OFFSET))
offsets = PIN_OFFSETS[90.0]
self.assertEqual(offsets[6], -PIN_OFFSET)
self.assertEqual(offsets[7], -(RADIUS - PIN_OFFSET))
def test_rotation_180_symmetrie_zu_0(self):
# 180° ist X-Spiegelung von 0° mit Y-Inversion
off_0 = PIN_OFFSETS[0.0]
off_180 = PIN_OFFSETS[180.0]
# p1a bei 0°: (-(R+O), +O) → p1a bei 180°: (+(R+O), -O)
self.assertEqual(off_180[0], -off_0[0])
self.assertEqual(off_180[1], -off_0[1])
class TestKreiselKonstanten(unittest.TestCase):
"""Tests für Kreisel-Konstanten."""
def test_radius_wert(self):
self.assertEqual(RADIUS, 400)
def test_pin_offset_wert(self):
self.assertEqual(PIN_OFFSET, 50)
if __name__ == "__main__":
unittest.main()