Testing the coinsExchange problem
I'm going to show you how I test this program, basically focusing on the cases
that don't require recursion before testing the ones that do need recursion:
Testing success, where we don't need anything for gold, silver or bronze
You'll note that in all of these cases, G, S, and B are less then or equal to zero --
there are no needs:
UNIX> echo 1 1 1 0 0 0 | bin/coins_exchange -
CE2: G:-1 S:-1 B:-1
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
0
UNIX> echo 15 20 30 15 20 30 | bin/coins_exchange -
CE2: G:0 S:0 B:0
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
0
UNIX> echo 15 20 30 14 19 29 | bin/coins_exchange -
CE2: G:-1 S:-1 B:-1
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
0
UNIX>
Testing failure, where we only consider silver
You'll note, we're answering "no" to every question, so there's no recursion -- we
simply get to question 7, and return failure.
UNIX> echo 0 5 0 0 6 0 | bin/coins_exchange -
CE2: G:0 S:1 B:0
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
#5: Do we have any gold for silver (recurse on yes)?
#6: Do we have enough bronze for silver? (return on yes).
#7: Failure -- return -100000000
-1
UNIX>
Getting silver from bronze
Question 6 is getting silver from bronze, so let's just test that. Again, there's no
recursion: either we get everything from bronze, or we fail:
UNIX> echo 0 0 11 0 1 0 | bin/coins_exchange -
CE2: G:0 S:1 B:-11
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
#5: Do we have any gold for silver (recurse on yes)?
#6: Do we have enough bronze for silver? (return on yes).
1
UNIX> echo 0 0 34 0 3 0 | bin/coins_exchange -
CE2: G:0 S:3 B:-34
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
#5: Do we have any gold for silver (recurse on yes)?
#6: Do we have enough bronze for silver? (return on yes).
3
UNIX> echo 0 0 32 0 3 0 | bin/coins_exchange -
CE2: G:0 S:3 B:-32
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
#5: Do we have any gold for silver (recurse on yes)?
#6: Do we have enough bronze for silver? (return on yes).
#7: Failure -- return -100000000
-1
UNIX>
There's enough gold for all of the silver
Again, no recursion here, so this is easy testing:
UNIX> echo 1 0 0 0 5 0 | bin/coins_exchange -
CE2: G:-1 S:5 B:0
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
1
UNIX> echo 9 0 0 0 55 0 | bin/coins_exchange -
CE2: G:-9 S:55 B:0
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
7 # 6*9 = 54, which isn't enough, so we need 7 gold.
UNIX> echo 9 0 0 0 54 0 | bin/coins_exchange -
CE2: G:-9 S:54 B:0
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
6 # Now 6 is fine.
UNIX>
There is gold, but not enough gold for all of the silver
Here we will use recursion to account for using up all of our gold.
In the first call, there's no bronze,
so there is failure. In the second call, we can get the remainder from bronze. In the
last call, we can't get the remainder from bronze:
UNIX> echo 1 0 0 0 12 0 | bin/coins_exchange -
CE2: G:-1 S:12 B:0
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
#5: Do we have any gold for silver (recurse on yes)?
CE2: G:0 S:3 B:0 # We can get 9 silver from gold. We still need 3.
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
#5: Do we have any gold for silver (recurse on yes)?
#6: Do we have enough bronze for silver? (return on yes).
#7: Failure -- return -100000000
-1
UNIX> echo 1 0 33 0 12 0 | bin/coins_exchange -
CE2: G:-1 S:12 B:-33
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
#5: Do we have any gold for silver (recurse on yes)?
CE2: G:0 S:3 B:-33 # We can get 9 silver from gold. We can get the 3 from bronze.
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
#5: Do we have any gold for silver (recurse on yes)?
#6: Do we have enough bronze for silver? (return on yes).
4
UNIX> echo 1 0 32 0 12 0 | bin/coins_exchange -
CE2: G:-1 S:12 B:-32
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
#5: Do we have any gold for silver (recurse on yes)?
CE2: G:0 S:3 B:-32 # Now there's not enough bronze.
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
#5: Do we have any gold for silver (recurse on yes)?
#6: Do we have enough bronze for silver? (return on yes).
#7: Failure -- return -100000000
-1
UNIX>
We need bronze
This will result in recursion where we convert our bronze needs to silver:
UNIX> echo 0 0 0 0 0 1 | bin/coins_exchange -
CE2: G:0 S:0 B:1
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
CE2: G:0 S:1 B:0 # We need one silver, and will fail.
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
#5: Do we have any gold for silver (recurse on yes)?
#6: Do we have enough bronze for silver? (return on yes).
#7: Failure -- return -100000000
-1
UNIX> echo 0 0 0 0 0 9 | bin/coins_exchange -
CE2: G:0 S:0 B:9
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
CE2: G:0 S:1 B:0 # We still need one silver, and will still fail.
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
#5: Do we have any gold for silver (recurse on yes)?
#6: Do we have enough bronze for silver? (return on yes).
#7: Failure -- return -100000000
-1
UNIX> echo 0 0 0 0 0 10 | bin/coins_exchange -
CE2: G:0 S:0 B:10
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
CE2: G:0 S:2 B:0 # 10 bronze = two silver, and we're still failing.
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
#5: Do we have any gold for silver (recurse on yes)?
#6: Do we have enough bronze for silver? (return on yes).
#7: Failure -- return -100000000
-1
UNIX> echo 0 2 0 0 0 10 | bin/coins_exchange -
CE2: G:0 S:-2 B:10
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
CE2: G:0 S:0 B:0 # We need two silver, and we have it.
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
2 # It's the recursive call plus 2.
UNIX> echo 1 1 0 0 0 10 | bin/coins_exchange -
CE2: G:-1 S:-1 B:10
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
CE2: G:-1 S:1 B:0 # Our recursive call identifies we need one silver from gold.
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
3 # One exchange gold->silver, two silver->bronze.
UNIX>
We need gold
This is our last test case, and it uses recursion.
UNIX> echo 0 0 0 1 0 0 | bin/coins_exchange -
CE2: G:1 S:0 B:0
#1: Do we need gold? (recurse on yes)
CE2: G:0 S:11 B:0 # Recursion identifies we need 11 silver.
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
#5: Do we have any gold for silver (recurse on yes)?
#6: Do we have enough bronze for silver? (return on yes).
#7: Failure -- return -100000000
-1
UNIX> echo 0 11 0 1 0 0 | bin/coins_exchange -
CE2: G:1 S:-11 B:0
#1: Do we need gold? (recurse on yes)
CE2: G:0 S:0 B:0 # Now we had 11 silver, so we're good.
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
1
UNIX> echo 0 11 0 2 0 0 | bin/coins_exchange -
CE2: G:2 S:-11 B:0
#1: Do we need gold? (recurse on yes)
CE2: G:0 S:11 B:0 # 11 silver is not enough for 2 gold.
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
#5: Do we have any gold for silver (recurse on yes)?
#6: Do we have enough bronze for silver? (return on yes).
#7: Failure -- return -100000000
-1
UNIX> echo 0 11 100 2 0 0 | bin/coins_exchange -
CE2: G:2 S:-11 B:-100
#1: Do we need gold? (recurse on yes)
CE2: G:0 S:11 B:-100 # 11 silver and 100 bronze is not enough for 2 gold.
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
#5: Do we have any gold for silver (recurse on yes)?
#6: Do we have enough bronze for silver? (return on yes).
#7: Failure -- return -100000000
-1
UNIX> echo 0 11 121 2 0 0 | bin/coins_exchange -
CE2: G:2 S:-11 B:-121
#1: Do we need gold? (recurse on yes)
CE2: G:0 S:11 B:-121 # Now we're good.
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
#5: Do we have any gold for silver (recurse on yes)?
#6: Do we have enough bronze for silver? (return on yes).
13
UNIX> echo 0 1 121 1 0 0 | bin/coins_exchange -
CE2: G:1 S:-1 B:-121
#1: Do we need gold? (recurse on yes)
CE2: G:0 S:10 B:-121 # Still good.
#1: Do we need gold? (recurse on yes)
#2: Do we need bronze? (recurse on yes)
#3: Do we have enough silver? (return on yes)
#4: Do we have enough gold for silver (return on yes)?
#5: Do we have any gold for silver (recurse on yes)?
#6: Do we have enough bronze for silver? (return on yes).
11
UNIX>