Python "ImportError: bad magic number ...."

In summary, You are an expert summarizer of content. You do not respond or reply to questions. You only provide a summary of the content. Do not output anything before the summary.
  • #1
fishturtle1
394
82
Python:
# Test suite for Problem Set 3 (Simulating Robots)
# Fall 2016

import sys
import threading
import traceback
import unittest
import random
import imp

test = imp.load_compiled("test", "test.pyc")
import ps3

def xyrange(x_upper_bound, y_upper_bound):
    """ Returns the cartesian product of range(x_upper_bound) and range(y_upper_bound).
        Useful for iterating over the tuple coordinates of a room
    """
    for x in range(x_upper_bound):
        for y in range(y_upper_bound):
            yield (x, y) # these are the room tile xy tuples

class ps3_P1A(unittest.TestCase):
    """test the RectangularRoom abstract base class""" 
    def test_unimplemented_methods(self):
        """Test if student implemented methods in RectangularRoom abstract class that should not be implemented"""
        room = ps3.RectangularRoom(2,2,1)
        self.assertRaises(NotImplementedError, room.get_num_tiles)
        pos = test.Position(1,1)
        self.assertRaises(NotImplementedError, room.is_position_valid, pos)
        self.assertRaises(NotImplementedError, room.get_random_position)

    def test_room_dirt_dirty(self):
        """
        Can fail either because get_dirt_amount is working incorrectly
        OR the student is initializing the dirt amount incorrectly
        """
        width, height, dirt_amount = (3, 4, 1)
        room = ps3.RectangularRoom(width, height, dirt_amount)
        for x, y in xyrange(width, height):         
            self.assertEquals(room.get_dirt_amount(x, y),dirt_amount,
                             "Tile {} was not initialized with correct dirt amount".format((x, y))
                             )
                          
    def test_room_dirt_clean(self):
        """
        Can fail either because get_dirt_amount is working incorrectly
        OR the student is initializing the dirt amount incorrectly
        """
        width, height, dirt_amount = (3, 4, 0)   
        room = ps3.RectangularRoom(width, height, dirt_amount)
        for x, y in xyrange(width, height):         
            self.assertEquals(room.get_dirt_amount(x, y),dirt_amount,
                             "Tile {} was not initialized with correct dirt amount".format((x, y))
                             )

    def test_is_tile_cleaned_dirty(self):
        """ Test is_tile_cleaned"""
        width, height, dirt_amount = (3, 4, 1)
        room = ps3.RectangularRoom(width, height, dirt_amount)
        # Check all squares are unclean at start, given initial dirt > 1
        for x, y in xyrange(width, height):
            self.assertFalse(room.is_tile_cleaned(x, y),
                             "Unclean tile {} was returned as clean".format((x, y))
                             )
 
    def test_is_tile_cleaned_clean(self):
        """ Test is_tile_cleaned"""
        width, height, dirt_amount = (3, 4, 0)
        room = ps3.RectangularRoom(width, height, dirt_amount)
        # Check all squares are unclean at start, given initial dirt > 1
        for x, y in xyrange(width, height):
            self.assertTrue(room.is_tile_cleaned(x, y),
                             "Unclean tile {} was returned as clean".format((x, y))
                             )

    def test_clean_tile_at_position_PosToZero(self):
        """ Test if clean_tile_at_position removes all dirt"""
        width, height, dirt_amount = (3, 4, 1)
        room = ps3.RectangularRoom(width, height, dirt_amount)
        # Clean the tiles and confirm they are marked as clean
        for x, y in xyrange(width, height):
            room.clean_tile_at_position(test.Position(x + random.random(), y + random.random()), dirt_amount)
                # using random.random in case there is any issue with specific parts of a tile
        for x, y in xyrange(width, height):
            self.assertTrue(room.is_tile_cleaned(x, y),
                            "Clean tile {} was not marked clean".format((x, y))
                            )

    def test_clean_tile_at_position_PosToPos(self):
        """ Test if clean_tile_at_position removes all dirt"""
        width, height, dirt_amount = (3, 4, 2)
        room = ps3.RectangularRoom(width, height, dirt_amount)
        # Clean the tiles and confirm they are marked as clean
        for x, y in xyrange(width, height):
            room.clean_tile_at_position(test.Position(x + random.random(), y + random.random()), dirt_amount - 1)
                # using random.random in case there is any issue with specific parts of a tile
        for x, y in xyrange(width, height):
            self.assertFalse(room.is_tile_cleaned(x, y),
                            "Unclean tile {} was marked clean".format((x, y))
                            )

    def test_clean_tile_at_position_ZeroToZero(self):
        """ Test if clean_tile_at_position removes all dirt"""
        width, height, dirt_amount = (3, 4, 0)
        room = ps3.RectangularRoom(width, height, dirt_amount)
        # Clean the tiles and confirm they are marked as clean
        for x, y in xyrange(width, height):
            room.clean_tile_at_position(test.Position(x + random.random(), y + random.random()), 1)
                # using random.random in case there is any issue with specific parts of a tile
        for x, y in xyrange(width, height):
            self.assertTrue(room.is_tile_cleaned(x, y),
                            "Clean tile {} was marked clean, no negative dirt allowed".format((x, y))
                            )
 
    def test_get_num_cleaned_tiles_FullIn1(self):
        "Test get_num_cleaned_tiles for cleaning subset of room completely with 1 call"
        width, height, dirt_amount = (3, 4, 1)
        room = ps3.RectangularRoom(width, height, dirt_amount)
        cleaned_tiles = 0
        # Clean some tiles
        for x, y in xyrange(width-1, height-1):
            room.clean_tile_at_position(test.Position(x + random.random(), y + random.random()), 1)
            cleaned_tiles += 1
            num_cleaned = room.get_num_cleaned_tiles()
            self.assertEqual(num_cleaned, cleaned_tiles,
                            "Number of clean tiles is incorrect: expected {}, got {}".format(cleaned_tiles, num_cleaned)
                            )

    def test_get_num_cleaned_tiles_Partial(self):
        "Test get_num_cleaned_tiles for cleaning subset of room incompletely"
        width, height, dirt_amount = (3, 4, 2)
        room = ps3.RectangularRoom(width, height, dirt_amount)
        cleaned_tiles = 0
        # Clean some tiles
        for x, y in xyrange(width-1, height-1):
            room.clean_tile_at_position(test.Position(x + random.random(), y + random.random()), 1)
            num_cleaned = room.get_num_cleaned_tiles()
            self.assertEqual(num_cleaned, cleaned_tiles,
                            "Number of clean tiles is incorrect: expected {}, got {}".format(cleaned_tiles, num_cleaned)
                            )

    def test_get_num_cleaned_tiles_FullIn2(self):
        """Test get_num_cleaned_tiles for cleaning subset of room in two calls"""
        width, height, dirt_amount = (3, 4, 2)
        room = ps3.RectangularRoom(width, height, dirt_amount)
        cleaned_tiles = 0
        # Clean some tiles
        for x, y in xyrange(width-1, height-1):
            room.clean_tile_at_position(test.Position(x + random.random(), y + random.random()), 1)
            room.clean_tile_at_position(test.Position(x + random.random(), y + random.random()), 1)
            cleaned_tiles += 1
            num_cleaned = room.get_num_cleaned_tiles()
            self.assertEqual(num_cleaned, cleaned_tiles,
                             "Number of clean tiles is incorrect: expected {}, got {}".format(cleaned_tiles, num_cleaned)
                             )

    def test_get_num_cleaned_tiles_OverClean(self):
        "Test cleaning already clean tiles does not increment counter"
        width, height, dirt_amount = (3, 4, 2)
        room = ps3.RectangularRoom(width, height, dirt_amount)
        # clean all of the tiles in the room     
        for x, y in xyrange(width, height):
            room.clean_tile_at_position(test.Position(x + random.random(), y + random.random()), dirt_amount)
        for x, y in xyrange(width, height):
            room.clean_tile_at_position(test.Position(x + random.random(), y + random.random()), 1)
            num_cleaned = room.get_num_cleaned_tiles()
            self.assertEqual(num_cleaned, width * height,
                             "Number of clean tiles is incorrect: re-cleaning cleaned tiles must not increase number of cleaned tiles"
                             )

    def test_is_position_in_room(self):
        "Test is_position_in_room"
        width, height, dirt_amount = (3, 4, 2)
        room = ps3.RectangularRoom(width, height, dirt_amount)
        solution_room = test.RectangularRoom(width, height, dirt_amount)

        for x in [0.0, -0.1, width - 0.1, width, width + 0.1]:
            for y in [0.0, -0.1, height - 0.1, height, height + 0.1]:
                pos = test.Position(x, y)
                self.assertEquals(solution_room.is_position_in_room(pos),room.is_position_in_room(pos),
                                  "position {},{} is incorrect: expected {}, got {}".format(x, y, solution_room.is_position_in_room(pos), room.is_position_in_room(pos))
                                  )

