def apply_layout(layout: LayoutDescription, options: Options, progress_update: ProgressUpdateCallable): """ Applies the given LayoutDescription to the files listed in options :param options: :param layout: :param progress_update: :return: """ game_files_path = options.game_files_path backup_files_path = options.backup_files_path patch_game_name_and_id( game_files_path, "Metroid Prime 2: Randomizer - {}".format(layout.shareable_hash)) try: dol_patcher.change_starting_spawn(game_files_path, layout.patches.starting_location) except dol_patcher.UnsupportedVersion: if layout.permalink.layout_configuration.starting_location.configuration != StartingLocationConfiguration.SHIP: raise claris_randomizer.apply_layout(description=layout, cosmetic_patches=options.cosmetic_patches, backup_files_path=backup_files_path, progress_update=progress_update, game_root=game_files_path)
def test_apply_layout( mock_apply_patcher_file: MagicMock, mock_create_patcher_file: MagicMock, ): # Setup description = MagicMock() description.file_extension.return_value = "foobar" player_config = MagicMock() cosmetic_patches = MagicMock() backup_files_path = MagicMock() progress_update = MagicMock() game_root = MagicMock(spec=Path()) # Run claris_randomizer.apply_layout(description, player_config, cosmetic_patches, backup_files_path, progress_update, game_root) # Assert game_root.joinpath.assert_called_once_with("files", "randovania.foobar") description.save_to_file.assert_called_once_with( game_root.joinpath.return_value) mock_create_patcher_file.assert_called_once_with(description, player_config, cosmetic_patches) mock_apply_patcher_file.assert_called_once_with( game_root, backup_files_path, mock_create_patcher_file.return_value, description.all_patches[player_config.player_index].game_specific, progress_update)
def apply_layout(layout: LayoutDescription, options: Options, players_config: PlayersConfiguration, progress_update: ProgressUpdateCallable): """ Applies the given LayoutDescription to the files listed in options :param options: :param layout: :param players_config: :param progress_update: :return: """ game_files_path = options.game_files_path backup_files_path = options.backup_files_path patch_game_name_and_id( game_files_path, "Metroid Prime 2: Randomizer - {}".format(layout.shareable_hash)) claris_randomizer.apply_layout( description=layout, players_config=players_config, cosmetic_patches=options.cosmetic_patches, backup_files_path=backup_files_path, progress_update=progress_update, game_root=game_files_path, )
def test_apply_layout( mock_ensure_no_menu_mod: MagicMock, mock_create_pak_backups: MagicMock, mock_add_menu_mod_to_files: MagicMock, mock_modern_api: MagicMock, mock_create_progress_update_from_successive_messages: MagicMock, mock_save_to_file: MagicMock, include_menu_mod: bool, has_backup_path: bool, ): # Setup cosmetic_patches = MagicMock() description = LayoutDescription( version=randovania.VERSION, permalink=Permalink(seed_number=1, spoiler=False, patcher_configuration=PatcherConfiguration( menu_mod=include_menu_mod, warp_to_start=MagicMock(), ), layout_configuration=MagicMock()), patches=MagicMock(), solver_path=(), ) game_root = MagicMock(spec=Path()) backup_files_path = MagicMock() if has_backup_path else None progress_update = MagicMock() status_update = mock_create_progress_update_from_successive_messages.return_value # Run claris_randomizer.apply_layout(description, cosmetic_patches, backup_files_path, progress_update, game_root) # Assert mock_create_progress_update_from_successive_messages.assert_called_once_with( progress_update, 400 if include_menu_mod else 100) mock_ensure_no_menu_mod.assert_called_once_with(game_root, backup_files_path, status_update) if has_backup_path: mock_create_pak_backups.assert_called_once_with( game_root, backup_files_path, status_update) else: mock_create_pak_backups.assert_not_called() game_root.joinpath.assert_called_once_with("files", "randovania.json") mock_save_to_file.assert_called_once_with(description, game_root.joinpath.return_value) mock_modern_api.assert_called_once_with(game_root, status_update, description, cosmetic_patches) if include_menu_mod: mock_add_menu_mod_to_files.assert_called_once_with( game_root, status_update) else: mock_add_menu_mod_to_files.assert_not_called()
def randomize_command_logic(args): def status_update(s): if args.verbose: print(s) if args.permalink is not None: layout_description = generator.generate_description(permalink=Permalink.from_str(args.permalink), status_update=status_update, validate_after_generation=True) else: layout_description = LayoutDescription.from_file(args.log_file) cosmetic_patches = CosmeticPatches( disable_hud_popup=args.disable_hud_popup, speed_up_credits=args.speed_up_credits) claris_randomizer.apply_layout(description=layout_description, cosmetic_patches=cosmetic_patches, backup_files_path=args.backup_files, progress_update=lambda x, _: status_update(x), game_root=args.game_files, )
def test_apply_layout(mock_run_with_args: MagicMock, mock_base_args: MagicMock, mock_ensure_no_menu_mod: MagicMock, mock_create_pak_backups: MagicMock, mock_calculate_indices: MagicMock, mock_add_menu_mod_to_files: MagicMock, mock_create_progress_update_from_successive_messages: MagicMock, mock_save_to_file: MagicMock, seed_number: int, item_loss: bool, elevators: bool, warp_to_start: bool, include_menu_mod: bool, speed_up_credits: bool, ): # Setup hud_memo_popup_removal: bool = MagicMock() cosmetic_patches = CosmeticPatches(disable_hud_popup=hud_memo_popup_removal, speed_up_credits=speed_up_credits, ) description = LayoutDescription( version=randovania.VERSION, permalink=Permalink( seed_number=seed_number, spoiler=False, patcher_configuration=PatcherConfiguration( menu_mod=include_menu_mod, warp_to_start=warp_to_start, ), layout_configuration=LayoutConfiguration.from_params( trick_level=MagicMock(), sky_temple_keys=MagicMock(), elevators=LayoutRandomizedFlag.RANDOMIZED if elevators else LayoutRandomizedFlag.VANILLA, pickup_quantities={}, starting_location=StartingLocation.default(), starting_resources=StartingResources.from_item_loss(item_loss), ) ), patches=None, solver_path=(), ) game_root = MagicMock(spec=Path()) backup_files_path = MagicMock() progress_update = MagicMock() status_update = mock_create_progress_update_from_successive_messages.return_value mock_calculate_indices.return_value = [10, 25, 1, 2, 5, 1] mock_base_args.return_value = [] expected_args = [ "-s", str(seed_number), "-p", "10,25,1,2,5,1" ] if not item_loss: expected_args.append("-i") if elevators: expected_args.append("-v") if speed_up_credits: expected_args.append("-c") if warp_to_start: expected_args.append("-t") # Run claris_randomizer.apply_layout(description, cosmetic_patches, backup_files_path, progress_update, game_root) # Assert mock_base_args.assert_called_once_with(game_root, hud_memo_popup_removal=hud_memo_popup_removal) mock_create_progress_update_from_successive_messages.assert_called_once_with( progress_update, 400 if include_menu_mod else 100 ) mock_ensure_no_menu_mod.assert_called_once_with(game_root, backup_files_path, status_update) mock_create_pak_backups.assert_called_once_with(game_root, backup_files_path, status_update) mock_calculate_indices.assert_called_once_with(description) game_root.joinpath.assert_called_once_with("files", "randovania.json") mock_save_to_file.assert_called_once_with(description, game_root.joinpath.return_value) mock_run_with_args.assert_called_once_with(expected_args, "Randomized!", status_update) if include_menu_mod: mock_add_menu_mod_to_files.assert_called_once_with(game_root, status_update) else: mock_add_menu_mod_to_files.assert_not_called()
def test_apply_layout( mock_ensure_no_menu_mod: MagicMock, mock_create_pak_backups: MagicMock, mock_add_menu_mod_to_files: MagicMock, mock_modern_api: MagicMock, mock_apply_patches: MagicMock, mock_create_progress_update_from_successive_messages: MagicMock, mock_save_to_file: MagicMock, include_menu_mod: bool, has_backup_path: bool, ): # Setup cosmetic_patches = MagicMock() description = LayoutDescription( version=randovania.VERSION, permalink=Permalink( seed_number=1, spoiler=False, presets={ 0: Preset(name="Name", description="Desc", base_preset_name=None, patcher_configuration=PatcherConfiguration( menu_mod=include_menu_mod, warp_to_start=MagicMock(), ), layout_configuration=MagicMock()) }, ), all_patches={0: MagicMock()}, item_order=(), ) game_root = MagicMock(spec=Path()) backup_files_path = MagicMock() if has_backup_path else None progress_update = MagicMock() player_config = PlayersConfiguration(0, {0: "you"}) status_update = mock_create_progress_update_from_successive_messages.return_value # Run claris_randomizer.apply_layout(description, player_config, cosmetic_patches, backup_files_path, progress_update, game_root) # Assert mock_create_progress_update_from_successive_messages.assert_called_once_with( progress_update, 400 if include_menu_mod else 100) mock_ensure_no_menu_mod.assert_called_once_with(game_root, backup_files_path, status_update) if has_backup_path: mock_create_pak_backups.assert_called_once_with( game_root, backup_files_path, status_update) else: mock_create_pak_backups.assert_not_called() game_root.joinpath.assert_called_once_with( "files", "randovania.{}".format(LayoutDescription.file_extension())) mock_save_to_file.assert_called_once_with(description, game_root.joinpath.return_value) mock_modern_api.assert_called_once_with(game_root, status_update, description, player_config, cosmetic_patches) mock_apply_patches.assert_called_once_with(game_root, description.all_patches[0], cosmetic_patches) if include_menu_mod: mock_add_menu_mod_to_files.assert_called_once_with( game_root, status_update) else: mock_add_menu_mod_to_files.assert_not_called()