// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

import "package:test/test.dart";
import "../lib/logic/hearts/hearts.dart";
import "../lib/logic/card.dart";

import "dart:io";

void main() {
  group("Initialization", () {
    HeartsGame game = new HeartsGame()..playerNumber = 0;
    game.phase = HeartsPhase.Deal;
    test("Dealing", () {
      game.dealCards(); // What the dealer actually runs to get cards to everybody.

      // By virtue of creating the game, HeartsGame should have 4 collections with 13 cards and 8 collections with 0 cards each.
      expect(
          game.cardCollections[HeartsGame.PLAYER_A + HeartsGame.OFFSET_HAND]
              .length,
          equals(13),
          reason: "Dealt 13 cards to A");
      expect(
          game.cardCollections[HeartsGame.PLAYER_B + HeartsGame.OFFSET_HAND]
              .length,
          equals(13),
          reason: "Dealt 13 cards to B");
      expect(
          game.cardCollections[HeartsGame.PLAYER_C + HeartsGame.OFFSET_HAND]
              .length,
          equals(13),
          reason: "Dealt 13 cards to C");
      expect(
          game.cardCollections[HeartsGame.PLAYER_D + HeartsGame.OFFSET_HAND]
              .length,
          equals(13),
          reason: "Dealt 13 cards to D");
      expect(
          game.cardCollections[HeartsGame.PLAYER_A + HeartsGame.OFFSET_PLAY]
              .length,
          equals(0),
          reason: "Not playing yet");
      expect(
          game.cardCollections[HeartsGame.PLAYER_B + HeartsGame.OFFSET_PLAY]
              .length,
          equals(0),
          reason: "Not playing yet");
      expect(
          game.cardCollections[HeartsGame.PLAYER_C + HeartsGame.OFFSET_PLAY]
              .length,
          equals(0),
          reason: "Not playing yet");
      expect(
          game.cardCollections[HeartsGame.PLAYER_D + HeartsGame.OFFSET_PLAY]
              .length,
          equals(0),
          reason: "Not playing yet");
      expect(
          game.cardCollections[HeartsGame.PLAYER_A + HeartsGame.OFFSET_PASS]
              .length,
          equals(0),
          reason: "Not passing yet");
      expect(
          game.cardCollections[HeartsGame.PLAYER_B + HeartsGame.OFFSET_PASS]
              .length,
          equals(0),
          reason: "Not passing yet");
      expect(
          game.cardCollections[HeartsGame.PLAYER_C + HeartsGame.OFFSET_PASS]
              .length,
          equals(0),
          reason: "Not passing yet");
      expect(
          game.cardCollections[HeartsGame.PLAYER_D + HeartsGame.OFFSET_PASS]
              .length,
          equals(0),
          reason: "Not passing yet");
      expect(
          game.cardCollections[HeartsGame.PLAYER_A + HeartsGame.OFFSET_TRICK]
              .length,
          equals(0),
          reason: "No tricks yet");
      expect(
          game.cardCollections[HeartsGame.PLAYER_B + HeartsGame.OFFSET_TRICK]
              .length,
          equals(0),
          reason: "No tricks yet");
      expect(
          game.cardCollections[HeartsGame.PLAYER_C + HeartsGame.OFFSET_TRICK]
              .length,
          equals(0),
          reason: "No tricks yet");
      expect(
          game.cardCollections[HeartsGame.PLAYER_D + HeartsGame.OFFSET_TRICK]
              .length,
          equals(0),
          reason: "No tricks yet");
    });
  });

  // For this test, the cards may end up being duplicate or inconsistent.
  group("Scoring", () {
    HeartsGame game = new HeartsGame()..playerNumber = 0;
    test("Compute/Prepare Score", () {
      // In this situation, what's the score?
      game.cardCollections[HeartsGame.PLAYER_A_TRICK] = <Card>[
        new Card("classic", "dq"),
        new Card("classic", "dk"),
        new Card("classic", "h1"),
        new Card("classic", "h2"),
        new Card("classic", "h3"),
        new Card("classic", "h4")
      ];

      expect(game.computeScore(HeartsGame.PLAYER_A), equals(4),
          reason: "Player A has 4 hearts");

      // In this alternative situation, what's the score?
      game.cardCollections[HeartsGame.PLAYER_B_TRICK] = <Card>[
        new Card("classic", "h6"),
        new Card("classic", "h7"),
        new Card("classic", "h8"),
        new Card("classic", "h9"),
        new Card("classic", "h10"),
        new Card("classic", "hj"),
        new Card("classic", "hq"),
        new Card("classic", "hk"),
        new Card("classic", "s1"),
        new Card("classic", "s2")
      ];

      expect(game.computeScore(HeartsGame.PLAYER_B), equals(8),
          reason: "Player B has 8 hearts.");

      // Should prepare C as well.
      game.cardCollections[HeartsGame.PLAYER_C_TRICK] = <Card>[
        new Card("classic", "h5"),
        new Card("classic", "sq")
      ];
      expect(game.computeScore(HeartsGame.PLAYER_C), equals(14),
          reason: "Player C has 1 heart and the queen of spades.");

      // Now, update the score, modifying game.scores.
      game.updateScore();
      expect(game.scores, equals([4, 8, 14, 0]));
      expect(game.deltaScores, equals([4, 8, 14, 0]));

      // Do it again.
      game.updateScore();
      expect(game.scores, equals([8, 16, 28, 0]));
      expect(game.deltaScores, equals([4, 8, 14, 0]));

      // Shoot the moon!
      game.cardCollections[HeartsGame.PLAYER_A_TRICK] = <Card>[];
      game.cardCollections[HeartsGame.PLAYER_B_TRICK] = <Card>[];
      game.cardCollections[HeartsGame.PLAYER_C_TRICK] = <Card>[];
      game.cardCollections[HeartsGame.PLAYER_D_TRICK] = Card.All;
      game.updateScore();
      expect(game.scores, equals([34, 42, 54, 0]));
      expect(game.deltaScores, equals([26, 26, 26, 0]));
    });
  });

  group("Game Over", () {
    HeartsGame game = new HeartsGame()..playerNumber = 0;

    test("Has the game ended? Yes", () {
      // Check if the game has ended. Should be yes.
      game.scores = <int>[HeartsGame.MAX_SCORE + 5, 40, 35, 0];
      expect(game.hasGameEnded, isTrue);
    });
    test("Has the game ended? No", () {
      // Check if the game has ended. Should be no.
      game.scores = <int>[HeartsGame.MAX_SCORE - 5, 40, 35, 0];
      expect(game.hasGameEnded, isFalse);
    });
  });

  // At this point, we should prepare the canonical game by setting up state and
  // performing a single action or set of actions.
  // Reads from a log, so we will go through logical game mechanics.
  group("Card Manipulation", () {
    HeartsGame game = new HeartsGame()..playerNumber = 0;

    // Note: This could have been a non-file (in-memory), but it's fine to use a file too.
    File file = new File("test/game_log_hearts_test.txt");
    List<String> commands = file.readAsStringSync().split("\n");
    int commandIndex = 0;

    void runCommand() {
      String c = commands[commandIndex];
      commandIndex++;
      if (c == "" || c[0] == "#") {
        // Essentially, this case allows empty lines and comments.
        runCommand();
      } else {
        game.gamelog.add(new HeartsCommand.fromCommand(c));
      }
    }

    test("Start Game Phase", () {
      expect(game.phase, equals(HeartsPhase.StartGame));

      // Start Game consists of 4 ready commands.
      runCommand();
      runCommand();
      runCommand();
      runCommand();
    });

    test("Deal Phase", () {
      expect(game.phase, equals(HeartsPhase.Deal));

      // Deal consists of 4 deal commands.
      runCommand();
      runCommand();
      runCommand();
      runCommand();

      // Confirm cards in hands.
      List<Card> expectedAHand =
          new List<Card>.from(Card.All.getRange(26, 26 + 5))
            ..addAll(Card.All.getRange(13 + 5, 26));
      List<Card> expectedBHand =
          new List<Card>.from(Card.All.getRange(13, 13 + 5))
            ..addAll(Card.All.getRange(39 + 5, 52));
      List<Card> expectedCHand =
          new List<Card>.from(Card.All.getRange(39, 39 + 5))
            ..addAll(Card.All.getRange(0 + 5, 13));
      List<Card> expectedDHand =
          new List<Card>.from(Card.All.getRange(0, 0 + 5))
            ..addAll(Card.All.getRange(26 + 5, 39));
      expect(game.cardCollections[HeartsGame.PLAYER_A], equals(expectedAHand));
      expect(game.cardCollections[HeartsGame.PLAYER_B], equals(expectedBHand));
      expect(game.cardCollections[HeartsGame.PLAYER_C], equals(expectedCHand));
      expect(game.cardCollections[HeartsGame.PLAYER_D], equals(expectedDHand));
    });
    test("Pass Phase", () {
      expect(game.phase, equals(HeartsPhase.Pass));

      // Pass consists of 4 pass commands.
      runCommand();
      runCommand();
      runCommand();
      runCommand();

      // Confirm cards in hands and passes.
      List<Card> expectedAHand =
          new List<Card>.from(Card.All.getRange(26 + 3, 26 + 5))
            ..addAll(Card.All.getRange(13 + 5, 26));
      List<Card> expectedBHand =
          new List<Card>.from(Card.All.getRange(13 + 3, 13 + 5))
            ..addAll(Card.All.getRange(39 + 5, 52));
      List<Card> expectedCHand =
          new List<Card>.from(Card.All.getRange(39 + 3, 39 + 5))
            ..addAll(Card.All.getRange(0 + 5, 13));
      List<Card> expectedDHand =
          new List<Card>.from(Card.All.getRange(0 + 3, 0 + 5))
            ..addAll(Card.All.getRange(26 + 5, 39));
      List<Card> expectedAPass =
          new List<Card>.from(Card.All.getRange(26, 26 + 3));
      List<Card> expectedBPass =
          new List<Card>.from(Card.All.getRange(13, 13 + 3));
      List<Card> expectedCPass =
          new List<Card>.from(Card.All.getRange(39, 39 + 3));
      List<Card> expectedDPass =
          new List<Card>.from(Card.All.getRange(0, 0 + 3));
      expect(game.cardCollections[HeartsGame.PLAYER_A], equals(expectedAHand));
      expect(game.cardCollections[HeartsGame.PLAYER_B], equals(expectedBHand));
      expect(game.cardCollections[HeartsGame.PLAYER_C], equals(expectedCHand));
      expect(game.cardCollections[HeartsGame.PLAYER_D], equals(expectedDHand));
      expect(game.cardCollections[HeartsGame.PLAYER_A_PASS],
          equals(expectedAPass));
      expect(game.cardCollections[HeartsGame.PLAYER_B_PASS],
          equals(expectedBPass));
      expect(game.cardCollections[HeartsGame.PLAYER_C_PASS],
          equals(expectedCPass));
      expect(game.cardCollections[HeartsGame.PLAYER_D_PASS],
          equals(expectedDPass));
    });
    test("Take Phase", () {
      expect(game.phase, equals(HeartsPhase.Take));

      // Take consists of 4 take commands.
      runCommand();
      runCommand();
      runCommand();
      runCommand();

      // Confirm cards in hands again.
      // Note: I will eventually want to do a sorted comparison or set comparison instead.
      List<Card> expectedAHand =
          new List<Card>.from(Card.All.getRange(26 + 3, 26 + 5))
            ..addAll(Card.All.getRange(13 + 5, 26))
            ..addAll(Card.All.getRange(13, 13 + 3));
      List<Card> expectedBHand =
          new List<Card>.from(Card.All.getRange(13 + 3, 13 + 5))
            ..addAll(Card.All.getRange(39 + 5, 52))
            ..addAll(Card.All.getRange(39, 39 + 3));
      List<Card> expectedCHand =
          new List<Card>.from(Card.All.getRange(39 + 3, 39 + 5))
            ..addAll(Card.All.getRange(0 + 5, 13))
            ..addAll(Card.All.getRange(0, 0 + 3));
      List<Card> expectedDHand =
          new List<Card>.from(Card.All.getRange(0 + 3, 0 + 5))
            ..addAll(Card.All.getRange(26 + 5, 39))
            ..addAll(Card.All.getRange(26, 26 + 3));
      expect(game.cardCollections[HeartsGame.PLAYER_A], equals(expectedAHand));
      expect(game.cardCollections[HeartsGame.PLAYER_B], equals(expectedBHand));
      expect(game.cardCollections[HeartsGame.PLAYER_C], equals(expectedCHand));
      expect(game.cardCollections[HeartsGame.PLAYER_D], equals(expectedDHand));
    });
    test("Play Phase - Trick 1", () {
      expect(game.phase, equals(HeartsPhase.Play));

      // Play Trick 1 consists of 4 play commands.
      runCommand();
      runCommand();
      runCommand();
      runCommand();

      // Confirm the winner of the round.
      expect(game.lastTrickTaker, equals(3),
          reason: "Player 3 played 4 of Clubs");
      expect(game.cardCollections[HeartsGame.PLAYER_D_TRICK].length, equals(4),
          reason: "Player 3 won 1 trick.");
    });
    test("Play Phase - Trick 2", () {
      expect(game.phase, equals(HeartsPhase.Play));

      // Play Trick 2 consists of 4 play commands.
      runCommand();
      runCommand();
      runCommand();
      runCommand();

      // Confirm the winner of the round.
      expect(game.lastTrickTaker, equals(2),
          reason: "Player 2 played Ace of Clubs");
      expect(game.cardCollections[HeartsGame.PLAYER_C_TRICK].length, equals(4),
          reason: "Player 2 won 1 trick.");
      expect(game.cardCollections[HeartsGame.PLAYER_D_TRICK].length, equals(4),
          reason: "Player 3 won 1 trick.");
    });
    test("Play Phase - Trick 13", () {
      expect(game.phase, equals(HeartsPhase.Play));

      // Play Trick 13 consists of 44 play commands.
      // Read line by line until the game is "over".
      for (int i = 8; i < 52; i++) {
        runCommand();
      }

      // Assert that hands/plays/passes are empty.
      expect(
          game.cardCollections[HeartsGame.PLAYER_A + HeartsGame.OFFSET_HAND]
              .length,
          equals(0),
          reason: "Played all cards");
      expect(
          game.cardCollections[HeartsGame.PLAYER_B + HeartsGame.OFFSET_HAND]
              .length,
          equals(0),
          reason: "Played all cards");
      expect(
          game.cardCollections[HeartsGame.PLAYER_C + HeartsGame.OFFSET_HAND]
              .length,
          equals(0),
          reason: "Played all cards");
      expect(
          game.cardCollections[HeartsGame.PLAYER_D + HeartsGame.OFFSET_HAND]
              .length,
          equals(0),
          reason: "Played all cards");

      // Check that all 52 cards are in tricks.
      expect(game.lastTrickTaker, equals(0),
          reason: "Player 0 won the last trick.");
      expect(
          game.cardCollections[HeartsGame.PLAYER_A_TRICK].length, equals(4 * 8),
          reason: "Player 0 won 8 tricks.");
      expect(
          game.cardCollections[HeartsGame.PLAYER_B_TRICK].length, equals(4 * 2),
          reason: "Player 1 won 2 tricks.");
      expect(
          game.cardCollections[HeartsGame.PLAYER_C_TRICK].length, equals(4 * 2),
          reason: "Player 2 won 2 tricks.");
      expect(game.cardCollections[HeartsGame.PLAYER_D_TRICK].length, equals(4),
          reason: "Player 3 won 1 trick.");
    });
    test("Score Phase", () {
      expect(game.phase, equals(HeartsPhase.Score));

      // Check score to ensure it matches the expectation.
      expect(game.scores, equals([21, 3, 2, 0]));
      expect(game.deltaScores, equals([21, 3, 2, 0]));

      // Score consists of 4 ready commands.
      runCommand();
      expect(game.allReady, isFalse);
      runCommand();
      expect(game.allReady, isFalse);
      runCommand();
      expect(game.allReady, isFalse);
      runCommand();

      // Back to the deal phase once everyone indicates that they are ready.
      expect(game.phase, equals(HeartsPhase.Deal));
    });
    test("Score Phase - end of game", () {
      expect(game.hasGameEnded, isFalse);

      // 2nd Round: 4 deal, 4 pass, 4 take, 52 play, 4 ready
      // Player A will shoot the moon for all remaining games (for simplicity).
      for (int i = 0; i < 68; i++) {
        runCommand();
      }
      expect(game.scores, equals([21 + 0, 3 + 26, 2 + 26, 0 + 26]));
      expect(game.hasGameEnded, isFalse);

      // 3rd Round: 4 deal, 4 pass, 4 take, 52 play, 4 ready
      for (int i = 0; i < 68; i++) {
        runCommand();
      }
      expect(game.scores,
          equals([21 + 0 + 0, 3 + 26 + 26, 2 + 26 + 26, 0 + 26 + 26]));
      expect(game.hasGameEnded, isFalse);

      // 4th Round: 4 deal, 52 play, 4 ready
      for (int i = 0; i < 60; i++) {
        runCommand();
      }
      expect(
          game.scores,
          equals([
            21 + 0 + 0 + 0,
            3 + 26 + 26 + 26,
            2 + 26 + 26 + 26,
            0 + 26 + 26 + 26
          ]));
      expect(game.deltaScores, equals([0, 26, 26, 26]));
      expect(game.hasGameEnded, isFalse);

      // 5th round: 4 deal, 4 pass, 4 take, 52 play. Game is over, so no ready phase.
      for (int i = 0; i < 64; i++) {
        runCommand();
      }
      expect(
          game.scores,
          equals([
            21 + 0 + 0 + 0 + 0,
            3 + 26 + 26 + 26 + 26,
            2 + 26 + 26 + 26 + 26,
            0 + 26 + 26 + 26 + 26
          ]));
      expect(game.deltaScores, equals([0, 26, 26, 26]));
      expect(game.hasGameEnded,
          isTrue); // assumes game ends after about 100 points.
    });
  });

  group("Card Manipulation - Error Cases", () {
    test("Dealing - too soon", () {
      HeartsGame game = new HeartsGame()..playerNumber = 0;
      expect(game.phase, HeartsPhase.StartGame);
      expect(() {
        game.gamelog.add(new HeartsCommand.deal(
            0, new List<Card>.from(Card.All.getRange(0, 13))));
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Dealing - wrong phase", () {
      HeartsGame game = new HeartsGame()..playerNumber = 0;
      game.phase = HeartsPhase.Score;
      expect(() {
        game.gamelog.add(new HeartsCommand.deal(
            0, new List<Card>.from(Card.All.getRange(0, 13))));
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Dealing - missing card", () {
      HeartsGame game = new HeartsGame()..playerNumber = 0;
      game.phase = HeartsPhase.Deal;
      expect(() {
        game.gamelog.add(
            new HeartsCommand.deal(0, <Card>[new Card("fake", "not real")]));
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Dealing - too many cards dealt", () {
      HeartsGame game = new HeartsGame()..playerNumber = 0;
      game.phase = HeartsPhase.Deal;
      expect(() {
        game.gamelog.add(new HeartsCommand.deal(
            0, new List<Card>.from(Card.All.getRange(0, 15))));
      }, throwsA(new isInstanceOf<StateError>()));

      game = new HeartsGame()..playerNumber = 0;
      game.phase = HeartsPhase.Deal;
      expect(() {
        game.gamelog.add(new HeartsCommand.deal(
            0, new List<Card>.from(Card.All.getRange(0, 5))));
        game.gamelog.add(new HeartsCommand.deal(
            0, new List<Card>.from(Card.All.getRange(5, 15))));
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Passing - wrong phase", () {
      HeartsGame game = new HeartsGame()..playerNumber = 0;
      game.phase = HeartsPhase.Deal;
      game.gamelog.add(new HeartsCommand.deal(
          0, new List<Card>.from(Card.All.getRange(0, 13))));
      expect(() {
        game.gamelog.add(new HeartsCommand.pass(
            0, new List<Card>.from(Card.All.getRange(0, 4))));
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Passing - missing card", () {
      HeartsGame game = new HeartsGame()..playerNumber = 0;
      game.phase = HeartsPhase.Deal;
      game.gamelog.add(new HeartsCommand.deal(
          0, new List<Card>.from(Card.All.getRange(0, 13))));
      game.phase = HeartsPhase.Pass;
      expect(() {
        game.gamelog.add(new HeartsCommand.pass(
            0, new List<Card>.from(Card.All.getRange(13, 16))));
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Passing - wrong number of cards", () {
      HeartsGame game = new HeartsGame()..playerNumber = 0;
      game.phase = HeartsPhase.Deal;
      game.gamelog.add(new HeartsCommand.deal(
          0, new List<Card>.from(Card.All.getRange(0, 13))));
      game.phase = HeartsPhase.Pass;
      expect(() {
        game.gamelog.add(new HeartsCommand.pass(
            0, new List<Card>.from(Card.All.getRange(0, 2))));
      }, throwsA(new isInstanceOf<StateError>()));

      game = new HeartsGame()..playerNumber = 0;
      game.phase = HeartsPhase.Deal;
      game.gamelog.add(new HeartsCommand.deal(
          0, new List<Card>.from(Card.All.getRange(0, 13))));
      game.phase = HeartsPhase.Pass;
      expect(() {
        game.gamelog.add(new HeartsCommand.pass(
            0, new List<Card>.from(Card.All.getRange(0, 4))));
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Taking - wrong phase", () {
      HeartsGame game = new HeartsGame()..playerNumber = 0;
      game.phase = HeartsPhase.Deal;
      expect(() {
        game.gamelog.add(new HeartsCommand.take(3));
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Playing - wrong phase", () {
      HeartsGame game = new HeartsGame()..playerNumber = 0;
      game.phase = HeartsPhase.Deal;
      game.gamelog.add(new HeartsCommand.deal(
          0, new List<Card>.from(Card.All.getRange(0, 13))));
      expect(() {
        game.gamelog.add(new HeartsCommand.play(0, Card.All[0]));
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Playing - missing card", () {
      HeartsGame game = new HeartsGame()..playerNumber = 0;
      game.phase = HeartsPhase.Deal;
      game.gamelog.add(new HeartsCommand.deal(
          0, new List<Card>.from(Card.All.getRange(0, 13))));
      game.phase = HeartsPhase.Play;
      expect(() {
        game.gamelog.add(new HeartsCommand.play(0, Card.All[13]));
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Playing - invalid card (not 2 of clubs as first card)", () {
      HeartsGame game = new HeartsGame()..playerNumber = 0;
      game.phase = HeartsPhase.Deal;
      game.gamelog.add(new HeartsCommand.deal(
          0, new List<Card>.from(Card.All.getRange(0, 13))));
      game.phase = HeartsPhase.Play;
      game.lastTrickTaker = 0;
      expect(() {
        game.gamelog.add(new HeartsCommand.play(0, Card.All[0]));
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Playing - invalid card (no penalty on first round)", () {
      // NOTE: It is actually possible to be forced to play a penalty card on round 1.
      // But the odds are miniscule, so this rule will be enforced.
      HeartsGame game = new HeartsGame()..playerNumber = 0;
      game.phase = HeartsPhase.Deal;
      game.gamelog.add(new HeartsCommand.deal(
          0, new List<Card>.from(Card.All.getRange(0, 13))));
      game.gamelog.add(new HeartsCommand.deal(
          1, new List<Card>.from(Card.All.getRange(13, 26))));
      game.gamelog.add(new HeartsCommand.deal(
          2, new List<Card>.from(Card.All.getRange(26, 39))));
      game.gamelog.add(new HeartsCommand.deal(
          3, new List<Card>.from(Card.All.getRange(39, 52))));
      game.phase = HeartsPhase.Play;
      game.lastTrickTaker = 0;
      game.gamelog.add(new HeartsCommand.play(0, Card.All[1]));
      game.gamelog.add(new HeartsCommand.play(1, Card.All[13]));
      expect(() {
        game.gamelog.add(new HeartsCommand.play(2, Card.All[26]));
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Playing - wrong turn", () {
      HeartsGame game = new HeartsGame()..playerNumber = 0;
      game.phase = HeartsPhase.Deal;
      game.gamelog.add(new HeartsCommand.deal(
          0, new List<Card>.from(Card.All.getRange(0, 13))));
      game.gamelog.add(new HeartsCommand.deal(
          1, new List<Card>.from(Card.All.getRange(13, 26))));
      game.gamelog.add(new HeartsCommand.deal(
          2, new List<Card>.from(Card.All.getRange(26, 39))));
      game.gamelog.add(new HeartsCommand.deal(
          3, new List<Card>.from(Card.All.getRange(39, 52))));
      game.phase = HeartsPhase.Play;
      game.lastTrickTaker = 0;
      expect(() {
        game.gamelog.add(new HeartsCommand.play(
            1, Card.All[13])); // player 0's turn, not player 1's.
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Playing - invalid card (suit mismatch)", () {
      HeartsGame game = new HeartsGame()..playerNumber = 0;
      game.phase = HeartsPhase.Deal;
      game.gamelog.add(new HeartsCommand.deal(
          0, new List<Card>.from(Card.All.getRange(0, 12))..add(Card.All[25])));
      game.gamelog.add(new HeartsCommand.deal(
          1, new List<Card>.from(Card.All.getRange(12, 25))));
      game.gamelog.add(new HeartsCommand.deal(
          2, new List<Card>.from(Card.All.getRange(26, 39))));
      game.gamelog.add(new HeartsCommand.deal(
          3, new List<Card>.from(Card.All.getRange(39, 52))));
      game.phase = HeartsPhase.Play;
      game.lastTrickTaker = 0;
      game.gamelog.add(new HeartsCommand.play(0, Card.All[1]));
      expect(() {
        game.gamelog
            .add(new HeartsCommand.play(0, Card.All[13])); // should play 12
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Playing - invalid card (hearts not broken yet)", () {
      HeartsGame game = new HeartsGame()..playerNumber = 0;
      game.phase = HeartsPhase.Deal;
      game.gamelog.add(new HeartsCommand.deal(
          0, new List<Card>.from(Card.All.getRange(0, 12))..add(Card.All[38])));
      game.gamelog.add(new HeartsCommand.deal(
          1, new List<Card>.from(Card.All.getRange(13, 26))));
      game.gamelog.add(new HeartsCommand.deal(2,
          new List<Card>.from(Card.All.getRange(26, 38))..add(Card.All[12])));
      game.gamelog.add(new HeartsCommand.deal(
          3, new List<Card>.from(Card.All.getRange(39, 52))));
      game.phase = HeartsPhase.Play;
      game.lastTrickTaker = 0;
      game.gamelog.add(new HeartsCommand.play(0, Card.All[1]));
      game.gamelog.add(new HeartsCommand.play(1, Card.All[13]));
      game.gamelog.add(new HeartsCommand.play(2, Card.All[12])); // 2 won!
      game.gamelog.add(new HeartsCommand.play(3, Card.All[39]));
      expect(() {
        game.gamelog.add(new HeartsCommand.play(
            2, Card.All[26])); // But 2 can't lead with a hearts.
      }, throwsA(new isInstanceOf<StateError>()));
    });
  });
}