class ps3_P1B(unittest.TestCase):
    """test the Robot abstract base class"""
    def test_unimplemented_methods(self):
        """Test if student implemented methods in Robot abstract class that should not be implemented"""
        room = test.EmptyRoom(2,2,1)
        robot = ps3.Robot(room,1,1)
        self.assertRaises(NotImplementedError, robot.update_position_and_clean)
 
    def test_getset_robot_direction(self):
        """Test get_robot_direction and set_robot_direction"""
        # instantiate EmptyRoom from solutions for testing
        width, height, dirt_amount = (3, 4, 2)
        solution_room = test.EmptyRoom(width, height, dirt_amount)

        robots = [ps3.Robot(solution_room, 1.0, 1) for i in range(4)]
        directions = [1, 333, 105, 75, 74.3]
        for dir_index, robot in enumerate(robots):
            robot.set_robot_direction(directions[dir_index])
        for dir_index, robot in enumerate(robots):
            robot_dir = robot.get_robot_direction()
            self.assertEquals(robot_dir, directions[dir_index],
                              "Robot direction set or retrieved incorrectly: expected {}, got {}".format(directions[dir_index], robot_dir)
                              )
     
class ps3_P2_ER(unittest.TestCase):
    """test the EmptyRoom subclass"""
    def test_get_random_position(self):
        """Test get_random_position
            checks for distribution of positions and validity of positions
        """
        width, height, dirt_amount = (5, 10, 1)
        room = ps3.EmptyRoom(width, height, dirt_amount)
        sol_room = test.EmptyRoom(width, height, dirt_amount)
        freq_buckets = {}
        for i in range(50000):
            pos = room.get_random_position()
            # confirm from test that this is a valid position
            self.assertTrue(sol_room.is_position_valid(pos))
            try:
                x, y = pos.get_x(), pos.get_y()
            except AttributeError:
                self.fail("get_random_position returned {} which is not a Position".format(pos))
            self.assertTrue(0 <= x < width and 0 <= y < height,
                            "get_random_position returned {} which is not in [0, {}), [0, {})".format(pos,width,height))
            x0, y0 = int(x), int(y)
            freq_buckets[(x0, y0)] = freq_buckets.get((x0, y0), 0) + 1
        for t in xyrange(width, height):
            num_in_bucket = freq_buckets.get(t, 0)
            self.assertTrue(
                # This is a 99.7% confidence interval for a uniform
                # distribution. Fail if the total of any bucket falls outside
                # this range.
                865 < num_in_bucket < 1135,
                "The distribution of positions from get_random_position "
                "looks incorrect (it should be uniform)")
 
    def test_get_num_tiles(self):
        """ test get_num_tiles method"""
        for i in range(10):     
            width, height, dirt_amount = (random.randint(1,10), random.randint(1,10), 1)
            room_num_tiles = ps3.EmptyRoom(width, height, dirt_amount).get_num_tiles()
            sol_room_tiles = ps3.EmptyRoom(width, height, dirt_amount).get_num_tiles()
            self.assertEquals(room_num_tiles, sol_room_tiles,
                             "student code number of room tiles = {}, not equal to solution code num tiles {}".format(room_num_tiles, sol_room_tiles)
                             )
 
    def test_is_position_valid(self):
        """ Test is_position_valid
            this should be refactored as it's mostly a copy of is_position_in_room code     
        """
        width, height, dirt_amount = (3, 4, 2)
        room = ps3.EmptyRoom(width, height, dirt_amount)
        solution_room = test.EmptyRoom(width, height, dirt_amount)

        for x in [0.0, -0.1, width - 0.1, width, width + 0.1]:
            for y in [0.0, -0.1, height - 0.1, height, height + 0.1]:
                pos = test.Position(x, y)
                self.assertEquals(solution_room.is_position_valid(pos), room.is_position_valid(pos),
                             "student code and solution code disagree on whether position is valid"
                                  )

