-
Muhamed (aider) authored
```json { "type": "fix", "description": "Fehler in der Authentifizierung behoben" } ```
Muhamed (aider) authored```json { "type": "fix", "description": "Fehler in der Authentifizierung behoben" } ```
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
Unittest.py 19.15 KiB
import sys
import os
#from Pyscript import MissionControl, Plateau, Rover, Mars
from plateau import Plateau
from mars import Mars
from rover import Rover
from mission_control import MissionControl
from telescope import Telescope
from map import Map
import unittest
# ---US01: Als Mars Mission Control möchte ich den Mars Rover steuern, um die grundlegende Interaktion und Kontrolle über den Rover zu ermöglichen.
# TC01.01: Gültiger Vorwärtsbefehl: Überprüft, ob der Rover sich korrekt um ein Feld vorwärts bewegt, wenn der Befehl "F" empfangen wird.
# TC01.02: Mehrfache gültige Vorwärtsbefehle: Überprüft, ob der Rover sich korrekt um mehrere Felder vorwärts bewegt, wenn eine Zeichenkette mit mehreren "F" Befehlen empfangen wird.
# TC01.03: Vorwärtsbefehl bei Drehung: Überprüft, ob der Rover sich nach einer Drehung korrekt vorwärts bewegt.
# TC01.04: Ungültiger Befehl in der Zeichenkette: Überprüft, wie der Rover mit einer Zeichenkette umgeht, die einen ungültigen Befehl enthält (ungültige Befehle werden ignoriert).
# TC01.05: Leerer Befehl: Überprüft, was passiert, wenn ein leerer Befehl gesendet wird (Rover bleibt unverändert).
class TestRoverMovment(unittest.TestCase):
def setUp(self):
# Erstelle ein neues Plateau für jeden Test
self.plateau = Plateau(5, 5) # Initialisiere Plateau
self.plateau.add_obstacle(1,1)
self.plateau.add_obstacle(3,3)
self.plateau.move(0, 0) # Setze die Startposition des Plateaus
self.telescope = Telescope(self.plateau) # Initialisiere Teleskop mit Plateau
# Aktualisiere die existierende Mars-Instanz mit dem neuen Plateau
self.mars = Mars(self.plateau) # Mars ist ein Singleton, wird mit neuem Plateau aktualisiert
self.rover = Rover(0, 0, 0) # Initialisiere Rover
self.rover.set_plateau_size(5, 5) # Setze die Größe des Plateaus für den Rover
self.mission_control=MissionControl(rover=self.rover,plateau_size_x=5, plateau_size_y=5) # Initialisiere MissionControl mit Rover und Plateau
self.telescope= Telescope(self.plateau)
self.map = Map()
#self.mission_control = MissionControl(5, 5, set()) # Initialisiere MissionControl
#self.plateau = Plateau(5, 5) # Initialisiere Plateau
#self.rover = Rover(0, 0, 0) # Initialisiere Rover
#self.mission_control=MissionControl(rover=self.rover, plateau_size_x=5, plateau_size_y=5) # Initialisiere MissionControl mit Rover und Plateau
#self.mission_control.rover.Position = (0, 0) # Setze die Startposition des Rovers
#self.mission_control.rover.heading = 0 # Setze die Startausrichtung des Rovers
#self.mission_control.rover.path = [(0, 0)]
#self.mission_control.rover_heading_path = [0]
#self.mission_control.mars.plateau.obstacles = set() # Initialisiere Hindernisse (falls benötigt)
def test_move_forwward_once(self):
self.mission_control.send_commands("F")
self.assertEqual(self.mission_control.rover.get_position(),(0, 1))
self.assertEqual(self.mission_control.rover.get_heading(),0)
def test_move_forwward_multiple_times(self):
self.mission_control.send_commands("FFFF")
self.assertEqual(self.mission_control.rover.get_position(),(0, 1))
self.assertEqual(self.mission_control.rover.get_heading(),0)
def test_move_forward_after_right_turn(self):
self.mission_control.send_commands("RF")
self.assertEqual(self.mission_control.rover.get_position(),(1, 1))
self.assertEqual(self.mission_control.rover.get_heading(),45)
def test_move_forward_after_left_turn(self):
self.mission_control.rover.Position = (1, 1)
self.mission_control.send_commands("LF")
self.assertEqual(self.mission_control.rover.get_position(),(0, 2))
self.assertEqual(self.mission_control.rover.get_heading(),315)
def test_ignore_invalid_command(self):
self.mission_control.send_commands("FZ")
self.assertEqual(self.mission_control.rover.get_position(),(0, 1))
self.assertEqual(self.mission_control.rover.get_heading(),0)
def test_empty_command(self):
self.mission_control.send_commands("")
self.assertEqual(self.mission_control.rover.get_position(),(0, 0))
self.assertEqual(self.mission_control.rover.get_heading(),0)
# ---US02: Als Mars Mission Control möchte ich dem Rover einen Befehl zum Rückwärtsfahren ('B') geben können, um dem Rover zu ermöglichen, sich von Hindernissen zu entfernen oder präzisere Manöver durchzuführen.
# TC02.01: Gültiger Rückwärtsbefehl: Überprüft, ob der Rover sich korrekt um ein Feld zurückbewegt, wenn der Befehl "B" empfangen wird.
# TC02.02: Mehrfache gültige Rückwärtsbefehle: Überprüft, ob der Rover sich korrekt um mehrere Felder rückwärts bewegt, wenn eine Zeichenkette mit mehreren "B" Befehlen empfangen wird.
# TC02.03: Rückwärtsbefehl nach Drehung: Überprüft, ob der Rover sich nach einer Drehung korrekt rückwärts bewegt.
# TC02.04: Rückwärts- und Vorwärtsbefehle kombinieren: Überprüft, ob Vorwärts- und Rückwärtsbefehle in einer Befehlskette korrekt verarbeitet werden.
def test_backward_from_y1_should_go_to_y0(self):
self.mission_control.rover.Position = (0, 1)
self.mission_control.send_commands("B")
self.assertEqual(self.mission_control.rover.get_position(), (0, 0))
def tests_backward_multiple_times(self):
self.mission_control.rover.Position = (0,4)
self.mission_control.send_commands("BBB")
self.assertEqual(self.mission_control.rover.get_position(), (0, 3))
def test_backward_after_right_turn(self):
self.mission_control.rover.Position = (2, 2)
self.mission_control.send_commands("RB")
self.assertEqual(self.mission_control.rover.get_position(), (1, 1))
self.assertEqual(self.mission_control.rover.get_heading(), 45)
def test_backward_forward(self):
self.mission_control.rover.Position = (0, 0)
self.mission_control.send_commands("FB")
self.assertEqual(self.mission_control.rover.get_position(), (0, 0))
self.assertEqual(self.mission_control.rover.get_heading(), 0)
# ---US03: Als Mars Mission Control möchte ich dem Rover einen Befehl zum Linksdrehen ('L') geben können, um die Ausrichtung des Rovers anzupassen und ihn in eine neue Richtung zu lenken.
# TC03.01: Gültiger Linksdrehungsbefehl: Überprüft, ob der Rover sich um 45 Grad nach links dreht, wenn der Befehl "L" empfangen wird.
# TC03.02: Mehrfache gültige Linksdrehungsbefehle: Überprüft, ob der Rover sich korrekt um mehrere 45-Grad-Schritte nach links dreht, wenn eine Zeichenkette mit mehreren "L" Befehlen empfangen wird.
# TC03.03: Linksdrehung und Bewegung kombinieren: Überprüft, ob Linksdrehungen mit Bewegungsbefehlen (F, B) korrekt kombiniert werden können.
# ---US04: Als Mars Mission Control möchte ich dem Rover einen Befehl zum Rechtsdrehen ('R') geben können, um die Ausrichtung des Rovers anzupassen und ihn in eine neue Richtung zu lenken.
# TC04.01: Gültiger Rechtsdrehungsbefehl: Überprüft, ob der Rover sich um 45 Grad nach rechts dreht, wenn der Befehl "R" empfangen wird.
# TC04.02: Mehrfache gültige Rechtsdrehungsbefehle: Überprüft, ob der Rover sich korrekt um mehrere 45-Grad-Schritte nach rechts dreht, wenn eine Zeichenkette mit mehreren "R" Befehlen empfangen wird.
# TC04.03: Rechtsdrehung und Bewegung kombinieren: Überprüft, ob Rechtsdrehungen mit Bewegungsbefehlen (F, B) korrekt kombiniert werden können.
def test_turn_left_once(self):
self.mission_control.send_commands("L")
self.assertEqual(self.mission_control.rover.get_heading(), 315)
def test_turn_left_multiple_times(self):
self.mission_control.send_commands("LLL")
self.assertEqual(self.mission_control.rover.get_heading(), 225)
def test_turn_left_and_move(self):
self.mission_control.rover.Position = (2, 2)
self.mission_control.send_commands("LB")
self.assertEqual(self.mission_control.rover.get_position(), (3, 1))
self.assertEqual(self.mission_control.rover.get_heading(), 315)
def test_turn_right_once(self):
self.mission_control.send_commands("R")
self.assertEqual(self.mission_control.rover.get_heading(), 45)
def test_turn_right_multiple_times(self):
self.mission_control.send_commands("RRR")
self.assertEqual(self.mission_control.rover.get_heading(), 135)
def test_turn_right_and_move(self):
self.mission_control.rover.Position = (2, 2)
self.mission_control.send_commands("RF")
self.assertEqual(self.mission_control.rover.get_position(), (3, 3))
self.assertEqual(self.mission_control.rover.get_heading(), 45)
# ---US05: Als Mars Mission Control möchte ich dem Rover eine Zeichenkette mit mehreren Befehlen senden können (z.B. "FFRBLF"), um komplexe Bewegungsabläufe und Manöver effizient in einer einzigen Anweisung zu übermitteln.
# TC05.01: Komplexe Befehlssequenz: Überprüft, ob eine lange und komplexe Zeichenkette mit verschiedenen Befehlen korrekt ausgeführt wird.
# TC05.02: Wiederholte Befehle: Überprüft, ob sich wiederholte Befehle in einer Sequenz korrekt ausführen lassen.
# TC05.03: Leere Befehlssequenz: Überprüft, was passiert, wenn eine leere Befehlssequenz gesendet wird.
# TC05.04: Befehlssequenz mit ungültigen Befehlen: Überprüft, ob ungültige Befehle in einer Befehlssequenz ignoriert werden und die gültigen Befehle ausgeführt werden.
def test_complex_command_sequence(self):
self.mission_control.send_commands("FFRBLF")
self.assertEqual(self.mission_control.rover.get_position(), (0, 2))
self.assertEqual(self.mission_control.rover.get_heading(), 45)
def test_repeated_commands(self):
self.mission_control.send_commands("FFFRRR")
self.assertEqual(self.mission_control.rover.get_position(), (0, 1))
self.assertEqual(self.mission_control.rover.get_heading(), 135)
def test_empty_command_sequence(self):
self.mission_control.send_commands("")
self.assertEqual(self.mission_control.rover.get_position(), (0, 0))
self.assertEqual(self.mission_control.rover.get_heading(), 0)
def test_command_sequence_with_invalid_commands(self):
self.mission_control.send_commands("FFZBLF")
self.assertEqual(self.mission_control.rover.get_position(), (0, 1))
self.assertEqual(self.mission_control.rover.get_heading(), 315)
# ---US06: Als Mars Mission Control möchte ich, dass der Rover vor einem Bewegungsschritt (vorwärts/rückwärts) prüft, ob sich ein Hindernis im Zielquadrat befindet, um Kollisionen mit unvorhergesehenen Objekten auf der Marsoberfläche zu vermeiden und die Sicherheit des Rovers zu gewährleisten.
# TC06.01: Hindernis bei Vorwärtsbewegung: Überprüft, ob der Rover die Vorwärtsbewegung stoppt, wenn ein Hindernis im Zielquadrat ist.
# TC06.02: Hindernis bei Rückwärtsbewegung: Überprüft, ob der Rover die Rückwärtsbewegung stoppt, wenn ein Hindernis im Zielquadrat ist.
# TC06.03: Hindernis nach Drehung: Überprüft, ob die Vorwärtsbewegung nach einer Drehung stoppt, wenn ein Hindernis im Zielquadrat ist.
# TC06.04: Mehrere Befehle mit Hindernis: Überprüft, ob die gesamte Befehlssequenz abbricht, wenn ein Hindernis auftritt.
# TC06.05: Kein Hindernis: Überprüft, ob die Bewegung fortgesetzt wird, wenn kein Hindernis vorhanden ist.
def test_obstacle_before_move_forward(self):
self.mission_control.rover.Position = (0, 0)
self.mission_control.mars.plateau.obstacles = [(0, 1)]
self.mission_control.send_commands("F")
self.assertEqual(self.mission_control.rover.get_position(), (0, 0))
def test_obstacle_before_move_backward(self):
self.mission_control.rover.Position = (0, 2)
self.mission_control.mars.plateau.obstacles = [(0, 1)]
self.mission_control.send_commands("B")
self.assertEqual(self.mission_control.rover.get_position(), (0, 2))
def test_obstacle_after_turn(self):
self.mission_control.rover.Position = (0, 0)
self.mission_control.mars.plateau.obstacles = [(1, 1)]
self.mission_control.send_commands("RFF")
self.assertEqual(self.mission_control.rover.get_position(), (0, 0))
def test_obstacle_in_command_sequence(self):
self.mission_control.rover.Position = (0, 0)
self.mission_control.mars.plateau.obstacles = [(0, 2)]
self.mission_control.send_commands("FFRBLF")
self.assertEqual(self.mission_control.rover.get_position(), (0, 1))
def test_no_obstacle(self):
self.mission_control.rover.Position = (0, 1)
self.mission_control.mars.plateau.obstacles = []
self.mission_control.send_commands("F")
self.assertEqual(self.mission_control.rover.get_position(), (0, 2))
# ---US08: Als Mars Mission Control möchte ich, dass der Rover vor einem Bewegungsschritt (vorwärts/rückwärts) prüft, ob das Zielquadrat außerhalb der Grenzen des Plateaus liegt, um zu verhindern, dass der Rover das zugewiesene Operationsgebiet verlässt und möglicherweise verloren geht oder beschädigt wird.
# TC08.01: Vorwärtsbewegung über den Rand: Überprüft, ob der Rover die Vorwärtsbewegung stoppt, wenn sie über den Rand des Plateaus hinausführen würde.
# TC08.02: Rückwärtsbewegung über den Rand: Überprüft, ob der Rover die Rückwärtsbewegung stoppt, wenn sie über den Rand des Plateaus hinausführen würde.
# TC08.03: Bewegung nach Drehung über den Rand: Überprüft, ob die Bewegung nach einer Drehung stoppt, wenn sie über den Rand des Plateaus hinausführen würde.
# TC08.04: Mehrere Befehle über den Rand: Überprüft, ob die gesamte Befehlssequenz abbricht, wenn der Rand erreicht wird.
# TC08.05: Bewegung am Rand: Überprüft, ob die Bewegung am Rand des Plateaus erlaubt ist.
def test_move_forward_out_of_bounds(self):
self.mission_control.rover.Position = (4, 4)
self.mission_control.send_commands("F")
self.assertEqual(self.mission_control.rover.get_position(), (4, 4))
def test_move_backward_out_of_bounds(self):
self.mission_control.rover.Position = (0, 0)
self.mission_control.send_commands("B")
self.assertEqual(self.mission_control.rover.get_position(), (0, 0))
def test_move_after_turn_out_of_bounds(self):
self.mission_control.rover.Position = (4, 4)
self.mission_control.send_commands("RFF")
self.assertEqual(self.mission_control.rover.get_position(), (4, 4))
def test_command_sequence_out_of_bounds(self):
self.mission_control.rover.Position = (4, 4)
self.mission_control.send_commands("FFRBLF")
self.assertEqual(self.mission_control.rover.get_position(), (4, 4))
def test_move_at_edge(self):
self.mission_control.rover.Position = (4, 4)
self.mission_control.send_commands("L")
self.assertEqual(self.mission_control.rover.get_position(), (4, 4))
self.assertEqual(self.mission_control.rover.get_heading(), 315)
# ---US10: Als Mars Mission Control möchte ich vom Rover eine Rückmeldung erhalten, welche Befehle einer Sequenz erfolgreich ausgeführt wurden, bevor ein Stopp erfolgte, um den Fortschritt der Rover-Mission zu verfolgen und zu verstehen, welche Aktionen erfolgreich waren und wo Probleme aufgetreten sind.
# TC10.01: Rückmeldung bei erfolgreicher Ausführung: Überprüft, ob der Rover eine Rückmeldung gibt, wenn alle Befehle erfolgreich ausgeführt wurden.
# TC10.02: Rückmeldung bei Stopp wegen Hindernis: Überprüft, ob der Rover eine Rückmeldung gibt, welche Befehle vor dem Stopp wegen eines Hindernisses ausgeführt wurden.
# TC10.03: Rückmeldung bei Stopp wegen Rand: Überprüft, ob der Rover eine Rückmeldung gibt, welche Befehle vor dem Stopp wegen des Plateaurandes ausgeführt wurden.
# TC10.04: Rückmeldung bei leerer Befehlssequenz: Überprüft, ob der Rover eine leere Rückmeldung gibt, wenn die Befehlssequenz leer ist.
# TC10.05: Rückmeldung bei ungültigen Befehlen: Überprüft, wie ungültige Befehle in der Rückmeldung behandelt werden (z.B. ausgelassen oder markiert).
def test_feedback_successful_execution(self):
self.mission_control.send_commands("FF")
feedback = self.mission_control.get_feedback()
print(feedback)
self.assertIn("Erfolgreich ausgeführte Befehle: F", feedback)
def test_feedback_stop_due_to_obstacle(self):
self.mission_control.mars.plateau.obstacles = [(0, 2)]
self.mission_control.send_commands("FFR")
feedback = self.mission_control.get_feedback()
print(feedback)
self.assertIn("Erfolgreich ausgeführte Befehle: F", feedback)
def test_feedback_stop_due_to_edge(self):
self.mission_control.rover.Position = (3, 3)
self.mission_control.send_commands("FF")
feedback = self.mission_control.get_feedback()
print(feedback)
self.assertIn("Erfolgreich ausgeführte Befehle: F", feedback)
def test_feedback_empty_command_sequence(self):
self.mission_control.send_commands("")
feedback = self.mission_control.get_feedback()
print(feedback)
self.assertIn("Keine Befehle erfolgreich ausgeführt", feedback)
def test_feedback_invalid_commands(self):
self.mission_control.send_commands("FZB")
feedback = self.mission_control.get_feedback()
print(feedback)
self.assertIn("Erfolgreich ausgeführte Befehle: F, B", feedback)
# TC12.01: Überprüfen, ob das Plateau-Objekt bei der Initialisierung korrekt gespeichert wird.
# TC12.02: Überprüfen, ob die observe-Methode den Inhalt des Grids vom Plateau zurückgibt.
# TC12.03: Überprüfen, ob die observe-Methode eine Kopie des Grids zurückgibt (nicht das Originalobjekt).
# TC12.04: Überprüfen, ob observe eine leere Liste zurückgibt, wenn das Grid fehlt oder None ist.
def test_observe_plateau_initialization(self):
real_plateau = Plateau(5, 5)
telescope = Telescope(real_plateau)
self.assertEqual(telescope.plateau, real_plateau)
print("Test observe_plateau_initialization erfolgreich!")
def test_observe_returns_grid(self):
real_plateau = Plateau(3, 3)
real_plateau.add_obstacle(1, 1)
real_plateau.move(0, 0)
expected_grid = [['R', '.', '.'], ['.', '#', '.'], ['.', '.', '.']]
telescope = Telescope(real_plateau)
observed_grid = telescope.observe()
self.assertEqual(observed_grid, expected_grid)
print("Test observe_returns_grid erfolgreich!")
def test_observe_returns_copy_of_grid(self):
real_plateau = Plateau(3, 3)
real_plateau.add_obstacle(1, 1)
real_plateau.move(0, 0)
telescope = Telescope(real_plateau)
observed_grid = telescope.observe()
observed_grid[0][0] = '.'
self.assertEqual(observed_grid[0][0], real_plateau.grid[0][0])
print("Test observe_returns_copy_of_grid erfolgreich!")
def test_observe_returns_empty_list(self):
real_plateau = Plateau(3, 3)
telescope = Telescope(real_plateau)
telescope.plateau.grid = None # Setze das Grid auf None
observed_grid = telescope.observe()
self.assertEqual(observed_grid, [])
print("Test observe_returns_empty_list erfolgreich!")
if __name__ == '__main__':
unittest.main()