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

import "dart:io";

void main() {
  group("Initialization", () {
    HeartsGame game = new HeartsGame(0);
    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(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]));

      // Do it again.
      game.updateScore();
      expect(game.scores, equals([8, 16, 28, 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]));
    });
  });

  group("Game Over", () {
    HeartsGame game = new HeartsGame(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(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(c));
      }
    }

    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]));

      // 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.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.hasGameEnded,
          isTrue); // assumes game ends after about 100 points.
    });
  });

  group("Card Manipulation - Error Cases", () {
    test("Dealing - wrong phase", () {
      expect(() {
        HeartsGame game = new HeartsGame(0);
        game.phase = HeartsPhase.Score;
        game.gamelog.add(new HeartsCommand.deal(
            0, new List<Card>.from(Card.All.getRange(0, 13))));
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Dealing - missing card", () {
      expect(() {
        HeartsGame game = new HeartsGame(0);
        game.gamelog.add(
            new HeartsCommand.deal(0, <Card>[new Card("fake", "not real")]));
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Dealing - too many cards dealt", () {
      expect(() {
        HeartsGame game = new HeartsGame(0);
        game.gamelog.add(new HeartsCommand.deal(
            0, new List<Card>.from(Card.All.getRange(0, 15))));
      }, throwsA(new isInstanceOf<StateError>()));
      expect(() {
        HeartsGame game = new HeartsGame(0);
        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", () {
      expect(() {
        HeartsGame game = new HeartsGame(0);
        game.gamelog.add(new HeartsCommand.deal(
            0, new List<Card>.from(Card.All.getRange(0, 13))));
        game.gamelog.add(new HeartsCommand.pass(
            0, new List<Card>.from(Card.All.getRange(0, 4))));
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Passing - missing card", () {
      expect(() {
        HeartsGame game = new HeartsGame(0);
        game.gamelog.add(new HeartsCommand.deal(
            0, new List<Card>.from(Card.All.getRange(0, 13))));
        game.phase = HeartsPhase.Pass;
        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", () {
      expect(() {
        HeartsGame game = new HeartsGame(0);
        game.gamelog.add(new HeartsCommand.deal(
            0, new List<Card>.from(Card.All.getRange(0, 13))));
        game.phase = HeartsPhase.Pass;
        game.gamelog.add(new HeartsCommand.pass(
            0, new List<Card>.from(Card.All.getRange(0, 2))));
      }, throwsA(new isInstanceOf<StateError>()));
      expect(() {
        HeartsGame game = new HeartsGame(0);
        game.gamelog.add(new HeartsCommand.deal(
            0, new List<Card>.from(Card.All.getRange(0, 13))));
        game.phase = HeartsPhase.Pass;
        game.gamelog.add(new HeartsCommand.pass(
            0, new List<Card>.from(Card.All.getRange(0, 4))));
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Taking - wrong phase", () {
      expect(() {
        HeartsGame game = new HeartsGame(0);
        game.gamelog.add(new HeartsCommand.take(3));
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Playing - wrong phase", () {
      expect(() {
        HeartsGame game = new HeartsGame(0);
        game.gamelog.add(new HeartsCommand.deal(
            0, new List<Card>.from(Card.All.getRange(0, 13))));
        game.gamelog.add(new HeartsCommand.play(0, Card.All[0]));
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Playing - missing card", () {
      expect(() {
        HeartsGame game = new HeartsGame(0);
        game.gamelog.add(new HeartsCommand.deal(
            0, new List<Card>.from(Card.All.getRange(0, 13))));
        game.phase = HeartsPhase.Play;
        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)", () {
      expect(() {
        HeartsGame game = new HeartsGame(0);
        game.gamelog.add(new HeartsCommand.deal(
            0, new List<Card>.from(Card.All.getRange(0, 13))));
        game.phase = HeartsPhase.Play;
        game.lastTrickTaker = 0;
        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.
      expect(() {
        HeartsGame game = new HeartsGame(0);
        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]));
        game.gamelog.add(new HeartsCommand.play(2, Card.All[26]));
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Playing - wrong turn", () {
      expect(() {
        HeartsGame game = new HeartsGame(0);
        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(
            1, Card.All[13])); // player 0's turn, not player 1's.
      }, throwsA(new isInstanceOf<StateError>()));
    });
    test("Playing - invalid card (suit mismatch)", () {
      expect(() {
        HeartsGame game = new HeartsGame(0);
        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]));
        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)", () {
      expect(() {
        HeartsGame game = new HeartsGame(0);
        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]));
        game.gamelog.add(new HeartsCommand.play(
            2, Card.All[26])); // But 2 can't lead with a hearts.
      }, throwsA(new isInstanceOf<StateError>()));
    });
  });
}