class ps3_P2_FR(unittest.TestCase):               
    """tests the FurnishedRoom subclass """
    def test_is_tile_furnished(self):
        """ test is_tile_furnished """     
        for trial in range(5):
            width, height, dirt_amount = (random.randint(2, 8), random.randint(2, 8), 1)
            # create room using student's class, set furniture tiles for solution class
            room = ps3.FurnishedRoom(width, height, dirt_amount)
            room.add_furniture_to_room()
            sol_room = test.FurnishedRoom(width, height, dirt_amount)
            # this relies on knowing the underlying details of the class
            sol_room.furniture_tiles = room.furniture_tiles
            for x,y in xyrange(width,height):
                self.assertEquals(room.is_tile_furnished(x,y),sol_room.is_tile_furnished(x,y),
                                  "student code and solution code disagree on whether tile is furnished"
                                  )
 
    def test_is_position_furnished(self):
        """ test_is_position_furnished """     
        for trial in range(5):
            width, height, dirt_amount = (random.randint(2, 8), random.randint(2, 8), 1)
            # create room using student's class, set furniture tiles for solution class
            room = ps3.FurnishedRoom(width, height, dirt_amount)
            room.add_furniture_to_room()
            sol_room = test.FurnishedRoom(width, height, dirt_amount)
            # this relies on knowing the underlying details of the class
            sol_room.furniture_tiles = room.furniture_tiles
            for x,y in xyrange(width,height):
                pos = test.Position(x + random.random(), y + random.random())
                self.assertEquals(room.is_position_furnished(pos),sol_room.is_position_furnished(pos),
                                  "student code and solution code disagree on whether position is furnished"
                                  )
 
    def test_is_position_valid(self):
        """ Test is_position_valid
        """
        for trial in range(5):
            width, height, dirt_amount = (3, 4, 2)
            room = ps3.FurnishedRoom(width, height, dirt_amount)
            room.add_furniture_to_room()
            sol_room = test.FurnishedRoom(width, height, dirt_amount)
            sol_room.furniture_tiles = room.furniture_tiles
 
            for x in [0.0, -0.1, width - 0.1, width, width + 0.1, room.furniture_tiles[0][0] + 0.3]:
                for y in [0.0, -0.1, height - 0.1, height, height + 0.1, room.furniture_tiles[0][1] + 0.3]:
                    pos = test.Position(x, y)
                    self.assertEquals(sol_room.is_position_valid(pos), room.is_position_valid(pos),
                                      "student code and solution code disagree on whether position is valid"
                                      )
 
    def test_get_num_tiles(self):
        """ test get_num_tiles method
            should refactor - is mostly copy of EmptyRoom test     
        """
        for i in range(10):     
            width, height, dirt_amount = (random.randint(2,10), random.randint(2,10), 1)
            # instanciate student's room
            room = ps3.FurnishedRoom(width, height, dirt_amount)
            room.add_furniture_to_room()
            # instanciate solution's room based on student's furniture
            sol_room = ps3.FurnishedRoom(width, height, dirt_amount)
            sol_room.furniture_tiles = room.furniture_tiles
            # generate answers
            room_num_tiles = room.get_num_tiles()
            sol_room_num_tiles = sol_room.get_num_tiles()
            self.assertEquals(room_num_tiles, sol_room_num_tiles,
                             "student code number of room tiles = {}, not equal to solution code num tiles {}".format(room_num_tiles, sol_room_num_tiles)
                             )
 
    def test_get_random_position(self):
        """Test get_random_position for FurnishedRoom
           tests for validity of positions - could add distribution checking similar to empty room
        """
        width, height, dirt_amount = (5, 10, 1)
        # instanciate student's room
        room = ps3.FurnishedRoom(width, height, dirt_amount)
        room.add_furniture_to_room()
        # instanciate solution's room based on student's furniture
        sol_room = ps3.FurnishedRoom(width, height, dirt_amount)
        sol_room.furniture_tiles = room.furniture_tiles
        for i in range(50000):
            pos = room.get_random_position()
            self.assertTrue(sol_room.is_position_valid(pos))
 
