Skip to content

Commit f2935e3

Browse files
committed
Все тесты написаны
1 parent 5186c34 commit f2935e3

22 files changed

+2385
-153
lines changed

savedData.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Client{name='Иван', phoneNumber='+79991234567', idNumber=2}
2+
Client{name='Пётр', phoneNumber='+79997654321', idNumber=1}
3+
4+
Client{name='Мария', phoneNumber='+79992222222', idNumber=4}
5+
6+
Client{name='Алексей', phoneNumber='+79994444444', idNumber=6}
7+
Client{name='Сергей', phoneNumber='+79993333333', idNumber=5}
8+
9+
Client{name='ВыводТест', phoneNumber='+71111111111', idNumber=77}
10+

src/main/java/dto/Client.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,17 @@ public Client build(){
3535
return new Client(this);
3636
}
3737

38+
public String getName() {
39+
return name;
40+
}
41+
42+
public String getPhoneNumber() {
43+
return phoneNumber;
44+
}
45+
46+
public int getIdNumber() {
47+
return idNumber;
48+
}
3849
}
3950

4051
public String getName() {

src/main/java/input/InputManager.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,47 @@ public CustomCollection<Client> loadData() throws IOException {
6464
}
6565
return currentStrategy.getData();
6666
}
67+
68+
/**
69+
* Создает стратегию для чтения данных из файла.
70+
*
71+
* <p>Файл должен содержать данные в формате:</p>
72+
* <pre>
73+
* Имя|Телефон|ID
74+
* Иван Иванов|+79991234567|1
75+
* </pre>
76+
*
77+
* @param filePath путь к файлу с данными о клиентах
78+
* @return стратегия чтения из файла
79+
* @throws IllegalArgumentException если {@code filePath} равен {@code null} или пуст
80+
*/
81+
public FileReaderStrategy createFileStrategy(String filePath) {
82+
if (filePath == null || filePath.trim().isEmpty()) {
83+
throw new IllegalArgumentException("Путь к файлу не может быть null или пустым");
84+
}
85+
return new FileReaderStrategy(filePath);
86+
}
87+
88+
/**
89+
* Создает стратегию для ручного ввода данных через консоль.
90+
*
91+
* <p>Стратегия предоставляет интерактивный интерфейс для ввода данных
92+
* о клиентах с валидацией и подтверждением.</p>
93+
*
94+
* @return стратегия ручного ввода
95+
*/
96+
public ManualInputReaderStrategy createManualStrategy() {
97+
return new ManualInputReaderStrategy();
98+
}
99+
100+
/**
101+
* Создает стратегию для генерации случайных данных о клиентах.
102+
*
103+
* @param count количество клиентов для генерации
104+
* @return стратегия генерации случайных данных
105+
* @throws IllegalArgumentException если {@code count} меньше или равен 0
106+
*/
107+
public RandomDataGeneratorStrategy createRandomStrategy(int count) {
108+
return new RandomDataGeneratorStrategy(count);
109+
}
67110
}

src/main/java/input/strategy/ManualInputReaderStrategy.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import input.CustomCollection;
55

66
import java.io.IOException;
7+
import java.io.InputStream;
78
import java.util.HashSet;
89
import java.util.Scanner;
910
import java.util.Set;
@@ -35,6 +36,12 @@ public ManualInputReaderStrategy() {
3536
this.userIds = new HashSet<>();
3637
}
3738

