Skip to content
Snippets Groups Projects
Select Git revision
  • d17a9b95f22a9826b13ce706b689a63a19ca3867
  • main default protected
  • k8s
  • msa-part-4
  • msa-part-3
  • msa-part-2
  • msa-part-1
7 results

campaign.go

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    Unittest.py 19.00 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):
            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
            self.mars = Mars(self.plateau) # Initialisiere Mars mit Plateau
            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, 4))
            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, 1))
        
        def test_backward_after_right_turn(self):
            self.mission_control.rover.Position = (4, 4)
            self.mission_control.send_commands("RB")
            self.assertEqual(self.mission_control.rover.get_position(), (3, 3))
            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, 3))
            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, 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()