from pathlib import Path from src import duration def test_manual_duration_is_fixed_and_clamped(monkeypatch, tmp_path): sample = tmp_path / "sample.wav" sample.write_bytes(b"x") monkeypatch.setattr(duration, "probe_duration", lambda path: 120.0) estimate = duration.calculate_duration_estimate( [sample], [], [], "None", "avg_wave", "FLAC", 0, 0, duration.DURATION_MODE_MANUAL, 999, 12, 1.25, ) assert estimate.seconds == duration.ZERO_GPU_MAX_SECONDS def test_semi_auto_increases_for_more_models_and_parameters(monkeypatch, tmp_path): sample = tmp_path / "sample.wav" sample.write_bytes(b"x") monkeypatch.setattr(duration, "probe_duration", lambda path: 180.0) base = duration.calculate_duration_estimate( [sample], [], ["UVR-MDX-NET-Inst_HQ_5.onnx"], "None", "avg_wave", "FLAC", 0, 0, duration.DURATION_MODE_SEMI_AUTO, 180, 8, 1.0, ) heavier = duration.calculate_duration_estimate( [sample], [], ["UVR-MDX-NET-Inst_HQ_5.onnx", "UVR-De-Reverb-aufr33-jarredou.pth"], "None", "avg_fft", "MP3", 2, 120, duration.DURATION_MODE_SEMI_AUTO, 180, 8, 1.0, ) assert heavier.seconds > base.seconds assert heavier.model_count == 2 def test_duration_callable_uses_app_argument_positions(monkeypatch, tmp_path): sample = tmp_path / "sample.wav" sample.write_bytes(b"x") monkeypatch.setattr(duration, "probe_duration", lambda path: 60.0) args = [ [sample], [], [], "None", "", "", "", "main", "", "", "", "avg_wave", "FLAC", "All stems", 0, 0, duration.DURATION_MODE_MANUAL, 75, 12, 1.25, ] assert duration.estimate_gpu_seconds(*args) == 75 def test_safe_mode_defaults_off_and_adds_exact_30_percent(monkeypatch, tmp_path): sample = tmp_path / "sample.wav" sample.write_bytes(b"x") monkeypatch.setattr(duration, "probe_duration", lambda path: 120.0) base = duration.calculate_duration_estimate( [sample], [], [], "None", "avg_wave", "FLAC", 0, 0, duration.DURATION_MODE_SEMI_AUTO, 180, 10, 1.0, False, ) safe = duration.calculate_duration_estimate( [sample], [], [], "None", "avg_wave", "FLAC", 0, 0, duration.DURATION_MODE_SEMI_AUTO, 180, 10, 1.0, True, ) assert base.safe_mode_requested is False assert base.safe_mode_applied is False assert base.safe_mode_multiplier == 1.0 assert safe.safe_mode_requested is True assert safe.safe_mode_applied is True assert safe.safe_mode_multiplier == duration.SAFE_MODE_MULTIPLIER assert safe.base_unclamped_seconds == base.base_unclamped_seconds assert safe.unclamped_seconds == base.unclamped_seconds * duration.SAFE_MODE_MULTIPLIER assert safe.seconds == duration._clamp_seconds(base.unclamped_seconds * 1.30) def test_safe_mode_never_changes_manual_duration(monkeypatch, tmp_path): sample = tmp_path / "sample.wav" sample.write_bytes(b"x") monkeypatch.setattr(duration, "probe_duration", lambda path: 120.0) estimate = duration.calculate_duration_estimate( [sample], [], [], "None", "avg_wave", "FLAC", 0, 0, duration.DURATION_MODE_MANUAL, 75, 10, 1.0, True, ) assert estimate.seconds == 75 assert estimate.safe_mode_requested is True assert estimate.safe_mode_applied is False assert estimate.safe_mode_multiplier == 1.0