def test_what_points_object_contains_when_its_enclosed(self): obj_a = Object(2, (0, 0), [(0, 0)]) obj_b = Object(1, (2, 2), [ (0, 0), (1, 0), (2, 0), (3, 0), (3, 1), (3, 2), (2, 2), (1, 2), (0, 2), (0, 1), ]) frame_model = ObjectRuntime.make_frame_model_from_objects( [obj_a, obj_b], 0) self.assertEqual( 0, len(GeometryRuntime.points_contained_by_object(obj_a, frame_model))) points_contained_by_b = GeometryRuntime.points_contained_by_object( obj_b, frame_model) self.assertEqual(2, len(points_contained_by_b)) self.assertSequenceEqual([(3, 3), (4, 3)], points_contained_by_b)
def are_objects_the_same_kind(a: Object.Object, b: Object.Object) -> bool: a_kind = a.get_object_kind() b_kind = b.get_object_kind() a_colour, a_relative_positions_string = a_kind.split(":") b_colour, b_relative_positions_string = b_kind.split(":") if a_colour != b_colour: return False # we convert to sets so that the order of the relative_positions doesn't matter a_relative_positions = set( map(lambda position: (position[0], position[1]), json.loads(a_relative_positions_string))) b_relative_positions = set( map(lambda position: (position[0], position[1]), json.loads(b_relative_positions_string))) b_rotated_90: Object.Object = GeometryRuntime.relatively_rotate_object_90( b) b_rotated_180: Object.Object = GeometryRuntime.relatively_rotate_object_180( b) b_rotated_270: Object.Object = GeometryRuntime.relatively_rotate_object_270( b) relative_positions_are_the_same_after_some_rotation = ( a_relative_positions == b_relative_positions or a_relative_positions == set(b_rotated_90.relative_positions) or a_relative_positions == set(b_rotated_180.relative_positions) or a_relative_positions == set(b_rotated_270.relative_positions)) return relative_positions_are_the_same_after_some_rotation
def test_rotating_line_90_degrees(self): obj = Object(1, (1, 0), [ (0, 0), (1, 0), (2, 0), ]) rotated_obj: Object = GeometryRuntime.relatively_rotate_object_90(obj) self.assertEqual([ (0, 0), (0, 1), (0, 2), ], rotated_obj.relative_positions)
def test_rotating_l_shape_360_degrees_doesnt_move_it_at_all(self): obj = Object(1, (1, 0), [ (0, 0), (1, 0), (2, 0), (2, 1), ]) rotated_obj: Object = GeometryRuntime.relatively_rotate_object( 360, obj) self.assertEqual(obj.top_left_offset, rotated_obj.top_left_offset) self.assertEqual(obj.relative_positions, rotated_obj.relative_positions)
def test_relatively_rotating_l_shape_270_degrees_when_it_wouldnt_go_off_top_of_grid( self): obj = Object(1, (5, 5), [ (0, 0), (1, 0), (2, 0), (2, 1), ]) rotated_obj: Object = GeometryRuntime.relatively_rotate_object_270(obj) self.assertEqual((5, 3), rotated_obj.top_left_offset) self.assertEqual([(0, 2), (0, 1), (0, 0), (1, 0)], rotated_obj.relative_positions)
def test_is_point_enclosed_in_cropped_rectangle(self): relative_positions = [ (0, 0), (1, 0), (2, 0), (3, 0), (3, 1), (3, 2), (2, 2), (1, 2), (0, 2), (0, 1), ] obj = Object(1, (0, 0), relative_positions) frame_model = ObjectRuntime.make_frame_model_from_objects([obj], 0) for pos in relative_positions: self.assertFalse( GeometryRuntime.is_point_fully_enclosed(pos, frame_model)) self.assertTrue( GeometryRuntime.is_point_fully_enclosed((1, 1), frame_model)) self.assertTrue( GeometryRuntime.is_point_fully_enclosed((2, 1), frame_model))
def test_what_points_object_contains_when_its_not_enclosed(self): obj_a = Object(1, (1, 1), [ (0, 0), (1, 0), (2, 0), (3, 0), (3, 2), (2, 2), (1, 2), (0, 2), (0, 1), ]) obj_b = Object(2, (5, 5), [(0, 0)]) frame_model = ObjectRuntime.make_frame_model_from_objects( [obj_a, obj_b], 0, False) points_contained_by_b = GeometryRuntime.points_contained_by_object( obj_a, frame_model) self.assertEqual(0, len(points_contained_by_b))
def test_what_points_object_contains_when_theres_another_object_in_the_way( self): obj_a = Object(1, (1, 1), [ (0, 0), (1, 0), (2, 0), (3, 0), (3, 2), (3, 3), (2, 2), (1, 2), (0, 2), (0, 1), ]) obj_b = Object(2, (5, 5), [(0, 0)]) obj_c = Object(3, (4, 2), [(0, 0)]) frame_model = ObjectRuntime.make_frame_model_from_objects( [obj_a, obj_b, obj_c], 0, False) points_contained_by_b = GeometryRuntime.points_contained_by_object( obj_a, frame_model) self.assertEqual(0, len(points_contained_by_b))
def test_is_point_enclosed_in_rectangle(self): obj_a = Object(2, (0, 0), [(0, 0)]) relative_positions = [ (0, 0), (1, 0), (2, 0), (3, 0), (3, 1), (3, 2), (2, 2), (1, 2), (0, 2), (0, 1), ] obj_b = Object(1, (2, 2), relative_positions) frame_model = ObjectRuntime.make_frame_model_from_objects( [obj_a, obj_b], 0) self.assertFalse( GeometryRuntime.is_point_fully_enclosed((0, 0), frame_model)) for pos in obj_b.convert_to_absolute_positions(): self.assertFalse( GeometryRuntime.is_point_fully_enclosed(pos, frame_model)) self.assertFalse( GeometryRuntime.is_point_fully_enclosed((1, 0), frame_model)) self.assertFalse( GeometryRuntime.is_point_fully_enclosed((1, 1), frame_model)) self.assertFalse( GeometryRuntime.is_point_fully_enclosed((0, 1), frame_model)) self.assertTrue( GeometryRuntime.is_point_fully_enclosed((3, 3), frame_model)) self.assertTrue( GeometryRuntime.is_point_fully_enclosed((4, 3), frame_model))