Skip to content

Commit d54d109

Browse files
committed
basic four buttons work with tests
1 parent 59bdb17 commit d54d109

File tree

5 files changed

+209
-5
lines changed

5 files changed

+209
-5
lines changed

src/App.js

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,56 @@
1-
import React from 'react';
1+
import React, { useState } from 'react';
22
import './App.css';
3-
import Counter from './Counter/Counter'
3+
//import Counter from './Counter/Counter'
44
import Scoreboard from './Baseball/Scoreboard';
5+
import Display from './Baseball/components/Display.js';
6+
import Controls from './Baseball/components/Controls';
57

68

79
function App() {
10+
const [strikes, setStrikes] = useState(0);
11+
const [balls, setBalls] = useState (0);
12+
13+
const throwStrike = () => {
14+
if (strikes === 2){
15+
setStrikes(0);
16+
setBalls(0);
17+
} else {
18+
setStrikes(strikes + 1);
19+
}
20+
};
21+
22+
const throwBall = () => {
23+
if(balls === 3) {
24+
setBalls(0);
25+
setStrikes(0);
26+
}
27+
else
28+
{
29+
setBalls(balls + 1);
30+
}
31+
};
32+
33+
const throwFoul = () => {
34+
if (strikes < 2 ){
35+
setStrikes(strikes + 1)
36+
}
37+
};
38+
39+
const throwHit = () => {
40+
setStrikes(0);
41+
setBalls(0);
42+
};
843
return (
944
<div className="App">
10-
<Scoreboard />
45+
<Display strikes={strikes} balls={balls}/>
46+
<Controls
47+
executeStrike={throwStrike}
48+
executeBall={throwBall}
49+
executeFoul={throwFoul}
50+
executeHit={throwHit}
51+
/>
1152
</div>
1253
);
1354
}
1455

15-
export default App;
56+
export default App;

src/App.test.js

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,92 @@
11
import React from 'react';
2-
import { render, screen } from '@testing-library/react';
2+
import { render, screen, fireEvent } from '@testing-library/react';
33
import App from './App';
44

55
test('renders header correctly', () => {
66
render(<App />);
77
});
8+
9+
test("Strike button increases strikes by one when clicked", ()=> {
10+
11+
render(<App/>);
12+
const strikeButton = screen.getByRole("button", {name: /strike/i});
13+
fireEvent.click(strikeButton);
14+
fireEvent.click(strikeButton);
15+
const strikeElement = screen.getByText("Strikes: 2");
16+
expect(strikeElement).toBeInTheDocument();
17+
});
18+
19+
test ("ball button increases ball count by 1", () => {
20+
render(<App />);
21+
const ballButton = screen.getByRole("button", {name: /ball/i});
22+
fireEvent.click(ballButton);
23+
const ballElement = screen.getByText("Balls: 1");
24+
expect(ballElement).toBeInTheDocument();
25+
});
26+
27+
test ("foul button increases strikes", ()=> {
28+
render (<App />);
29+
const foulButton = screen.getByRole("button", {name: /foul/i});
30+
fireEvent.click(foulButton);
31+
const strikesElement = screen.getByText("Strikes: 1");
32+
expect(strikesElement).toBeInTheDocument();
33+
});
34+
35+
test ("foul button does NOT increase strikes if there are 2 strikes", ()=> {
36+
render (<App />);
37+
const foulButton = screen.getByRole("button", {name: /foul/i});
38+
fireEvent.click(foulButton);
39+
fireEvent.click(foulButton);
40+
fireEvent.click(foulButton);
41+
const strikesElement = screen.getByText("Strikes: 2");
42+
expect(strikesElement).toBeInTheDocument();
43+
});
44+
45+
test("hit button clears both balls and strikes", ()=>{
46+
render(<App />);
47+
const hitButton = screen.getByRole("button", {name: /hit/i});
48+
const strikeButton = screen.getByRole("button", {name: /strike/i});
49+
const ballButton = screen.getByRole("button", {name: /ball/i})
50+
fireEvent.click(strikeButton);
51+
fireEvent.click(strikeButton);
52+
fireEvent.click(ballButton);
53+
fireEvent.click(hitButton);
54+
const strikesElement = screen.getByText("Strikes: 0");
55+
const ballsElement = screen.getByText("Balls: 0");
56+
expect(strikesElement).toBeInTheDocument();
57+
expect(ballsElement).toBeInTheDocument();
58+
})
59+
60+
test("3rd strike is a strikout, resets all counts", ()=>{
61+
render(<App />);
62+
63+
const strikeButton = screen.getByRole("button", {name: /strike/i});
64+
const ballButton = screen.getByRole("button", {name: /ball/i})
65+
fireEvent.click(strikeButton);
66+
fireEvent.click(ballButton);
67+
fireEvent.click(ballButton);
68+
fireEvent.click(strikeButton);
69+
fireEvent.click(strikeButton);
70+
71+
const strikesElement = screen.getByText("Strikes: 0");
72+
const ballsElement = screen.getByText("Balls: 0");
73+
expect(strikesElement).toBeInTheDocument();
74+
expect(ballsElement).toBeInTheDocument();
75+
})
76+
77+
test("4th ball is a walk, resets all counts", ()=>{
78+
render(<App />);
79+
80+
const strikeButton = screen.getByRole("button", {name: /strike/i});
81+
const ballButton = screen.getByRole("button", {name: /ball/i})
82+
fireEvent.click(ballButton);
83+
fireEvent.click(ballButton);
84+
fireEvent.click(ballButton);
85+
fireEvent.click(strikeButton);
86+
fireEvent.click(ballButton);
87+
88+
const strikesElement = screen.getByText("Strikes: 0");
89+
const ballsElement = screen.getByText("Balls: 0");
90+
expect(strikesElement).toBeInTheDocument();
91+
expect(ballsElement).toBeInTheDocument();
92+
});

