From deb53d600e3bc22f914f24695bed0f482f2d442d Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Sun, 26 Jun 2022 22:44:41 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D1=84=D1=83?= =?UTF-8?q?=D0=BD=D0=BA=D1=86=D0=B8=D1=8E=20=D1=81=D0=BE=D1=85=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=B7=D0=B8=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D1=8F=20=D0=B2=20=D1=81=D1=86=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B8.=20=D0=A2=D0=B5=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D1=8C=20=D1=8D=D1=82=D0=BE=D1=82=20=D1=84=D1=83=D0=BD=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D0=BE=D0=BD=D0=B0=D0=BB=20=D0=B4=D0=BE=D0=BB=D0=B6?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2?= =?UTF-8?q?=D1=8B=D0=B2=D0=B0=D1=82=D1=8C=20=D0=B1=D0=B8=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D0=BE=D1=82=D0=B5=D0=BA=D0=B0-=D0=BA=D0=BB=D0=B8=D0=B5=D0=BD?= =?UTF-8?q?=D1=82.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../autoresponder/AutoResponder.java | 159 ---------- .../struchkov/autoresponder/Responder.java | 100 ++++++ .../autoresponder/entity/UnitPointer.java | 56 ---- .../repository/UnitPointerRepository.java | 26 -- .../repository/UnitPointerRepositoryMap.java | 41 --- .../service/UnitPointerService.java | 22 -- .../service/UnitPointerServiceImpl.java | 43 --- .../struchkov/autoresponder/util/Parser.java | 2 +- .../struchkov/autoresponder/util/Units.java | 39 --- .../autoresponder/AutoResponderTest.java | 286 +++++++++--------- 11 files changed, 245 insertions(+), 531 deletions(-) delete mode 100644 src/main/java/dev/struchkov/autoresponder/AutoResponder.java create mode 100644 src/main/java/dev/struchkov/autoresponder/Responder.java delete mode 100644 src/main/java/dev/struchkov/autoresponder/entity/UnitPointer.java delete mode 100644 src/main/java/dev/struchkov/autoresponder/repository/UnitPointerRepository.java delete mode 100644 src/main/java/dev/struchkov/autoresponder/repository/UnitPointerRepositoryMap.java delete mode 100644 src/main/java/dev/struchkov/autoresponder/service/UnitPointerService.java delete mode 100644 src/main/java/dev/struchkov/autoresponder/service/UnitPointerServiceImpl.java delete mode 100644 src/main/java/dev/struchkov/autoresponder/util/Units.java diff --git a/pom.xml b/pom.xml index 0c4a795..097eeb2 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ dev.struchkov autoresponder - 2.0.1 + 3.0.0 jar Abstract Autoresponder diff --git a/src/main/java/dev/struchkov/autoresponder/AutoResponder.java b/src/main/java/dev/struchkov/autoresponder/AutoResponder.java deleted file mode 100644 index 614251b..0000000 --- a/src/main/java/dev/struchkov/autoresponder/AutoResponder.java +++ /dev/null @@ -1,159 +0,0 @@ -package dev.struchkov.autoresponder; - -import dev.struchkov.autoresponder.compare.UnitPriorityComparator; -import dev.struchkov.autoresponder.entity.Unit; -import dev.struchkov.autoresponder.entity.UnitPointer; -import dev.struchkov.autoresponder.service.UnitPointerService; -import dev.struchkov.autoresponder.util.Message; -import dev.struchkov.autoresponder.util.Parser; -import dev.struchkov.haiti.utils.Inspector; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.HashSet; -import java.util.Optional; -import java.util.Set; - -import static dev.struchkov.haiti.utils.Inspector.isEmpty; -import static dev.struchkov.haiti.utils.Inspector.isNotEmpty; -import static dev.struchkov.haiti.utils.Inspector.isNotNull; - -/** - * Реализуют основную логику автоответчика. - * - * @author upagge [07/07/2019] - */ -public class AutoResponder> { - - private static final Logger log = LoggerFactory.getLogger(AutoResponder.class); - - /** - * Компоратор для сортировки Unit-ов - */ - private static final UnitPriorityComparator UNIT_PRIORITY_COMPARATOR = new UnitPriorityComparator(); - - /** - * Начальные юниты, первый запрос приходит на них - */ - private final Set startUnits; - - private final UnitPointerService unitPointerService; - - /** - * Дефолтный юнит, отправляется если ни один Unit не подошел - */ - private U defaultUnit; - - public AutoResponder(UnitPointerService unitPointerService, Set startUnits) { - this.startUnits = startUnits; - this.unitPointerService = unitPointerService; - } - - /** - * Принимает текстовый запрос пользователя и отдает юнит, который соответствует запросу - * - * @param entityId Идентификатор клиента - * @param message Запрос пользователя - текстовое сообщение - * @return {@link Unit}, который отвечает за данные для обработки данного запроса - */ - public Optional answer(Long entityId, String message) { - isNotNull(entityId, message); - Optional> unitPointer = unitPointerService.getByEntityId(entityId); - final Optional answer = nextUnit( - unitPointer.isPresent() - && unitPointer.get().getUnit().getNextUnits() != null - && !unitPointer.get().getUnit().getNextUnits().isEmpty() - ? unitPointer.get().getUnit().getNextUnits() - : startUnits, - message - ); - if (answer.isPresent()) { - final U unitAnswer = answer.get(); - final Set nextUnits = unitAnswer.getNextUnits(); - if (isEmpty(nextUnits)) { - unitPointerService.removeByEntityId(entityId); - } else { - unitPointerService.save(new UnitPointer<>(entityId, unitAnswer)); - } - return answer; - } else { - return Optional.ofNullable(defaultUnit); - } - } - - /** - * Выбирает, какой {@link Unit} будет отдан для обработки - * - * @param nextUnits Множество следующих Unit-ов - * @param message Запрос пользователя - текстовое сообщение - * @return Юнит, который нуждается в обработке в соответствии с запросом пользователя - */ - private Optional nextUnit(Set nextUnits, String message) { - isNotNull(nextUnits, message); - final Set searchUnit = new HashSet<>(); - - if (isNotEmpty(nextUnits)) { - for (U unit : nextUnits) { - if (unit.getPhrase() != null - && !unit.getPhrase().isEmpty() - && unit.getPhrase().equalsIgnoreCase(message)) { - searchUnit.add(unit); - } - - if (unit.getPattern() != null && patternReg(unit, message)) { - searchUnit.add(unit); - } - - if (percentageMatch(unit, Parser.parse(message)) >= unit.getMatchThreshold()) { - searchUnit.add(unit); - } - } - } - - if (isEmpty(searchUnit)) { - for (U nextUnit : nextUnits) { - if ((nextUnit.getPattern() == null && (nextUnit.getKeyWords() == null || nextUnit.getKeyWords().isEmpty()))) { - searchUnit.add(nextUnit); - } - } - } - return searchUnit.stream().max(UNIT_PRIORITY_COMPARATOR); - } - - private boolean patternReg(U unit, String message) { - isNotNull(unit); - return message.matches(unit.getPattern().pattern()); - } - - private Double percentageMatch(U unit, Set words) { - final Set keyWords = unit.getKeyWords(); - if (keyWords != null && !keyWords.isEmpty()) { - final Set temp = new HashSet<>(keyWords); - temp.retainAll(words); - log.trace(Message.UNIT_KEYWORDS, keyWords, keyWords.size()); - log.trace(Message.USER_MESSAGE_KEYWORDS, words); - log.trace(Message.INTERSECTION, temp, temp.size()); - log.trace(Message.CROSSING_PERCENTAGE, (double) temp.size() / (double) keyWords.size() * 100.0, unit.getMatchThreshold()); - return (double) temp.size() / (double) keyWords.size() * 100.0; - } else { - return 0.0; - } - } - - public UnitPointerService getUnitPointerService() { - return unitPointerService; - } - - public Set getStartUnits() { - return startUnits; - } - - public U getDefaultUnit() { - return defaultUnit; - } - - public void setDefaultUnit(U defaultUnit) { - this.defaultUnit = defaultUnit; - } - -} diff --git a/src/main/java/dev/struchkov/autoresponder/Responder.java b/src/main/java/dev/struchkov/autoresponder/Responder.java new file mode 100644 index 0000000..444c720 --- /dev/null +++ b/src/main/java/dev/struchkov/autoresponder/Responder.java @@ -0,0 +1,100 @@ +package dev.struchkov.autoresponder; + +import dev.struchkov.autoresponder.compare.UnitPriorityComparator; +import dev.struchkov.autoresponder.entity.Unit; +import dev.struchkov.autoresponder.util.Message; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; +import java.util.regex.Pattern; + +import static dev.struchkov.autoresponder.util.Parser.splitWords; +import static dev.struchkov.haiti.utils.Exceptions.utilityClass; +import static dev.struchkov.haiti.utils.Inspector.isNotNull; + +/** + * Реализуют основную логику автоответчика. + * + * @author upagge [07/07/2019] + */ +public final class Responder { + + private static final Logger log = LoggerFactory.getLogger(Responder.class); + + /** + * Компоратор для сортировки Unit-ов + */ + private static final UnitPriorityComparator UNIT_PRIORITY_COMPARATOR = new UnitPriorityComparator(); + + private Responder() { + utilityClass(); + } + + /** + * Выбирает, какой {@link Unit} будет отдан для обработки + * + * @param nextUnits Множество следующих Unit-ов + * @param message Запрос пользователя - текстовое сообщение + * @return Юнит, который нуждается в обработке в соответствии с запросом пользователя + */ + public static > Optional nextUnit(String message, Collection nextUnits) { + isNotNull(nextUnits, message); + final Set searchUnit = new HashSet<>(); + + if (nextUnits != null) { + for (U unit : nextUnits) { + final String unitPhrase = unit.getPhrase(); + if ( + unitPhrase != null + && !unitPhrase.isEmpty() + && unitPhrase.equalsIgnoreCase(message) + ) { + searchUnit.add(unit); + } + + if (unit.getPattern() != null && patternReg(unit.getPattern(), message)) { + searchUnit.add(unit); + } + + if (percentageMatch(unit, splitWords(message)) >= unit.getMatchThreshold()) { + searchUnit.add(unit); + } + } + + if (searchUnit.isEmpty()) { + for (U nextUnit : nextUnits) { + if ((nextUnit.getPattern() == null && (nextUnit.getKeyWords() == null || nextUnit.getKeyWords().isEmpty()))) { + searchUnit.add(nextUnit); + } + } + } + } + + return searchUnit.stream().max(UNIT_PRIORITY_COMPARATOR); + } + + private static boolean patternReg(Pattern pattern, String message) { + isNotNull(pattern); + return message.matches(pattern.pattern()); + } + + private static > Double percentageMatch(U unit, Set words) { + final Set keyWords = unit.getKeyWords(); + if (keyWords != null && !keyWords.isEmpty()) { + final Set temp = new HashSet<>(keyWords); + temp.retainAll(words); + log.trace(Message.UNIT_KEYWORDS, keyWords, keyWords.size()); + log.trace(Message.USER_MESSAGE_KEYWORDS, words); + log.trace(Message.INTERSECTION, temp, temp.size()); + log.trace(Message.CROSSING_PERCENTAGE, (double) temp.size() / (double) keyWords.size() * 100.0, unit.getMatchThreshold()); + return (double) temp.size() / (double) keyWords.size() * 100.0; + } else { + return 0.0; + } + } + +} diff --git a/src/main/java/dev/struchkov/autoresponder/entity/UnitPointer.java b/src/main/java/dev/struchkov/autoresponder/entity/UnitPointer.java deleted file mode 100644 index 84667ac..0000000 --- a/src/main/java/dev/struchkov/autoresponder/entity/UnitPointer.java +++ /dev/null @@ -1,56 +0,0 @@ -package dev.struchkov.autoresponder.entity; - -import java.util.Objects; - -/** - * Сущность для сохранения позиции пользователя в сценарии, состоящем из связного списка элементов {@link Unit}. - * - * @author upagge [07/07/2019] - */ -public class UnitPointer> { - - /** - * Идентификатор пользователя. - */ - private Long entityId; - - /** - * Юнит, который был обработан. - */ - private U unit; - - public UnitPointer(Long entityId, U unit) { - this.entityId = entityId; - this.unit = unit; - } - - public Long getEntityId() { - return entityId; - } - - public void setEntityId(Long entityId) { - this.entityId = entityId; - } - - public U getUnit() { - return unit; - } - - public void setUnit(U unit) { - this.unit = unit; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - UnitPointer that = (UnitPointer) o; - return Objects.equals(entityId, that.entityId); - } - - @Override - public int hashCode() { - return Objects.hash(entityId); - } - -} diff --git a/src/main/java/dev/struchkov/autoresponder/repository/UnitPointerRepository.java b/src/main/java/dev/struchkov/autoresponder/repository/UnitPointerRepository.java deleted file mode 100644 index 580f8f6..0000000 --- a/src/main/java/dev/struchkov/autoresponder/repository/UnitPointerRepository.java +++ /dev/null @@ -1,26 +0,0 @@ -package dev.struchkov.autoresponder.repository; - -import dev.struchkov.autoresponder.entity.Unit; -import dev.struchkov.autoresponder.entity.UnitPointer; -import org.jetbrains.annotations.NotNull; - -import java.util.Optional; - -/** - * Интегрфейс для работы с хранилищем сущности {@link UnitPointer}. - * - * @author upagge [07/07/2019] - */ -public interface UnitPointerRepository> { - - UnitPointer save(@NotNull UnitPointer unitPointer); - - /** - * @param entityId Идентификатор пользователя - * @return Объект с последним обработанным {@link Unit} для пользователя - */ - Optional> findByEntityId(Long entityId); - - void removeByEntityId(Long entityId); - -} diff --git a/src/main/java/dev/struchkov/autoresponder/repository/UnitPointerRepositoryMap.java b/src/main/java/dev/struchkov/autoresponder/repository/UnitPointerRepositoryMap.java deleted file mode 100644 index 5855739..0000000 --- a/src/main/java/dev/struchkov/autoresponder/repository/UnitPointerRepositoryMap.java +++ /dev/null @@ -1,41 +0,0 @@ -package dev.struchkov.autoresponder.repository; - -import dev.struchkov.autoresponder.entity.Unit; -import dev.struchkov.autoresponder.entity.UnitPointer; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; - -import static dev.struchkov.haiti.utils.Inspector.isNotNull; - -/** - * Реализация хранилища для {@link UnitPointer} на основе Map. - * - * @author upagge [07/07/2019] - */ -public class UnitPointerRepositoryMap> implements UnitPointerRepository { - - private final Map> unitPointerMap = new HashMap<>(); - - @Override - public UnitPointer save(@NotNull UnitPointer unitPointer) { -// isNotNull(unitPointer); - unitPointerMap.put(unitPointer.getEntityId(), unitPointer); - return unitPointer; - } - - @Override - public Optional> findByEntityId(Long entityId) { - isNotNull(entityId); - return Optional.ofNullable(unitPointerMap.get(entityId)); - } - - @Override - public void removeByEntityId(Long entityId) { - isNotNull(entityId); - unitPointerMap.remove(entityId); - } - -} diff --git a/src/main/java/dev/struchkov/autoresponder/service/UnitPointerService.java b/src/main/java/dev/struchkov/autoresponder/service/UnitPointerService.java deleted file mode 100644 index 84b5e35..0000000 --- a/src/main/java/dev/struchkov/autoresponder/service/UnitPointerService.java +++ /dev/null @@ -1,22 +0,0 @@ -package dev.struchkov.autoresponder.service; - -import dev.struchkov.autoresponder.entity.Unit; -import dev.struchkov.autoresponder.entity.UnitPointer; -import org.jetbrains.annotations.NotNull; - -import java.util.Optional; - -/** - * Сервис для взаимодействия с сущностью {@link UnitPointer}. - * - * @author upagge [07/07/2019] - */ -public interface UnitPointerService> { - - void save(@NotNull UnitPointer unitPointer); - - Optional> getByEntityId(@NotNull Long entityId); - - void removeByEntityId(@NotNull Long entityId); - -} diff --git a/src/main/java/dev/struchkov/autoresponder/service/UnitPointerServiceImpl.java b/src/main/java/dev/struchkov/autoresponder/service/UnitPointerServiceImpl.java deleted file mode 100644 index 9bc2e87..0000000 --- a/src/main/java/dev/struchkov/autoresponder/service/UnitPointerServiceImpl.java +++ /dev/null @@ -1,43 +0,0 @@ -package dev.struchkov.autoresponder.service; - -import dev.struchkov.autoresponder.entity.Unit; -import dev.struchkov.autoresponder.entity.UnitPointer; -import dev.struchkov.autoresponder.repository.UnitPointerRepository; -import org.jetbrains.annotations.NotNull; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Optional; - -import static dev.struchkov.haiti.utils.Inspector.isNotNull; - -public class UnitPointerServiceImpl> implements UnitPointerService { - - private static final Logger log = LoggerFactory.getLogger(UnitPointerServiceImpl.class); - - private final UnitPointerRepository unitPointerRepository; - - public UnitPointerServiceImpl(UnitPointerRepository unitPointerRepository) { - this.unitPointerRepository = unitPointerRepository; - } - - @Override - public Optional> getByEntityId(@NotNull Long entityId) { - isNotNull(entityId); - return unitPointerRepository.findByEntityId(entityId); - } - - @Override - public void removeByEntityId(@NotNull Long entityId) { - isNotNull(entityId); - unitPointerRepository.removeByEntityId(entityId); - } - - @Override - public void save(@NotNull UnitPointer unitPointer) { - isNotNull(unitPointer); - unitPointerRepository.save(unitPointer); - log.trace("Пользователь отправлен в репозиторий"); - } - -} diff --git a/src/main/java/dev/struchkov/autoresponder/util/Parser.java b/src/main/java/dev/struchkov/autoresponder/util/Parser.java index af3e3e5..8209595 100644 --- a/src/main/java/dev/struchkov/autoresponder/util/Parser.java +++ b/src/main/java/dev/struchkov/autoresponder/util/Parser.java @@ -30,7 +30,7 @@ public class Parser { * @param text Строка * @return Множество слов */ - public static Set parse(String text) { + public static Set splitWords(String text) { final String[] split = text.split("\\P{L}+"); final Set words = Arrays.stream(split).map(String::toLowerCase).collect(Collectors.toSet()); words.removeAll(pretexts); diff --git a/src/main/java/dev/struchkov/autoresponder/util/Units.java b/src/main/java/dev/struchkov/autoresponder/util/Units.java deleted file mode 100644 index 1bd2bf2..0000000 --- a/src/main/java/dev/struchkov/autoresponder/util/Units.java +++ /dev/null @@ -1,39 +0,0 @@ -package dev.struchkov.autoresponder.util; - -import dev.struchkov.autoresponder.entity.Unit; - -import java.util.Set; - -import static dev.struchkov.haiti.utils.Exceptions.utilityClass; -import static dev.struchkov.haiti.utils.Inspector.isNotEmpty; -import static dev.struchkov.haiti.utils.Inspector.isNotNull; - -/** - * Утилитарный класс с полезными методами для работы с юнитами. - */ -public class Units { - - private Units() { - utilityClass(); - } - - /** - * Позволяет связать два разных юнита. Используется, чтобы побороть циклические зависимости в различных фреймворках. - * - * @param first К этому юниту будет присоединен юнит second. - * @param second Этот юнит присоединяется после first. - */ - public static void link(Unit first, Unit second) { - isNotNull(first, second); - final Set nextUnits = first.getNextUnits(); - if (nextUnits != null) { - nextUnits.add(second); - } - } - - public static void link(Unit first, Unit... other) { - isNotNull(first); - isNotEmpty(other); - } - -} diff --git a/src/test/java/dev/struchkov/autoresponder/AutoResponderTest.java b/src/test/java/dev/struchkov/autoresponder/AutoResponderTest.java index 7231497..ee9992f 100644 --- a/src/test/java/dev/struchkov/autoresponder/AutoResponderTest.java +++ b/src/test/java/dev/struchkov/autoresponder/AutoResponderTest.java @@ -1,143 +1,143 @@ -package dev.struchkov.autoresponder; - -import dev.struchkov.autoresponder.repository.UnitPointerRepositoryMap; -import dev.struchkov.autoresponder.service.UnitPointerServiceImpl; -import dev.struchkov.autoresponder.test.TestUnit; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.HashSet; -import java.util.Optional; -import java.util.Set; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class AutoResponderTest { - - private AutoResponder autoresponder; - - @BeforeEach - public void setUp() { - final TestUnit dela = TestUnit.builder() - .keyWord("дела") - .keyWord("делишки") - .message("хорошо") - .build(); - - final TestUnit delaTop = TestUnit.builder() - .priority(100) - .keyWord("делишки") - .message("отлично") - .build(); - - final TestUnit hello = TestUnit.builder() - .keyWord("привет") - .message("тест") - .nextUnit(dela) - .nextUnit(delaTop) - .build(); - - - final TestUnit number = TestUnit.builder() - .keyWord("89101234567") - .message("ответ") - .build(); - - final TestUnit regExp = TestUnit.builder() - .pattern(Pattern.compile("^((8|\\+7)[\\- ]?)?(\\(?\\d{3}\\)?[\\- ]?)?[\\d\\- ]{7,10}$")) - .message("регулярка") - .build(); - dela.setNextUnits(Stream.of(regExp, number).collect(Collectors.toSet())); - - final Set strings = Stream.of("витамин", "мультифрукт", "арбуз", "параметр").collect(Collectors.toSet()); - - final TestUnit unreal = TestUnit.builder() - .keyWords(strings) - .message("победа") - .matchThreshold(100) - .build(); - - final Set testUnits = new HashSet<>(); - testUnits.add(hello); - testUnits.add(regExp); - testUnits.add(unreal); - - final UnitPointerRepositoryMap unitPointerRepository = new UnitPointerRepositoryMap<>(); - final UnitPointerServiceImpl unitPointerService = new UnitPointerServiceImpl<>(unitPointerRepository); - autoresponder = new AutoResponder<>(unitPointerService, testUnits); - } - - @Test - void simpleAnswer() { - final String message = autoresponder.answer(1L, "привет это тестирвоание функциональности").orElseThrow(NullPointerException::new).getMessage(); - assertEquals("тест", message); - final String message1 = autoresponder.answer(2L, "привет, еще одно тестирование").orElseThrow(NullPointerException::new).getMessage(); - assertEquals("тест", message1); - } - - @Test - void defaultAnswer() { - final TestUnit defaultUnit = TestUnit.builder().message("не знаю").build(); - autoresponder.setDefaultUnit(defaultUnit); - - assertEquals("не знаю", autoresponder.answer(2L, "пока").orElseThrow(NullPointerException::new).getMessage()); - } - - @Test - void notDefaultAnswer() { - assertEquals(Optional.empty(), autoresponder.answer(2L, "пока")); - } - - @Test - void regExpAnswer() { - final String message = autoresponder.answer(1L, "79101234567").orElseThrow(NullPointerException::new).getMessage(); - assertEquals("регулярка", message); - } - - @Test - void priorityAnswer() { - autoresponder.answer(1L, "привет"); - autoresponder.answer(2L, "привет"); - final String message = autoresponder.answer(1L, "как твои делишки").orElseThrow(NullPointerException::new).getMessage(); - assertEquals("отлично", message); - final String message1 = autoresponder.answer(2L, "твои дела все еще хорошо?").orElseThrow(NullPointerException::new).getMessage(); - assertEquals("хорошо", message1); - } - - @Test - void showRegExpVsKeyWords() { - autoresponder.answer(1L, "привет"); - autoresponder.answer(1L, "дела"); - assertEquals("регулярка", autoresponder.answer(1L, "89101234567").orElseThrow(NullPointerException::new).getMessage()); - } - - @Test - void matchThreshold() { - autoresponder.answer(1L, "витамин я сьем, и арбуз получу"); - final String message = "параметр себе задам: покушать витамин и арбуз, а вместе все это мультифрукт"; - final String answer = autoresponder.answer(1L, message).orElseThrow(NullPointerException::new).getMessage(); - assertEquals("победа", answer); - } - - @Test - void generalAnswer() { - TestUnit defaultUnit = TestUnit.builder().message("не знаю").build(); - autoresponder.setDefaultUnit(defaultUnit); - final String answer = autoresponder.answer(1L, "привет это тестирование функциональности").orElseThrow(NullPointerException::new).getMessage(); - assertEquals("тест", answer); - assertEquals("хорошо", autoresponder.answer(1L, "как твои дела").orElseThrow(NullPointerException::new).getMessage()); - final String answer2 = autoresponder.answer(2L, "привет это тестирование функциональности").orElseThrow(NullPointerException::new).getMessage(); - assertEquals("тест", answer2); - assertEquals("не знаю", autoresponder.answer(1L, "нет").orElseThrow(NullPointerException::new).getMessage()); - final String message = "параметр себе задам: покушать витамин и арбуз, а вместе все это мультифрукт"; - assertEquals("победа", autoresponder.answer(3L, message).orElseThrow(NullPointerException::new).getMessage()); - assertEquals("регулярка", autoresponder.answer(1L, "8912345678").orElseThrow(NullPointerException::new).getMessage()); - final String answer3 = autoresponder.answer(1L, "привет это тестирование функциональности").orElseThrow(NullPointerException::new).getMessage(); - assertEquals("тест", answer3); - } - - -} \ No newline at end of file +//package dev.struchkov.autoresponder; +// +//import dev.struchkov.autoresponder.repository.UnitPointerRepositoryMap; +//import dev.struchkov.autoresponder.service.UnitPointerServiceImpl; +//import dev.struchkov.autoresponder.test.TestUnit; +//import org.junit.jupiter.api.BeforeEach; +//import org.junit.jupiter.api.Test; +// +//import java.util.HashSet; +//import java.util.Optional; +//import java.util.Set; +//import java.util.regex.Pattern; +//import java.util.stream.Collectors; +//import java.util.stream.Stream; +// +//import static org.junit.jupiter.api.Assertions.assertEquals; +// +//class AutoResponderTest { +// +// private AutoResponder autoresponder; +// +// @BeforeEach +// public void setUp() { +// final TestUnit dela = TestUnit.builder() +// .keyWord("дела") +// .keyWord("делишки") +// .message("хорошо") +// .build(); +// +// final TestUnit delaTop = TestUnit.builder() +// .priority(100) +// .keyWord("делишки") +// .message("отлично") +// .build(); +// +// final TestUnit hello = TestUnit.builder() +// .keyWord("привет") +// .message("тест") +// .nextUnit(dela) +// .nextUnit(delaTop) +// .build(); +// +// +// final TestUnit number = TestUnit.builder() +// .keyWord("89101234567") +// .message("ответ") +// .build(); +// +// final TestUnit regExp = TestUnit.builder() +// .pattern(Pattern.compile("^((8|\\+7)[\\- ]?)?(\\(?\\d{3}\\)?[\\- ]?)?[\\d\\- ]{7,10}$")) +// .message("регулярка") +// .build(); +// dela.setNextUnits(Stream.of(regExp, number).collect(Collectors.toSet())); +// +// final Set strings = Stream.of("витамин", "мультифрукт", "арбуз", "параметр").collect(Collectors.toSet()); +// +// final TestUnit unreal = TestUnit.builder() +// .keyWords(strings) +// .message("победа") +// .matchThreshold(100) +// .build(); +// +// final Set testUnits = new HashSet<>(); +// testUnits.add(hello); +// testUnits.add(regExp); +// testUnits.add(unreal); +// +// final UnitPointerRepositoryMap unitPointerRepository = new UnitPointerRepositoryMap<>(); +// final UnitPointerServiceImpl unitPointerService = new UnitPointerServiceImpl<>(unitPointerRepository); +// autoresponder = new AutoResponder<>(unitPointerService, testUnits); +// } +// +// @Test +// void simpleAnswer() { +// final String message = autoresponder.answer(1L, "привет это тестирвоание функциональности").orElseThrow(NullPointerException::new).getMessage(); +// assertEquals("тест", message); +// final String message1 = autoresponder.answer(2L, "привет, еще одно тестирование").orElseThrow(NullPointerException::new).getMessage(); +// assertEquals("тест", message1); +// } +// +// @Test +// void defaultAnswer() { +// final TestUnit defaultUnit = TestUnit.builder().message("не знаю").build(); +// autoresponder.setDefaultUnit(defaultUnit); +// +// assertEquals("не знаю", autoresponder.answer(2L, "пока").orElseThrow(NullPointerException::new).getMessage()); +// } +// +// @Test +// void notDefaultAnswer() { +// assertEquals(Optional.empty(), autoresponder.answer(2L, "пока")); +// } +// +// @Test +// void regExpAnswer() { +// final String message = autoresponder.answer(1L, "79101234567").orElseThrow(NullPointerException::new).getMessage(); +// assertEquals("регулярка", message); +// } +// +// @Test +// void priorityAnswer() { +// autoresponder.answer(1L, "привет"); +// autoresponder.answer(2L, "привет"); +// final String message = autoresponder.answer(1L, "как твои делишки").orElseThrow(NullPointerException::new).getMessage(); +// assertEquals("отлично", message); +// final String message1 = autoresponder.answer(2L, "твои дела все еще хорошо?").orElseThrow(NullPointerException::new).getMessage(); +// assertEquals("хорошо", message1); +// } +// +// @Test +// void showRegExpVsKeyWords() { +// autoresponder.answer(1L, "привет"); +// autoresponder.answer(1L, "дела"); +// assertEquals("регулярка", autoresponder.answer(1L, "89101234567").orElseThrow(NullPointerException::new).getMessage()); +// } +// +// @Test +// void matchThreshold() { +// autoresponder.answer(1L, "витамин я сьем, и арбуз получу"); +// final String message = "параметр себе задам: покушать витамин и арбуз, а вместе все это мультифрукт"; +// final String answer = autoresponder.answer(1L, message).orElseThrow(NullPointerException::new).getMessage(); +// assertEquals("победа", answer); +// } +// +// @Test +// void generalAnswer() { +// TestUnit defaultUnit = TestUnit.builder().message("не знаю").build(); +// autoresponder.setDefaultUnit(defaultUnit); +// final String answer = autoresponder.answer(1L, "привет это тестирование функциональности").orElseThrow(NullPointerException::new).getMessage(); +// assertEquals("тест", answer); +// assertEquals("хорошо", autoresponder.answer(1L, "как твои дела").orElseThrow(NullPointerException::new).getMessage()); +// final String answer2 = autoresponder.answer(2L, "привет это тестирование функциональности").orElseThrow(NullPointerException::new).getMessage(); +// assertEquals("тест", answer2); +// assertEquals("не знаю", autoresponder.answer(1L, "нет").orElseThrow(NullPointerException::new).getMessage()); +// final String message = "параметр себе задам: покушать витамин и арбуз, а вместе все это мультифрукт"; +// assertEquals("победа", autoresponder.answer(3L, message).orElseThrow(NullPointerException::new).getMessage()); +// assertEquals("регулярка", autoresponder.answer(1L, "8912345678").orElseThrow(NullPointerException::new).getMessage()); +// final String answer3 = autoresponder.answer(1L, "привет это тестирование функциональности").orElseThrow(NullPointerException::new).getMessage(); +// assertEquals("тест", answer3); +// } +// +// +//} \ No newline at end of file