diff --git a/pom.xml b/pom.xml index 78ee59d..06cdf4e 100644 --- a/pom.xml +++ b/pom.xml @@ -4,10 +4,10 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.javarush.khmelov - project-ledzeppelin + com.javarush.alimov + project-pantera 1.0-SNAPSHOT - ProjectLedzeppelin + ProjectPantera war @@ -41,6 +41,12 @@ jakarta.servlet-api provided + + org.mockito + mockito-core + 5.20.0 + test + jakarta.servlet.jsp.jstl jakarta.servlet.jsp.jstl-api diff --git a/src/main/java/com/javarush/alimov/quest/GameLogic.java b/src/main/java/com/javarush/alimov/quest/GameLogic.java new file mode 100644 index 0000000..59fa66f --- /dev/null +++ b/src/main/java/com/javarush/alimov/quest/GameLogic.java @@ -0,0 +1,37 @@ +package com.javarush.alimov.quest; + +public class GameLogic { + + public static GameResult next(GameState current, String answer) { + return switch (current) { + case START -> new GameResult(GameState.UFO_CHALLENGE, null); + + case UFO_CHALLENGE -> { + if ("accept".equals(answer)) { + yield new GameResult(GameState.BRIDGE_CHOICE, null); + } else { + yield new GameResult(GameState.LOSE, "Ты отклонил вызов. Поражение."); + } + } + + case BRIDGE_CHOICE -> { + if ("go".equals(answer)) { + yield new GameResult(GameState.IDENTITY_CHOICE, null); + } else { + yield new GameResult(GameState.LOSE, "Ты не пошёл на переговоры. Поражение."); + } + } + + case IDENTITY_CHOICE -> { + if ("truth".equals(answer)) { + yield new GameResult(GameState.WIN, "Тебя вернули домой. Победа!"); + } else { + yield new GameResult(GameState.LOSE, "Твою ложь разоблачили. Поражение."); + } + } + + default -> new GameResult(GameState.START, null); + }; + } +} + diff --git a/src/main/java/com/javarush/alimov/quest/GameResult.java b/src/main/java/com/javarush/alimov/quest/GameResult.java new file mode 100644 index 0000000..36565cd --- /dev/null +++ b/src/main/java/com/javarush/alimov/quest/GameResult.java @@ -0,0 +1,6 @@ +package com.javarush.alimov.quest; + +public record GameResult(GameState state, String message) { + +} + diff --git a/src/main/java/com/javarush/alimov/quest/GameServlet.java b/src/main/java/com/javarush/alimov/quest/GameServlet.java new file mode 100644 index 0000000..2630ce0 --- /dev/null +++ b/src/main/java/com/javarush/alimov/quest/GameServlet.java @@ -0,0 +1,42 @@ +package com.javarush.alimov.quest; + +import jakarta.servlet.http.*; +import jakarta.servlet.annotation.*; +import jakarta.servlet.*; + +import java.io.IOException; + +@WebServlet("/game") +public class GameServlet extends HttpServlet { + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + req.getRequestDispatcher("/WEB-INF/game.jsp").forward(req, resp); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + + HttpSession session = req.getSession(); + GameState state = (GameState) session.getAttribute("state"); + if (state == null) state = GameState.START; + + String answer = req.getParameter("answer"); + GameResult result = GameLogic.next(state, answer); + + session.setAttribute("state", result.state()); + session.setAttribute("message", result.message()); + + if (result.state() == GameState.WIN || result.state() == GameState.LOSE) { + Integer gamesPlayed = (Integer) session.getAttribute("gamesPlayed"); + session.setAttribute("gamesPlayed", gamesPlayed == null ? 1 : gamesPlayed + 1); + req.getRequestDispatcher("/WEB-INF/result.jsp").forward(req, resp); + } else { + req.getRequestDispatcher("/WEB-INF/game.jsp").forward(req, resp); + } + } +} + + + diff --git a/src/main/java/com/javarush/alimov/quest/GameState.java b/src/main/java/com/javarush/alimov/quest/GameState.java new file mode 100644 index 0000000..1ff4308 --- /dev/null +++ b/src/main/java/com/javarush/alimov/quest/GameState.java @@ -0,0 +1,10 @@ +package com.javarush.alimov.quest; + +public enum GameState { + START, + UFO_CHALLENGE, + BRIDGE_CHOICE, + IDENTITY_CHOICE, + WIN, + LOSE +} diff --git a/src/main/java/com/javarush/khmelov/cmd/Command.java b/src/main/java/com/javarush/khmelov/cmd/Command.java deleted file mode 100644 index fd4035b..0000000 --- a/src/main/java/com/javarush/khmelov/cmd/Command.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.javarush.khmelov.cmd; - -import jakarta.servlet.http.HttpServletRequest; - -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public interface Command { - - default String doGet(HttpServletRequest request) { - return getView(); - } - - default String doPost(HttpServletRequest request) { - return getView(); - } - - default String getView() { - String simpleName = this.getClass().getSimpleName(); - return convertCamelCaseToKebabStyle(simpleName); - } - - private static String convertCamelCaseToKebabStyle(String string) { - String snakeName = string.chars() - .mapToObj(s -> String.valueOf((char) s)) - .flatMap(s -> s.matches("[A-Z]") - ? Stream.of("-", s) - : Stream.of(s)) - .collect(Collectors.joining()) - .toLowerCase(); - return snakeName.startsWith("-") - ? snakeName.substring(1) - : snakeName; - } - - -} diff --git a/src/main/java/com/javarush/khmelov/cmd/EditUser.java b/src/main/java/com/javarush/khmelov/cmd/EditUser.java deleted file mode 100644 index ae191b4..0000000 --- a/src/main/java/com/javarush/khmelov/cmd/EditUser.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.javarush.khmelov.cmd; - -import com.javarush.khmelov.entity.Role; -import com.javarush.khmelov.entity.User; -import com.javarush.khmelov.service.UserService; -import jakarta.servlet.http.HttpServletRequest; - -import java.util.Optional; - - -@SuppressWarnings("unused") -public class EditUser implements Command { - - private final UserService userService; - - public EditUser(UserService userService) { - this.userService = userService; - } - - - @Override - public String doGet(HttpServletRequest req) { - String stringId = req.getParameter("id"); - if (stringId != null) { - long id = Long.parseLong(stringId); - Optional optionalUser = userService.get(id); - if (optionalUser.isPresent()) { - User user = optionalUser.get(); - req.setAttribute("user", user); - } - } - return getView(); - } - - @Override - public String doPost(HttpServletRequest req) { - User user = User.builder() - .login(req.getParameter("login")) - .password(req.getParameter("password")) - .role(Role.valueOf(req.getParameter("role"))) - .build(); - if (req.getParameter("create") != null) { - userService.create(user); - } else if (req.getParameter("update") != null) { - user.setId(Long.parseLong(req.getParameter("id"))); - userService.update(user); - } - return getView() + "?id=" + user.getId(); - } - - -} \ No newline at end of file diff --git a/src/main/java/com/javarush/khmelov/cmd/ListUser.java b/src/main/java/com/javarush/khmelov/cmd/ListUser.java deleted file mode 100644 index 9257917..0000000 --- a/src/main/java/com/javarush/khmelov/cmd/ListUser.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.javarush.khmelov.cmd; - -import com.javarush.khmelov.entity.User; -import com.javarush.khmelov.service.UserService; -import jakarta.servlet.http.HttpServletRequest; - -import java.util.Collection; - -@SuppressWarnings("unused") -public class ListUser implements Command { - - private final UserService userService; - - public ListUser(UserService userService) { - this.userService = userService; - } - - @Override - public String doGet(HttpServletRequest request) { - Collection users = userService.getAll(); - request.setAttribute("users", users); - return getView(); - } - - -} \ No newline at end of file diff --git a/src/main/java/com/javarush/khmelov/cmd/StartPage.java b/src/main/java/com/javarush/khmelov/cmd/StartPage.java deleted file mode 100644 index d268f93..0000000 --- a/src/main/java/com/javarush/khmelov/cmd/StartPage.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.javarush.khmelov.cmd; - -@SuppressWarnings("unused") -public class StartPage implements Command { - -} diff --git a/src/main/java/com/javarush/khmelov/config/Winter.java b/src/main/java/com/javarush/khmelov/config/Winter.java deleted file mode 100644 index 48bd8a7..0000000 --- a/src/main/java/com/javarush/khmelov/config/Winter.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.javarush.khmelov.config; - -import lombok.SneakyThrows; - -import java.lang.reflect.Constructor; -import java.util.concurrent.ConcurrentHashMap; - -public class Winter { - - public static ConcurrentHashMap, Object> components = new ConcurrentHashMap<>(); - - - @SuppressWarnings("unchecked") - @SneakyThrows - public static T find(Class aClass) { - Object component = components.get(aClass); - if (component == null) { - Constructor constructor = aClass.getConstructors()[0]; - Class[] parameterTypes = constructor.getParameterTypes(); - Object[] parameters = new Object[parameterTypes.length]; - for (int i = 0; i < parameters.length; i++) { - parameters[i] = Winter.find(parameterTypes[i]); - } - Object newInstance = constructor.newInstance(parameters); - components.put(aClass, newInstance); - } - return (T) components.get(aClass); - } -} diff --git a/src/main/java/com/javarush/khmelov/controller/FrontController.java b/src/main/java/com/javarush/khmelov/controller/FrontController.java deleted file mode 100644 index 33242b2..0000000 --- a/src/main/java/com/javarush/khmelov/controller/FrontController.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.javarush.khmelov.controller; - -import com.javarush.khmelov.cmd.Command; -import com.javarush.khmelov.config.Winter; -import com.javarush.khmelov.entity.Role; -import jakarta.servlet.ServletConfig; -import jakarta.servlet.ServletException; -import jakarta.servlet.annotation.WebServlet; -import jakarta.servlet.http.HttpServlet; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - -import java.io.IOException; - -@WebServlet({"", "/home", "/list-user", "/edit-user"}) -public class FrontController extends HttpServlet { - - private final HttpResolver httpResolver = Winter.find(HttpResolver.class); - - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - Command command = httpResolver.resolve(req); - String view = command.doGet(req); - String jsp = getJsp(view); - req.getRequestDispatcher(jsp).forward(req, resp); - } - - @Override - public void init(ServletConfig config) { - config.getServletContext().setAttribute("roles", Role.values()); - } - - private static String getJsp(String view) { - return "/WEB-INF/" + view + ".jsp"; - } - - @Override - protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - Command command = httpResolver.resolve(req); - String redirect = command.doPost(req); - resp.sendRedirect(redirect); - } -} diff --git a/src/main/java/com/javarush/khmelov/controller/HttpResolver.java b/src/main/java/com/javarush/khmelov/controller/HttpResolver.java deleted file mode 100644 index 18bb761..0000000 --- a/src/main/java/com/javarush/khmelov/controller/HttpResolver.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.javarush.khmelov.controller; - -import com.javarush.khmelov.cmd.Command; -import com.javarush.khmelov.config.Winter; -import jakarta.servlet.http.HttpServletRequest; - -public class HttpResolver { - - public Command resolve(HttpServletRequest request) { - // /cmd-example - try { - String requestURI = request.getRequestURI(); - requestURI = requestURI.equals("/") ? "/start-page" : requestURI; - String kebabName = requestURI.split("[?#/]")[1]; - String simpleName = convertKebabStyleToCamelCase(kebabName); - String fullName = Command.class.getPackageName() + "." + simpleName; - Class aClass = Class.forName(fullName); - return (Command) Winter.find(aClass); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - private String convertKebabStyleToCamelCase(String input) { - StringBuilder result = new StringBuilder(); - boolean capitalizeNext = true; - for (char c : input.toCharArray()) { - if (c == '-') { - capitalizeNext = true; - } else { - if (capitalizeNext) { - result.append(Character.toUpperCase(c)); - capitalizeNext = false; - } else { - result.append(Character.toLowerCase(c)); - } - } - } - return result.toString(); - } -} diff --git a/src/main/java/com/javarush/khmelov/entity/Role.java b/src/main/java/com/javarush/khmelov/entity/Role.java deleted file mode 100644 index 5ae365f..0000000 --- a/src/main/java/com/javarush/khmelov/entity/Role.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.javarush.khmelov.entity; - -public enum Role { - USER, ADMIN, GUEST -} diff --git a/src/main/java/com/javarush/khmelov/entity/User.java b/src/main/java/com/javarush/khmelov/entity/User.java deleted file mode 100644 index f7fa2d6..0000000 --- a/src/main/java/com/javarush/khmelov/entity/User.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.javarush.khmelov.entity; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class User { - - private Long id; - - private String login; - - private String password; - - private Role role; - - public String getImage() { //TODO move to DTO - return "image-" + id; - } - -} diff --git a/src/main/java/com/javarush/khmelov/repository/Repository.java b/src/main/java/com/javarush/khmelov/repository/Repository.java deleted file mode 100644 index f1abdac..0000000 --- a/src/main/java/com/javarush/khmelov/repository/Repository.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.javarush.khmelov.repository; - -import com.javarush.khmelov.entity.User; - -import java.util.Collection; -import java.util.Optional; - -public interface Repository { - - Collection getAll(); - - Optional get(long id); - - void create(T entity); - - void update(T entity); - - void delete(T entity); -} diff --git a/src/main/java/com/javarush/khmelov/repository/UserRepository.java b/src/main/java/com/javarush/khmelov/repository/UserRepository.java deleted file mode 100644 index 58b32ea..0000000 --- a/src/main/java/com/javarush/khmelov/repository/UserRepository.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.javarush.khmelov.repository; - -import com.javarush.khmelov.entity.Role; -import com.javarush.khmelov.entity.User; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.atomic.AtomicLong; - -public class UserRepository implements Repository { - - private final Map map = new HashMap<>(); - - public static final AtomicLong id = new AtomicLong(System.currentTimeMillis()); - - public UserRepository() { - map.put(1L, new User(1L, "Alisa", "qwerty", Role.USER)); - map.put(2L, new User(2L, "Bob", "", Role.GUEST)); - map.put(3L, new User(3L, "Carl", "admin", Role.ADMIN)); - map.put(4L, new User(4L, "Khmelov", "admin", Role.ADMIN)); - } - - @Override - public Collection getAll() { - return map.values(); - } - - @Override - public Optional get(long id) { - return Optional.ofNullable(map.get(id)); - } - - @Override - public void create(User entity) { - entity.setId(id.incrementAndGet()); - update(entity); - } - - @Override - public void update(User entity) { - map.put(entity.getId(), entity); - } - - @Override - public void delete(User entity) { - map.remove(entity.getId()); - } -} diff --git a/src/main/java/com/javarush/khmelov/service/UserService.java b/src/main/java/com/javarush/khmelov/service/UserService.java deleted file mode 100644 index b17527c..0000000 --- a/src/main/java/com/javarush/khmelov/service/UserService.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.javarush.khmelov.service; - -import com.javarush.khmelov.entity.User; -import com.javarush.khmelov.repository.UserRepository; - -import java.util.Collection; -import java.util.Optional; - -public class UserService { - - private final UserRepository userRepository; - - public UserService(UserRepository userRepository) { - this.userRepository = userRepository; - } - - public void create(User user) { - userRepository.create(user); - } - - public void update(User user) { - userRepository.update(user); - } - - public void delete(User user) { - userRepository.delete(user); - } - - public Collection getAll() { - return userRepository.getAll(); - } - - public Optional 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" %> - -
-
-
- - - Edit user: - - -
- -
- - min 3 symbols -
-
- - -
- -
- - min 8 symb -
-
- - - -
- -
- -
-
- - -
- -
- - - - - - - -
-
- -
-
-
- - 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); + } + +} +