diff --git a/.gitignore b/.gitignore
index cba2a35..3c599ea 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
.idea
target
*.iml
-*.log
\ No newline at end of file
+*.log
+*.txt
diff --git a/README.md b/README.md
index 67d4ca0..10840c6 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,20 @@
-# OtusSpringHW
-Домашние задания по Spring для Otus.
+# OtusSpringHW
+
+Домашнее задание #1:
+
+Программа по проведению тестирования студентов
+В ресурсах хранятся вопросы и различные ответы к ним в виде CSV файла (5 вопрсов). Программа должна спросить у пользователя фамилию и имя, спросить 5 вопросов из CSV-файла и вывести результат тестирования.
+
+Все сервисы в программе должны решать строго определённую задачу. Зависимости должны быть настроены в IoC контейнере.
+
+Опционально: сервисы, по возможности, покрыть тестами.
+
+### 19-03-18 Доработки:
+- Переименованы классы.
+- Добавлено исключение QuestionsFileLoadingException.
+- Работа с консолью вынесена в сервис ConsoleService.
+- Тесты для QuestionsDAO.
+
+### 19-03-19 Доработки:
+- Переименованы классы.
+- Добавлены тесты.
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..942e1cb
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,100 @@
+
+
+ 4.0.0
+
+ home-work-01
+
+ ru.otus.mkulikov
+ home-work
+ 1.0-SNAPSHOT
+
+
+ 11
+ ${java.version}
+ ${java.version}
+ UTF-8
+
+
+
+
+ org.springframework
+ spring-context
+ 5.0.9.RELEASE
+
+
+
+ net.sf.opencsv
+ opencsv
+ 2.3
+
+
+
+ javax.annotation
+ javax.annotation-api
+ 1.3.2
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ 5.4.0
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ 5.4.0
+ test
+
+
+
+ org.assertj
+ assertj-core
+ 3.11.1
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ ${java.version}
+ ${java.version}
+ ${encoding}
+
+
+
+
+ org.apache.maven.plugins
+ maven-resources-plugin
+
+ ${encoding}
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.21.0
+
+
+
+
+
+ src/main/resources
+
+ **/*.properties
+ **/*.xml
+ **/*.csv
+
+ false
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/ru/otus/mkulikov/Main.java b/src/main/java/ru/otus/mkulikov/Main.java
new file mode 100644
index 0000000..88e4918
--- /dev/null
+++ b/src/main/java/ru/otus/mkulikov/Main.java
@@ -0,0 +1,27 @@
+package ru.otus.mkulikov;
+
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException;
+import ru.otus.mkulikov.processor.ProcessorService;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 2019-03-14
+ * Time: 15:27
+ */
+
+public class Main {
+
+ public static void main(String[] args) {
+ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
+ try {
+ ProcessorService processor = context.getBean(ProcessorService.class);
+ processor.startTest();
+ } catch (QuestionsFileLoadingException e) {
+ e.printStackTrace();
+ } finally {
+ context.close();
+ }
+ }
+}
diff --git a/src/main/java/ru/otus/mkulikov/console/ConsoleService.java b/src/main/java/ru/otus/mkulikov/console/ConsoleService.java
new file mode 100644
index 0000000..75d552d
--- /dev/null
+++ b/src/main/java/ru/otus/mkulikov/console/ConsoleService.java
@@ -0,0 +1,15 @@
+package ru.otus.mkulikov.console;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 17.03.2019
+ * Time: 23:21
+ */
+
+public interface ConsoleService {
+
+ void write(String text);
+
+ String read();
+}
diff --git a/src/main/java/ru/otus/mkulikov/console/ConsoleServiceImpl.java b/src/main/java/ru/otus/mkulikov/console/ConsoleServiceImpl.java
new file mode 100644
index 0000000..881223e
--- /dev/null
+++ b/src/main/java/ru/otus/mkulikov/console/ConsoleServiceImpl.java
@@ -0,0 +1,35 @@
+package ru.otus.mkulikov.console;
+
+import javax.annotation.PreDestroy;
+import java.util.Scanner;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 17.03.2019
+ * Time: 23:21
+ */
+
+public class ConsoleServiceImpl implements ConsoleService {
+
+ private Scanner in;
+
+ public ConsoleServiceImpl() {
+ in = new Scanner(System.in);
+ }
+
+ @Override
+ public void write(String text) {
+ System.out.println(text);
+ }
+
+ @Override
+ public String read() {
+ return in.nextLine();
+ }
+
+ @PreDestroy
+ public void destroy() {
+ in.close();
+ }
+}
diff --git a/src/main/java/ru/otus/mkulikov/constants/StringConstants.java b/src/main/java/ru/otus/mkulikov/constants/StringConstants.java
new file mode 100644
index 0000000..0673a74
--- /dev/null
+++ b/src/main/java/ru/otus/mkulikov/constants/StringConstants.java
@@ -0,0 +1,16 @@
+package ru.otus.mkulikov.constants;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 2019-03-18
+ * Time: 13:07
+ */
+
+public class StringConstants {
+
+ public static final String c_error_load_consoleService = "Ошибка загрузки ConsoleService!";
+ public static final String c_error_load_questionsDAO = "Ошибка загрузки QuestionsDAO!";
+ public static final String c_error_load_questionsService = "Ошибка загрузки QuestionsService!";
+ public static final String c_error_load_registrationService = "Ошибка загрузки RegistrationService!";
+}
diff --git a/src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java b/src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java
new file mode 100644
index 0000000..5a4e3bc
--- /dev/null
+++ b/src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java
@@ -0,0 +1,19 @@
+package ru.otus.mkulikov.exceptions;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 2019-03-17
+ * Time: 01:40
+ */
+
+public class QuestionsFileLoadingException extends Exception {
+
+ public QuestionsFileLoadingException(String message) {
+ super(message);
+ }
+
+ public QuestionsFileLoadingException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/src/main/java/ru/otus/mkulikov/model/Question.java b/src/main/java/ru/otus/mkulikov/model/Question.java
new file mode 100644
index 0000000..5f40e3f
--- /dev/null
+++ b/src/main/java/ru/otus/mkulikov/model/Question.java
@@ -0,0 +1,99 @@
+package ru.otus.mkulikov.model;
+
+import java.io.Serializable;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 2019-03-14
+ * Time: 15:54
+ */
+
+public class Question implements Serializable {
+
+ private String id;
+ private String question;
+ private String answer1;
+ private String answer2;
+ private String answer3;
+ private String answer4;
+ private String trueAnswer;
+ private String userAnswer;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getQuestion() {
+ return question;
+ }
+
+ public void setQuestion(String question) {
+ this.question = question;
+ }
+
+ public String getAnswer1() {
+ return answer1;
+ }
+
+ public void setAnswer1(String answer1) {
+ this.answer1 = answer1;
+ }
+
+ public String getAnswer2() {
+ return answer2;
+ }
+
+ public void setAnswer2(String answer2) {
+ this.answer2 = answer2;
+ }
+
+ public String getAnswer3() {
+ return answer3;
+ }
+
+ public void setAnswer3(String answer3) {
+ this.answer3 = answer3;
+ }
+
+ public String getAnswer4() {
+ return answer4;
+ }
+
+ public void setAnswer4(String answer4) {
+ this.answer4 = answer4;
+ }
+
+ public String getTrueAnswer() {
+ return trueAnswer;
+ }
+
+ public void setTrueAnswer(String trueAnswer) {
+ this.trueAnswer = trueAnswer;
+ }
+
+ public String getUserAnswer() {
+ return userAnswer;
+ }
+
+ public void setUserAnswer(String userAnswer) {
+ this.userAnswer = userAnswer;
+ }
+
+ @Override
+ public String toString() {
+ return "Question {" +
+ "id='" + id + '\'' +
+ ", question='" + question + '\'' +
+ ", answer1='" + answer1 + '\'' +
+ ", answer2='" + answer2 + '\'' +
+ ", answer3='" + answer3 + '\'' +
+ ", answer4='" + answer4 + '\'' +
+ ", trueAnswer='" + trueAnswer + '\'' +
+ '}';
+ }
+}
diff --git a/src/main/java/ru/otus/mkulikov/model/User.java b/src/main/java/ru/otus/mkulikov/model/User.java
new file mode 100644
index 0000000..146fbd7
--- /dev/null
+++ b/src/main/java/ru/otus/mkulikov/model/User.java
@@ -0,0 +1,35 @@
+package ru.otus.mkulikov.model;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 2019-03-14
+ * Time: 15:29
+ */
+
+public class User {
+
+ private final String name;
+ private final String surname;
+
+ public User(String name, String surname) {
+ this.name = name;
+ this.surname = surname;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getSurname() {
+ return surname;
+ }
+
+ @Override
+ public String toString() {
+ return "User {" +
+ "name='" + name + '\'' +
+ ", surname='" + surname + '\'' +
+ '}';
+ }
+}
diff --git a/src/main/java/ru/otus/mkulikov/processor/ProcessorService.java b/src/main/java/ru/otus/mkulikov/processor/ProcessorService.java
new file mode 100644
index 0000000..f0bcccc
--- /dev/null
+++ b/src/main/java/ru/otus/mkulikov/processor/ProcessorService.java
@@ -0,0 +1,15 @@
+package ru.otus.mkulikov.processor;
+
+import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 2019-03-14
+ * Time: 15:54
+ */
+
+public interface ProcessorService {
+
+ void startTest() throws QuestionsFileLoadingException;
+}
diff --git a/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java b/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java
new file mode 100644
index 0000000..626be7a
--- /dev/null
+++ b/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java
@@ -0,0 +1,46 @@
+package ru.otus.mkulikov.processor;
+
+import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException;
+import ru.otus.mkulikov.questions.QuestionsService;
+import ru.otus.mkulikov.registration.RegistrationService;
+
+import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsService;
+import static ru.otus.mkulikov.constants.StringConstants.c_error_load_registrationService;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 2019-03-14
+ * Time: 15:54
+ */
+
+public class ProcessorServiceImpl implements ProcessorService {
+
+ private QuestionsService questionsService;
+ private RegistrationService registration;
+
+ public ProcessorServiceImpl(QuestionsService questionsService, RegistrationService registration) {
+ this.questionsService = questionsService;
+ this.registration = registration;
+ }
+
+ @Override
+ public void startTest() throws QuestionsFileLoadingException {
+ getRegistration().addNewUser();
+ getQuestionsService().showQuestions();
+ }
+
+ public QuestionsService getQuestionsService() throws QuestionsFileLoadingException {
+ if (questionsService == null) {
+ throw new QuestionsFileLoadingException(c_error_load_questionsService);
+ }
+ return questionsService;
+ }
+
+ public RegistrationService getRegistration() throws QuestionsFileLoadingException {
+ if (registration == null) {
+ throw new QuestionsFileLoadingException(c_error_load_registrationService);
+ }
+ return registration;
+ }
+}
diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsDAO.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsDAO.java
new file mode 100644
index 0000000..9a99d97
--- /dev/null
+++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsDAO.java
@@ -0,0 +1,18 @@
+package ru.otus.mkulikov.questions;
+
+import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException;
+import ru.otus.mkulikov.model.Question;
+
+import java.util.List;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 2019-03-14
+ * Time: 16:41
+ */
+
+public interface QuestionsDAO {
+
+ List getQuestions(String csvFilename) throws QuestionsFileLoadingException;
+}
diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java
new file mode 100644
index 0000000..1ec9636
--- /dev/null
+++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java
@@ -0,0 +1,68 @@
+package ru.otus.mkulikov.questions;
+
+import au.com.bytecode.opencsv.CSVReader;
+import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy;
+import au.com.bytecode.opencsv.bean.CsvToBean;
+import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException;
+import ru.otus.mkulikov.model.Question;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.List;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 2019-03-14
+ * Time: 16:42
+ */
+
+public class QuestionsDAOImpl implements QuestionsDAO {
+
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ private List loadFile(String csvFilename) throws QuestionsFileLoadingException {
+ if (csvFilename == null) {
+ throw new QuestionsFileLoadingException("Имя файла не может быть null!");
+ }
+
+ List questions = null;
+ try {
+ URL url = getClass().getResource("/" + csvFilename);
+ if (url == null) {
+ throw new QuestionsFileLoadingException(
+ String.format("Ошибка загрузки ресурса с именем %s!", csvFilename)
+ );
+ }
+
+ File file = new File(url.toURI());
+
+ CSVReader csvReader = new CSVReader(new FileReader(file));
+ CsvToBean csv = new CsvToBean();
+
+ questions = csv.parse(setColumMapping(), csvReader);
+ } catch (FileNotFoundException e) {
+ throw new QuestionsFileLoadingException("Файл с именем " + csvFilename + " не найден!", e);
+ } catch (URISyntaxException e) {
+ throw new QuestionsFileLoadingException("Ошибка чтения файла!", e);
+ }
+ return questions;
+ }
+
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ private ColumnPositionMappingStrategy setColumMapping() {
+ ColumnPositionMappingStrategy strategy = new ColumnPositionMappingStrategy();
+ strategy.setType(Question.class);
+ String[] columns = new String[]{"id", "question", "answer1", "answer2", "answer3", "answer4", "trueAnswer"};
+ strategy.setColumnMapping(columns);
+ return strategy;
+ }
+
+ @Override
+ public List getQuestions(String csvFilename) throws QuestionsFileLoadingException {
+ return loadFile(csvFilename);
+ }
+}
diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsService.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsService.java
new file mode 100644
index 0000000..8c80904
--- /dev/null
+++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsService.java
@@ -0,0 +1,15 @@
+package ru.otus.mkulikov.questions;
+
+import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 2019-03-14
+ * Time: 16:41
+ */
+
+public interface QuestionsService {
+
+ void showQuestions() throws QuestionsFileLoadingException;
+}
diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java
new file mode 100644
index 0000000..fe5c66d
--- /dev/null
+++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java
@@ -0,0 +1,83 @@
+package ru.otus.mkulikov.questions;
+
+import ru.otus.mkulikov.console.ConsoleService;
+import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException;
+import ru.otus.mkulikov.model.Question;
+
+import java.util.List;
+
+import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService;
+import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsDAO;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 2019-03-14
+ * Time: 16:41
+ */
+
+public class QuestionsServiceImpl implements QuestionsService {
+
+ private final String c_delimeter = "---------------------------------------------------";
+ private final String c_answerNumbers = "1234";
+ private final String c_questionsFileName = "questions.csv";
+
+ private QuestionsDAO questionsDAO;
+ private ConsoleService consoleService;
+
+ public QuestionsServiceImpl(QuestionsDAO questionsDAO, ConsoleService consoleService) {
+ this.questionsDAO = questionsDAO;
+ this.consoleService = consoleService;
+ }
+
+ @Override
+ public void showQuestions() throws QuestionsFileLoadingException {
+ getConsoleService().write(c_delimeter);
+ List questions = getQuestionsDAO().getQuestions(c_questionsFileName);
+
+ if (questions == null) {
+ throw new QuestionsFileLoadingException("Список вопросов пуст!");
+ }
+
+ for (Question question : questions) {
+ getConsoleService().write(question.getQuestion());
+ getConsoleService().write(question.getAnswer1());
+ getConsoleService().write(question.getAnswer2());
+ getConsoleService().write(question.getAnswer3());
+ getConsoleService().write(question.getAnswer4());
+
+ String answer = null;
+ boolean okAnswer = false;
+ int i = 0;
+ while (!okAnswer && i < 4) {
+ System.out.println("Введите номер ответа: ");
+ answer = getConsoleService().read();
+ okAnswer = c_answerNumbers.contains(answer);
+ i++;
+ }
+
+ question.setUserAnswer((!okAnswer && i == 4) ? "0" : answer);
+ getConsoleService().write(c_delimeter);
+ }
+
+ long count = questions.stream()
+ .filter(obj -> obj.getTrueAnswer().equals(obj.getUserAnswer()))
+ .count();
+ getConsoleService().write("Количество правильных ответов: " + count + " из " + questions.size());
+ getConsoleService().write(c_delimeter);
+ }
+
+ public QuestionsDAO getQuestionsDAO() throws QuestionsFileLoadingException {
+ if (questionsDAO == null) {
+ throw new QuestionsFileLoadingException(c_error_load_questionsDAO);
+ }
+ return questionsDAO;
+ }
+
+ public ConsoleService getConsoleService() throws QuestionsFileLoadingException {
+ if (consoleService == null) {
+ throw new QuestionsFileLoadingException(c_error_load_consoleService);
+ }
+ return consoleService;
+ }
+}
diff --git a/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java b/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java
new file mode 100644
index 0000000..f3a68ea
--- /dev/null
+++ b/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java
@@ -0,0 +1,15 @@
+package ru.otus.mkulikov.registration;
+
+import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 2019-03-14
+ * Time: 16:34
+ */
+
+public interface RegistrationService {
+
+ void addNewUser() throws QuestionsFileLoadingException;
+}
diff --git a/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java b/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java
new file mode 100644
index 0000000..b50d935
--- /dev/null
+++ b/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java
@@ -0,0 +1,43 @@
+package ru.otus.mkulikov.registration;
+
+import ru.otus.mkulikov.console.ConsoleService;
+import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException;
+import ru.otus.mkulikov.model.User;
+
+import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 2019-03-14
+ * Time: 16:34
+ */
+
+public class RegistrationServiceImpl implements RegistrationService {
+
+ private ConsoleService consoleService;
+
+ public RegistrationServiceImpl(ConsoleService consoleService) {
+ this.consoleService = consoleService;
+ }
+
+ @Override
+ public void addNewUser() throws QuestionsFileLoadingException {
+ getConsoleService().write("Введите свои данные");
+ getConsoleService().write("Фамилия: ");
+ String surname = getConsoleService().read();
+
+ getConsoleService().write("Имя: ");
+ String name = getConsoleService().read();
+
+ User user = new User(name, surname);
+ getConsoleService().write(String.format("Здравствуйте, %s %s!", user.getSurname(), user.getName()));
+ }
+
+ public ConsoleService getConsoleService() throws QuestionsFileLoadingException {
+ if (consoleService == null) {
+ throw new QuestionsFileLoadingException(c_error_load_consoleService);
+ }
+ return consoleService;
+ }
+}
diff --git a/src/main/resources/applicationContext.xml b/src/main/resources/applicationContext.xml
new file mode 100644
index 0000000..c85fd3c
--- /dev/null
+++ b/src/main/resources/applicationContext.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/questions.csv b/src/main/resources/questions.csv
new file mode 100644
index 0000000..6114d64
--- /dev/null
+++ b/src/main/resources/questions.csv
@@ -0,0 +1,5 @@
+1,Что из списка не является паттерном проектирования?,1. Фасад,2. Объект,3. Фабрика,4. Синглтон,2
+2,Какой тип не является примитивным?,1. String,2. int,3. char,4. boolean,1
+3,Сколько классов можно наследовать в Java?,1. Один,2. Два,3. Три,4. Четыре,1
+4,Какая коллекция содержит уникальне объекты?,1. List,2. Map,3. Set,4. Queue,3
+5,Какое значение нельзя положить в примитивный тип - int?,1. -1,2. 0,3. 10,4. null,4
\ No newline at end of file
diff --git a/src/test/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingExceptionTest.java b/src/test/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingExceptionTest.java
new file mode 100644
index 0000000..3b40a89
--- /dev/null
+++ b/src/test/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingExceptionTest.java
@@ -0,0 +1,29 @@
+package ru.otus.mkulikov.exceptions;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 2019-03-18
+ * Time: 11:39
+ */
+
+@DisplayName("Класс исключения QuestionsFileLoadingException")
+class QuestionsFileLoadingExceptionTest {
+
+ private final String c_not_supperted = "Not supported";
+
+ @Test
+ @DisplayName("Корректное заполнение исключения")
+ void shouldThrowException() {
+ Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> {
+ throw new QuestionsFileLoadingException(c_not_supperted);
+ });
+ assertEquals(c_not_supperted, exception.getMessage());
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/ru/otus/mkulikov/model/QuestionTest.java b/src/test/java/ru/otus/mkulikov/model/QuestionTest.java
new file mode 100644
index 0000000..c7a8c27
--- /dev/null
+++ b/src/test/java/ru/otus/mkulikov/model/QuestionTest.java
@@ -0,0 +1,90 @@
+package ru.otus.mkulikov.model;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 2019-03-18
+ * Time: 11:13
+ */
+
+@DisplayName("Класс Question")
+class QuestionTest {
+
+ private final String c_id = "1";
+ private final String c_question = "Question";
+ private final String c_userAnswer = "UserAnswer";
+ private final String c_trueAnswer = "TrueAnswer";
+ private final String c_answer1 = "Answer1";
+ private final String c_answer2 = "Answer2";
+ private final String c_answer3 = "Answer3";
+ private final String c_answer4 = "Answer4";
+
+ private Question question;
+
+ @BeforeEach
+ public void createModelQuestion() {
+ question = new Question();
+ question.setId(c_id);
+ question.setQuestion(c_question);
+ question.setUserAnswer(c_userAnswer);
+ question.setTrueAnswer(c_trueAnswer);
+ question.setAnswer1(c_answer1);
+ question.setAnswer2(c_answer2);
+ question.setAnswer3(c_answer3);
+ question.setAnswer4(c_answer4);
+ }
+
+ @Test
+ @DisplayName("Корректное заполнение id")
+ public void fillIdTest() {
+ assertEquals(c_id, question.getId());
+ }
+
+ @Test
+ @DisplayName("Корректное заполнение question")
+ public void fillQuestionTest() {
+ assertEquals(c_question, question.getQuestion());
+ }
+
+ @Test
+ @DisplayName("Корректное заполнение userAnswer")
+ public void fillUserAnsweTest() {
+ assertEquals(c_userAnswer, question.getUserAnswer());
+ }
+
+ @Test
+ @DisplayName("Корректное заполнение trueAnswer")
+ public void fillTrueAnsweTest() {
+ assertEquals(c_trueAnswer, question.getTrueAnswer());
+ }
+
+ @Test
+ @DisplayName("Корректное заполнение answer1")
+ public void fillAnswer1AnsweTest() {
+ assertEquals(c_answer1, question.getAnswer1());
+ }
+
+ @Test
+ @DisplayName("Корректное заполнение answer2")
+ public void fillAnswer2AnsweTest() {
+ assertEquals(c_answer2, question.getAnswer2());
+ }
+
+ @Test
+ @DisplayName("Корректное заполнение answer3")
+ public void fillAnswer3AnsweTest() {
+ assertEquals(c_answer3, question.getAnswer3());
+ }
+
+ @Test
+ @DisplayName("Корректное заполнение answer4")
+ public void fillAnswer4AnsweTest() {
+ assertEquals(c_answer4, question.getAnswer4());
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/ru/otus/mkulikov/model/UserTest.java b/src/test/java/ru/otus/mkulikov/model/UserTest.java
new file mode 100644
index 0000000..ffba44b
--- /dev/null
+++ b/src/test/java/ru/otus/mkulikov/model/UserTest.java
@@ -0,0 +1,33 @@
+package ru.otus.mkulikov.model;
+
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 2019-03-18
+ * Time: 10:57
+ */
+
+@DisplayName("Класс User")
+class UserTest {
+
+ private final String c_userName = "Name";
+ private final String c_userSurname = "Surname";
+
+ @Test
+ @DisplayName("Корректное создание")
+ public void createUserTest() {
+ User user = new User(c_userName, c_userSurname);
+ assertAll("user",
+ () -> assertEquals(c_userName, user.getName()),
+ () -> assertEquals(c_userSurname, user.getSurname())
+ );
+
+ Assertions.assertThat(user).hasFieldOrPropertyWithValue("name", c_userName);
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java b/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java
new file mode 100644
index 0000000..c5f2864
--- /dev/null
+++ b/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java
@@ -0,0 +1,56 @@
+package ru.otus.mkulikov.processor;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsService;
+import static ru.otus.mkulikov.constants.StringConstants.c_error_load_registrationService;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 2019-03-18
+ * Time: 11:37
+ */
+
+@DisplayName("Класс ProcessorServiceImpl")
+class ProcessorServiceImplTest {
+
+ private final ProcessorServiceImpl processorServiceNull = new ProcessorServiceImpl(null, null);
+
+ @Test
+ @DisplayName("Корректный тип исключения для getQuestionsProcess")
+ void getExceptionTypeQuestionsProcessTest() {
+ assertThrows(QuestionsFileLoadingException.class, () -> {
+ processorServiceNull.getQuestionsService();
+ });
+ }
+
+ @Test
+ @DisplayName("Корректное исключение для getQuestionsProcess")
+ void getExceptionQuestionsProcessTest() {
+ Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> {
+ processorServiceNull.getQuestionsService();
+ });
+ assertEquals(c_error_load_questionsService, exception.getMessage());
+ }
+
+ @Test
+ @DisplayName("Корректный тип исключения для getRegistrationTest")
+ void getExceptionTypeRegistrationTest() {
+ assertThrows(QuestionsFileLoadingException.class, () -> {
+ processorServiceNull.getRegistration();
+ });
+ }
+
+ @Test
+ @DisplayName("Корректное исключение для getRegistrationTest")
+ void getExceptionRegistrationTest() {
+ Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> {
+ processorServiceNull.getRegistration();
+ });
+ assertEquals(c_error_load_registrationService, exception.getMessage());
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java
new file mode 100644
index 0000000..9c68433
--- /dev/null
+++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java
@@ -0,0 +1,57 @@
+package ru.otus.mkulikov.questions;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException;
+import ru.otus.mkulikov.model.Question;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+@DisplayName("Класс QuestionsDAO")
+class QuestionsDAOTest {
+
+ private final QuestionsDAO questionsDAO = new QuestionsDAOImpl();
+
+ private final String c_questionsFileName = "test_questions.csv";
+ private final String c_questionsBadFileName = "test.csv";
+
+ private final String c_test1 = "Тест1";
+ private final String c_test2 = "Тест2";
+ private final String c_test3 = "Тест3";
+
+ @Test
+ @DisplayName("Корректная загрузка вопросов")
+ public void loadQuestionsTest() {
+ try {
+ List questions = questionsDAO.getQuestions(c_questionsFileName);
+
+ assertNotNull(questions);
+ assertEquals(3, questions.size());
+ assertEquals(c_test1, questions.get(0).getQuestion());
+ assertEquals(c_test2, questions.get(1).getQuestion());
+ assertEquals(c_test3, questions.get(2).getQuestion());
+ } catch (QuestionsFileLoadingException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ @DisplayName("Корректное исключение на null")
+ public void loadNullExceptionQuestionsTest() {
+ Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> {
+ questionsDAO.getQuestions(null);
+ });
+ assertEquals("Имя файла не может быть null!", exception.getMessage());
+ }
+
+ @Test
+ @DisplayName("Корректное исключение на неверное имя файла")
+ public void loadExceptionQuestionsTest() {
+ Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> {
+ questionsDAO.getQuestions(c_questionsBadFileName);
+ });
+ assertEquals(String.format("Ошибка загрузки ресурса с именем %s!", c_questionsBadFileName), exception.getMessage());
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java
new file mode 100644
index 0000000..a7bbcc6
--- /dev/null
+++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java
@@ -0,0 +1,56 @@
+package ru.otus.mkulikov.questions;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService;
+import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsDAO;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 2019-03-18
+ * Time: 12:00
+ */
+
+@DisplayName("Класс QuestionsServiceImpl")
+class QuestionsServiceImplTest {
+
+ private final QuestionsServiceImpl questionsService = new QuestionsServiceImpl(null, null);
+
+ @Test
+ @DisplayName("Корректный тип исключения для getQuestionsDAO")
+ void getExceptionTypeQuestionsDAO() {
+ assertThrows(QuestionsFileLoadingException.class, () -> {
+ questionsService.getQuestionsDAO();
+ });
+ }
+
+ @Test
+ @DisplayName("Корректное исключение для getQuestionsDAO")
+ void getExceptionQuestionsDAO() {
+ Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> {
+ questionsService.getQuestionsDAO();
+ });
+ assertEquals(c_error_load_questionsDAO, exception.getMessage());
+ }
+
+ @Test
+ @DisplayName("Корректный тип исключения для getConsoleService")
+ void getExceptionTypeConsoleService() {
+ assertThrows(QuestionsFileLoadingException.class, () -> {
+ questionsService.getConsoleService();
+ });
+ }
+
+ @Test
+ @DisplayName("Корректное исключение для getConsoleService")
+ void getExceptionConsoleService() {
+ Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> {
+ questionsService.getConsoleService();
+ });
+ assertEquals(c_error_load_consoleService, exception.getMessage());
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java b/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java
new file mode 100644
index 0000000..5b75555
--- /dev/null
+++ b/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java
@@ -0,0 +1,38 @@
+package ru.otus.mkulikov.registration;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService;
+
+/**
+ * Created by IntelliJ IDEA.
+ * Developer: Maksim Kulikov
+ * Date: 2019-03-18
+ * Time: 13:02
+ */
+
+@DisplayName("Класс RegistrationServiceImpl")
+class RegistrationServiceImplTest {
+
+ private final RegistrationServiceImpl registrationService = new RegistrationServiceImpl(null);
+
+ @Test
+ @DisplayName("Корректный тип исключения для getConsoleService")
+ void getExceptionTypeConsoleServiceTest() {
+ assertThrows(QuestionsFileLoadingException.class, () -> {
+ registrationService.getConsoleService();
+ });
+ }
+
+ @Test
+ @DisplayName("Корректное исключение для getQuestionsDAO")
+ void getExceptionConsoleServiceTest() {
+ Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> {
+ registrationService.getConsoleService();
+ });
+ assertEquals(c_error_load_consoleService, exception.getMessage());
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/questions.csv b/src/test/resources/questions.csv
new file mode 100644
index 0000000..47cc49f
--- /dev/null
+++ b/src/test/resources/questions.csv
@@ -0,0 +1,3 @@
+1,Тест1,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1
+2,Тест2,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1
+3,Тест3,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1
diff --git a/src/test/resources/test_questions.csv b/src/test/resources/test_questions.csv
new file mode 100644
index 0000000..47cc49f
--- /dev/null
+++ b/src/test/resources/test_questions.csv
@@ -0,0 +1,3 @@
+1,Тест1,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1
+2,Тест2,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1
+3,Тест3,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1