D-039: test: cover None branch of classify_span_change#8
Merged
Conversation
Add three direct-assertion unit tests for `classify_diff_span` (the public wrapper over `ContextBuilder::classify_span_change` re-exported from `lib.rs`) that exercise the `None` return path. Each test documents why that branch is reachable: 1. symbol span entirely outside the diff hunk (line 50-60 span vs a hunk at lines 1-3) — no +/- line lands inside the requested span, 2. empty diff string — the parse loop never enters a hunk at all, 3. inverted span (`new_start > new_end`) — `in_new_span` evaluates false for every counter value, so no +/- line is ever collected. The pre-existing `whitespace_detection_returns_none_when_span_has_no_changes` test only probed this branch indirectly through `ContextBuilder::build` and never asserted on the actual `Option::None` return, leaving the short-circuit contract (`added_in_span.is_empty() && removed_in_span.is_empty()` guard in `src/services/context.rs`) untested. These direct `assert_eq!(..., None)` assertions pin the contract so a future refactor cannot silently convert the "no changes in span" case into a false-positive `Some(true)` whitespace-only classification. Test count: +3 in `tests/context.rs` (101 → 104). Closes audit entry D-039 from #3.
There was a problem hiding this comment.
Pull request overview
Adds targeted integration tests to cover the None return path of ContextBuilder::classify_span_change (via the public classify_diff_span wrapper), addressing audit item D-039.
Changes:
- Import
commitbee::classify_diff_spanintotests/context.rs. - Add new tests asserting
Noneis returned when a requested span has no diff changes (outside-hunk, empty diff, and degenerate span inputs).
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
The comment describing the classify_span_change contract lists the span order as (old_start..=old_end) / (new_start..=new_end), but the actual API (and implementation in ContextBuilder::classify_span_change) takes/uses new_start..=new_end for added lines and old_start..=old_end for removed lines. Please update the comment to match the parameter order to avoid misleading future readers. Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
classify_span_change_returns_none_when_span_range_is_empty currently uses spans 100..50, which are both inverted and completely outside the hunk (lines 1–3). That means the test would still pass even if the implementation started normalizing inverted ranges (or otherwise mishandled the inversion), because the out-of-hunk condition alone yields None. Consider using an inverted range that would otherwise overlap the hunk (e.g., new_start=3, new_end=1, old_start=3, old_end=1) to specifically validate the inverted-span behavior. Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
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 subscribe to this conversation on GitHub.
Already have an account?
Sign in.
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.
Summary
test: cover None branch of classify_span_change.
Audit context
Closes audit entry D-039 from #3.
Verification
cargo fmt --checkcargo clippy --all-targets --all-features -- -D warningscargo test --all-targets