Пример #1
0
def test_mark_alert_as_displayed(tmp_path):
    opt = Options(tmp_path)

    all_alerts = (InfoAlert.FAQ, InfoAlert.MULTIWORLD_FAQ)
    for alert in all_alerts:
        assert not opt.is_alert_displayed(alert)
        opt.mark_alert_as_displayed(alert)
        assert opt.is_alert_displayed(alert)

    assert opt.displayed_alerts == set(all_alerts)

    new_opt = Options(tmp_path)
    new_opt.load_from_disk()
    assert new_opt.displayed_alerts == set(all_alerts)
def test_delete_files_location(
    tmpdir,
    games_path_exist: bool,
    backup_path_exist: bool,
):
    # Setup
    data_dir = Path(str(tmpdir.join("user_data_dir")))
    options = Options(data_dir)

    game_files = tmpdir.join("user_data_dir", "extracted_game")
    if games_path_exist:
        game_files.ensure_dir()
        game_files.join("random.txt").write_text("yay", "utf-8")

    backup_files = tmpdir.join("user_data_dir", "backup")
    if backup_path_exist:
        backup_files.ensure_dir()
        backup_files.join("random.txt").write_text("yay", "utf-8")

    # Run
    simplified_patcher.delete_files_location(options)

    # Assert
    assert not game_files.exists()
    assert not backup_files.exists()
Пример #3
0
def test_load_from_disk_first_failure(tmp_path, mocker):
    persisted_result = MagicMock()
    mocker.patch(
        "randovania.interface_common.persisted_options.find_config_files",
        autospec=True,
        return_value=[
            "[1]",
            "[2]",
        ])
    mock_get_persisted_options_from_data = mocker.patch(
        "randovania.interface_common.persisted_options.get_persisted_options_from_data",
        autospec=True,
        side_effect=[
            migration_lib.UnsupportedVersion(),
            persisted_result,
        ])
    option = Options(tmp_path)
    option.load_from_persisted = MagicMock()

    # Run
    result = option.load_from_disk(True)

    # Assert
    assert result
    option.load_from_persisted.assert_called_once_with(persisted_result, True)
    mock_get_persisted_options_from_data.assert_has_calls([
        call([1]),
        call([2]),
    ])
Пример #4
0
def test_save_options(skip_qtbot, tmp_path, is_prime_multi):
    options = Options(tmp_path)
    games = [RandovaniaGame.METROID_PRIME]
    if is_prime_multi:
        games.append(RandovaniaGame.METROID_PRIME_ECHOES)
    window = PrimeGameExportDialog(options, {}, "MyHash", True, games)
    window.output_file_edit.setText("somewhere/game.iso")

    if is_prime_multi:
        skip_qtbot.mouseClick(window.echoes_models_check, QtCore.Qt.LeftButton)
        window.echoes_file_edit.setText("somewhere/echoes.iso")

    # Run
    window.save_options()

    # Assert
    assert options.options_for_game(
        RandovaniaGame.METROID_PRIME).output_directory == Path("somewhere")
    if is_prime_multi:
        assert options.options_for_game(
            RandovaniaGame.METROID_PRIME).use_external_models == {
                RandovaniaGame.METROID_PRIME_ECHOES
            }
        assert options.options_for_game(
            RandovaniaGame.METROID_PRIME_ECHOES).input_path == Path(
                "somewhere/echoes.iso")
Пример #5
0
def _default_online_interactions(skip_qtbot,
                                 preset_manager) -> OnlineInteractions:
    main_window = MagicMock()
    parent = QtWidgets.QWidget()
    skip_qtbot.add_widget(parent)

    return OnlineInteractions(parent, preset_manager, MagicMock(), main_window,
                              Options(MagicMock()))
Пример #6
0
def test_reset_to_defaults():
    # Create and test they're equal
    blank = Options(MagicMock())
    modified = Options(MagicMock())
    assert blank._serialize_fields() == modified._serialize_fields()

    # Modify and test they're different
    with modified:
        for field in randovania.interface_common.options._SERIALIZER_FOR_FIELD.keys():
            # This cause weirdness in serializing it
            if field != "last_changelog_displayed":
                modified._set_field(field, getattr(modified, field))
    assert blank._serialize_fields() != modified._serialize_fields()

    # Reset and test they're the same
    with modified:
        modified.reset_to_defaults()
    assert blank._serialize_fields() == modified._serialize_fields()
