Python: Add tests for bounce and bowling

This commit is contained in:
Martin Thoma
2022-03-23 11:44:46 +01:00
parent 0064fd328a
commit e66d2df028
4 changed files with 360 additions and 14 deletions

View File

@@ -1,14 +1,15 @@
import random
from typing import List
def simulate_roll(pins) -> None:
def simulate_roll(pins: List[int]) -> None:
for _ in range(20):
x = random.randint(0, 14)
if x < len(pins):
pins[x] = 1
def calculate_score(rolls) -> int:
def calculate_score(rolls: List[int]) -> int:
score = 0
frame = 1
b = 1
@@ -32,11 +33,11 @@ def calculate_score(rolls) -> int:
class Player:
def __init__(self, name):
def __init__(self, name: str):
self.name = name
self.rolls = []
self.rolls: List[int] = []
def play_frame(self, frame):
def play_frame(self, frame: int) -> None:
extra = 0
prev_score = 0
pins = [0] * 10 # reset the pins
@@ -73,10 +74,10 @@ class Player:
score = sum(pins)
self.rolls.append(score)
def __str__(self):
def __str__(self) -> str:
return f"{self.name}: {self.rolls}, total:{calculate_score(self.rolls)}"
def show(self, pins):
def show(self, pins: List[int]) -> None:
pins_iter = iter(pins)
print()
for row in range(4):
@@ -87,14 +88,14 @@ class Player:
print()
def centreText(text, width):
def centre_text(text: str, width: int) -> str:
t = len(text)
return (" " * ((width - t) // 2)) + text
def main() -> None:
print(centreText("Bowl", 80))
print(centreText("CREATIVE COMPUTING MORRISTOWN, NEW JERSEY", 80))
print(centre_text("Bowl", 80))
print(centre_text("CREATIVE COMPUTING MORRISTOWN, NEW JERSEY", 80))
print()
print("WELCOME TO THE ALLEY.")
print("BRING YOUR FRIENDS.")

View File

@@ -0,0 +1,273 @@
import io
from typing import List
from _pytest.capture import CaptureFixture
from _pytest.monkeypatch import MonkeyPatch
from bowling import main
def test_bowling_strikes(monkeypatch: MonkeyPatch, capsys: CaptureFixture[str]) -> None:
def perfect_roll(pins: List[int]) -> None:
for i in range(20):
x = i
if x < len(pins):
pins[x] = 1
monkeypatch.setattr("bowling.simulate_roll", perfect_roll)
instructions1 = "Y"
players1 = 1
name1 = "Martin"
another_game1 = "Y"
instructions2 = "N"
players2 = 2
name21 = "Anna"
name22 = "Bob"
another_game2 = "N"
monkeypatch.setattr(
"sys.stdin",
io.StringIO(
f"{instructions1}\n{players1}\n{name1}\n{another_game1}\n"
f"{instructions2}\n{players2}\n{name21}\n{name22}\n{another_game2}"
),
)
main()
actual = capsys.readouterr().out
expected = """ Bowl
CREATIVE COMPUTING MORRISTOWN, NEW JERSEY
WELCOME TO THE ALLEY.
BRING YOUR FRIENDS.
OKAY LET'S FIRST GET ACQUAINTED.
THE INSTRUCTIONS (Y/N)? THE GAME OF BOWLING TAKES MIND AND SKILL. DURING THE GAME
THE COMPUTER WILL KEEP SCORE. YOU MAY COMPETE WITH
OTHER PLAYERS[UP TO FOUR]. YOU WILL BE PLAYING TEN FRAMES.
ON THE PIN DIAGRAM 'O' MEANS THE PIN IS DOWN...'+' MEANS THE
PIN IS STANDING. AFTER THE GAME THE COMPUTER WILL SHOW YOUR
SCORES.
FIRST OF ALL...HOW MANY ARE PLAYING?
VERY GOOD...
Enter name for player 1:
O O O O
O O O
O O
O
10 for Martin
STRIKE!!!
O O O O
O O O
O O
O
10 for Martin
STRIKE!!!
O O O O
O O O
O O
O
10 for Martin
STRIKE!!!
O O O O
O O O
O O
O
10 for Martin
STRIKE!!!
O O O O
O O O
O O
O
10 for Martin
STRIKE!!!
O O O O
O O O
O O
O
10 for Martin
STRIKE!!!
O O O O
O O O
O O
O
10 for Martin
STRIKE!!!
O O O O
O O O
O O
O
10 for Martin
STRIKE!!!
O O O O
O O O
O O
O
10 for Martin
STRIKE!!!
O O O O
O O O
O O
O
10 for Martin
STRIKE!!!
Extra rolls for Martin
Martin: [10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10], total:300
DO YOU WANT ANOTHER GAME?
THE INSTRUCTIONS (Y/N)? FIRST OF ALL...HOW MANY ARE PLAYING?
VERY GOOD...
Enter name for player 1: Enter name for player 2:
O O O O
O O O
O O
O
10 for Anna
STRIKE!!!
O O O O
O O O
O O
O
10 for Bob
STRIKE!!!
O O O O
O O O
O O
O
10 for Anna
STRIKE!!!
O O O O
O O O
O O
O
10 for Bob
STRIKE!!!
O O O O
O O O
O O
O
10 for Anna
STRIKE!!!
O O O O
O O O
O O
O
10 for Bob
STRIKE!!!
O O O O
O O O
O O
O
10 for Anna
STRIKE!!!
O O O O
O O O
O O
O
10 for Bob
STRIKE!!!
O O O O
O O O
O O
O
10 for Anna
STRIKE!!!
O O O O
O O O
O O
O
10 for Bob
STRIKE!!!
O O O O
O O O
O O
O
10 for Anna
STRIKE!!!
O O O O
O O O
O O
O
10 for Bob
STRIKE!!!
O O O O
O O O
O O
O
10 for Anna
STRIKE!!!
O O O O
O O O
O O
O
10 for Bob
STRIKE!!!
O O O O
O O O
O O
O
10 for Anna
STRIKE!!!
O O O O
O O O
O O
O
10 for Bob
STRIKE!!!
O O O O
O O O
O O
O
10 for Anna
STRIKE!!!
O O O O
O O O
O O
O
10 for Bob
STRIKE!!!
O O O O
O O O
O O
O
10 for Anna
STRIKE!!!
Extra rolls for Anna
O O O O
O O O
O O
O
10 for Bob
STRIKE!!!
Extra rolls for Bob
Anna: [10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10], total:300
Bob: [10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10], total:300
DO YOU WANT ANOTHER GAME? """ # noqa: W291
assert actual.split("\n") == expected.split("\n")