gui: fixed broken watcher view mode (closes #11481)

This commit is contained in:
Oleg Agafonov 2023-11-28 08:03:58 +04:00
parent 6a1f4a35d4
commit 2eac541b80
8 changed files with 125 additions and 41 deletions

View file

@ -104,8 +104,8 @@ public class LoadCallbackClient implements CallbackClient {
session.sendPlayerUUID(gameId, playerId);
return;
case "Select a card to discard":
log.info(getLogStartInfo() + "hand size: " + gameView.getHand().size());
SimpleCardView card = gameView.getHand().values().iterator().next();
log.info(getLogStartInfo() + "hand size: " + gameView.getMyHand().size());
SimpleCardView card = gameView.getMyHand().values().iterator().next();
session.sendPlayerUUID(gameId, card.getId());
return;
default:

View file

@ -27,8 +27,8 @@ public class CardIconsTest extends CardTestPlayerBase {
// hand (not visible)
runCode("card icons in hand", 1, PhaseStep.PRECOMBAT_MAIN, playerA, (info, player, game) -> {
GameView gameView = getGameView(player);
Assert.assertEquals("must have 1 card in hand", 1, gameView.getHand().values().size());
CardView cardView = gameView.getHand().values().stream().findFirst().get();
Assert.assertEquals("must have 1 card in hand", 1, gameView.getMyHand().values().size());
CardView cardView = gameView.getMyHand().values().stream().findFirst().get();
Assert.assertEquals("must have non x cost card icons in hand", 0, cardView.getCardIcons().size());
});
@ -224,8 +224,8 @@ public class CardIconsTest extends CardTestPlayerBase {
// hand (not visible)
runCode("card icons in hand", 1, PhaseStep.PRECOMBAT_MAIN, playerA, (info, player, game) -> {
GameView gameView = getGameView(player);
Assert.assertEquals("must have 1 card in hand", 1, gameView.getHand().values().size());
CardView cardView = gameView.getHand().values().stream().findFirst().get();
Assert.assertEquals("must have 1 card in hand", 1, gameView.getMyHand().values().size());
CardView cardView = gameView.getMyHand().values().stream().findFirst().get();
Assert.assertEquals("must have non x cost card icons in hand", 0, cardView.getCardIcons().size());
});
@ -296,7 +296,7 @@ public class CardIconsTest extends CardTestPlayerBase {
// hand (not visible)
runCode("card icons in hand", 1, PhaseStep.PRECOMBAT_MAIN, playerA, (info, player, game) -> {
GameView gameView = getGameView(player);
CardView cardView = gameView.getHand().values().stream()
CardView cardView = gameView.getMyHand().values().stream()
.filter(c -> c.getName().equals("Agadeem's Awakening"))
.findFirst()
.orElse(null);

View file

@ -0,0 +1,68 @@
package org.mage.test.serverside;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.view.GameView;
import org.junit.Assert;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
import java.util.UUID;
/**
* @author JayDi85
*/
public class GameViewTest extends CardTestPlayerBase {
@Test
public void test_GameViewForPlayersAndWatchers() {
addCard(Zone.HAND, playerA, "Forest", 1);
setStrictChooseMode(true);
setStopAt(1, PhaseStep.END_TURN);
execute();
UUID userA = UUID.randomUUID();
UUID userB = UUID.randomUUID();
UUID userWatcher = UUID.randomUUID();
// normal hand
GameView gameView = getGameView(playerA, userA);
Assert.assertNotNull(gameView);
Assert.assertNotNull(gameView.getMyHand());
Assert.assertEquals(1, gameView.getMyHand().size());
Assert.assertEquals("Forest", gameView.getMyHand().values().stream().findFirst().get().getName());
Assert.assertEquals(0, gameView.getLookedAt().size());
Assert.assertEquals(0, gameView.getRevealed().size());
Assert.assertEquals(0, gameView.getWatchedHands().size());
// empty hand
gameView = getGameView(playerB, userB);
Assert.assertNotNull(gameView);
Assert.assertNotNull(gameView.getMyHand());
Assert.assertEquals(0, gameView.getMyHand().size());
Assert.assertEquals(0, gameView.getLookedAt().size());
Assert.assertEquals(0, gameView.getRevealed().size());
Assert.assertEquals(0, gameView.getWatchedHands().size());
// watcher hand
gameView = getGameView(null, userWatcher);
Assert.assertNotNull(gameView);
Assert.assertNotNull(gameView.getMyHand());
Assert.assertEquals(0, gameView.getMyHand().size());
Assert.assertEquals(0, gameView.getLookedAt().size());
Assert.assertEquals(0, gameView.getRevealed().size());
Assert.assertEquals(0, gameView.getWatchedHands().size());
// A gives access to hand for B and watcher
playerA.addPermissionToShowHandCards(userB);
playerA.addPermissionToShowHandCards(userWatcher);
gameView = getGameView(playerA, userA);
Assert.assertEquals(0, gameView.getWatchedHands().size());
gameView = getGameView(playerB, userB);
Assert.assertEquals(1, gameView.getWatchedHands().size());
gameView = getGameView(null, userWatcher);
Assert.assertEquals(1, gameView.getWatchedHands().size());
}
}

View file

@ -2222,9 +2222,20 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
Assert.assertFalse(player.getName() + " has lost the game.", player.hasLost());
}
/**
* Prepare GameView from current game (for client side code tests)
*
* @param player null for watcher mode
*/
public GameView getGameView(Player player) {
// prepare client-server data for tests
return GameSessionPlayer.prepareGameView(currentGame, player.getId(), null);
UUID playerId = player == null ? null : player.getId();
return GameSessionPlayer.prepareGameView(currentGame, playerId, playerId);
}
public GameView getGameView(Player player, UUID userId) {
// prepare client-server data for tests
return GameSessionPlayer.prepareGameView(currentGame, player == null ? null : player.getId(), userId);
}
protected enum ExpectedType {