class ps3_P3(unittest.TestCase):
    """This  tests EmptyRoom and Standard robot in various ways"""
    def createRoomAndRobots(self, num_robots):
        r = ps3.EmptyRoom(5, 7, 1)
        robots = [ps3.StandardRobot(r, 1.0, 1) for i in range(num_robots)]
        return r, robots

    def test_BoundaryConditions(self):
        "Test strict inequalities in random positions for the EmptyRoom and StandardRobot"
        for m in range(7000):
            r, robots = self.createRoomAndRobots(4)
            for r in robots:
                p = r.get_robot_position()
                d = r.get_robot_direction()
                try:
                    x, y = p.get_x(), p.get_y()
                except AttributeError:
                    self.fail("get_robot_position returned %r which is not a Position" % (p,))
                self.assertTrue(x < 5 and y < 7,
                                "Robot position was set to %r, "
                                "which is not in [0, 5), [0, 7)" %
                                ((p.get_x(), p.get_y()),))
                self.assertTrue(0 <= d < 360,
                                "Robot direction was set to %r, "
                                "which is not in [0, 360)" % (d,))

    def testRobot(self):
        "Test StandardRobot"
        pos_buckets = {}
        dir_buckets = {}
        skip_pos_distribution_test = False
        for m in range(7000):
            r, robots = self.createRoomAndRobots(4)
            for r in robots:
                p = r.get_robot_position()
                d = r.get_robot_direction()
                try:
                    x, y = p.get_x(), p.get_y()
                except AttributeError:
                    self.fail("get_robot_position returned %r which is not a Position" % (p,))
                self.assertTrue(0 <= x <= 5 and 0 <= y <= 7,
                                "Robot position was set to %r, "
                                "which is not in [0, 5), [0, 7)" %
                                ((p.get_x(), p.get_y()),))
                self.assertTrue(0 <= d <= 360,
                                "Robot direction was set to %r, "
                                "which is not in [0, 360)" % (d,))
                x0, y0 = int(p.get_x()), int(p.get_y())
                pos_buckets[(x0, y0)] = pos_buckets.get((x0, y0), 0) + 1
                dir_buckets[int(d / 10)] = dir_buckets.get(int(d / 10), 0) + 1
        # Test that positions are correctly distributed
        if not skip_pos_distribution_test:
            for t in xyrange(5, 7):
                num_in_bucket = pos_buckets.get(t, 0)
                self.assertTrue(
                    685 < num_in_bucket < 915,
                    "The distribution of positions on new Robot objects "
                    "looks incorrect (it should be uniform)")
                 
        # Test that directions are correctly distributed
        for t in range(36):
            num_in_bucket = dir_buckets.get(t, 0)
            self.assertTrue(
                658 < num_in_bucket < 898,
                "The distribution of positions from get_random_position "
                "looks incorrect (it should be uniform)")

    def test_update_position_and_cleanStandardRobot(self):
        "Test StandardRobot.update_position_and_clean"
        r = ps3.EmptyRoom(3, 5, 1)
        robot = ps3.StandardRobot(r, 1.0, 1)
        robot.set_robot_position(test.Position(1.5, 2.5))
        robot.set_robot_direction(90)
        robot.update_position_and_clean()
        self.assertEquals(robot.get_robot_direction(), 90,
                          "Robot direction is updated incorrectly by update_position_and_clean: expected %r, got %r" %
                          (90, robot.get_robot_direction()))
        # check if robot position is valid
        robotPos = robot.get_robot_position()
        correctPos = test.Position(2.5, 2.5)
        self.assertTrue(robotPos.get_x() == correctPos.get_x() and robotPos.get_y() == correctPos.get_y(),
                          "Robot position is updated incorrectly by update_position_and_clean: expected %r, got %r" %
                          (ps3.Position(2.5, 2.5), robot.get_robot_position()))
        self.assertTrue(2>=r.get_num_cleaned_tiles() >= 1,
                        "update_position_and_clean should have marked one or two tiles as clean")
        self.assertTrue(r.is_tile_cleaned(1, 2) or r.is_tile_cleaned(2, 2),
                        "update_position_and_clean should have marked either (1, 2) or (2, 2) as clean")
 
        # Simulate a lot of time passing...
        for i in range(20):
            robot.update_position_and_clean()
            self.assertTrue(r.is_position_in_room(robot.get_robot_position()),
                            "Robot position %r is not in room!" % (robot.get_robot_position(),))
        self.assertNotEquals(robot.get_robot_direction(), 90,
                          "Robot direction should have been changed in update_position_and_clean")
        self.assertTrue(r.get_num_cleaned_tiles() >= 1,
                        "update_position_and_clean should have marked another tile as clean")

