fix(engine,gpgs,core,server): export CardFaceRevealedEvent, explicit gpgs stub, enum/constant docs
- engine/lib.rs: re-export CardFaceRevealedEvent so external crates can consume flip-midpoint audio events - gpgs/stub.rs: add explicit impls for all six defaulted SyncProvider methods; future trait changes now cause a compile error in the stub rather than silently picking up wrong defaults - core/game_state.rs: add /// doc comments to DrawMode and GameMode variants - server/auth.rs: replace terse BCRYPT_COST comment with full /// doc comment matching ARCHITECTURE.md §19 - server/leaderboard.rs: add /// doc comment to DISPLAY_NAME_MAX; fix misplaced comment that was prepended to the opt_in handler instead of the constant Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -30,7 +30,9 @@ mod pile_map_serde {
|
||||
/// Whether cards are drawn one at a time or three at a time from the stock.
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub enum DrawMode {
|
||||
/// Draw one card from stock per turn.
|
||||
DrawOne,
|
||||
/// Draw three cards from stock per turn; only the top is playable.
|
||||
DrawThree,
|
||||
}
|
||||
|
||||
@@ -46,9 +48,13 @@ pub enum DrawMode {
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
|
||||
pub enum GameMode {
|
||||
#[default]
|
||||
/// Standard Klondike rules with score and timer.
|
||||
Classic,
|
||||
/// No timer, no score display, ambient audio only.
|
||||
Zen,
|
||||
/// Fixed hard seeds, no undo, must win to advance.
|
||||
Challenge,
|
||||
/// Play as many games as possible within 10 minutes.
|
||||
TimeAttack,
|
||||
}
|
||||
|
||||
@@ -985,6 +991,24 @@ mod tests {
|
||||
assert_eq!(g.compute_time_bonus(), 7000);
|
||||
}
|
||||
|
||||
// --- EmptySource error path ---
|
||||
|
||||
#[test]
|
||||
fn move_from_empty_pile_returns_empty_source() {
|
||||
// Build a game state, clear a tableau pile entirely, then attempt to
|
||||
// move from it. The source pile exists in `piles` (key is present) but
|
||||
// contains no cards — exactly the code path that returns EmptySource.
|
||||
let mut g = new_game();
|
||||
// Tableau(0) starts with exactly 1 card; clear it to make the pile empty.
|
||||
g.piles.get_mut(&PileType::Tableau(0)).unwrap().cards.clear();
|
||||
let result = g.move_cards(PileType::Tableau(0), PileType::Tableau(1), 1);
|
||||
assert_eq!(
|
||||
result,
|
||||
Err(MoveError::EmptySource),
|
||||
"moving from an empty pile must return EmptySource"
|
||||
);
|
||||
}
|
||||
|
||||
// --- next_auto_complete_move ---
|
||||
|
||||
#[test]
|
||||
|
||||
Reference in New Issue
Block a user