please fix the code, it is failing all tests:const suits = ["♥", "♦", "♣", "♠"];
const ranks = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"];

class Card {
  constructor(suit, rank) {
    this.suit = suit;
    this.rank = rank;
  }
  
  toString() {
    return `${this.rank}${this.suit}`;
  }
}

function determineWinners(playerHands, boardCards) {
  const allHands = playerHands.map((hand) => [...hand, ...boardCards]);
  const bestHands = allHands.map((hand) => getBestHand(hand));
  const maxRank = Math.max(...bestHands.map((hand) => hand.rank));

  return bestHands.reduce((winners, hand, index) => {
    if (hand.rank === maxRank) {
      winners.push({
        playerId: index,
        winningCombinationId: hand.combination.id,
        winningCards: hand.cards,
      });
    }
    return winners;
  }, []);
}

function getBestHand(cards) {
  const combinations = [
    RoyalFlush,
    StraightFlush,
    FourOfAKind,
    FullHouse,
    Flush,
    Straight,
    ThreeOfAKind,
    TwoPairs,
    Pair
  ];

  for (const Combination of combinations) {
    const result = Combination.test(cards);
    if (result != null) {
      return { rank: Combination.rank, combination: result.combination, cards: result.cards };
    }
  }
}

class Combination {
  constructor(name, id, rank) {
    this.name = name;
    this.id = id;
    this.rank = rank;
  }

  static test(cards) {}
}

class ThreeOfAKind extends Combination {
constructor() {
super("Three of a kind", 3, 3);
}

static test(cards) {
let trios = [];

for (let i = 0; i <= cards.length - 3; i++) {
//checking whether values are equal & not undefined(not yet deleted)

if (cards[i].rank === cards[i + 1].rank && cards[i].rank === cards[i + 2].rank) {
trios.push([cards[i], cards[i + 1], cards[i + 2]]);
}
}

let remainingCards = cards.filter(card => !trios.some(trio => trio.includes(card)));

if (trios.length < 1 || remainingCards.length < 2) {
return null;
} else {
let output = {
combination: this,
cards: [].concat(...trios, ...remainingCards.slice(-2)),
};

return output;
}
}
}

/////////////////////


function testThreeOfAKind() {
  // Test case 1: Valid input
  const cards1 = [
    new Card('♠', '3'),
    new Card('♥', '3'),
    new Card('♦', '6'),
    new Card('♠', '8'),
    new Card('♣', '3'),
  ];
  const expectedOutput1 = {
    combination: new ThreeOfAKind(),
    cards: [
      new Card('♠', '3'),
      new Card('♥', '3'),
      new Card('♠', '8'),
      new Card('♦', '6'),
      new Card('♣', '3'),
     ]
  };
  const output1 = ThreeOfAKind.test(cards1);
  console.log(output1);
  console.assert(
    JSON.stringify(output1) === JSON.stringify(expectedOutput1),
    "Test case 1 failed"
  );
  
  // Test case 2: Invalid input - no three of a kind
  const cards2 = [
  	new Card("♥", "7"),
  	new Card("♦", "J"),
  	new Card("♣", "3"),
  	new Card("♥", "Q"),
  	new Card("♠", "9")
	];
	const expectedOutput2 = null;
	const output2 = ThreeOfAKind.test(cards2);

	console.assert(
	  output2 === expectedOutput2,
	  "Test case 2 failed"
	);
	
	// Test case 3: Invalid input - not enough remaining cards
	const cards3 = [
		new Card("♥", "10"),
		new Card("♥", "K"),
		new Card("♥", "8"),
		new Card("♦", "10"),
		new Card("♣", "K")
	];
	const expectedOutput3 = null;
	const output3 = ThreeOfAKind.test(cards3);
	
	console.assert(
	  output3 === expectedOutput3,
	  "Test case 3 failed"
	);

  	console.log("All test cases passed for ThreeOfAKind class!");
}

testThreeOfAKind(); //// because three of a kind would rarely be in a row, they are more about to be randomly spread in array