import { Color, JokerCard, PlayingCard, Suit } from "../src";
import { InvalidArgumentError } from "../src/errors";

let card: PlayingCard | JokerCard;
describe("Testing all valid playing card combinations from 500 deck: ", () => {
  test("Ace of Spades", () => {
    card = new PlayingCard("1", Suit.spades);
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("A", Suit.spades);
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("1", "S" as Suit);
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("A", "S" as Suit);
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("AS");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("1S");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("aS");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("As");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("1s");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("as");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.spades);
  });
  test("Two of Spades", () => {
    card = new PlayingCard("11", Suit.spades);
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("11", "S" as Suit);
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("11S");
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("11s");
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.spades);
  });
  test("Three of Spades", () => {
    card = new PlayingCard("3", Suit.spades);
    expect(card.getRank()).toBe("3");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("3", "S" as Suit);
    expect(card.getRank()).toBe("3");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("3S");
    expect(card.getRank()).toBe("3");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("3s");
    expect(card.getRank()).toBe("3");
    expect(card.getSuit()).toBe(Suit.spades);
  });
  test("Four of Spades", () => {
    card = new PlayingCard("4", Suit.spades);
    expect(card.getRank()).toBe("4");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("4", "S" as Suit);
    expect(card.getRank()).toBe("4");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("4S");
    expect(card.getRank()).toBe("4");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("4s");
    expect(card.getRank()).toBe("4");
    expect(card.getSuit()).toBe(Suit.spades);
  });
  test("Five of Spades", () => {
    card = new PlayingCard("5", Suit.spades);
    expect(card.getRank()).toBe("5");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("5", "S" as Suit);
    expect(card.getRank()).toBe("5");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("5S");
    expect(card.getRank()).toBe("5");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("5s");
    expect(card.getRank()).toBe("5");
    expect(card.getSuit()).toBe(Suit.spades);
  });
  test("Six of Spades", () => {
    card = new PlayingCard("6", Suit.spades);
    expect(card.getRank()).toBe("6");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("6", "S" as Suit);
    expect(card.getRank()).toBe("6");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("6S");
    expect(card.getRank()).toBe("6");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("6s");
    expect(card.getRank()).toBe("6");
    expect(card.getSuit()).toBe(Suit.spades);
  });
  test("Seven of Spades", () => {
    card = new PlayingCard("7", Suit.spades);
    expect(card.getRank()).toBe("7");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("7", "S" as Suit);
    expect(card.getRank()).toBe("7");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("7S");
    expect(card.getRank()).toBe("7");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("7s");
    expect(card.getRank()).toBe("7");
    expect(card.getSuit()).toBe(Suit.spades);
  });
  test("Eight of Spades", () => {
    card = new PlayingCard("8", Suit.spades);
    expect(card.getRank()).toBe("8");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("8", "S" as Suit);
    expect(card.getRank()).toBe("8");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("8S");
    expect(card.getRank()).toBe("8");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("8s");
    expect(card.getRank()).toBe("8");
    expect(card.getSuit()).toBe(Suit.spades);
  });
  test("Nine of Spades", () => {
    card = new PlayingCard("9", Suit.spades);
    expect(card.getRank()).toBe("9");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("9", "S" as Suit);
    expect(card.getRank()).toBe("9");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("9S");
    expect(card.getRank()).toBe("9");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("9s");
    expect(card.getRank()).toBe("9");
    expect(card.getSuit()).toBe(Suit.spades);
  });
  test("Ten of Spades", () => {
    card = new PlayingCard("10", Suit.spades);
    expect(card.getRank()).toBe("10");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("10", "S" as Suit);
    expect(card.getRank()).toBe("10");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("10S");
    expect(card.getRank()).toBe("10");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("10s");
    expect(card.getRank()).toBe("10");
    expect(card.getSuit()).toBe(Suit.spades);
  });
  test("Jack of Spades", () => {
    card = new PlayingCard("J", Suit.spades);
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("J", "S" as Suit);
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("JS");
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("Js");
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("j", Suit.spades);
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("j", "S" as Suit);
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("jS");
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("js");
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.spades);
  });
  test("Eleven of Spades", () => {
    card = new PlayingCard("11", Suit.spades);
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("11", "S" as Suit);
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("11S");
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("11s");
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.spades);
  });
  test("Queen of Spades", () => {
    card = new PlayingCard("Q", Suit.spades);
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("Q", "S" as Suit);
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("QS");
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("Qs");
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("q", Suit.spades);
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("q", "S" as Suit);
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("qS");
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("qs");
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.spades);
  });
  test("Twelve of Spades", () => {
    card = new PlayingCard("12", Suit.spades);
    expect(card.getRank()).toBe("12");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("12", "S" as Suit);
    expect(card.getRank()).toBe("12");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("12S");
    expect(card.getRank()).toBe("12");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("12s");
    expect(card.getRank()).toBe("12");
    expect(card.getSuit()).toBe(Suit.spades);
  });
  test("King of Spades", () => {
    card = new PlayingCard("K", Suit.spades);
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("K", "S" as Suit);
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("KS");
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("Ks");
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("k", Suit.spades);
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("k", "S" as Suit);
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("kS");
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("ks");
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.spades);
  });
  test("Thirteen of Spades", () => {
    card = new PlayingCard("13", Suit.spades);
    expect(card.getRank()).toBe("13");
    expect(card.getSuit()).toBe(Suit.spades);
    card = new PlayingCard("13", "S" as Suit);
    expect(card.getRank()).toBe("13");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("13S");
    expect(card.getRank()).toBe("13");
    expect(card.getSuit()).toBe(Suit.spades);
    card = PlayingCard.parseString("13s");
    expect(card.getRank()).toBe("13");
    expect(card.getSuit()).toBe(Suit.spades);
  });
  test("Ace of Hearts", () => {
    card = new PlayingCard("1", Suit.hearts);
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("A", Suit.hearts);
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("1", "H" as Suit);
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("A", "H" as Suit);
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("AH");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("1H");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("aH");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("Ah");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("1h");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("ah");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.hearts);
  });
  test("Two of Hearts", () => {
    card = new PlayingCard("11", Suit.hearts);
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("11", "H" as Suit);
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("11H");
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("11h");
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.hearts);
  });
  test("Three of Hearts", () => {
    card = new PlayingCard("3", Suit.hearts);
    expect(card.getRank()).toBe("3");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("3", "H" as Suit);
    expect(card.getRank()).toBe("3");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("3H");
    expect(card.getRank()).toBe("3");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("3h");
    expect(card.getRank()).toBe("3");
    expect(card.getSuit()).toBe(Suit.hearts);
  });
  test("Four of Hearts", () => {
    card = new PlayingCard("4", Suit.hearts);
    expect(card.getRank()).toBe("4");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("4", "H" as Suit);
    expect(card.getRank()).toBe("4");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("4H");
    expect(card.getRank()).toBe("4");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("4h");
    expect(card.getRank()).toBe("4");
    expect(card.getSuit()).toBe(Suit.hearts);
  });
  test("Five of Hearts", () => {
    card = new PlayingCard("5", Suit.hearts);
    expect(card.getRank()).toBe("5");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("5", "H" as Suit);
    expect(card.getRank()).toBe("5");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("5H");
    expect(card.getRank()).toBe("5");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("5h");
    expect(card.getRank()).toBe("5");
    expect(card.getSuit()).toBe(Suit.hearts);
  });
  test("Six of Hearts", () => {
    card = new PlayingCard("6", Suit.hearts);
    expect(card.getRank()).toBe("6");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("6", "H" as Suit);
    expect(card.getRank()).toBe("6");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("6H");
    expect(card.getRank()).toBe("6");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("6h");
    expect(card.getRank()).toBe("6");
    expect(card.getSuit()).toBe(Suit.hearts);
  });
  test("Seven of Hearts", () => {
    card = new PlayingCard("7", Suit.hearts);
    expect(card.getRank()).toBe("7");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("7", "H" as Suit);
    expect(card.getRank()).toBe("7");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("7H");
    expect(card.getRank()).toBe("7");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("7h");
    expect(card.getRank()).toBe("7");
    expect(card.getSuit()).toBe(Suit.hearts);
  });
  test("Eight of Hearts", () => {
    card = new PlayingCard("8", Suit.hearts);
    expect(card.getRank()).toBe("8");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("8", "H" as Suit);
    expect(card.getRank()).toBe("8");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("8H");
    expect(card.getRank()).toBe("8");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("8h");
    expect(card.getRank()).toBe("8");
    expect(card.getSuit()).toBe(Suit.hearts);
  });
  test("Nine of Hearts", () => {
    card = new PlayingCard("9", Suit.hearts);
    expect(card.getRank()).toBe("9");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("9", "H" as Suit);
    expect(card.getRank()).toBe("9");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("9H");
    expect(card.getRank()).toBe("9");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("9h");
    expect(card.getRank()).toBe("9");
    expect(card.getSuit()).toBe(Suit.hearts);
  });
  test("Ten of Hearts", () => {
    card = new PlayingCard("10", Suit.hearts);
    expect(card.getRank()).toBe("10");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("10", "H" as Suit);
    expect(card.getRank()).toBe("10");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("10H");
    expect(card.getRank()).toBe("10");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("10h");
    expect(card.getRank()).toBe("10");
    expect(card.getSuit()).toBe(Suit.hearts);
  });
  test("Jack of Hearts", () => {
    card = new PlayingCard("J", Suit.hearts);
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("J", "H" as Suit);
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("JH");
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("Jh");
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("j", Suit.hearts);
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("j", "H" as Suit);
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("jH");
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("jh");
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.hearts);
  });
  test("Eleven of Hearts", () => {
    card = new PlayingCard("11", Suit.hearts);
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("11", "H" as Suit);
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("11H");
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("11h");
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.hearts);
  });
  test("Queen of Hearts", () => {
    card = new PlayingCard("Q", Suit.hearts);
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("Q", "H" as Suit);
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("QH");
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("Qh");
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("q", Suit.hearts);
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("q", "H" as Suit);
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("qH");
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("qh");
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.hearts);
  });
  test("Twelve of Hearts", () => {
    card = new PlayingCard("12", Suit.hearts);
    expect(card.getRank()).toBe("12");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("12", "H" as Suit);
    expect(card.getRank()).toBe("12");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("12H");
    expect(card.getRank()).toBe("12");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("12h");
    expect(card.getRank()).toBe("12");
    expect(card.getSuit()).toBe(Suit.hearts);
  });
  test("King of Hearts", () => {
    card = new PlayingCard("K", Suit.hearts);
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("K", "H" as Suit);
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("KH");
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("Kh");
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("k", Suit.hearts);
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("k", "H" as Suit);
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("kH");
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("kh");
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.hearts);
  });
  test("Thirteen of Hearts", () => {
    card = new PlayingCard("13", Suit.hearts);
    expect(card.getRank()).toBe("13");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = new PlayingCard("13", "H" as Suit);
    expect(card.getRank()).toBe("13");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("13H");
    expect(card.getRank()).toBe("13");
    expect(card.getSuit()).toBe(Suit.hearts);
    card = PlayingCard.parseString("13h");
    expect(card.getRank()).toBe("13");
    expect(card.getSuit()).toBe(Suit.hearts);
  });
  test("Ace of Diamonds", () => {
    card = new PlayingCard("1", Suit.diamonds);
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("A", Suit.diamonds);
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("1", "D" as Suit);
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("A", "D" as Suit);
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("AD");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("1D");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("aD");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("Ad");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("1d");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("ad");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.diamonds);
  });
  test("Two of Diamonds", () => {
    card = new PlayingCard("11", Suit.diamonds);
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("11", "D" as Suit);
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("11D");
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("11d");
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.diamonds);
  });
  test("Three of Diamonds", () => {
    card = new PlayingCard("3", Suit.diamonds);
    expect(card.getRank()).toBe("3");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("3", "D" as Suit);
    expect(card.getRank()).toBe("3");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("3D");
    expect(card.getRank()).toBe("3");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("3d");
    expect(card.getRank()).toBe("3");
    expect(card.getSuit()).toBe(Suit.diamonds);
  });
  test("Four of Diamonds", () => {
    card = new PlayingCard("4", Suit.diamonds);
    expect(card.getRank()).toBe("4");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("4", "D" as Suit);
    expect(card.getRank()).toBe("4");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("4D");
    expect(card.getRank()).toBe("4");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("4d");
    expect(card.getRank()).toBe("4");
    expect(card.getSuit()).toBe(Suit.diamonds);
  });
  test("Five of Diamonds", () => {
    card = new PlayingCard("5", Suit.diamonds);
    expect(card.getRank()).toBe("5");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("5", "D" as Suit);
    expect(card.getRank()).toBe("5");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("5D");
    expect(card.getRank()).toBe("5");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("5d");
    expect(card.getRank()).toBe("5");
    expect(card.getSuit()).toBe(Suit.diamonds);
  });
  test("Six of Diamonds", () => {
    card = new PlayingCard("6", Suit.diamonds);
    expect(card.getRank()).toBe("6");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("6", "D" as Suit);
    expect(card.getRank()).toBe("6");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("6D");
    expect(card.getRank()).toBe("6");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("6d");
    expect(card.getRank()).toBe("6");
    expect(card.getSuit()).toBe(Suit.diamonds);
  });
  test("Seven of Diamonds", () => {
    card = new PlayingCard("7", Suit.diamonds);
    expect(card.getRank()).toBe("7");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("7", "D" as Suit);
    expect(card.getRank()).toBe("7");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("7D");
    expect(card.getRank()).toBe("7");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("7d");
    expect(card.getRank()).toBe("7");
    expect(card.getSuit()).toBe(Suit.diamonds);
  });
  test("Eight of Diamonds", () => {
    card = new PlayingCard("8", Suit.diamonds);
    expect(card.getRank()).toBe("8");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("8", "D" as Suit);
    expect(card.getRank()).toBe("8");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("8D");
    expect(card.getRank()).toBe("8");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("8d");
    expect(card.getRank()).toBe("8");
    expect(card.getSuit()).toBe(Suit.diamonds);
  });
  test("Nine of Diamonds", () => {
    card = new PlayingCard("9", Suit.diamonds);
    expect(card.getRank()).toBe("9");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("9", "D" as Suit);
    expect(card.getRank()).toBe("9");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("9D");
    expect(card.getRank()).toBe("9");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("9d");
    expect(card.getRank()).toBe("9");
    expect(card.getSuit()).toBe(Suit.diamonds);
  });
  test("Ten of Diamonds", () => {
    card = new PlayingCard("10", Suit.diamonds);
    expect(card.getRank()).toBe("10");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("10", "D" as Suit);
    expect(card.getRank()).toBe("10");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("10D");
    expect(card.getRank()).toBe("10");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("10d");
    expect(card.getRank()).toBe("10");
    expect(card.getSuit()).toBe(Suit.diamonds);
  });
  test("Jack of Diamonds", () => {
    card = new PlayingCard("J", Suit.diamonds);
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("J", "D" as Suit);
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("JD");
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("Jd");
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("j", Suit.diamonds);
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("j", "D" as Suit);
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("jD");
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("jd");
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.diamonds);
  });
  test("Eleven of Diamonds", () => {
    card = new PlayingCard("11", Suit.diamonds);
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("11", "D" as Suit);
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("11D");
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("11d");
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.diamonds);
  });
  test("Queen of Diamonds", () => {
    card = new PlayingCard("Q", Suit.diamonds);
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("Q", "D" as Suit);
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("QD");
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("Qd");
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("q", Suit.diamonds);
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("q", "D" as Suit);
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("qD");
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("qd");
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.diamonds);
  });
  test("Twelve of Diamonds", () => {
    card = new PlayingCard("12", Suit.diamonds);
    expect(card.getRank()).toBe("12");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("12", "D" as Suit);
    expect(card.getRank()).toBe("12");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("12D");
    expect(card.getRank()).toBe("12");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("12d");
    expect(card.getRank()).toBe("12");
    expect(card.getSuit()).toBe(Suit.diamonds);
  });
  test("King of Diamonds", () => {
    card = new PlayingCard("K", Suit.diamonds);
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("K", "D" as Suit);
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("KD");
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("Kd");
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("k", Suit.diamonds);
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("k", "D" as Suit);
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("kD");
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("kd");
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.diamonds);
  });
  test("Thirteen of Diamonds", () => {
    card = new PlayingCard("13", Suit.diamonds);
    expect(card.getRank()).toBe("13");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = new PlayingCard("13", "D" as Suit);
    expect(card.getRank()).toBe("13");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("13D");
    expect(card.getRank()).toBe("13");
    expect(card.getSuit()).toBe(Suit.diamonds);
    card = PlayingCard.parseString("13d");
    expect(card.getRank()).toBe("13");
    expect(card.getSuit()).toBe(Suit.diamonds);
  });
  test("Ace of Clubs", () => {
    card = new PlayingCard("1", Suit.clubs);
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("A", Suit.clubs);
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("1", "C" as Suit);
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("A", "C" as Suit);
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("AC");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("1C");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("aC");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("Ac");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("1c");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("ac");
    expect(card.getRank()).toBe("A");
    expect(card.getSuit()).toBe(Suit.clubs);
  });
  test("Two of Clubs", () => {
    card = new PlayingCard("11", Suit.clubs);
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("11", "C" as Suit);
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("11C");
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("11c");
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.clubs);
  });
  test("Three of Clubs", () => {
    card = new PlayingCard("3", Suit.clubs);
    expect(card.getRank()).toBe("3");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("3", "C" as Suit);
    expect(card.getRank()).toBe("3");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("3C");
    expect(card.getRank()).toBe("3");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("3c");
    expect(card.getRank()).toBe("3");
    expect(card.getSuit()).toBe(Suit.clubs);
  });
  test("Four of Clubs", () => {
    card = new PlayingCard("4", Suit.clubs);
    expect(card.getRank()).toBe("4");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("4", "C" as Suit);
    expect(card.getRank()).toBe("4");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("4C");
    expect(card.getRank()).toBe("4");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("4c");
    expect(card.getRank()).toBe("4");
    expect(card.getSuit()).toBe(Suit.clubs);
  });
  test("Five of Clubs", () => {
    card = new PlayingCard("5", Suit.clubs);
    expect(card.getRank()).toBe("5");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("5", "C" as Suit);
    expect(card.getRank()).toBe("5");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("5C");
    expect(card.getRank()).toBe("5");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("5c");
    expect(card.getRank()).toBe("5");
    expect(card.getSuit()).toBe(Suit.clubs);
  });
  test("Six of Clubs", () => {
    card = new PlayingCard("6", Suit.clubs);
    expect(card.getRank()).toBe("6");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("6", "C" as Suit);
    expect(card.getRank()).toBe("6");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("6C");
    expect(card.getRank()).toBe("6");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("6c");
    expect(card.getRank()).toBe("6");
    expect(card.getSuit()).toBe(Suit.clubs);
  });
  test("Seven of Clubs", () => {
    card = new PlayingCard("7", Suit.clubs);
    expect(card.getRank()).toBe("7");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("7", "C" as Suit);
    expect(card.getRank()).toBe("7");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("7C");
    expect(card.getRank()).toBe("7");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("7c");
    expect(card.getRank()).toBe("7");
    expect(card.getSuit()).toBe(Suit.clubs);
  });
  test("Eight of Clubs", () => {
    card = new PlayingCard("8", Suit.clubs);
    expect(card.getRank()).toBe("8");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("8", "C" as Suit);
    expect(card.getRank()).toBe("8");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("8C");
    expect(card.getRank()).toBe("8");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("8c");
    expect(card.getRank()).toBe("8");
    expect(card.getSuit()).toBe(Suit.clubs);
  });
  test("Nine of Clubs", () => {
    card = new PlayingCard("9", Suit.clubs);
    expect(card.getRank()).toBe("9");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("9", "C" as Suit);
    expect(card.getRank()).toBe("9");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("9C");
    expect(card.getRank()).toBe("9");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("9c");
    expect(card.getRank()).toBe("9");
    expect(card.getSuit()).toBe(Suit.clubs);
  });
  test("Ten of Clubs", () => {
    card = new PlayingCard("10", Suit.clubs);
    expect(card.getRank()).toBe("10");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("10", "C" as Suit);
    expect(card.getRank()).toBe("10");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("10C");
    expect(card.getRank()).toBe("10");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("10c");
    expect(card.getRank()).toBe("10");
    expect(card.getSuit()).toBe(Suit.clubs);
  });
  test("Jack of Clubs", () => {
    card = new PlayingCard("J", Suit.clubs);
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("J", "C" as Suit);
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("JC");
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("Jc");
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("j", Suit.clubs);
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("j", "C" as Suit);
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("jC");
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("jc");
    expect(card.getRank()).toBe("J");
    expect(card.getSuit()).toBe(Suit.clubs);
  });
  test("Eleven of Clubs", () => {
    card = new PlayingCard("11", Suit.clubs);
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("11", "C" as Suit);
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("11C");
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("11c");
    expect(card.getRank()).toBe("11");
    expect(card.getSuit()).toBe(Suit.clubs);
  });
  test("Queen of Clubs", () => {
    card = new PlayingCard("Q", Suit.clubs);
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("Q", "C" as Suit);
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("QC");
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("Qc");
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("q", Suit.clubs);
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("q", "C" as Suit);
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("qC");
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("qc");
    expect(card.getRank()).toBe("Q");
    expect(card.getSuit()).toBe(Suit.clubs);
  });
  test("Twelve of Clubs", () => {
    card = new PlayingCard("12", Suit.clubs);
    expect(card.getRank()).toBe("12");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("12", "C" as Suit);
    expect(card.getRank()).toBe("12");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("12C");
    expect(card.getRank()).toBe("12");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("12c");
    expect(card.getRank()).toBe("12");
    expect(card.getSuit()).toBe(Suit.clubs);
  });
  test("King of Clubs", () => {
    card = new PlayingCard("K", Suit.clubs);
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("K", "C" as Suit);
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("KC");
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("Kc");
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("k", Suit.clubs);
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("k", "C" as Suit);
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("kC");
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("kc");
    expect(card.getRank()).toBe("K");
    expect(card.getSuit()).toBe(Suit.clubs);
  });
  test("Thirteen of Clubs", () => {
    card = new PlayingCard("13", Suit.clubs);
    expect(card.getRank()).toBe("13");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = new PlayingCard("13", "C" as Suit);
    expect(card.getRank()).toBe("13");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("13C");
    expect(card.getRank()).toBe("13");
    expect(card.getSuit()).toBe(Suit.clubs);
    card = PlayingCard.parseString("13c");
    expect(card.getRank()).toBe("13");
    expect(card.getSuit()).toBe(Suit.clubs);
  });
});

