Coverage Summary for Class: OrderLogicCard (it.polimi.ingsw.gc14.Model)

Class Class, % Method, % Branch, % Line, %
OrderLogicCard 100% (1/1) 80% (8/10) 91.7% (11/12) 86.7% (26/30)


 package it.polimi.ingsw.gc14.Model;
 
 import it.polimi.ingsw.gc14.Model.Orders.OrderPlayer;
 
 import java.io.Serializable;
 import java.util.*;
 
 /**
  * Abstract base class for all order logic cards.
  *
  * <p>An order logic card manages the turn order of the players and defines
  * the behavior used to update the order during the game.
  */
 public abstract class OrderLogicCard implements Serializable {
 
     /**
      * The queue of {@link Player Players} associated with this order logic card.
      */
     private final Queue<Player> players;
 
     /**
      * The list of {@link OrderPlayer} entries tracking turn order and played status.
      * Protected so subclasses can read it for display purposes (e.g., {@link #toString()}).
      */
     protected final List<OrderPlayer> playerList;
 
     /**
      * Returns an unmodifiable view of the player order list.
      *
      * @return the list of {@link OrderPlayer} entries in turn order.
      */
     public List<OrderPlayer> getPlayerList() {
         return Collections.unmodifiableList(playerList);
     }
 
 
 
     /**
      * Creates an order logic card with the specified list of players.
      *
      * <p>The input list is shuffled in place to establish a random initial turn order.
      * This is intentional: the caller's list (typically {@code Game.playersList}) is
      * reordered so that the game's canonical player sequence reflects the randomized order.
      *
      * @param players the list of players associated with this order logic card.
      *                <strong>The list is mutated (shuffled) by this constructor.</strong>
      */
     public OrderLogicCard(ArrayList<Player> players) {
         Collections.shuffle(players);
         this.players = new LinkedList<>(players);
         this.playerList = new ArrayList<>(players.stream().map(x -> new OrderPlayer(x, false)).toList());
     }
 
     /**
      * Applies the effect associated with the current queue position of the player
      * and then adds the player to the end of the queue.
      *
      * @param player the player to be pushed into the queue.
      */
     public void push(Player player) {
         effect(player, players.size());
         if (players.isEmpty()) {
             playerList.clear();
         }
         playerList.add(new OrderPlayer(player, false));
         players.add(player);
     }
 
     /**
      * Moves the specified player to the end of the queue without applying effects.
      *
      * <p>Any previous occurrence of the player is removed from both the queue
      * and the order list before the player is added again.
      *
      * @param player the player to be pushed into the queue.
      */
     public void pushNoEffect(Player player) {
         players.removeIf(x -> player.getUserName().equals(x.getUserName()));
         playerList.removeIf(x -> player.getUserName().equals(x.getPlayer().getUserName()));
         playerList.add(new OrderPlayer(player, false));
         players.add(player);
     }
 
     /**
      * Removes and returns the first player in the queue.
      *
      * <p>The first order entry that has not yet been marked as played
      * is marked as played before removing the player from the queue.
      *
      * @return the first player in the queue, or {@code null} if the queue is empty.
      */
     public Player pull() {
         for (OrderPlayer p : playerList) {
             if (!p.isPlayed()) {
                 p.markAsPlayed();
                 break;
             }
         }
         return players.poll();
     }
 
     /**
      * Returns the first player in the queue without removing it.
      *
      * @return the first player in the queue, or {@code null} if the queue is empty.
      */
     public Player getFirst()
     {
         return players.peek();
     }
 
     /**
      * Applies the effect associated with the specified player and queue position.
      *
      * @param player the player to whom the effect is applied.
      * @param index the queue position index associated with the effect.
      * @throws IndexOutOfBoundsException if the specified index is not valid.
      */
     protected abstract void effect(Player player, int index) throws IndexOutOfBoundsException;
 
     /**
      * Applies the building-related effect to the specified player.
      * For each building card owned by the player with effect id equal to 3,
      * the player gains 1 Food.
      *
      * @param player the player to whom the building effect is applied.
      */
     protected void buildingEffect(Player player) {
         long count = player.getBuildingCards().stream().filter(x -> x.getEffectId() == 3).count();
         player.addFood((int) count);
     }
 
     /**
      * Returns whether the given player is currently present in the turn queue.
      *
      * @param player the player to look up.
      * @return {@code true} if the player is in the queue; {@code false} otherwise.
      */
     public boolean containsInQueue(Player player) {
         return players.contains(player);
     }
 
     /**
      * Removes the given player from both the turn queue and the order list.
      * No-op if the player is not present.
      *
      * @param player the player to remove.
      */
     public void removeFromQueue(Player player) {
         players.removeIf(x -> x.equals(player));
         playerList.removeIf(x -> x.getPlayer().equals(player));
     }
 
     /**
      * Returns the position of the player associated with the specified username
      * within the current order list.
      *
      * @param username the username of the player whose position is requested.
      * @return the player's position, or {@code -1} if no player with the specified
      *         username is present in the order list.
      * @see Player
      */
     public int getPosition(String username) {
         int pos = 0;
         for (OrderPlayer p : playerList) {
             if (p.getPlayer().getUserName().equals(username))
                 return pos;
             pos++;
         }
         return -1;
     }
 
 
 }