def test_save_options(skip_qtbot, tmp_path):
    options = Options(tmp_path)
    window = SuperMetroidGameExportDialog(options, {}, "MyHash", True, [])
    window.output_file_edit.setText("somewhere/game.smc")

    # Run
    window.save_options()

    # Assert
    assert options.options_for_game(
        RandovaniaGame.SUPER_METROID).output_directory == Path("somewhere")
Пример #8
0
def test_setting_fields_to_self_do_nothing():
    options = Options(MagicMock())
    initial_serialize = options._serialize_fields()

    # Modify and test they're different
    with options:
        for field in randovania.interface_common.options._SERIALIZER_FOR_FIELD.keys():
            setattr(options, field, getattr(options, field))

    # Reset and test they're the same
    assert options._serialize_fields() == initial_serialize
Пример #9
0
def test_load_from_disk_missing_json(ignore_decode_errors: bool, tmpdir):
    # Setup
    option = Options(Path(tmpdir))
    tmpdir.join("config.json").write_text("", "utf-8")

    if ignore_decode_errors:
        result = option.load_from_disk(ignore_decode_errors)
        assert result != ignore_decode_errors
    else:
        with pytest.raises(DecodeFailedException):
            option.load_from_disk(ignore_decode_errors)
def test_save_options(skip_qtbot, tmp_path):
    options = Options(tmp_path)

    window = CSGameExportDialog(options, {}, "MyHash", True, [])
    window.output_file_edit.setText("somewhere/foo")

    # Run
    window.save_options()

    # Assert
    assert options.options_for_game(
        RandovaniaGame.CAVE_STORY).output_directory == Path("somewhere/foo")
Пример #11
0
def test_edit_during_options_changed(tmpdir):
    # Setup
    option = Options(Path(tmpdir))
    option._selected_tracker = "start"

    def on_changed():
        with option:
            option.selected_tracker = "final"

    option.on_options_changed = on_changed

    # Run
    with option:
        option.selected_tracker = "middle"

    second_option = Options(Path(tmpdir))
    second_option.load_from_disk()

    # Assert
    assert option.selected_tracker == "final"
    assert option.selected_tracker == second_option.selected_tracker
Пример #12
0
def test_edit_during_options_changed(tmpdir):
    # Setup
    option = Options(Path(tmpdir))
    option._output_directory = Path("start")

    def on_changed():
        with option:
            option.output_directory = Path("final")

    option.on_options_changed = on_changed

    # Run
    with option:
        option.output_directory = Path("middle")

    second_option = Options(Path(tmpdir))
    second_option.load_from_disk()

    # Assert
    assert option.output_directory == Path("final")
    assert option.output_directory == second_option.output_directory
Пример #13
0
def test_load_from_disk_no_data(tmp_path, mocker):
    # Setup
    mock_get_persisted_options_from_data: MagicMock = mocker.patch(
        "randovania.interface_common.persisted_options.get_persisted_options_from_data",
        autospec=True)
    option = Options(tmp_path)

    # Run
    option.load_from_disk()

    # Assert
    mock_get_persisted_options_from_data.assert_not_called()
def test_save_options(skip_qtbot, tmp_path):
    options = Options(tmp_path)

    window = DreadGameExportDialog(options, {}, "MyHash", True, [])
    window.atmosphere_radio.setChecked(True)

    # Run
    window.save_options()

    # Assert
    game_options = options.options_for_game(RandovaniaGame.METROID_DREAD)
    assert isinstance(game_options, DreadPerGameOptions)
    assert game_options.target_platform == DreadModPlatform.ATMOSPHERE