describe("Testing joker generation: ", () => {
  test("By standard class constructor", () => {
    card = new JokerCard();
    expect(card.getRank()).toBe("Joker");
    expect(card.getColor()).toBe(Color.red);
    card = new JokerCard(Color.red);
    expect(card.getRank()).toBe("Joker");
    expect(card.getColor()).toBe(Color.red);
    card = new JokerCard(Color.black);
    expect(card.getRank()).toBe("Joker");
    expect(card.getColor()).toBe(Color.black);
  });
  //TODO - add parse string for joker tests
});

describe("Testing non-valid card types: ", () => {
  test("Rank outside of range: ", () => {
    expect(() => {
      new PlayingCard("14", Suit.clubs);
    }).toThrowError(new InvalidArgumentError("Invalid rank. Must be 1 to 13; A, J, Q, K; or Joker."));
    expect(() => {
      new PlayingCard("0", Suit.clubs);
    }).toThrowError(new InvalidArgumentError("Invalid rank. Must be 1 to 13; A, J, Q, K; or Joker."));
    expect(() => {
      PlayingCard.parseString("14D");
    }).toThrowError(new InvalidArgumentError("Invalid rank. Must be 1 to 13; A, J, Q, K; or Joker."));
    expect(() => {
      PlayingCard.parseString("DD");
    }).toThrowError(new InvalidArgumentError("Invalid rank. Must be 1 to 13; A, J, Q, K; or Joker."));
  });
  test("Invalid Suit string value: ", () => {
    expect(() => {
      new PlayingCard("A", "A" as Suit);
    }).toThrowError(new InvalidArgumentError("Invalid suit. Must be one of: H, C, D, S."));
    expect(() => {
      PlayingCard.parseString("10I");
    }).toThrowError(new InvalidArgumentError("Invalid suit. Must be one of: H, C, D, S."));
  });
  test("Invalid card string to parse: ", () => {
    expect(() => {
      PlayingCard.parseString("QueenD");
    }).toThrowError(new InvalidArgumentError("Invalid string representation of a card entered."));
    expect(() => {
      PlayingCard.parseString("Q D");
    }).toThrowError(new InvalidArgumentError("Invalid string representation of a card entered."));
  });
});