39+
40+
public ManualInputReaderStrategy(InputStream in) {
41+
this.scanner = new Scanner(in); // создаём Scanner на переданном потоке
42+
this.userIds = new HashSet<>();
43+
}
44+
3845
/**
3946
* Получает коллекцию клиентов через интерактивный ручной ввод.
4047
* Метод последовательно запрашивает данные о каждом клиенте,

src/main/java/output/FileDataWriter.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,24 @@ public class FileDataWriter {
77
private final File file = new File("savedData.txt");
88

99
public void writeDataToFile(String data){
10-
try {
11-
file.createNewFile();
12-
} catch (IOException e) {
13-
throw new RuntimeException(e);
10+
if(file.exists() && file.isDirectory()){
11+
throw new RuntimeException("По пути сохранения находится директория");
12+
}
13+
14+
if (!file.exists()) {
15+
try {
16+
if(!file.createNewFile()){
17+
throw new RuntimeException("Не удалось создать файл");
18+
}
19+
} catch (IOException e) {
20+
throw new RuntimeException("Ошибка создания файла", e);
21+
}
1422
}
1523

1624
try(Writer writer = new BufferedWriter(new FileWriter(file, true))){
1725
writer.append(data);
18-
} catch (Exception e){
19-
e.printStackTrace();
26+
} catch (IOException e){
27+
throw new RuntimeException("Ошибка записи в файл", e);
2028
}
2129
}
2230
}

src/main/java/sorting/SortingStrategy.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
public interface SortingStrategy {
77

8-
98
void sort(CustomCollection<Client> clients);
109
String getStrategyName();
1110
void sortEvenValuesOnly(CustomCollection<Client> clients);

src/main/java/userInterface/AppController.java

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@
44
import enums.Field;
55
import input.CustomCollection;
66
import input.InputManager;
7-
import input.strategy.FileReaderStrategy;
87
import input.strategy.ManualInputReaderStrategy;
9-
import input.strategy.RandomDataGeneratorStrategy;
108
import output.FileDataWriter;
119
import sorting.MergeSortDefaultStrategy;
1210
import sorting.MergeSortDynamicStrategy;
1311
import sorting.SortingManager;
1412

13+
import java.io.File;
1514
import java.io.IOException;
1615

1716
public class AppController {
@@ -31,7 +30,7 @@ public void startDefaultSorting(){
3130
public void startEvenIdsSorting(){
3231
sortingManager.setStrategy(new MergeSortDefaultStrategy());
3332
sortingManager.getCurrentStrategy().sortEvenValuesOnly(fullList);
34-
showAndWriteAllClients();
33+
showAndWriteEvenClients(fullList);
3534
}
3635

3736
public void startDynamicSorting(Field field){
@@ -52,8 +51,18 @@ public void showAndWriteAllClients(){
5251
fileDataWriter.writeDataToFile("\n");
5352
}
5453

54+
public void showAndWriteEvenClients(CustomCollection<Client> clients){
55+
for(Client client : clients){
56+
if (client.getIdNumber() % 2 == 0){
57+
System.out.println(client);
58+
fileDataWriter.writeDataToFile(client + "\n");
59+
}
60+
}
61+
fileDataWriter.writeDataToFile("\n");
62+
}
63+
5564
public void startFileReaderStrategy(String path){
56-
inputManager.setStrategy(new FileReaderStrategy(path));
65+
inputManager.setStrategy(inputManager.createFileStrategy(path));
5766
try {
5867
CustomCollection<Client> fromFileList = inputManager.loadData();
5968
int countOfAlexes = concurrentCounter.countAlexes(fromFileList);
@@ -65,10 +74,12 @@ public void startFileReaderStrategy(String path){
6574
} catch (IOException e) {
6675
throw new RuntimeException(e);
6776
}
77+
System.out.println("File path: " + path);
78+
System.out.println("File exists: " + new File(path).exists());
6879
}
6980

7081
public void startManualInputStrategy(){
71-
inputManager.setStrategy(new ManualInputReaderStrategy());
82+
inputManager.setStrategy(inputManager.createManualStrategy());
7283
try {
7384
CustomCollection<Client> manualList = inputManager.loadData();
7485
int countOfAlexes = concurrentCounter.countAlexes(manualList);
@@ -83,7 +94,7 @@ public void startManualInputStrategy(){
8394
}
8495

8596
public void startRandomDataStrategy(int count){
86-
inputManager.setStrategy(new RandomDataGeneratorStrategy(count));
97+
inputManager.setStrategy(inputManager.createRandomStrategy(count));
8798
try {
8899
CustomCollection<Client> randomList = inputManager.loadData();
89100
int countOfAlexes = concurrentCounter.countAlexes(randomList);
@@ -97,4 +108,23 @@ public void startRandomDataStrategy(int count){
97108
}
98109

99110
}
111+
112+
public void startManualInputStrategy(ManualInputReaderStrategy strategy){
113+
inputManager.setStrategy(strategy);
114+
try {
115+
CustomCollection<Client> manualList = inputManager.loadData();
116+
int countOfAlexes = concurrentCounter.countAlexes(manualList);
117+
fullList.addAll(manualList);
118+
for(Client client : manualList){
119+
System.out.println(client);
120+
}
121+
System.out.println("Добавлено Алексеев: " + countOfAlexes);
122+
} catch (IOException e) {
123+
throw new RuntimeException(e);
124+
}
125+
}
126+
127+
public InputManager getInputManager() {
128+
return inputManager;
129+
}
100130
}

src/test/java/dto/ClientTest.java

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
package dto;
2+
3+
import org.junit.jupiter.api.DisplayName;
4+
import org.junit.jupiter.api.Test;
5+
6+
import static org.junit.jupiter.api.Assertions.*;
7+
8+
class ClientTest {
9+
10+
@Test
11+
@DisplayName("Конструктор Client должен корректно инициализировать поля из ClientBuilder")
12+
void testClientConstructorInitializesFieldsCorrectly() {
13+
// Arrange
14+
Client.ClientBuilder builder = new Client.ClientBuilder()
15+
.name("Иван Иванов")
16+
.phoneNumber("+79991234567")
17+
.idNumber(1);
18+
19+
// Act
20+
Client client = new Client(builder);
21+
22+
// Assert
23+
assertEquals("Иван Иванов", client.getName());
24+
assertEquals("+79991234567", client.getPhoneNumber());
25+
assertEquals(1, client.getIdNumber());
26+
}
27+
28+
@Test
29+
@DisplayName("Геттеры должны возвращать корректные значения полей")
30+
void testGettersReturnCorrectValues() {
31+
// Arrange
32+
Client.ClientBuilder builder = new Client.ClientBuilder()
33+
.name("Петр Петров")
34+
.phoneNumber("+78887654321")
35+
.idNumber(2);
36+
Client client = new Client(builder);
37+
38+
// Act & Assert
39+
assertEquals("Петр Петров", client.getName());
40+
assertEquals("+78887654321", client.getPhoneNumber());
41+
assertEquals(2, client.getIdNumber());
42+
}
43+
44+
@Test
45+
@DisplayName("Метод build() ClientBuilder должен создавать корректный объект Client")
46+
void testClientBuilderBuildCreatesCorrectClient() {
47+
// Arrange
48+
Client.ClientBuilder builder = new Client.ClientBuilder()
49+
.name("Мария Сидорова")
50+
.phoneNumber("+77776543210")
51+
.idNumber(3);
52+
53+
// Act
54+
Client client = builder.build();
55+
56+
// Assert
57+
assertNotNull(client);
58+
assertEquals("Мария Сидорова", client.getName());
59+
assertEquals("+77776543210", client.getPhoneNumber());
60+
assertEquals(3, client.getIdNumber());
61+
}
62+
63+
@Test
64+
@DisplayName("Цепочка методов в ClientBuilder должна работать корректно")
65+
void testClientBuilderMethodChaining() {
66+
// Act
67+
Client client = new Client.ClientBuilder()
68+
.name("Алексей Козлов")
69+
.phoneNumber("+75554443322")
70+
.idNumber(4)
71+
.build();
72+
73+
// Assert
74+
assertNotNull(client);
75+
assertEquals("Алексей Козлов", client.getName());
76+
assertEquals("+75554443322", client.getPhoneNumber());
77+
assertEquals(4, client.getIdNumber());
78+
}
79+
80+
@Test
81+
@DisplayName("toString() должен возвращать строку в ожидаемом формате")
82+
void testToStringReturnsExpectedFormat() {
83+
// Arrange
84+
Client.ClientBuilder builder = new Client.ClientBuilder()
85+
.name("Анна Волкова")
86+
.phoneNumber("+73332221100")
87+
.idNumber(5);
88+
Client client = builder.build();
89+
String expectedString = "Client{name='Анна Волкова', phoneNumber='+73332221100', idNumber=5}";
90+
91+
// Act
92+
String actualString = client.toString();
93+
94+
// Assert
95+
assertEquals(expectedString, actualString);
96+
}
97+
98+
@Test
99+
@DisplayName("Поля Client должны быть final и не изменяться после создания")
100+
void testClientFieldsAreImmutable() {
101+
// Arrange
102+
Client.ClientBuilder builder = new Client.ClientBuilder()
103+
.name("Сергей Новиков")
104+
.phoneNumber("+71112223344")
105+
.idNumber(6);
106+
Client client = builder.build();
107+
108+
// Act & Assert (проверяем, что геттеры возвращают те же значения)
109+
assertEquals("Сергей Новиков", client.getName());
110+
assertEquals("+71112223344", client.getPhoneNumber());
111+
assertEquals(6, client.getIdNumber());
112+
113+
// Попытка изменить состояние через builder не должна повлиять на существующий объект
114+
builder.name("Другое имя").idNumber(999);
115+
Client anotherClient = builder.build();
116+
117+
// Проверяем, что первый клиент остался неизменным
118+
assertEquals("Сергей Новиков", client.getName());
119+
assertEquals(6, client.getIdNumber());
120+
121+
// Проверяем, что новый клиент имеет новые значения
122+
assertEquals("Другое имя", anotherClient.getName());
123+
assertEquals(999, anotherClient.getIdNumber());
124+
}
125+
126+
@Test
127+
@DisplayName("Два клиента с одинаковыми данными должны быть разными объектами")
128+
void testClientsWithSameDataAreDifferentObjects() {
129+
// Arrange
130+
Client.ClientBuilder builder1 = new Client.ClientBuilder()
131+
.name("Ольга Смирнова")
132+
.phoneNumber("+79998887766")
133+
.idNumber(7);
134+
Client.ClientBuilder builder2 = new Client.ClientBuilder()
135+
.name("Ольга Смирнова")
136+
.phoneNumber("+79998887766")
137+
.idNumber(7);
138+
139+
// Act
140+
Client client1 = builder1.build();
141+
Client client2 = builder2.build();
142+
143+
// Assert
144+
assertNotSame(client1, client2); // Разные объекты
145+
assertEquals(client1.getName(), client2.getName());
146+
assertEquals(client1.getPhoneNumber(), client2.getPhoneNumber());
147+
assertEquals(client1.getIdNumber(), client2.getIdNumber());
148+
}
149+
}

0 commit comments

Comments
 (0)