fix missing dealer when player is knocked out
authorGeoffrey Allott <geoffrey@allott.email>
Wed, 17 Mar 2021 22:54:15 +0000 (22:54 +0000)
committerGeoffrey Allott <geoffrey@allott.email>
Wed, 17 Mar 2021 22:54:15 +0000 (22:54 +0000)
src/game/whist.rs
src/seats.rs

index 0f38968bc30bbcd62dc816ff6ba06cda5a08d15d..262f1ad8621c9ce63c9fb8e9811a0350932864ae 100644 (file)
@@ -256,7 +256,12 @@ impl Game for KnockOutWhist {
                 }
                 Ok(())
             }
-            (State::Playing, Action::KnockedOut) => self.seats.remove_player(username),
+            (State::Playing, Action::KnockedOut) => {
+                if self.dealer == Some(username) {
+                    self.dealer = self.seats.player_before(username);
+                }
+                self.seats.remove_player(username)
+            }
             (State::Playing, Action::WinGame) => {
                 self.winners.clear();
                 self.winners.insert(username);
@@ -762,4 +767,235 @@ mod tests {
 
         test_game(actions, settings, seed);
     }
+
+    #[test]
+    fn there_is_a_player_to_deal_after_player_knocked_out() {
+        let actions = r#"[
+            {"timestamp":1616020446932,"username":"pete","action":{"action":"Join","seat":0,"chips":0}},
+            {"timestamp":1616020449305,"username":"mack","action":{"action":"Join","seat":1,"chips":0}},
+            {"timestamp":1616020452004,"username":"kat","action":{"action":"Join","seat":2,"chips":0}},
+            {"timestamp":1616020454516,"username":"geoff","action":{"action":"Join","seat":3,"chips":0}},
+            {"timestamp":1616020454517,"username":"geoff","action":{"action":"NextToDeal"}},
+            {"timestamp":1616020454517,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Six","suit":"Spades"}}},
+            {"timestamp":1616020454518,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Two","suit":"Spades"}}},
+            {"timestamp":1616020454518,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Ten","suit":"Clubs"}}},
+            {"timestamp":1616020454519,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Eight","suit":"Clubs"}}},
+            {"timestamp":1616020454519,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Queen","suit":"Diamonds"}}},
+            {"timestamp":1616020454520,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Five","suit":"Diamonds"}}},
+            {"timestamp":1616020454520,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Jack","suit":"Diamonds"}}},
+            {"timestamp":1616020454521,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Ten","suit":"Hearts"}}},
+            {"timestamp":1616020454521,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Jack","suit":"Clubs"}}},
+            {"timestamp":1616020454522,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"King","suit":"Clubs"}}},
+            {"timestamp":1616020454522,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"King","suit":"Hearts"}}},
+            {"timestamp":1616020454523,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Ace","suit":"Spades"}}},
+            {"timestamp":1616020454523,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Seven","suit":"Hearts"}}},
+            {"timestamp":1616020454523,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Five","suit":"Spades"}}},
+            {"timestamp":1616020454524,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Nine","suit":"Clubs"}}},
+            {"timestamp":1616020454524,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Ace","suit":"Diamonds"}}},
+            {"timestamp":1616020454525,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Seven","suit":"Clubs"}}},
+            {"timestamp":1616020454525,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Six","suit":"Clubs"}}},
+            {"timestamp":1616020454525,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Nine","suit":"Hearts"}}},
+            {"timestamp":1616020454526,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Jack","suit":"Spades"}}},
+            {"timestamp":1616020454526,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Ace","suit":"Hearts"}}},
+            {"timestamp":1616020454527,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Nine","suit":"Diamonds"}}},
+            {"timestamp":1616020454527,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Four","suit":"Hearts"}}},
+            {"timestamp":1616020454528,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Five","suit":"Clubs"}}},
+            {"timestamp":1616020454528,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Queen","suit":"Spades"}}},
+            {"timestamp":1616020454529,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Ten","suit":"Diamonds"}}},
+            {"timestamp":1616020454529,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Eight","suit":"Hearts"}}},
+            {"timestamp":1616020454529,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Three","suit":"Hearts"}}},
+            {"timestamp":1616020454530,"username":"geoff","action":{"action":"CommunityCard","card":{"rank":"Ten","suit":"Spades"}}},
+            {"timestamp":1616020454530,"username":"geoff","action":{"action":"EndDeal"}},
+            {"timestamp":1616020479930,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Queen","suit":"Diamonds"}}},
+            {"timestamp":1616020487756,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Ten","suit":"Diamonds"}}},
+            {"timestamp":1616020523123,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Jack","suit":"Diamonds"}}},
+            {"timestamp":1616020528580,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Ace","suit":"Diamonds"}}},
+            {"timestamp":1616020528581,"username":"geoff","action":{"action":"WinTrick"}},
+            {"timestamp":1616020534102,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Ace","suit":"Spades"}}},
+            {"timestamp":1616020537134,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Six","suit":"Spades"}}},
+            {"timestamp":1616020539368,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Two","suit":"Spades"}}},
+            {"timestamp":1616020543712,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Four","suit":"Hearts"}}},
+            {"timestamp":1616020543713,"username":"geoff","action":{"action":"WinTrick"}},
+            {"timestamp":1616020546435,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Jack","suit":"Spades"}}},
+            {"timestamp":1616020549585,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Queen","suit":"Spades"}}},
+            {"timestamp":1616020550737,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Five","suit":"Spades"}}},
+            {"timestamp":1616020552494,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Eight","suit":"Hearts"}}},
+            {"timestamp":1616020552495,"username":"pete","action":{"action":"WinTrick"}},
+            {"timestamp":1616020554825,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Ace","suit":"Hearts"}}},
+            {"timestamp":1616020557999,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Five","suit":"Diamonds"}}},
+            {"timestamp":1616020560984,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Nine","suit":"Hearts"}}},
+            {"timestamp":1616020562819,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Three","suit":"Hearts"}}},
+            {"timestamp":1616020562820,"username":"pete","action":{"action":"WinTrick"}},
+            {"timestamp":1616020581188,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Jack","suit":"Clubs"}}},
+            {"timestamp":1616020583165,"username":"mack","action":{"action":"PlayCard","card":{"rank":"King","suit":"Clubs"}}},
+            {"timestamp":1616020599486,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Nine","suit":"Clubs"}}},
+            {"timestamp":1616020603061,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Five","suit":"Clubs"}}},
+            {"timestamp":1616020603062,"username":"mack","action":{"action":"WinTrick"}},
+            {"timestamp":1616020606056,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Nine","suit":"Diamonds"}}},
+            {"timestamp":1616020609480,"username":"kat","action":{"action":"PlayCard","card":{"rank":"Ten","suit":"Clubs"}}},
+            {"timestamp":1616020611226,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Eight","suit":"Clubs"}}},
+            {"timestamp":1616020613771,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Seven","suit":"Clubs"}}},
+            {"timestamp":1616020613772,"username":"mack","action":{"action":"WinTrick"}},
+            {"timestamp":1616020615850,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Six","suit":"Clubs"}}},
+            {"timestamp":1616020616785,"username":"kat","action":{"action":"PlayCard","card":{"rank":"King","suit":"Hearts"}}},
+            {"timestamp":1616020618064,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Ten","suit":"Hearts"}}},
+            {"timestamp":1616020618954,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Seven","suit":"Hearts"}}},
+            {"timestamp":1616020618955,"username":"mack","action":{"action":"WinTrick"}},
+            {"timestamp":1616020618955,"username":"kat","action":{"action":"KnockedOut"}},
+            {"timestamp":1616020618956,"username":"mack","action":{"action":"WinCall"}},
+            {"timestamp":1616020618956,"username":"pete","action":{"action":"NextToDeal"}},
+            {"timestamp":1616020618957,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Ten","suit":"Hearts"}}},
+            {"timestamp":1616020618957,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Six","suit":"Spades"}}},
+            {"timestamp":1616020618958,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Jack","suit":"Hearts"}}},
+            {"timestamp":1616020618958,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Four","suit":"Diamonds"}}},
+            {"timestamp":1616020618959,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Two","suit":"Clubs"}}},
+            {"timestamp":1616020618959,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Two","suit":"Hearts"}}},
+            {"timestamp":1616020618960,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Ace","suit":"Spades"}}},
+            {"timestamp":1616020618960,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"King","suit":"Clubs"}}},
+            {"timestamp":1616020618961,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Six","suit":"Hearts"}}},
+            {"timestamp":1616020618961,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Ten","suit":"Diamonds"}}},
+            {"timestamp":1616020618962,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Nine","suit":"Spades"}}},
+            {"timestamp":1616020618962,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Nine","suit":"Diamonds"}}},
+            {"timestamp":1616020618963,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Queen","suit":"Spades"}}},
+            {"timestamp":1616020618963,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Eight","suit":"Diamonds"}}},
+            {"timestamp":1616020618964,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Three","suit":"Diamonds"}}},
+            {"timestamp":1616020618964,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Ten","suit":"Spades"}}},
+            {"timestamp":1616020618965,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Jack","suit":"Spades"}}},
+            {"timestamp":1616020618965,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Seven","suit":"Clubs"}}},
+            {"timestamp":1616020618965,"username":"pete","action":{"action":"EndDeal"}},
+            {"timestamp":1616020630957,"username":"mack","action":{"action":"ChooseTrumps","suit":"Clubs"}},
+            {"timestamp":1616020634051,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Ace","suit":"Spades"}}},
+            {"timestamp":1616020636576,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Nine","suit":"Spades"}}},
+            {"timestamp":1616020639245,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Seven","suit":"Clubs"}}},
+            {"timestamp":1616020639246,"username":"pete","action":{"action":"WinTrick"}},
+            {"timestamp":1616020641387,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Jack","suit":"Hearts"}}},
+            {"timestamp":1616020644366,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Ten","suit":"Hearts"}}},
+            {"timestamp":1616020647516,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Two","suit":"Clubs"}}},
+            {"timestamp":1616020647517,"username":"geoff","action":{"action":"WinTrick"}},
+            {"timestamp":1616020649796,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"King","suit":"Clubs"}}},
+            {"timestamp":1616020651822,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Three","suit":"Diamonds"}}},
+            {"timestamp":1616020653511,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Four","suit":"Diamonds"}}},
+            {"timestamp":1616020653512,"username":"geoff","action":{"action":"WinTrick"}},
+            {"timestamp":1616020655681,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Jack","suit":"Spades"}}},
+            {"timestamp":1616020657401,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Two","suit":"Hearts"}}},
+            {"timestamp":1616020660982,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Queen","suit":"Spades"}}},
+            {"timestamp":1616020660983,"username":"mack","action":{"action":"WinTrick"}},
+            {"timestamp":1616020662793,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Ten","suit":"Spades"}}},
+            {"timestamp":1616020663891,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Six","suit":"Spades"}}},
+            {"timestamp":1616020665573,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Nine","suit":"Diamonds"}}},
+            {"timestamp":1616020665574,"username":"mack","action":{"action":"WinTrick"}},
+            {"timestamp":1616020666809,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Ten","suit":"Diamonds"}}},
+            {"timestamp":1616020668480,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Eight","suit":"Diamonds"}}},
+            {"timestamp":1616020669165,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Six","suit":"Hearts"}}},
+            {"timestamp":1616020669166,"username":"mack","action":{"action":"WinTrick"}},
+            {"timestamp":1616020669166,"username":"mack","action":{"action":"WinCall"}},
+            {"timestamp":1616020669167,"username":"mack","action":{"action":"NextToDeal"}},
+            {"timestamp":1616020669167,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Jack","suit":"Diamonds"}}},
+            {"timestamp":1616020669168,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Ace","suit":"Spades"}}},
+            {"timestamp":1616020669169,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Eight","suit":"Diamonds"}}},
+            {"timestamp":1616020669169,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Seven","suit":"Clubs"}}},
+            {"timestamp":1616020669170,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Ace","suit":"Diamonds"}}},
+            {"timestamp":1616020669170,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Ace","suit":"Hearts"}}},
+            {"timestamp":1616020669171,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Jack","suit":"Hearts"}}},
+            {"timestamp":1616020669171,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Ten","suit":"Hearts"}}},
+            {"timestamp":1616020669172,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"King","suit":"Hearts"}}},
+            {"timestamp":1616020669172,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Seven","suit":"Spades"}}},
+            {"timestamp":1616020669173,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Nine","suit":"Hearts"}}},
+            {"timestamp":1616020669173,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Jack","suit":"Spades"}}},
+            {"timestamp":1616020669174,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Queen","suit":"Clubs"}}},
+            {"timestamp":1616020669174,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Four","suit":"Diamonds"}}},
+            {"timestamp":1616020669174,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Five","suit":"Hearts"}}},
+            {"timestamp":1616020669175,"username":"mack","action":{"action":"EndDeal"}},
+            {"timestamp":1616020689526,"username":"mack","action":{"action":"ChooseTrumps","suit":"Diamonds"}},
+            {"timestamp":1616020697323,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Jack","suit":"Hearts"}}},
+            {"timestamp":1616020699409,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Nine","suit":"Hearts"}}},
+            {"timestamp":1616020700698,"username":"mack","action":{"action":"PlayCard","card":{"rank":"King","suit":"Hearts"}}},
+            {"timestamp":1616020700699,"username":"mack","action":{"action":"WinTrick"}},
+            {"timestamp":1616020701122,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Ace","suit":"Hearts"}}},
+            {"timestamp":1616020709502,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Jack","suit":"Diamonds"}}},
+            {"timestamp":1616020711574,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Ten","suit":"Hearts"}}},
+            {"timestamp":1616020711575,"username":"geoff","action":{"action":"WinTrick"}},
+            {"timestamp":1616020714169,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Queen","suit":"Clubs"}}},
+            {"timestamp":1616020715935,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Four","suit":"Diamonds"}}},
+            {"timestamp":1616020718760,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Five","suit":"Hearts"}}},
+            {"timestamp":1616020718761,"username":"pete","action":{"action":"WinTrick"}},
+            {"timestamp":1616020722676,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Ace","suit":"Spades"}}},
+            {"timestamp":1616020725578,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Jack","suit":"Spades"}}},
+            {"timestamp":1616020727140,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Seven","suit":"Spades"}}},
+            {"timestamp":1616020727141,"username":"pete","action":{"action":"WinTrick"}},
+            {"timestamp":1616020728059,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Ace","suit":"Diamonds"}}},
+            {"timestamp":1616020729567,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Eight","suit":"Diamonds"}}},
+            {"timestamp":1616020730235,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Seven","suit":"Clubs"}}},
+            {"timestamp":1616020730236,"username":"pete","action":{"action":"WinTrick"}},
+            {"timestamp":1616020730236,"username":"pete","action":{"action":"WinCall"}},
+            {"timestamp":1616020730237,"username":"geoff","action":{"action":"NextToDeal"}},
+            {"timestamp":1616020730237,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Three","suit":"Hearts"}}},
+            {"timestamp":1616020730238,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Two","suit":"Clubs"}}},
+            {"timestamp":1616020730238,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Queen","suit":"Diamonds"}}},
+            {"timestamp":1616020730239,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Eight","suit":"Hearts"}}},
+            {"timestamp":1616020730239,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Four","suit":"Diamonds"}}},
+            {"timestamp":1616020730240,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Two","suit":"Spades"}}},
+            {"timestamp":1616020730240,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Queen","suit":"Clubs"}}},
+            {"timestamp":1616020730241,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"King","suit":"Hearts"}}},
+            {"timestamp":1616020730241,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Jack","suit":"Clubs"}}},
+            {"timestamp":1616020730242,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Queen","suit":"Hearts"}}},
+            {"timestamp":1616020730242,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Nine","suit":"Spades"}}},
+            {"timestamp":1616020730242,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Five","suit":"Diamonds"}}},
+            {"timestamp":1616020730243,"username":"geoff","action":{"action":"EndDeal"}},
+            {"timestamp":1616020740399,"username":"pete","action":{"action":"ChooseTrumps","suit":"Clubs"}},
+            {"timestamp":1616020742365,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Queen","suit":"Hearts"}}},
+            {"timestamp":1616020744021,"username":"mack","action":{"action":"PlayCard","card":{"rank":"King","suit":"Hearts"}}},
+            {"timestamp":1616020747144,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Jack","suit":"Clubs"}}},
+            {"timestamp":1616020747145,"username":"geoff","action":{"action":"WinTrick"}},
+            {"timestamp":1616020748544,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Queen","suit":"Diamonds"}}},
+            {"timestamp":1616020751349,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Queen","suit":"Clubs"}}},
+            {"timestamp":1616020753943,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Four","suit":"Diamonds"}}},
+            {"timestamp":1616020753944,"username":"pete","action":{"action":"WinTrick"}},
+            {"timestamp":1616020756369,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Eight","suit":"Hearts"}}},
+            {"timestamp":1616020758704,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Two","suit":"Clubs"}}},
+            {"timestamp":1616020759929,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Five","suit":"Diamonds"}}},
+            {"timestamp":1616020759929,"username":"mack","action":{"action":"WinTrick"}},
+            {"timestamp":1616020762159,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Nine","suit":"Spades"}}},
+            {"timestamp":1616020763052,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Two","suit":"Spades"}}},
+            {"timestamp":1616020763854,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Three","suit":"Hearts"}}},
+            {"timestamp":1616020763855,"username":"mack","action":{"action":"WinTrick"}},
+            {"timestamp":1616020763855,"username":"mack","action":{"action":"WinCall"}},
+            {"timestamp":1616020763855,"username":"pete","action":{"action":"NextToDeal"}},
+            {"timestamp":1616020763856,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Eight","suit":"Diamonds"}}},
+            {"timestamp":1616020763856,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Five","suit":"Clubs"}}},
+            {"timestamp":1616020763857,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Eight","suit":"Clubs"}}},
+            {"timestamp":1616020763857,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Five","suit":"Spades"}}},
+            {"timestamp":1616020763858,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Two","suit":"Clubs"}}},
+            {"timestamp":1616020763858,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Ten","suit":"Hearts"}}},
+            {"timestamp":1616020763859,"username":"mack","action":{"action":"ReceiveCard","card":{"rank":"Four","suit":"Diamonds"}}},
+            {"timestamp":1616020763859,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Ace","suit":"Spades"}}},
+            {"timestamp":1616020763859,"username":"pete","action":{"action":"ReceiveCard","card":{"rank":"Queen","suit":"Clubs"}}},
+            {"timestamp":1616020763860,"username":"pete","action":{"action":"EndDeal"}},
+            {"timestamp":1616020771703,"username":"mack","action":{"action":"ChooseTrumps","suit":"Diamonds"}},
+            {"timestamp":1616020773023,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Eight","suit":"Diamonds"}}},
+            {"timestamp":1616020775380,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Two","suit":"Clubs"}}},
+            {"timestamp":1616020776571,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Eight","suit":"Clubs"}}},
+            {"timestamp":1616020776572,"username":"mack","action":{"action":"WinTrick"}},
+            {"timestamp":1616020777516,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Four","suit":"Diamonds"}}},
+            {"timestamp":1616020779481,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Five","suit":"Clubs"}}},
+            {"timestamp":1616020781587,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Ten","suit":"Hearts"}}},
+            {"timestamp":1616020781588,"username":"mack","action":{"action":"WinTrick"}},
+            {"timestamp":1616020783419,"username":"mack","action":{"action":"PlayCard","card":{"rank":"Five","suit":"Spades"}}},
+            {"timestamp":1616020784003,"username":"geoff","action":{"action":"PlayCard","card":{"rank":"Ace","suit":"Spades"}}},
+            {"timestamp":1616020784795,"username":"pete","action":{"action":"PlayCard","card":{"rank":"Queen","suit":"Clubs"}}},
+            {"timestamp":1616020784795,"username":"geoff","action":{"action":"WinTrick"}},
+            {"timestamp":1616020784796,"username":"pete","action":{"action":"KnockedOut"}},
+            {"timestamp":1616020784796,"username":"mack","action":{"action":"WinCall"}},
+            {"timestamp":1616020784797,"username":"mack","action":{"action":"NextToDeal"}}
+        ]"#;
+        let actions = serde_json::from_str(actions).unwrap();
+
+        let settings = r#"{"format":"KnockOutWhist","title":"Exciting Kingdom","max_players":4}"#;
+        let settings = serde_json::from_str(settings).unwrap();
+
+        let seed = r#"{"rng":"ChaCha20","seed":"95dfa7caf75556fddc24ace55625ded8eb58ca2ea5bcb68f91b405b721b0e8e8"}"#;
+        let seed = serde_json::from_str(seed).unwrap();
+
+        test_game(actions, settings, seed);
+    }
 }
index 22588ee72280a846412e90f20d3c5a5dd7f135b6..d959437a3cfae9d6493e12b6b1fa3085e1cf08fb 100644 (file)
@@ -41,6 +41,16 @@ impl Seats {
         }
     }
 
+    fn player_before_seat(&self, seat: u32) -> Option<Username> {
+        if let Some((_, &name)) = self.players.range(..seat).next_back() {
+            Some(name)
+        } else if let Some((_, &name)) = self.players.range(seat + 1..).next_back() {
+            Some(name)
+        } else {
+            None
+        }
+    }
+
     pub fn player_after_where(&self, username: Username, condition: impl Fn(Username) -> bool) -> Option<Username> {
         for (&seat, &player) in &self.players {
             if player == username {
@@ -69,6 +79,15 @@ impl Seats {
         None
     }
 
+    pub fn player_before(&self, username: Username) -> Option<Username> {
+        for (&seat, &player) in &self.players {
+            if player == username {
+                return self.player_before_seat(seat);
+            }
+        }
+        None
+    }
+
     pub fn contains_player(&self, username: Username) -> bool {
         for &player in self.players.values() {
             if player == username {