Пример #15
0
def test_load_from_disk_invalid_json(ignore_decode_errors: bool, tmpdir):
    # Setup
    option = Options(Path(tmpdir))
    tmpdir.join("config.json").write_text(
        json.dumps(
            randovania.interface_common.persisted_options.
            serialized_data_for_options(
                {"cosmetic_patches": {
                    "pickup_model_style": "invalid-value"
                }})), "utf-8")

    if ignore_decode_errors:
        result = option.load_from_disk(ignore_decode_errors)
        assert result != ignore_decode_errors
    else:
        with pytest.raises(DecodeFailedException):
            option.load_from_disk(ignore_decode_errors)
Пример #16
0
def test_load_from_disk_with_data(fields_to_test: list[str], tmp_path, mocker):
    # Setup
    mock_get_persisted_options_from_data: MagicMock = mocker.patch(
        "randovania.interface_common.persisted_options.get_persisted_options_from_data",
        autospec=True)
    mock_set_field: MagicMock = mocker.patch(
        "randovania.interface_common.options.Options._set_field",
        autospec=True)
    tmp_path.joinpath("config.json").write_text("[1, 2, 54, 69]")

    option = Options(tmp_path)

    persisted_options = {
        field_name: MagicMock()
        for field_name in fields_to_test
    }
    new_serializers = {
        field_name: MagicMock()
        for field_name in fields_to_test
    }
    mock_get_persisted_options_from_data.return_value = persisted_options

    # Run
    with patch.dict(randovania.interface_common.options._SERIALIZER_FOR_FIELD,
                    new_serializers):
        option.load_from_disk()

    # Assert
    mock_get_persisted_options_from_data.assert_called_once_with(
        [1, 2, 54, 69])
    for field_name, serializer in new_serializers.items():
        serializer.decode.assert_called_once_with(
            persisted_options[field_name])

    mock_set_field.assert_has_calls([
        call(option, field_name,
             new_serializers[field_name].decode.return_value)
        for field_name in fields_to_test
    ])
Пример #17
0
def test_load_from_disk_first_successful(tmp_path, mocker):
    mocker.patch(
        "randovania.interface_common.persisted_options.find_config_files",
        autospec=True,
        return_value=[
            "[1]",
            "[2]",
        ])
    mock_get_persisted_options_from_data = mocker.patch(
        "randovania.interface_common.persisted_options.get_persisted_options_from_data",
        autospec=True,
    )
    option = Options(tmp_path)
    option.load_from_persisted = MagicMock()

    # Run
    result = option.load_from_disk(False)

    # Assert
    assert result
    option.load_from_persisted.assert_called_once_with(
        mock_get_persisted_options_from_data.return_value, False)
    mock_get_persisted_options_from_data.assert_called_once_with([1])
Пример #18
0
def test_click_on_preset_tree(tab, preset_manager, game: RandovaniaGame, skip_qtbot, tmp_path, allow_experimental):
    preset = preset_manager.default_preset_for_game(game)

    options = Options(tmp_path, None)
    with options:
        options.experimental_games = allow_experimental
    options.on_options_changed = lambda: tab.on_options_changed(options)

    tab._options = options
    tab._window_manager.preset_manager = preset_manager
    tab.setup_ui()
    tab.on_options_changed(options)

    # Run
    item = tab.window.create_preset_tree.preset_to_item.get(preset.uuid)
    # assert item.parent().text(0) == "1"
    if not game.data.development_state.can_view(allow_experimental):
        assert item is None
    else:
        tab.window.create_preset_tree.selectionModel().reset()
        item.setSelected(True)

        # Assert
        assert tab._current_preset_data.get_preset() == preset.get_preset()
Пример #19
0
def _default_main_window(skip_qtbot, preset_manager) -> MainWindow:
    return create_window(Options(MagicMock()), preset_manager)
Пример #20
0
def _default_main_window(skip_qtbot, preset_manager, mocker) -> MainWindow:
    mocker.patch("randovania.gui.lib.theme.set_dark_theme")
    return create_window(Options(MagicMock()), preset_manager)
Пример #21
0
def _option() -> Options:
    return Options(MagicMock())
Пример #22
0
def _default_main_window() -> MainWindow:
    return create_window(Options(MagicMock()))