Deepen MainWindowViewModel test coverage#37
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Closes the coverage gaps left by #34 — clip filtering, seek math, and the clip→auto-play trigger — by adding two small delegate seams (no new interfaces) and 12 tests that drive a real
VideoPlayerControllervia the existingFakeCameraPlayer.Seams added to
MainWindowViewModel(optional ctor params, real defaults)Func<string, IReadOnlyList<CamClip>> clipLoader— defaults toroot => CamStorage.Map(root).Clips; lets tests populate clips without disk I/O. Runtime behavior unchanged.Func<Task> backgroundYield— defaults toDispatcher.Yield(Background); lets the auto-play path run without a pumped dispatcher in tests.InitializePlayer/LoadClipsmadepublicso tests can call them directly. (This is an app, not a library, so noInternalsVisibleToceremony.)Tests (12 new; suite 81 → 93)
PositionText/DurationTextscale by duration;CanSeekgating; controllerPosition→SeekPositionmirroring; the scrub guard (controller position changes are ignored mid-drag, resume after).IsLoading/IsPlaying/PlayPauseIcon, andErrorMessage→ error overlay.CanGoNext/CanGoPrevious; selecting a clip triggers the auto-play loading state.FakeCameraPlayerintoFixtures/FakeCameraPlayer.cs(shared, no behavior change) so both test classes use one copy.Notes
VideoPlayerControllerthroughFakeCameraPlayer(existingICameraPlayer).CreateViewModelWithController. DrivingGoToClipAsyncto completion would marshal onto the thread pool and deadlock, so the auto-play test asserts the trigger (IsLoading) rather than the media open — which isVideoPlayerController's own (already-tested) responsibility.