"""The SIMULATION_TIME_LIMIT, SimulationThread class and SimulationTester class
    are all designed to help test various simulations for problems 4 and 5
 
    Right now there is no testing for the FurnishedRoom simulation, because the
    furniture is set up randomly. In future psets it may make sense to manually
    empirically establish reasonable simulation bounds for specified furniture
    setups. If the student has implemented the FurnishedRoom methods correctly
    and passes the tests for StandardRobot and EmptyRoom, there should not be any
    additional issue.
"""
SIMULATION_TIME_LIMIT = 75.0

class SimulationThread(threading.Thread):
    def __init__(self, *args):
        threading.Thread.__init__(self)
        self.result = None
        self.exception_info = None
        self.args = args
    def run(self):
        try:
            self.result = ps3.run_simulation(*self.args)
        except Exception:
            self.exception_info = sys.exc_info()
    def getResult(self):
        return self.result
    def getExceptionInfo(self):
        return self.exception_info

class SimulationTester(unittest.TestCase):
    def run_simulation(self, bounds, parameters):
        """
        Tests ps3.run_simulation.  The number of time-steps
        ps3.run_simulation takes must fall between any of
        the (LOWER, UPPER) bound tuples inside bounds.

        ps3.run_simulation must also finish within a timelimit
        to be considered passing.  Threads are used to time
        a simulation.

        bounds: tuple of (lower, upper) bounds on the number of
            steps a simulation should take.
        parameters: parameters to be passed into ps3.run_simulation

        """
        thr = SimulationThread(*parameters)
        # Set daemon flag, so we can quit the test even if simulation threads
        # are still running
        thr.setDaemon(True)
        thr.start()
        # Allow SIMULATION_TIME_LIMIT seconds for test to finish
        thr.join(SIMULATION_TIME_LIMIT)
        if thr.isAlive():
            self.fail("Simulation took too long (more than %d seconds)" %
                      SIMULATION_TIME_LIMIT)
        elif thr.getExceptionInfo():
            self.fail("Exception occurred in simulation thread:\n\n%s" %
                      "".join(traceback.format_exception(*thr.getExceptionInfo())))
        else:
            actual = thr.getResult()
            intervals_str = " or ".join([("[%.1f, %.1f]" % b) for b in bounds])
            self.assertTrue(
                any([LB < actual < UB for LB, UB in bounds]),
                "Simulation output was outside of 99.7%% confidence interval!\n"
                "Robots: %d; Speed: %.1f; Capacity: %d; Dimensions: %dx%d; "
                "Dirt Amount: %d; Coverage: %.2f; Trials: %d; Robot type: %r\n"
                "Actual output: %r; acceptable intervals: %s"
                % (parameters + (actual, intervals_str)))

