get(long id) {
- return userRepository.get(id);
- }
-}
diff --git a/src/main/webapp/WEB-INF/edit-user.jsp b/src/main/webapp/WEB-INF/edit-user.jsp
deleted file mode 100644
index f274104..0000000
--- a/src/main/webapp/WEB-INF/edit-user.jsp
+++ /dev/null
@@ -1,73 +0,0 @@
-<%@ page contentType="text/html;charset=UTF-8" language="java" %>
-<%@include file="head.jsp" %>
-
-
-
-
diff --git a/src/main/webapp/WEB-INF/game.jsp b/src/main/webapp/WEB-INF/game.jsp
new file mode 100644
index 0000000..522fce5
--- /dev/null
+++ b/src/main/webapp/WEB-INF/game.jsp
@@ -0,0 +1,27 @@
+<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+Квест
+
+
+
+
diff --git a/src/main/webapp/WEB-INF/head.jsp b/src/main/webapp/WEB-INF/head.jsp
deleted file mode 100644
index 2f7b9f2..0000000
--- a/src/main/webapp/WEB-INF/head.jsp
+++ /dev/null
@@ -1,11 +0,0 @@
-<%@ page contentType="text/html;charset=UTF-8" language="java" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-
-
- Title
-
-
-
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/list-user.jsp b/src/main/webapp/WEB-INF/list-user.jsp
deleted file mode 100644
index dd52c55..0000000
--- a/src/main/webapp/WEB-INF/list-user.jsp
+++ /dev/null
@@ -1,9 +0,0 @@
-<%@ page contentType="text/html;charset=UTF-8" language="java" %>
-<%@include file="head.jsp"%>
-
-
- ${user.login}
-
-
-
-
diff --git a/src/main/webapp/WEB-INF/result.jsp b/src/main/webapp/WEB-INF/result.jsp
new file mode 100644
index 0000000..9248254
--- /dev/null
+++ b/src/main/webapp/WEB-INF/result.jsp
@@ -0,0 +1,12 @@
+<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+Результат
+
+ ${sessionScope.message}
+
+ Количество сыгранных игр: ${sessionScope.gamesPlayed}
+
+
diff --git a/src/main/webapp/WEB-INF/start-page.jsp b/src/main/webapp/WEB-INF/start-page.jsp
deleted file mode 100644
index 0531c1c..0000000
--- a/src/main/webapp/WEB-INF/start-page.jsp
+++ /dev/null
@@ -1,8 +0,0 @@
-<%@ page contentType="text/html;charset=UTF-8" language="java" %>
-<%@include file="head.jsp"%>
-
-<%= "Hello World!" %>
-
-
-List Users
-
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index 0bf2fcb..c480daa 100644
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -1,6 +1,6 @@
-
-
\ No newline at end of file
+ version="5.0">
+
+ index.jsp
+
+
diff --git a/src/main/webapp/images/cat.png b/src/main/webapp/images/cat.png
deleted file mode 100644
index 41771a1..0000000
Binary files a/src/main/webapp/images/cat.png and /dev/null differ
diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp
new file mode 100644
index 0000000..1429c9b
--- /dev/null
+++ b/src/main/webapp/index.jsp
@@ -0,0 +1,15 @@
+<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+Космический квест
+
+Пролог
+Ты стоишь в космическом порту и готов подняться на борт своего корабля. Разве ты не об этом мечтал?
+
+
+ Количество сыгранных игр: ${sessionScope.gamesPlayed}
+
+
+
diff --git a/src/test/java/com/javarush/alimov/quest/GameLogicTest.java b/src/test/java/com/javarush/alimov/quest/GameLogicTest.java
new file mode 100644
index 0000000..7dd6834
--- /dev/null
+++ b/src/test/java/com/javarush/alimov/quest/GameLogicTest.java
@@ -0,0 +1,50 @@
+package com.javarush.alimov.quest;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class GameLogicTest {
+
+ @Test
+ void testVictoryPath() {
+ GameResult result = GameLogic.next(GameState.START, null);
+ result = GameLogic.next(result.state(), "accept");
+ result = GameLogic.next(result.state(), "go");
+ result = GameLogic.next(result.state(), "truth");
+
+ assertEquals(GameState.WIN, result.state());
+ assertEquals("Тебя вернули домой. Победа!", result.message());
+ }
+
+ @Test
+ void testDefeatByDecline() {
+ GameResult result = GameLogic.next(GameState.START, null);
+ result = GameLogic.next(result.state(), "decline");
+
+ assertEquals(GameState.LOSE, result.state());
+ assertEquals("Ты отклонил вызов. Поражение.", result.message());
+ }
+
+ @Test
+ void testDefeatByRefuseBridge() {
+ GameResult result = GameLogic.next(GameState.START, null);
+ result = GameLogic.next(result.state(), "accept");
+ result = GameLogic.next(result.state(), "refuse");
+
+ assertEquals(GameState.LOSE, result.state());
+ assertEquals("Ты не пошёл на переговоры. Поражение.", result.message());
+ }
+
+ @Test
+ void testDefeatByLie() {
+ GameResult result = GameLogic.next(GameState.START, null);
+ result = GameLogic.next(result.state(), "accept");
+ result = GameLogic.next(result.state(), "go");
+ result = GameLogic.next(result.state(), "lie");
+
+ assertEquals(GameState.LOSE, result.state());
+ assertEquals("Твою ложь разоблачили. Поражение.", result.message());
+ }
+}
+
diff --git a/src/test/java/com/javarush/alimov/quest/GameServletTest.java b/src/test/java/com/javarush/alimov/quest/GameServletTest.java
new file mode 100644
index 0000000..3b537d3
--- /dev/null
+++ b/src/test/java/com/javarush/alimov/quest/GameServletTest.java
@@ -0,0 +1,150 @@
+package com.javarush.alimov.quest;
+
+import jakarta.servlet.RequestDispatcher;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.*;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.*;
+
+import java.io.IOException;
+
+import static org.mockito.Mockito.*;
+
+class GameServletTest {
+
+ private GameServlet servlet;
+ @Mock private HttpServletRequest request;
+ @Mock private HttpServletResponse response;
+ @Mock private HttpSession session;
+ @Mock private RequestDispatcher dispatcher;
+
+ @BeforeEach
+ void setUp() {
+ MockitoAnnotations.openMocks(this);
+ servlet = new GameServlet();
+ when(request.getSession()).thenReturn(session);
+ }
+
+ @Test
+ void doGet_ForwardsToGameJsp() throws ServletException, IOException {
+ when(request.getRequestDispatcher("/WEB-INF/game.jsp")).thenReturn(dispatcher);
+
+ servlet.doGet(request, response);
+
+ verify(dispatcher).forward(request, response);
+ }
+
+ @Test
+ void doPost_StartToUfoChallenge() throws ServletException, IOException {
+ when(session.getAttribute("state")).thenReturn(null);
+ when(request.getParameter("answer")).thenReturn("any");
+ when(request.getRequestDispatcher("/WEB-INF/game.jsp")).thenReturn(dispatcher);
+
+ servlet.doPost(request, response);
+
+ verify(session).setAttribute("state", GameState.UFO_CHALLENGE);
+ verify(session).setAttribute("message", null);
+ verify(dispatcher).forward(request, response);
+ }
+
+ @Test
+ void doPost_UfoChallenge_Accept() throws ServletException, IOException {
+ when(session.getAttribute("state")).thenReturn(GameState.UFO_CHALLENGE);
+ when(request.getParameter("answer")).thenReturn("accept");
+ when(request.getRequestDispatcher("/WEB-INF/game.jsp")).thenReturn(dispatcher);
+
+ servlet.doPost(request, response);
+
+ verify(session).setAttribute("state", GameState.BRIDGE_CHOICE);
+ verify(session).setAttribute("message", null);
+ verify(dispatcher).forward(request, response);
+ }
+
+ @Test
+ void doPost_UfoChallenge_Reject_Lose() throws ServletException, IOException {
+ when(session.getAttribute("state")).thenReturn(GameState.UFO_CHALLENGE);
+ when(request.getParameter("answer")).thenReturn("reject");
+ when(request.getRequestDispatcher("/WEB-INF/result.jsp")).thenReturn(dispatcher);
+
+ servlet.doPost(request, response);
+
+ verify(session).setAttribute("state", GameState.LOSE);
+ verify(session).setAttribute("message", "Ты отклонил вызов. Поражение.");
+ verify(session).setAttribute("gamesPlayed", 1);
+ verify(dispatcher).forward(request, response);
+ }
+
+ @Test
+ void doPost_BridgeChoice_Go() throws ServletException, IOException {
+ when(session.getAttribute("state")).thenReturn(GameState.BRIDGE_CHOICE);
+ when(request.getParameter("answer")).thenReturn("go");
+ when(request.getRequestDispatcher("/WEB-INF/game.jsp")).thenReturn(dispatcher);
+
+ servlet.doPost(request, response);
+
+ verify(session).setAttribute("state", GameState.IDENTITY_CHOICE);
+ verify(session).setAttribute("message", null);
+ verify(dispatcher).forward(request, response);
+ }
+
+ @Test
+ void doPost_BridgeChoice_Stay_Lose() throws ServletException, IOException {
+ when(session.getAttribute("state")).thenReturn(GameState.BRIDGE_CHOICE);
+ when(request.getParameter("answer")).thenReturn("stay");
+ when(request.getRequestDispatcher("/WEB-INF/result.jsp")).thenReturn(dispatcher);
+
+ servlet.doPost(request, response);
+
+ verify(session).setAttribute("state", GameState.LOSE);
+ verify(session).setAttribute("message", "Ты не пошёл на переговоры. Поражение.");
+ verify(session).setAttribute("gamesPlayed", 1);
+ verify(dispatcher).forward(request, response);
+ }
+
+ @Test
+ void doPost_IdentityChoice_Truth_Win() throws ServletException, IOException {
+ when(session.getAttribute("state")).thenReturn(GameState.IDENTITY_CHOICE);
+ when(session.getAttribute("gamesPlayed")).thenReturn(2);
+ when(request.getParameter("answer")).thenReturn("truth");
+ when(request.getRequestDispatcher("/WEB-INF/result.jsp")).thenReturn(dispatcher);
+
+ servlet.doPost(request, response);
+
+ verify(session).setAttribute("state", GameState.WIN);
+ verify(session).setAttribute("message", "Тебя вернули домой. Победа!");
+ verify(session).setAttribute("gamesPlayed", 3);
+ verify(dispatcher).forward(request, response);
+ }
+
+ @Test
+ void doPost_IdentityChoice_Lie_Lose() throws ServletException, IOException {
+ when(session.getAttribute("state")).thenReturn(GameState.IDENTITY_CHOICE);
+ when(session.getAttribute("gamesPlayed")).thenReturn(null);
+ when(request.getParameter("answer")).thenReturn("lie");
+ when(request.getRequestDispatcher("/WEB-INF/result.jsp")).thenReturn(dispatcher);
+
+ servlet.doPost(request, response);
+
+ verify(session).setAttribute("state", GameState.LOSE);
+ verify(session).setAttribute("message", "Твою ложь разоблачили. Поражение.");
+ verify(session).setAttribute("gamesPlayed", 1);
+ verify(dispatcher).forward(request, response);
+ }
+ @Test
+ void doPost_LoseScenario_IncrementsGamesPlayed() throws ServletException, IOException {
+ when(session.getAttribute("state")).thenReturn(GameState.IDENTITY_CHOICE);
+ when(session.getAttribute("gamesPlayed")).thenReturn(5);
+ when(request.getParameter("answer")).thenReturn("lie");
+ when(request.getRequestDispatcher("/WEB-INF/result.jsp")).thenReturn(dispatcher);
+
+ servlet.doPost(request, response);
+
+ verify(session).setAttribute("state", GameState.LOSE);
+ verify(session).setAttribute("message", "Твою ложь разоблачили. Поражение.");
+ verify(session).setAttribute("gamesPlayed", 6);
+ verify(dispatcher).forward(request, response);
+ }
+
+}
+