This commit is contained in:
Rudy Dellomas III 2020-06-01 12:37:20 +10:00
commit 080e4af432
10 changed files with 175 additions and 78 deletions

View File

@ -2,6 +2,14 @@
* CHANGELOG * CHANGELOG
** [[https://github.com/mpereira/tty-solitaire/releases/tag/v1.2.0][v1.2.0]] (2020-05-31)
*** Bug fixes
- Fixed off-by-one issue in ~game:shuffle_deck()~. [[https://github.com/mpereira/tty-solitaire/pull/35][(#35)]]
- Fixed memory leaks in game and test code. [[https://github.com/mpereira/tty-solitaire/pull/35][(#35)]]
- Fixed broken tests. [[https://github.com/mpereira/tty-solitaire/pull/35][(#35)]]
- Fixed card drawing issue that came up due to changes in newer versions of
Ncurses. ([[https://github.com/mpereira/tty-solitaire/pull/41][#41]])
** [[https://github.com/mpereira/tty-solitaire/releases/tag/v1.1.1][v1.1.1]] (2018-11-10) ** [[https://github.com/mpereira/tty-solitaire/releases/tag/v1.1.1][v1.1.1]] (2018-11-10)
*** Improvements *** Improvements
- Added LICENSE. - Added LICENSE.

View File

@ -1,10 +1,11 @@
VERSION = 1.1.1 VERSION = 1.2.0
CC ?= gcc CC ?= gcc
CFLAGS ?= -g CFLAGS ?= -g
CFLAGS += -W -Wall -pedantic -ansi -std=c99 -DVERSION=\"$(VERSION)\" -fcommon CFLAGS += -W -Wall -pedantic -ansi -std=c99 -DVERSION=\"$(VERSION)\" -fcommon
# OS X installs ncurses with wide character support, but not as "libncurses". # The Ncurses library with wide character support is available as "lncurses"
# under macOS.
ifeq ($(shell uname -s),Darwin) ifeq ($(shell uname -s),Darwin)
LDFLAGS += -lncurses LDFLAGS += -lncurses
else else
@ -48,15 +49,15 @@ ttysolitaire: $(SRC_OBJECTS)
$(CC) $(CFLAGS) $(SRC) -o $(EXECUTABLE) $(SRC_OBJECTS) $(LDFLAGS) $(CC) $(CFLAGS) $(SRC) -o $(EXECUTABLE) $(SRC_OBJECTS) $(LDFLAGS)
test: $(SRC_OBJECTS) $(TESTS_OBJECTS) test: $(SRC_OBJECTS) $(TESTS_OBJECTS)
@$(CC) $(CFLAGS) $(TESTS_SRC) -o $(TESTS_EXECUTABLE) $(TESTS_OBJECTS) $(SRC_OBJECTS) $(LDFLAGS) $(CC) $(CFLAGS) $(TESTS_SRC) -o $(TESTS_EXECUTABLE) $(TESTS_OBJECTS) $(SRC_OBJECTS) $(LDFLAGS)
@./$(TESTS_EXECUTABLE) ./$(TESTS_EXECUTABLE)
clean: clean:
@rm -rf $(SRC_DIR)/*.o $(TESTS_DIR)/*.o $(EXECUTABLE) $(TESTS_EXECUTABLE) rm -rf $(SRC_DIR)/*.o $(TESTS_DIR)/*.o $(EXECUTABLE) $(TESTS_EXECUTABLE)
install: install:
@install -d $(DESTDIR)$(PREFIX)/bin install -d $(DESTDIR)$(PREFIX)/bin
@install -m755 $(EXECUTABLE) $(DESTDIR)$(PREFIX)/bin/$(EXECUTABLE) install -m755 $(EXECUTABLE) $(DESTDIR)$(PREFIX)/bin/$(EXECUTABLE)
uninstall: uninstall:
@rm -f $(PREFIX)/bin/$(EXECUTABLE) rm -f $(PREFIX)/bin/$(EXECUTABLE)

81
README
View File

@ -12,53 +12,94 @@
- Ncurses with wide-char/UTF-8 support - Ncurses with wide-char/UTF-8 support
** Install ** Install
*** Using package managers
**** Arch Linux
#+begin_src bash
pacman -S tty-solitaire
#+end_src
**** macOS
#+begin_src bash
brew install tty-solitaire
#+end_src
**** Void Linux
#+begin_src bash
xbps-install -S tty-solitaire
#+end_src
**** FreeBSD
#+begin_src bash
pkg install tty-solitaire
#+end_src
**** Slackware
[[https://www.slackbuilds.org/repository/14.2/games/tty-solitaire/][Via Slackbuilds]].
**** ALT Linux
#+begin_src bash
apt-get install tty-solitaire
#+end_src
We still need help making tty-solitaire available on Ubuntu, Fedora, Gentoo,
and more. Please give us a hand at [[https://github.com/mpereira/tty-solitaire/issues/29][issue #29]] if you think you can help.
*** From source *** From source
**** Install Ncurses **** Install Ncurses
tty-solitaire depends on Ncurses. Some platforms provide it out of the box tty-solitaire depends on Ncurses. Some platforms provide it out of the box
and some don't, so you might need to install it yourself. and some don't, so you might need to install it yourself.
***** Ubuntu ***** Ubuntu
#+BEGIN_SRC bash #+begin_src bash
sudo apt-get install libncurses5-dev libncursesw5-dev sudo apt-get install libncurses5-dev libncursesw5-dev
#+END_SRC #+end_src
***** macOS ***** macOS
macOS has Ncurses with wide character support out of the box, so *there's macOS has Ncurses with wide character support out of the box, so *there's
nothing you need to do*. If you want to use other Ncurses libraries (from nothing you need to do*.
*If* for some reason you want to use other Ncurses libraries (from
Macports, Homebrew, etc.) you are able to do it by specifying =LDLAGS= in Macports, Homebrew, etc.) you are able to do it by specifying =LDLAGS= in
the make invocation. See [[https://github.com/mpereira/tty-solitaire/pull/8][this pull request]] for more information. the make invocation. See [[https://github.com/mpereira/tty-solitaire/pull/8][this pull request]] for more information.
**** Install tty-solitaire **** Install tty-solitaire
#+BEGIN_SRC text #+begin_src bash
$ wget -O tty-solitaire-v1.1.0.tar.gz https://github.com/mpereira/tty-solitaire/archive/v1.1.0.tar.gz wget -O tty-solitaire-v1.2.0.tar.gz https://github.com/mpereira/tty-solitaire/archive/v1.2.0.tar.gz
$ tar xvf tty-solitaire-v1.1.0.tar.gz tar xvf tty-solitaire-v1.2.0.tar.gz
$ cd tty-solitaire-1.1.0 cd tty-solitaire-1.2.0
$ make make
$ sudo make install sudo make install
#+END_SRC #+end_src
*** Via package managers
Check out https://github.com/mpereira/tty-solitaire/issues/29.
** Play ** Play
Run in your favorite shell: Run in your favorite shell:
#+BEGIN_SRC bash
#+begin_src bash
ttysolitaire ttysolitaire
#+END_SRC #+end_src
** Usage ** Usage
#+BEGIN_SRC text #+begin_src text
usage: ttysolitaire [-v|--version] [-h|--help] [-p|--passes=NUMBER] usage: ttysolitaire [-v|--version] [-h|--help] [-p|--passes=NUMBER]
-v, --version Show version -v, --version Show version
-h, --help Show this message -h, --help Show this message
-p, --passes Number of passes through the deck -p, --passes Number of passes through the deck
#+END_SRC #+end_src
** Development ** Development
*** Get the code *** Get the code
#+BEGIN_SRC bash #+begin_src bash
git clone https://github.com/mpereira/tty-solitaire.git git clone https://github.com/mpereira/tty-solitaire.git
#+END_SRC #+end_src
*** Run the unit tests *** Run the unit tests
#+BEGIN_SRC bash #+begin_src bash
make test make test
#+END_SRC #+end_src
*** [[https://invisible-island.net/ncurses/man/ncurses.3x.html][Ncurses documentation]]
*** [[https://tldp.org/HOWTO/NCURSES-Programming-HOWTO/][Ncurses programming HOWTO]]
** Author ** Author
[[http://murilopereira.com][Murilo Pereira]] [[http://murilopereira.com][Murilo Pereira]]

View File

@ -153,8 +153,8 @@ static void shuffle_deck(struct deck *deck) {
card[i] = stack_pop(&(deck->stock)); card[i] = stack_pop(&(deck->stock));
} }
srand(time(NULL)); srand(time(NULL));
for (int i = 0; i < NUMBER_OF_CARDS - 1; i++) { for (int i = 0; i < NUMBER_OF_CARDS; i++) {
random = i + (rand() % (NUMBER_OF_CARDS) - i); random = rand() % (NUMBER_OF_CARDS);
tmp = *card[i]; tmp = *card[i];
*card[i] = (*card[random]); *card[i] = (*card[random]);
*card[random] = tmp; *card[random] = tmp;
@ -162,6 +162,7 @@ static void shuffle_deck(struct deck *deck) {
for (int i = 0; i < NUMBER_OF_CARDS; i++) { for (int i = 0; i < NUMBER_OF_CARDS; i++) {
stack_push(&(deck->stock), card[i]); stack_push(&(deck->stock), card[i]);
} }
free(card);
} }
static void deal_cards(struct deck *deck) { static void deal_cards(struct deck *deck) {

View File

@ -69,6 +69,7 @@ int stack_length(struct stack *stack) {
void stack_push(struct stack **stack, struct card *card) { void stack_push(struct stack **stack, struct card *card) {
if (card) { if (card) {
if (stack_empty(*stack)) { if (stack_empty(*stack)) {
card_free((*stack)->card);
(*stack)->card = card; (*stack)->card = card;
} else { } else {
/* Allocating by hand because stack_malloc() would /* Allocating by hand because stack_malloc() would

View File

@ -25,6 +25,9 @@ void test_card_dup() {
assert(card_0 != card_1); assert(card_0 != card_1);
assert(cards_equal(card_0, card_1)); assert(cards_equal(card_0, card_1));
card_free(card_0);
card_free(card_1);
} }
void test_card_set() { void test_card_set() {

View File

@ -25,6 +25,9 @@ void test_frame_dup() {
assert(frame_0 != frame_1); assert(frame_0 != frame_1);
assert(frames_equal(frame_0, frame_1)); assert(frames_equal(frame_0, frame_1));
frame_free(frame_0);
frame_free(frame_1);
} }
void test_frame_set() { void test_frame_set() {

View File

@ -119,7 +119,7 @@ void test_valid_move_from_waste_pile_to_foundation_stacks() {
stack_malloc(&waste_pile); stack_malloc(&waste_pile);
stack_init(waste_pile); stack_init(waste_pile);
card_set(waste_pile->card, ACE, SPADES, EXPOSED, WASTE_PILE_BEGIN_Y, WASTE_PILE_BEGIN_X); card_set(waste_pile->card, TWO, SPADES, EXPOSED, WASTE_PILE_BEGIN_Y, WASTE_PILE_BEGIN_X);
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
stack_malloc(&foundation_stacks[i]); stack_malloc(&foundation_stacks[i]);
stack_init(foundation_stacks[i]); stack_init(foundation_stacks[i]);
@ -129,7 +129,6 @@ void test_valid_move_from_waste_pile_to_foundation_stacks() {
card_set(foundation_stacks[2]->card, ACE, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_2_BEGIN_X); card_set(foundation_stacks[2]->card, ACE, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_2_BEGIN_X);
card_set(foundation_stacks[3]->card, ACE, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_3_BEGIN_X); card_set(foundation_stacks[3]->card, ACE, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_3_BEGIN_X);
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
// TODO: fix error here
assert(valid_move(waste_pile, foundation_stacks[i])); assert(valid_move(waste_pile, foundation_stacks[i]));
} }
stack_free(waste_pile); stack_free(waste_pile);
@ -143,20 +142,19 @@ void test_valid_move_from_waste_pile_to_maneuvre_stacks() {
stack_malloc(&waste_pile); stack_malloc(&waste_pile);
stack_init(waste_pile); stack_init(waste_pile);
card_set(waste_pile->card, ACE, SPADES, EXPOSED, WASTE_PILE_BEGIN_Y, WASTE_PILE_BEGIN_X); card_set(waste_pile->card, ACE, DIAMONDS, EXPOSED, WASTE_PILE_BEGIN_Y, WASTE_PILE_BEGIN_X);
for (int i = 0; i < 7; i++) { for (int i = 0; i < 7; i++) {
stack_malloc(&maneuvre_stacks[i]); stack_malloc(&maneuvre_stacks[i]);
stack_init(maneuvre_stacks[i]); stack_init(maneuvre_stacks[i]);
} }
card_set(maneuvre_stacks[0]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_0_BEGIN_X); card_set(maneuvre_stacks[0]->card, TWO, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_0_BEGIN_X);
card_set(maneuvre_stacks[1]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_1_BEGIN_X); card_set(maneuvre_stacks[1]->card, TWO, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_1_BEGIN_X);
card_set(maneuvre_stacks[2]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_2_BEGIN_X); card_set(maneuvre_stacks[2]->card, TWO, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_2_BEGIN_X);
card_set(maneuvre_stacks[3]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_3_BEGIN_X); card_set(maneuvre_stacks[3]->card, TWO, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_3_BEGIN_X);
card_set(maneuvre_stacks[4]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_4_BEGIN_X); card_set(maneuvre_stacks[4]->card, TWO, CLUBS, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_4_BEGIN_X);
card_set(maneuvre_stacks[5]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_5_BEGIN_X); card_set(maneuvre_stacks[5]->card, TWO, CLUBS, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_5_BEGIN_X);
card_set(maneuvre_stacks[6]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_6_BEGIN_X); card_set(maneuvre_stacks[6]->card, TWO, CLUBS, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_6_BEGIN_X);
for (int i = 0; i < 7; i++) { for (int i = 0; i < 7; i++) {
// TODO: fix error here
assert(valid_move(waste_pile, maneuvre_stacks[i])); assert(valid_move(waste_pile, maneuvre_stacks[i]));
} }
stack_free(waste_pile); stack_free(waste_pile);
@ -219,15 +217,14 @@ void test_valid_move_from_foundation_stack_to_foundation_stacks() {
stack_init(foundation_stacks[i]); stack_init(foundation_stacks[i]);
} }
card_set(foundation_stacks[0]->card, ACE, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_0_BEGIN_X); card_set(foundation_stacks[0]->card, ACE, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_0_BEGIN_X);
card_set(foundation_stacks[1]->card, ACE, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_1_BEGIN_X); card_set(foundation_stacks[1]->card, TWO, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_1_BEGIN_X);
card_set(foundation_stacks[2]->card, ACE, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_2_BEGIN_X); card_set(foundation_stacks[2]->card, THREE, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_2_BEGIN_X);
card_set(foundation_stacks[3]->card, ACE, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_3_BEGIN_X); card_set(foundation_stacks[3]->card, FOUR, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_3_BEGIN_X);
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) { for (int j = 0; j < 4; j++) {
if (i == j) { if (i != j + 1) {
assert(!valid_move(foundation_stacks[i], foundation_stacks[j])); assert(!valid_move(foundation_stacks[i], foundation_stacks[j]));
} else { } else {
// TODO: fix error here
assert(valid_move(foundation_stacks[i], foundation_stacks[j])); assert(valid_move(foundation_stacks[i], foundation_stacks[j]));
} }
} }
@ -247,22 +244,21 @@ void test_valid_move_from_foundation_stack_to_maneuvre_stacks() {
} }
card_set(foundation_stacks[0]->card, ACE, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_0_BEGIN_X); card_set(foundation_stacks[0]->card, ACE, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_0_BEGIN_X);
card_set(foundation_stacks[1]->card, ACE, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_1_BEGIN_X); card_set(foundation_stacks[1]->card, ACE, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_1_BEGIN_X);
card_set(foundation_stacks[2]->card, ACE, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_2_BEGIN_X); card_set(foundation_stacks[2]->card, ACE, CLUBS, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_2_BEGIN_X);
card_set(foundation_stacks[3]->card, ACE, SPADES, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_3_BEGIN_X); card_set(foundation_stacks[3]->card, ACE, CLUBS, EXPOSED, FOUNDATION_BEGIN_Y, FOUNDATION_3_BEGIN_X);
for (int i = 0; i < 7; i++) { for (int i = 0; i < 7; i++) {
stack_malloc(&maneuvre_stacks[i]); stack_malloc(&maneuvre_stacks[i]);
stack_init(maneuvre_stacks[i]); stack_init(maneuvre_stacks[i]);
} }
card_set(maneuvre_stacks[0]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_0_BEGIN_X); card_set(maneuvre_stacks[0]->card, TWO, HEARTS, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_0_BEGIN_X);
card_set(maneuvre_stacks[1]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_1_BEGIN_X); card_set(maneuvre_stacks[1]->card, TWO, HEARTS, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_1_BEGIN_X);
card_set(maneuvre_stacks[2]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_2_BEGIN_X); card_set(maneuvre_stacks[2]->card, TWO, HEARTS, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_2_BEGIN_X);
card_set(maneuvre_stacks[3]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_3_BEGIN_X); card_set(maneuvre_stacks[3]->card, TWO, HEARTS, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_3_BEGIN_X);
card_set(maneuvre_stacks[4]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_4_BEGIN_X); card_set(maneuvre_stacks[4]->card, TWO, DIAMONDS, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_4_BEGIN_X);
card_set(maneuvre_stacks[5]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_5_BEGIN_X); card_set(maneuvre_stacks[5]->card, TWO, DIAMONDS, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_5_BEGIN_X);
card_set(maneuvre_stacks[6]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_6_BEGIN_X); card_set(maneuvre_stacks[6]->card, TWO, DIAMONDS, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_6_BEGIN_X);
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
for (int j = 0; j < 7; j++) { for (int j = 0; j < 7; j++) {
// TODO: fix error here
assert(valid_move(foundation_stacks[i], maneuvre_stacks[j])); assert(valid_move(foundation_stacks[i], maneuvre_stacks[j]));
} }
} }
@ -342,16 +338,15 @@ void test_valid_move_from_maneuvre_stack_to_foundation_stacks() {
stack_malloc(&maneuvre_stacks[i]); stack_malloc(&maneuvre_stacks[i]);
stack_init(maneuvre_stacks[i]); stack_init(maneuvre_stacks[i]);
} }
card_set(maneuvre_stacks[0]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_0_BEGIN_X); card_set(maneuvre_stacks[0]->card, TWO, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_0_BEGIN_X);
card_set(maneuvre_stacks[1]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_1_BEGIN_X); card_set(maneuvre_stacks[1]->card, TWO, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_1_BEGIN_X);
card_set(maneuvre_stacks[2]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_2_BEGIN_X); card_set(maneuvre_stacks[2]->card, TWO, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_2_BEGIN_X);
card_set(maneuvre_stacks[3]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_3_BEGIN_X); card_set(maneuvre_stacks[3]->card, TWO, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_3_BEGIN_X);
card_set(maneuvre_stacks[4]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_4_BEGIN_X); card_set(maneuvre_stacks[4]->card, TWO, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_4_BEGIN_X);
card_set(maneuvre_stacks[5]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_5_BEGIN_X); card_set(maneuvre_stacks[5]->card, TWO, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_5_BEGIN_X);
card_set(maneuvre_stacks[6]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_6_BEGIN_X); card_set(maneuvre_stacks[6]->card, TWO, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_6_BEGIN_X);
for (int i = 0; i < 7; i++) { for (int i = 0; i < 7; i++) {
for (int j = 0; j < 4; j++) { for (int j = 0; j < 4; j++) {
// TODO: fix error here
assert(valid_move(maneuvre_stacks[i], foundation_stacks[j])); assert(valid_move(maneuvre_stacks[i], foundation_stacks[j]));
} }
} }
@ -371,18 +366,17 @@ void test_valid_move_from_maneuvre_stack_to_maneuvre_stacks() {
stack_init(maneuvre_stacks[i]); stack_init(maneuvre_stacks[i]);
} }
card_set(maneuvre_stacks[0]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_0_BEGIN_X); card_set(maneuvre_stacks[0]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_0_BEGIN_X);
card_set(maneuvre_stacks[1]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_1_BEGIN_X); card_set(maneuvre_stacks[1]->card, TWO, HEARTS, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_1_BEGIN_X);
card_set(maneuvre_stacks[2]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_2_BEGIN_X); card_set(maneuvre_stacks[2]->card, THREE, CLUBS, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_2_BEGIN_X);
card_set(maneuvre_stacks[3]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_3_BEGIN_X); card_set(maneuvre_stacks[3]->card, FOUR, DIAMONDS, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_3_BEGIN_X);
card_set(maneuvre_stacks[4]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_4_BEGIN_X); card_set(maneuvre_stacks[4]->card, FIVE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_4_BEGIN_X);
card_set(maneuvre_stacks[5]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_5_BEGIN_X); card_set(maneuvre_stacks[5]->card, SIX, DIAMONDS, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_5_BEGIN_X);
card_set(maneuvre_stacks[6]->card, ACE, SPADES, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_6_BEGIN_X); card_set(maneuvre_stacks[6]->card, SEVEN, CLUBS, EXPOSED, MANEUVRE_BEGIN_Y, MANEUVRE_6_BEGIN_X);
for (int i = 0; i < 7; i++) { for (int i = 0; i < 7; i++) {
for (int j = 0; j < 7; j++) { for (int j = 0; j < 7; j++) {
if (i == j) { if (i + 1 != j) {
assert(!valid_move(maneuvre_stacks[i], maneuvre_stacks[j])); assert(!valid_move(maneuvre_stacks[i], maneuvre_stacks[j]));
} else { } else {
// TODO: fix error here
assert(valid_move(maneuvre_stacks[i], maneuvre_stacks[j])); assert(valid_move(maneuvre_stacks[i], maneuvre_stacks[j]));
} }
} }
@ -412,6 +406,8 @@ void test_move_card_from_stack_empty_stack_to_stack_empty_stack() {
assert(destination == new_destination); assert(destination == new_destination);
assert(stacks_equal(destination, destination_duplicate)); assert(stacks_equal(destination, destination_duplicate));
stack_free(origin_duplicate);
stack_free(destination_duplicate);
stack_free(origin); stack_free(origin);
stack_free(destination); stack_free(destination);
} }
@ -442,6 +438,8 @@ void test_move_card_from_stack_empty_stack_to_non_stack_empty_stack() {
assert(destination == new_destination); assert(destination == new_destination);
assert(stacks_equal(destination, destination_duplicate)); assert(stacks_equal(destination, destination_duplicate));
stack_free(origin_duplicate);
stack_free(destination_duplicate);
stack_free(origin); stack_free(origin);
stack_free(destination); stack_free(destination);
} }

View File

@ -30,6 +30,9 @@ void test_stack_dup() {
assert(stack_0 != stack_1); assert(stack_0 != stack_1);
assert(stacks_equal(stack_0, stack_1)); assert(stacks_equal(stack_0, stack_1));
stack_free(stack_0);
stack_free(stack_1);
} }
void test_stack_empty_on_stack_empty_stack() { void test_stack_empty_on_stack_empty_stack() {
@ -185,6 +188,7 @@ void test_stack_pop_on_stack_with_one_element() {
assert(stack_popped_card == card); assert(stack_popped_card == card);
stack_free(stack); stack_free(stack);
card_free(stack_popped_card);
} }
void test_stack_pop_on_stack_with_more_than_one_element() { void test_stack_pop_on_stack_with_more_than_one_element() {
@ -207,6 +211,7 @@ void test_stack_pop_on_stack_with_more_than_one_element() {
assert(stack_popped_card == card[2]); assert(stack_popped_card == card[2]);
stack_free(stack); stack_free(stack);
card_free(stack_popped_card);
} }
void test_stack_reverse_on_stack_empty_stack() { void test_stack_reverse_on_stack_empty_stack() {
@ -220,6 +225,7 @@ void test_stack_reverse_on_stack_empty_stack() {
assert(stacks_equal(stack_reversed_stack, old_stack)); assert(stacks_equal(stack_reversed_stack, old_stack));
stack_free(stack); stack_free(stack);
stack_free(stack_reversed_stack);
} }
void test_stack_reverse_on_stack_with_one_element() { void test_stack_reverse_on_stack_with_one_element() {
@ -238,6 +244,7 @@ void test_stack_reverse_on_stack_with_one_element() {
assert(stacks_equal(stack_reversed_stack, old_stack)); assert(stacks_equal(stack_reversed_stack, old_stack));
stack_free(stack_reversed_stack);
stack_free(stack); stack_free(stack);
} }
@ -264,12 +271,14 @@ void test_stack_reverse_on_stack_with_more_than_one_element() {
assert(stacks_equal(unstack_reversed_stack, old_stack)); assert(stacks_equal(unstack_reversed_stack, old_stack));
stack_free(unstack_reversed_stack);
stack_free(stack_reversed_stack); stack_free(stack_reversed_stack);
stack_free(old_stack);
stack_free(stack); stack_free(stack);
} }
void test_stack_reverse_should_not_change_stack() { void test_stack_reverse_should_not_change_stack() {
struct stack *stack, *old_stack, *old_stack_address; struct stack *stack, *stack_reversed_stack_0, *stack_reversed_stack_1;
struct card *card[3]; struct card *card[3];
stack_malloc(&stack); stack_malloc(&stack);
@ -280,13 +289,14 @@ void test_stack_reverse_should_not_change_stack() {
card_set(card[i], TWO + i, DIAMONDS + i, EXPOSED, 0, 0); card_set(card[i], TWO + i, DIAMONDS + i, EXPOSED, 0, 0);
stack_push(&stack, card[i]); stack_push(&stack, card[i]);
} }
old_stack_address = stack; stack_reversed_stack_0 = stack_reverse(stack);
old_stack = stack_dup(stack); stack_reversed_stack_1 = stack_reverse(stack_reversed_stack_0);
stack_reverse(stack);
assert(stack == old_stack_address); assert(!stacks_equal(stack, stack_reversed_stack_0));
assert(stacks_equal(stack, old_stack)); assert(stacks_equal(stack, stack_reversed_stack_1));
stack_free(stack_reversed_stack_0);
stack_free(stack_reversed_stack_1);
stack_free(stack); stack_free(stack);
} }

View File

@ -11,6 +11,8 @@ void test_frames_equal_with_one_null() {
frame_malloc(&frame); frame_malloc(&frame);
assert(!frames_equal(frame, NULL)); assert(!frames_equal(frame, NULL));
assert(!frames_equal(NULL, frame)); assert(!frames_equal(NULL, frame));
frame_free(frame);
} }
void test_frames_equal_with_two_equivalent_frames() { void test_frames_equal_with_two_equivalent_frames() {
@ -23,14 +25,20 @@ void test_frames_equal_with_two_equivalent_frames() {
frame_set(frame_1, begin_y, begin_x); frame_set(frame_1, begin_y, begin_x);
assert(frames_equal(frame_0, frame_1)); assert(frames_equal(frame_0, frame_1));
frame_free(frame_0);
frame_free(frame_1);
} }
void test_frames_equal_with_two_frame_pointers_to_the_same_address() { void test_frames_equal_with_two_frame_pointers_to_the_same_address() {
struct frame *frame; struct frame *frame;
frame_malloc(&frame); frame_malloc(&frame);
frame_init(frame);
assert(frames_equal(frame, frame)); assert(frames_equal(frame, frame));
frame_free(frame);
} }
void test_cards_equal_with_two_nulls() { void test_cards_equal_with_two_nulls() {
@ -55,14 +63,20 @@ void test_cards_equal_with_two_equivalent_cards() {
card_set(card_1, ACE, SPADES, EXPOSED, begin_y, begin_x); card_set(card_1, ACE, SPADES, EXPOSED, begin_y, begin_x);
assert(cards_equal(card_0, card_1)); assert(cards_equal(card_0, card_1));
card_free(card_0);
card_free(card_1);
} }
void test_cards_equal_with_two_card_pointers_to_the_same_address() { void test_cards_equal_with_two_card_pointers_to_the_same_address() {
struct card *card; struct card *card;
card_malloc(&card); card_malloc(&card);
card_init(card);
assert(cards_equal(card, card)); assert(cards_equal(card, card));
card_free(card);
} }
void test_stacks_equal_with_two_nulls() { void test_stacks_equal_with_two_nulls() {
@ -73,8 +87,12 @@ void test_stacks_equal_with_one_null() {
struct stack *stack; struct stack *stack;
stack_malloc(&stack); stack_malloc(&stack);
stack_init(stack);
assert(!stacks_equal(stack, NULL)); assert(!stacks_equal(stack, NULL));
assert(!stacks_equal(NULL, stack)); assert(!stacks_equal(NULL, stack));
stack_free(stack);
} }
void test_stacks_equal_with_two_equivalent_stacks() { void test_stacks_equal_with_two_equivalent_stacks() {
@ -88,10 +106,15 @@ void test_stacks_equal_with_two_equivalent_stacks() {
card_set(card_1, ACE, SPADES, EXPOSED, begin_y, begin_x); card_set(card_1, ACE, SPADES, EXPOSED, begin_y, begin_x);
stack_malloc(&stack_0); stack_malloc(&stack_0);
stack_malloc(&stack_1); stack_malloc(&stack_1);
stack_init(stack_0);
stack_init(stack_1);
stack_push(&stack_0, card_0); stack_push(&stack_0, card_0);
stack_push(&stack_1, card_1); stack_push(&stack_1, card_1);
assert(stacks_equal(stack_0, stack_1)); assert(stacks_equal(stack_0, stack_1));
stack_free(stack_0);
stack_free(stack_1);
} }
void test_stacks_equal_with_two_different_stacks() { void test_stacks_equal_with_two_different_stacks() {
@ -105,18 +128,26 @@ void test_stacks_equal_with_two_different_stacks() {
card_set(card_1, KING, HEARTS, EXPOSED, begin_y, begin_x); card_set(card_1, KING, HEARTS, EXPOSED, begin_y, begin_x);
stack_malloc(&stack_0); stack_malloc(&stack_0);
stack_malloc(&stack_1); stack_malloc(&stack_1);
stack_init(stack_0);
stack_init(stack_1);
stack_push(&stack_0, card_0); stack_push(&stack_0, card_0);
stack_push(&stack_1, card_1); stack_push(&stack_1, card_1);
assert(!stacks_equal(stack_0, stack_1)); assert(!stacks_equal(stack_0, stack_1));
stack_free(stack_0);
stack_free(stack_1);
} }
void test_stacks_equal_with_two_stack_pointers_to_the_same_address() { void test_stacks_equal_with_two_stack_pointers_to_the_same_address() {
struct stack *stack; struct stack *stack;
stack_malloc(&stack); stack_malloc(&stack);
stack_init(stack);
assert(stacks_equal(stack, stack)); assert(stacks_equal(stack, stack));
stack_free(stack);
} }
void test_test_helper() { void test_test_helper() {