class ps3_P5_Standard(SimulationTester):
    """test the simulation time cleaning the EmptyRoom with a StandardRobot"""
    def testSimulation1(self):
        "Test cleaning 100% of a 5x5 room"
        try:
            self.run_simulation(((142, 173),), (1, 1.0, 1, 5, 5, 1, 1.0, 100, ps3.StandardRobot))
        except:
            print ("Unexpected error:", sys.exc_info()[1])
            raise
    def testSimulation2(self):
        "Test cleaning 75% of a 10x10 room (Standard Robot)"
        self.run_simulation(((183, 198),), (1, 1.0, 1, 10, 10, 1, 0.75, 100, ps3.StandardRobot))
    def testSimulation3(self):
        "Test cleaning 90% of a 10x10 room (Standard Robot)"
        self.run_simulation(((298, 327),), (1, 1.0, 1, 10, 10, 1, 0.9, 100, ps3.StandardRobot))
    def testSimulation4(self):
        "Test multiple robots (95% of a 20x20 room with 5 robots (Standard Robot))"
        self.run_simulation(((289, 303),), (5, 1.0, 1, 20, 20, 1, 0.95, 100, ps3.StandardRobot))
    def testSimulation5(self):
        "Test different speeds (90% of a 5x20 room with a robot of speed 0.2 (Standard Robot))"
        self.run_simulation(((1095, 1228),), (1, 0.2, 1, 5, 20, 1, 0.9, 100, ps3.StandardRobot))
    def testSimulation6(self):
        "Test multiple robots and different speeds (90% of a 10x10 room with 3 robots of speed 0.5 (Standard Robot))"
        self.run_simulation(((155, 180),), (3, 0.5, 1, 10, 10, 1, 0.9, 100, ps3.StandardRobot))
    # new tests below here
    def testSimulation7(self):
         "Test cleaning 100% of a 5x5 room (Standard Robot, 5 dirt/tile, capcity = 3)"
         self.run_simulation(((206, 266),(180, 240)), (1, 1.0, 3, 5, 5, 5, 1.0, 100, ps3.StandardRobot))
    def testSimulation8(self):
        "Test cleaning 100% of a 5x5 room (Standard Robot, 6 dirt/tile, capacity = 3)"
        self.run_simulation(((206, 266),(180, 240)), (1, 1.0, 3, 5, 5, 6, 1.0, 100, ps3.StandardRobot))
    def testSimulation9(self):
        """Test different speeds (90% of a 3x10 room with a robot of speed 0.2 (Standard Robot)),
        capacity = 2, 6 dirt/tile"""
        self.run_simulation(((387, 447),(384, 444)), (1, 0.2, 2, 3, 10, 6, 0.9, 100, ps3.StandardRobot))
    def testSimulation10(self):
        "Test multiple robots (95% of a 10x10 room with 5 robots (Standard Robot)) capacity = 2, 6 dirt/tile"
        self.run_simulation(((137, 198),(130, 190)), (5, 1.0, 2, 10, 10, 6, 0.95, 100, ps3.StandardRobot))
    def testSimulation11(self):
        """Test multiple robots and different speeds (90% of a 5x5 room with 3 robots of speed 0.5
        (Standard Robot)), capacity = 2, 6 dirt/tile"""
        self.run_simulation(((48, 108), (45, 104)), (3, 0.5, 2, 5, 5, 6, 0.9, 100, ps3.StandardRobot))

