From b2420620ed06158a619ca0d8104b71bfbbece6ed Mon Sep 17 00:00:00 2001 From: jasonz6688 Date: Mon, 5 Apr 2021 18:19:50 -0700 Subject: [PATCH 1/4] First code to add numProblems sizer --- frontend/src/api/Room.ts | 2 ++ frontend/src/views/Lobby.tsx | 62 ++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/frontend/src/api/Room.ts b/frontend/src/api/Room.ts index d276130e0..ccdcf3d58 100644 --- a/frontend/src/api/Room.ts +++ b/frontend/src/api/Room.ts @@ -13,6 +13,7 @@ export type Room = { difficulty: Difficulty, duration: number, size: number, + numProblems: number, }; export type CreateRoomParams = { @@ -28,6 +29,7 @@ export type UpdateSettingsParams = { difficulty?: Difficulty, duration?: number, size?: number, + numProblems?: number, }; export type ChangeHostParams = { diff --git a/frontend/src/views/Lobby.tsx b/frontend/src/views/Lobby.tsx index 2fb350028..9325b1523 100644 --- a/frontend/src/views/Lobby.tsx +++ b/frontend/src/views/Lobby.tsx @@ -143,6 +143,7 @@ function LobbyPage() { const [difficulty, setDifficulty] = useState(null); const [duration, setDuration] = useState(15); const [size, setSize] = useState(10); + const [numProblems, setNumProblems] = useState(1); const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 }); const [hoverVisible, setHoverVisible] = useState(false); @@ -174,6 +175,7 @@ function LobbyPage() { setDifficulty(room.difficulty); setDuration(room.duration / 60); setSize(room.size); + setNumProblems(room.numProblems); }; // Function to determine if the given user is the host or not @@ -374,6 +376,25 @@ function LobbyPage() { }); }; + const updateNumProblems = () => { + setLoading(true); + const prevNumProblems = numProblems; + const settings = { + initiator: currentUser!, + numProblems, + }; + + updateRoomSettings(currentRoomId, settings) + .then(() => setLoading(false)) + .then(() => setError('')) + .catch((err) => { + setLoading(false); + setError(err.message); + // Set numProblems back to original if REST call failed + setSize(prevNumProblems); + }); + }; + /** * Display the passed-in list of users on the UI, either as * active or inactive. @@ -718,6 +739,47 @@ function LobbyPage() { /> + Number of Problems + + {`${numProblems} problem${numProblems === 1 ? '' : 's'}`} + + + { + if (!isHost(currentUser)) { + setHoverVisible(true); + } + }} + onMouseLeave={() => { + if (!isHost(currentUser)) { + setHoverVisible(false); + } + }} + /> + + { + const { value } = e.target; + + // Set numProblems to undefined to allow users to clear field + if (!value) { + setNumProblems(undefined); + } else { + const newNumProblems = Number(value); + if (newNumProblems >= 1 && newNumProblems <= 8) { + setNumProblems(newNumProblems); + } + } + }} + onMouseUp={updateNumProblems} + /> + + From 8b5a2423276d587f142b6395480d837ac208c552 Mon Sep 17 00:00:00 2001 From: jasonz6688 Date: Tue, 6 Apr 2021 00:22:14 -0700 Subject: [PATCH 2/4] adding tests --- frontend/src/api/Game.ts | 2 +- frontend/src/views/Lobby.tsx | 8 ++--- .../service/GameManagementServiceTests.java | 33 +++++++++++++++++++ .../main/service/RoomServiceTests.java | 25 ++++++++++++++ 4 files changed, 63 insertions(+), 5 deletions(-) diff --git a/frontend/src/api/Game.ts b/frontend/src/api/Game.ts index a90f2fb13..cdd5844d3 100644 --- a/frontend/src/api/Game.ts +++ b/frontend/src/api/Game.ts @@ -115,4 +115,4 @@ export const playAgain = (roomId: string, params: PlayAgainParams): .then((res) => res.data) .catch((err) => { throw axiosErrorHandler(err); - }); + }); \ No newline at end of file diff --git a/frontend/src/views/Lobby.tsx b/frontend/src/views/Lobby.tsx index 05e6869fd..b2244c6fa 100644 --- a/frontend/src/views/Lobby.tsx +++ b/frontend/src/views/Lobby.tsx @@ -389,6 +389,7 @@ function LobbyPage() { }; const updateNumProblems = () => { + setError('') setLoading(true); const prevNumProblems = numProblems; const settings = { @@ -398,12 +399,11 @@ function LobbyPage() { updateRoomSettings(currentRoomId, settings) .then(() => setLoading(false)) - .then(() => setError('')) .catch((err) => { setLoading(false); setError(err.message); // Set numProblems back to original if REST call failed - setSize(prevNumProblems); + setNumProblems(prevNumProblems); }); }; @@ -753,7 +753,7 @@ function LobbyPage() { { @@ -764,7 +764,7 @@ function LobbyPage() { setNumProblems(undefined); } else { const newNumProblems = Number(value); - if (newNumProblems >= 1 && newNumProblems <= 8) { + if (newNumProblems >= 1 && newNumProblems <= 10) { setNumProblems(newNumProblems); } } diff --git a/src/test/java/com/rocketden/main/service/GameManagementServiceTests.java b/src/test/java/com/rocketden/main/service/GameManagementServiceTests.java index 9243cf67c..04c43103c 100644 --- a/src/test/java/com/rocketden/main/service/GameManagementServiceTests.java +++ b/src/test/java/com/rocketden/main/service/GameManagementServiceTests.java @@ -174,6 +174,39 @@ public void startGameSuccess() { assertEquals(room.getDuration(), game.getGameTimer().getDuration()); } + @Test + public void startGameWithMultipleQuestionsSuccess() { + User host = new User(); + host.setNickname(NICKNAME); + host.setUserId(USER_ID); + + Room room = new Room(); + room.setRoomId(ROOM_ID); + room.setHost(host); + room.setDifficulty(ProblemDifficulty.RANDOM); + room.setDuration(DURATION); + room.setNumProblems(6); + + StartGameRequest request = new StartGameRequest(); + request.setInitiator(UserMapper.toDto(host)); + + Mockito.doReturn(room).when(repository).findRoomByRoomId(ROOM_ID); + RoomDto response = gameService.startGame(ROOM_ID, request); + + verify(socketService).sendSocketUpdate(eq(response)); + + assertEquals(ROOM_ID, response.getRoomId()); + assertTrue(response.isActive()); + + // Game object is created when the room chooses to start + Game game = gameService.getGameFromRoomId(ROOM_ID); + assertNotNull(game); + + assertNotNull(game.getGameTimer()); + assertEquals(room.getDuration(), game.getGameTimer().getDuration()); + assertEquals(room.getNumProblems(), response.getNumProblems()); + } + @Test public void startGameRoomNotFound() { UserDto user = new UserDto(); diff --git a/src/test/java/com/rocketden/main/service/RoomServiceTests.java b/src/test/java/com/rocketden/main/service/RoomServiceTests.java index 3f39c9a8c..139557408 100644 --- a/src/test/java/com/rocketden/main/service/RoomServiceTests.java +++ b/src/test/java/com/rocketden/main/service/RoomServiceTests.java @@ -285,6 +285,31 @@ public void manyUsersJoiningAnInfinitelySizedRoomSuccess() { assertEquals(102, room.getUsers().size()); } + @Test + public void setInvalidNumProblemsFailure() { + /** + * Verify update settings request fails when numProblems is + * set to outside of the allowable range + */ + User host = new User(); + host.setNickname(NICKNAME); + + Room room = new Room(); + room.setRoomId(ROOM_ID); + room.setHost(host); + room.addUser(host); + + UpdateSettingsRequest request = new UpdateSettingsRequest(); + request.setInitiator(UserMapper.toDto(host)); + request.setNumProblems(15); + + // Mock repository to return room when called + Mockito.doReturn(room).when(repository).findRoomByRoomId(eq(ROOM_ID)); + ApiException exception = assertThrows(ApiException.class, () -> roomService.updateRoomSettings(ROOM_ID, request)); + + verify(repository).findRoomByRoomId(ROOM_ID); + assertEquals(ProblemError.INVALID_NUMBER_REQUEST, exception.getError()); + } @Test public void getRoomSuccess() { From 73183f08ca07f87cdb4ce12cdd2af91084861a34 Mon Sep 17 00:00:00 2001 From: jasonz6688 Date: Tue, 13 Apr 2021 16:48:21 -0700 Subject: [PATCH 3/4] to merge --- frontend/package-lock.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 2ad6f7a72..45a0ffae8 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -3859,6 +3859,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.1.tgz", "integrity": "sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA==", + "hasInstallScript": true, "optional": true, "dependencies": { "node-gyp-build": "~3.7.0" @@ -16290,6 +16291,7 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.2.tgz", "integrity": "sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw==", + "hasInstallScript": true, "optional": true, "dependencies": { "node-gyp-build": "~3.7.0" From 0f14b51db6a2eab10f52d6fc4e5bf93718583bf6 Mon Sep 17 00:00:00 2001 From: jasonz6688 Date: Tue, 13 Apr 2021 17:04:30 -0700 Subject: [PATCH 4/4] responding to comments I can respond to --- frontend/src/api/Game.ts | 2 +- frontend/src/views/Lobby.tsx | 17 +++++------------ 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/frontend/src/api/Game.ts b/frontend/src/api/Game.ts index cdd5844d3..a90f2fb13 100644 --- a/frontend/src/api/Game.ts +++ b/frontend/src/api/Game.ts @@ -115,4 +115,4 @@ export const playAgain = (roomId: string, params: PlayAgainParams): .then((res) => res.data) .catch((err) => { throw axiosErrorHandler(err); - }); \ No newline at end of file + }); diff --git a/frontend/src/views/Lobby.tsx b/frontend/src/views/Lobby.tsx index b2244c6fa..03f5976aa 100644 --- a/frontend/src/views/Lobby.tsx +++ b/frontend/src/views/Lobby.tsx @@ -143,7 +143,7 @@ function LobbyPage() { const [difficulty, setDifficulty] = useState(null); const [duration, setDuration] = useState(15); const [size, setSize] = useState(10); - const [numProblems, setNumProblems] = useState(1); + const [numProblems, setNumProblems] = useState(1); const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 }); const [hoverVisible, setHoverVisible] = useState(false); @@ -389,7 +389,7 @@ function LobbyPage() { }; const updateNumProblems = () => { - setError('') + setError(''); setLoading(true); const prevNumProblems = numProblems; const settings = { @@ -757,16 +757,9 @@ function LobbyPage() { value={numProblems} disabled={!isHost(currentUser)} onChange={(e) => { - const { value } = e.target; - - // Set numProblems to undefined to allow users to clear field - if (!value) { - setNumProblems(undefined); - } else { - const newNumProblems = Number(value); - if (newNumProblems >= 1 && newNumProblems <= 10) { - setNumProblems(newNumProblems); - } + const newNumProblems = Number(e.target); + if (newNumProblems >= 1 && newNumProblems <= 10) { + setNumProblems(newNumProblems); } }} onMouseUp={updateNumProblems}