/**
 * Copyright (c) 2021 Dominic Masters
 * 
 * This software is released under the MIT License.
 * https://opensource.org/licenses/MIT
 */

#include <unity.h>
#include <poker/card.h>

void setUp(void) {
}

void tearDown(void) {
}


void test_cardGetSuit_should_ReturnCardsSuit(void) {
  TEST_ASSERT_EQUAL_UINT8(CARD_SUIT_CLUBS, cardGetSuit(CARD_CLUBS_ACE));
  TEST_ASSERT_EQUAL_UINT8(CARD_SUIT_CLUBS, cardGetSuit(CARD_CLUBS_TWO));
  TEST_ASSERT_EQUAL_UINT8(CARD_SUIT_CLUBS, cardGetSuit(CARD_CLUBS_KING));
  
  TEST_ASSERT_EQUAL_UINT8(CARD_SUIT_HEARTS, cardGetSuit(CARD_HEARTS_QUEEN));
  TEST_ASSERT_EQUAL_UINT8(CARD_SUIT_HEARTS, cardGetSuit(CARD_HEARTS_TWO));
  TEST_ASSERT_EQUAL_UINT8(CARD_SUIT_HEARTS, cardGetSuit(CARD_HEARTS_SEVEN));

  TEST_ASSERT_EQUAL_UINT8(CARD_SUIT_SPADES, cardGetSuit(CARD_SPADES_TWO));
  TEST_ASSERT_EQUAL_UINT8(CARD_SUIT_SPADES, cardGetSuit(CARD_SPADES_ACE));

  TEST_ASSERT_EQUAL_UINT8(CARD_SUIT_DIAMONDS, cardGetSuit(CARD_DIAMONDS_ACE));
}

void test_cardGetNumber_should_ReturnCardsNumber(void) {
  TEST_ASSERT_EQUAL_UINT8(CARD_ACE, cardGetNumber(CARD_CLUBS_ACE));
  TEST_ASSERT_EQUAL_UINT8(CARD_TWO, cardGetNumber(CARD_CLUBS_TWO));
  TEST_ASSERT_EQUAL_UINT8(CARD_KING, cardGetNumber(CARD_CLUBS_KING));
  
  TEST_ASSERT_EQUAL_UINT8(CARD_QUEEN, cardGetNumber(CARD_HEARTS_QUEEN));
  TEST_ASSERT_EQUAL_UINT8(CARD_TWO, cardGetNumber(CARD_HEARTS_TWO));
  TEST_ASSERT_EQUAL_UINT8(CARD_SEVEN, cardGetNumber(CARD_HEARTS_SEVEN));

  TEST_ASSERT_EQUAL_UINT8(CARD_TWO, cardGetNumber(CARD_SPADES_TWO));
  TEST_ASSERT_EQUAL_UINT8(CARD_ACE, cardGetNumber(CARD_SPADES_ACE));

  TEST_ASSERT_EQUAL_UINT8(CARD_ACE, cardGetNumber(CARD_DIAMONDS_ACE));
}

void test_cardGet_should_ReturnTheCard(void) {
  TEST_ASSERT_EQUAL_UINT8(CARD_CLUBS_ACE, cardGet(CARD_ACE, CARD_SUIT_CLUBS));
  TEST_ASSERT_EQUAL_UINT8(CARD_CLUBS_TWO, cardGet(CARD_TWO, CARD_SUIT_CLUBS));
  TEST_ASSERT_EQUAL_UINT8(CARD_CLUBS_KING, cardGet(CARD_KING, CARD_SUIT_CLUBS));

  TEST_ASSERT_EQUAL_UINT8(
    CARD_HEARTS_QUEEN, cardGet(CARD_QUEEN, CARD_SUIT_HEARTS)
  );
  TEST_ASSERT_EQUAL_UINT8(
    CARD_HEARTS_TWO, cardGet(CARD_TWO, CARD_SUIT_HEARTS)
  );
  TEST_ASSERT_EQUAL_UINT8(
    CARD_HEARTS_SEVEN, cardGet(CARD_SEVEN, CARD_SUIT_HEARTS)
  );

  TEST_ASSERT_EQUAL_UINT8(CARD_SPADES_TWO, cardGet(CARD_TWO, CARD_SUIT_SPADES));
  TEST_ASSERT_EQUAL_UINT8(CARD_SPADES_ACE, cardGet(CARD_ACE, CARD_SUIT_SPADES));
  
  TEST_ASSERT_EQUAL_UINT8(
    CARD_DIAMONDS_ACE, cardGet(CARD_ACE, CARD_SUIT_DIAMONDS)
  );
}

void test_cardWriteDeck_should_WriteCardsToArray(void) {
  card_t cards[CARD_DECK_SIZE];
  cardWriteDeck(cards);
  
  TEST_ASSERT_EQUAL_UINT8(CARD_CLUBS_TWO, cards[0]);
  TEST_ASSERT_EQUAL_UINT8(CARD_CLUBS_THREE, cards[1]);
  TEST_ASSERT_EQUAL_UINT8(CARD_CLUBS_FOUR, cards[2]);
  TEST_ASSERT_EQUAL_UINT8(CARD_CLUBS_ACE, cards[12]);

  TEST_ASSERT_EQUAL_UINT8(CARD_DIAMONDS_NINE, cards[20]);

  TEST_ASSERT_EQUAL_UINT8(CARD_HEARTS_ACE, cards[38]);

  TEST_ASSERT_EQUAL_UINT8(CARD_SPADES_ACE, cards[51]);
}

void test_cardWriteDeck_should_ReturnCardsWritten(void) {
  card_t cards[CARD_DECK_SIZE];
  TEST_ASSERT_EQUAL_UINT8(CARD_DECK_SIZE, cardWriteDeck(cards));
}

int main() {
  UNITY_BEGIN();
  
  RUN_TEST(test_cardGetSuit_should_ReturnCardsSuit);
  RUN_TEST(test_cardGetNumber_should_ReturnCardsNumber);
  RUN_TEST(test_cardGet_should_ReturnTheCard);

  RUN_TEST(test_cardWriteDeck_should_WriteCardsToArray);
  RUN_TEST(test_cardWriteDeck_should_ReturnCardsWritten);

  return UNITY_END();
}