/* Tests for a constraint triggered by red, and ensure that it will expire
  * Bug seen in UI.*/
 @Test
 public void testYellowYellowRed() throws InvalidMoveException, JMSException {
   ManantialesFicha a1 = new ManantialesFicha(3, 4, alice.getColor(), TokenType.MODERATE_PASTURE);
   ManantialesFicha a2 = new ManantialesFicha(2, 4, alice.getColor(), TokenType.MODERATE_PASTURE);
   ManantialesFicha trigger =
       new ManantialesFicha(0, 4, charlie.getColor(), TokenType.MODERATE_PASTURE);
   ManantialesFicha sp1 = new ManantialesFicha(5, 7, denise.getColor(), TokenType.MANAGED_FOREST);
   ManantialesFicha sp2 = new ManantialesFicha(1, 1, alice.getColor(), TokenType.MODERATE_PASTURE);
   ManantialesFicha expiry = new ManantialesFicha(6, 0, bob.getColor(), TokenType.MANAGED_FOREST);
   SetIds(a1, a2, trigger, sp1, sp2, expiry);
   ManantialesMove move = new ManantialesMove(alice, a1);
   game.move(move);
   assertEquals(MoveStatus.EVALUATED, move.getStatus());
   alice.setTurn(true);
   assertEquals(MoveStatus.EVALUATED, move.getStatus());
   move = new ManantialesMove(alice, a2);
   game.move(move);
   assertEquals(MoveStatus.EVALUATED, move.getStatus());
   charlie.setTurn(true);
   move = new ManantialesMove(charlie, trigger);
   game.move(move);
   assertEquals(MoveStatus.EVALUATED, move.getStatus());
   List<Message> messages = filterForEvent(GameEvent.CONDITION_RAISED);
   assertEquals(1, messages.size());
   move = new ManantialesMove(denise, sp1);
   game.move(move);
   move = new ManantialesMove(alice, sp2);
   game.move(move);
   move = new ManantialesMove(bob, expiry);
   game.move(move);
   assertEquals(MoveStatus.EVALUATED, move.getStatus());
   messages = filterForEvent(GameEvent.CONDITION_TRIGGERED);
   assertEquals(1, messages.size());
 }
  @Test
  public void testManantialesCheckConstriantsRelieved() throws InvalidMoveException, JMSException {
    ManantialesFicha ficha =
        new ManantialesFicha(4, 3, alice.getColor(), TokenType.MODERATE_PASTURE);
    ManantialesFicha ficha2 =
        new ManantialesFicha(4, 5, bob.getColor(), TokenType.MODERATE_PASTURE);
    ManantialesFicha ficha3 =
        new ManantialesFicha(3, 4, charlie.getColor(), TokenType.MODERATE_PASTURE);
    ManantialesFicha relief =
        new ManantialesFicha(4, 3, alice.getColor(), TokenType.MANAGED_FOREST);
    ManantialesFicha retrigger =
        new ManantialesFicha(4, 3, alice.getColor(), TokenType.MODERATE_PASTURE);
    ManantialesFicha terminate =
        new ManantialesFicha(5, 5, denise.getColor(), TokenType.MODERATE_PASTURE);
    SetIds(ficha, ficha2, ficha3, retrigger, terminate);
    ManantialesMove move = new ManantialesMove(alice, ficha);
    move.setMode(game.getMode());
    Move mv = game.move(move);
    assertEquals(MoveStatus.EVALUATED, mv.getStatus());
    bob.setTurn(true);
    move = new ManantialesMove(bob, ficha2);
    mv = game.move(move);
    assertEquals(MoveStatus.EVALUATED, mv.getStatus());
    charlie.setTurn(true);
    move = new ManantialesMove(charlie, ficha3);
    mv = game.move(move);
    assertEquals(MoveStatus.EVALUATED, mv.getStatus());
    List filtered = filterForEvent(GameEvent.CONDITION_RAISED);
    assertTrue(filtered.size() == 1);
    alice.setTurn(true);
    move = new ManantialesMove(alice, ficha, relief);
    game.move(move);
    filtered = filterForEvent(GameEvent.CONDITION_RESOLVED);
    assertTrue("Actual size of filtered (expected 1): " + filtered.size(), filtered.size() == 1);
    filtered = filterForEvent(GameEvent.CONDITION_TRIGGERED);
    assertTrue(filtered.size() == 0);

    /* retrigger condition */
    alice.setTurn(true);
    move = new ManantialesMove(alice, relief, retrigger);
    game.move(move);
    filtered = filterForEvent(GameEvent.CONDITION_RAISED);
    assertTrue("filter size is: " + filtered.size(), filtered.size() == 2);
    /* allow condition to terminate game, i.e., TRIGGER */
    denise.setTurn(true);
    move = new ManantialesMove(denise, terminate);
    game.move(move);
    filtered = filterForEvent(GameEvent.CONDITION_TRIGGERED);
    assertTrue(filtered.size() == 1);
    assertTrue(game.getState().equals(GameState.ENDED));
  }
  @Test
  public void testRelieveIntensiveCheckConditionWithModerate()
      throws InvalidMoveException, JMSException {
    game.setMode(Mode.SILVO_PUZZLE);
    ManantialesFicha contig1 =
        new ManantialesFicha(5, 4, alice.getColor(), TokenType.INTENSIVE_PASTURE);
    ManantialesFicha contig2 =
        new ManantialesFicha(6, 4, alice.getColor(), TokenType.INTENSIVE_PASTURE);
    SetIds(contig1, contig2);
    GameGrid grid = game.getGrid();
    if (grid.isEmpty()) grid.setCells(new HashSet<GridCell>());
    game.getGrid().getCells().add(contig1);
    ManantialesMove move = new ManantialesMove(alice, contig2);
    game.move(move);
    assertEquals(MoveStatus.EVALUATED, move.getStatus());
    assertEquals(1, game.getCheckConditions().size());
    List<Message> messages = filterForEvent(GameEvent.CONDITION_RAISED);
    assertEquals(1, messages.size());

    alice.setTurn(true);
    ManantialesFicha relief =
        new ManantialesFicha(5, 4, alice.getColor(), TokenType.MODERATE_PASTURE);
    move = new ManantialesMove(alice, contig1, relief);
    game.move(move);
    assertEquals(MoveStatus.EVALUATED, move.getStatus());
    assertEquals(
        Arrays.toString(game.getCheckConditions().toArray()), 0, game.getCheckConditions().size());
    messages = filterForEvent(GameEvent.CONDITION_RESOLVED);
    assertEquals(1, messages.size());
  }
 /**
  * Test on ManantialesGame for setting check constraints
  *
  * @throws InvalidMoveException
  */
 @Test
 public void testManantialCheckConstraints() throws InvalidMoveException {
   ManantialesFicha ficha =
       new ManantialesFicha(4, 3, alice.getColor(), TokenType.MODERATE_PASTURE);
   ManantialesFicha ficha2 =
       new ManantialesFicha(4, 5, bob.getColor(), TokenType.MODERATE_PASTURE);
   ManantialesFicha ficha3 =
       new ManantialesFicha(3, 4, charlie.getColor(), TokenType.MODERATE_PASTURE);
   SetIds(ficha, ficha2, ficha3);
   ManantialesMove move = new ManantialesMove(alice, ficha);
   move.setMode(game.getMode());
   Move mv = game.move(move);
   assertEquals(MoveStatus.EVALUATED, mv.getStatus());
   bob.setTurn(true);
   move = new ManantialesMove(bob, ficha2);
   mv = game.move(move);
   assertEquals(MoveStatus.EVALUATED, mv.getStatus());
   charlie.setTurn(true);
   move = new ManantialesMove(charlie, ficha3);
   mv = game.move(move);
   assertEquals(MoveStatus.EVALUATED, mv.getStatus());
   assertEquals(1, game.getCheckConditions().size());
 }
 private void move(ManantialesFicha... moves) throws InvalidMoveException {
   for (ManantialesFicha f : moves) {
     ManantialesPlayer player = null;
     for (GridPlayer p : game.getPlayers()) {
       if (p.getColor().equals(f.getColor())) {
         player = (ManantialesPlayer) p;
         break;
       }
     }
     stripTurns();
     player.setTurn(true);
     ManantialesMove m = new ManantialesMove(player, f);
     game.move(m);
   }
 }
  @Test
  public void testRelieveEastCheckConstraintsWithActiveManantialesConstraint()
      throws InvalidMoveException, JMSException {

    /* Northern Constraint */
    ManantialesFicha nFicha =
        new ManantialesFicha(4, 3, alice.getColor(), TokenType.MODERATE_PASTURE);
    ManantialesFicha nFicha2 =
        new ManantialesFicha(4, 1, charlie.getColor(), TokenType.MODERATE_PASTURE);
    ManantialesFicha nFicha3 =
        new ManantialesFicha(4, 2, charlie.getColor(), TokenType.MODERATE_PASTURE);

    /* Manantials Constraint */
    ManantialesFicha mFicha =
        new ManantialesFicha(4, 5, bob.getColor(), TokenType.MODERATE_PASTURE);
    /* Trigger */
    ManantialesFicha mFicha2 =
        new ManantialesFicha(3, 4, charlie.getColor(), TokenType.MODERATE_PASTURE);

    SetIds(nFicha, nFicha2, nFicha3, mFicha, mFicha2);
    move(nFicha, nFicha2, nFicha3, mFicha2);
    List<Message> messages = filterForEvent(GameEvent.CONDITION_RAISED);
    assertEquals(1, messages.size());

    /* Trigger Manantiales condition */
    stripTurns();
    bob.setTurn(true);
    ManantialesMove move = new ManantialesMove(bob, mFicha);
    assertTrue(move.isManantial());
    game.move(move);
    assertEquals(MoveStatus.EVALUATED, move.getStatus());

    messages = filterForEvent(GameEvent.CONDITION_TRIGGERED);
    assertEquals(1, messages.size());

    messages = filterForEvent(GameEvent.CONDITION_RAISED);
    assertEquals(2, messages.size());

    /* Check that expired Northern border constraint resolved Manantiales condition */
    messages = filterForEvent(GameEvent.CONDITION_RESOLVED);
    assertEquals(1, messages.size());
  }