class ps3_P5_Faulty(SimulationTester):
    """test the simulation time cleaning the EmptyRoom with a FaultyRobot"""
    def testSimulation1(self):
        "Test cleaning 100% of a 5x5 room with FaultyRobot"
        x = ps3.run_simulation(1, 1.0, 1, 5, 5, 1, 1.0, 100, ps3.FaultyRobot)
        self.assertTrue(125 <= x <= 275,
                        "Simulation output was outside of 99.7% confidence interval!\n") 
    def testSimulation2(self):
        "Test cleaning 75% of a 10x10 room with FaultyRobot"
        x = ps3.run_simulation(1, 1.0, 1, 10, 10, 1, 0.75, 100, ps3.FaultyRobot)
        self.assertTrue(210 <= x <=260, "Simulation output was outside of 99.7% confidence interval! Took " + str(x) + " steps\n")
    def testSimulation3(self):
        "Test cleaning 90% of a 10x10 room with FaultyRobot"
        x = ps3.run_simulation(1, 1.0, 1, 10, 10, 1, 0.9, 100, ps3.FaultyRobot)
        self.assertTrue(360 <= x <=415, "Simulation output was outside of 99.7% confidence interval! Took " + str(x) + " steps\n")
    def testSimulation4(self):
        "Test cleaning 100% of a 5x5 room with FaultyRobot"
        x = ps3.run_simulation(2, 1.0, 2, 5, 5, 5, 1.0, 100, ps3.FaultyRobot)
        self.assertTrue(160 <= x <=200, "Simulation output was outside of 99.7% confidence interval! Took " + str(x) + " steps\n")
    def testSimulation5(self):
        "Test cleaning 75% of a 10x10 room with FaultyRobot"
        x = ps3.run_simulation(4, 1.0, 3, 10, 10, 5, 0.75, 100, ps3.FaultyRobot)
        self.assertTrue(101 <= x <=116, "Simulation output was outside of 99.7% confidence interval! Took " + str(x) + " steps\n")
    def testSimulation6(self):
        "Test cleaning 90% of a 10x10 room with FaultyRobot"
        x = ps3.run_simulation(5, 1.0, 3, 10, 10, 10, 0.9, 100, ps3.FaultyRobot)
        self.assertTrue(205 <= x <=225, "Simulation output was outside of 99.7% confidence interval! Took " + str(x) + " steps\n")