src/Baseball/Scoreboard.jsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
import React from 'react';
22
import Display from './components/Display';
3+
import Controls from './components/Controls';
4+
35

46
function Scoreboard(){
57
return(
8+
<>
69
<Display strikes={2} balls={1}/>
10+
<Controls />
11+
</>
712
)
813
}
914

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import React from 'react';
2+
3+
export default function Controls({executeStrike, executeBall, executeFoul, executeHit}){
4+
return(
5+
<div>
6+
<button onClick={executeStrike}>strike</button>
7+
<button onClick={executeBall}>ball</button>
8+
<button onClick={executeFoul}>foul</button>
9+
<button onClick={executeHit}>hit</button>
10+
</div>
11+
)
12+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import React from 'react';
2+
import {fireEvent, render, screen} from '@testing-library/react';
3+
import Controls from './Controls'
4+
5+
test("Controls component renders the four buttons", ()=> {
6+
render(<Controls />);
7+
const strikeButton = screen.getByRole("button", {name:/strike/i});
8+
const ballButton = screen.getByRole("button", {name:/ball/i});
9+
const foulButton = screen.getByRole("button", {name:/foul/i});
10+
const hitButton = screen.getByRole("button", {name:/hit/i});
11+
expect(strikeButton).toBeInTheDocument();
12+
expect(ballButton).toBeInTheDocument();
13+
expect(foulButton).toBeInTheDocument();
14+
expect(hitButton).toBeInTheDocument();
15+
});
16+
17+
// test("Strike button receives and executes a prop function", ()=>{
18+
// render(<Controls executeStrike={ ()=>console.log('strike') } />);
19+
// const strikeButton = screen.getByRole("button", {name:/strike/i});
20+
// fireEvent.click(strikeButton);
21+
// })
22+
23+
// test("Strike button receives and executes a prop function", ()=>{
24+
// let clicked = false
25+
// render(<Controls executeStrike={ ()=>clicked = true } />);
26+
// const strikeButton = screen.getByRole("button", {name:/strike/i});
27+
// fireEvent.click(strikeButton);
28+
// expect(clicked).toBe(true);
29+
// })
30+
31+
test("Strike button receives and executes a prop function", ()=>{
32+
let click = jest.fn();
33+
render(<Controls executeStrike={click} />);
34+
const strikeButton = screen.getByRole("button", {name:/strike/i});
35+
fireEvent.click(strikeButton);
36+
expect(click).toBeCalled();
37+
});
38+
39+
test("Ball button receives and executes a prop function", ()=>{
40+
let click = jest.fn();
41+
render(<Controls executeBall={click} />);
42+
const ballButton = screen.getByRole("button", {name:/ball/i});
43+
fireEvent.click(ballButton);
44+
expect(click).toBeCalled();
45+
});
46+
47+
test("Foul button receives and executes a prop function", ()=>{
48+
let click = jest.fn();
49+
render(<Controls executeFoul={click} />);
50+
const foulButton = screen.getByRole("button", {name:/foul/i});
51+
fireEvent.click(foulButton);
52+
expect(click).toBeCalled();
53+
});
54+
55+
test("Hit button receives and executes a prop function", ()=>{
56+
let click = jest.fn();
57+
render(<Controls executeHit={click} />);
58+
const hitButton = screen.getByRole("button", {name:/hit/i});
59+
fireEvent.click(hitButton);
60+
expect(click).toBeCalled();
61+
});

0 commit comments

Comments
 (0)