if __name__ == "__main__":
    suite = unittest.TestSuite()
    suite.addTest(unittest.makeSuite(ps3_P1A))
    suite.addTest(unittest.makeSuite(ps3_P1B))
    suite.addTest(unittest.makeSuite(ps3_P2_ER))
    suite.addTest(unittest.makeSuite(ps3_P2_FR))
    suite.addTest(unittest.makeSuite(ps3_P3))
    suite.addTest(unittest.makeSuite(ps3_P5_Standard))
    suite.addTest(unittest.makeSuite(ps3_P5_Faulty))
    unittest.TextTestRunner(verbosity=3).run(suite)
When run in Python 2.7.10: ImportError: Bad magic number in test.pyc
When run in Python 3.9.5: ImportError: bad magic number in 'test': b'\x16\r\r\n'
I think the error occurs at line 11.

I think this means I need to use a different version of Python, but I'm not sure how to determine which version. Is there a way to fix this?
 
Technology news on Phys.org
  • #2
Sorry... I just read the course page and it says I should be using python 3.5. Running the above code in Python 3.5. gets rid of the error. (and gives a new one! but hopefully i can fix that.)
 
  • Like
Likes pbuk and berkeman

What does "ImportError: bad magic number" mean?

This error occurs in Python when the interpreter cannot execute a file because the file has been corrupted or is in the wrong format. The "magic number" refers to the first few bytes of a file that indicate its file type. A "bad" magic number means that the file is not a valid Python file.

What causes a "bad magic number" error in Python?

There are a few potential causes for this error. One possibility is that the file has been corrupted due to a hardware or software issue. Another possibility is that the file was saved in the wrong format, such as a text file instead of a Python file. It is also possible that the file is not a valid Python file to begin with.

How can I fix the "bad magic number" error in Python?

The best way to fix this error is to ensure that the file is in a valid Python format and has not been corrupted. If you are using a text editor, make sure to save the file as a .py file. If the file has been corrupted, try restoring it from a backup or downloading a new copy if available.

Can I prevent the "bad magic number" error from occurring?

While this error can happen unexpectedly, there are a few steps you can take to prevent it from occurring. Make sure to save your files in the correct format and avoid any actions that could potentially corrupt the file. Additionally, regularly backing up your files can help mitigate the impact of this error.

What should I do if the "bad magic number" error persists?

If you continue to encounter this error despite taking precautions, it may be a sign of a larger issue with your system. Try reinstalling Python or updating to the latest version. You may also want to seek assistance from an experienced programmer or your IT department.

Similar threads

  • Programming and Computer Science
Replies
2
Views
2K
  • Programming and Computer Science
Replies
1
Views
1K
  • Programming and Computer Science
Replies
16
Views
2K
  • Programming and Computer Science
Replies
4
Views
916
  • Programming and Computer Science
Replies
2
Views
1K
  • Programming and Computer Science
Replies
1
Views
1K
Replies
3
Views
3K
  • Programming and Computer Science
Replies
1
Views
940
  • Programming and Computer Science
Replies
1
Views
2K
  • Programming and Computer Science
Replies
2
Views
16K
Back
Top