-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathManualInputReaderStrategyTest.java
More file actions
197 lines (159 loc) · 8.14 KB
/
ManualInputReaderStrategyTest.java
File metadata and controls
197 lines (159 loc) · 8.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
package input.strategy;
import dto.Client;
import input.CustomCollection;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import static org.junit.jupiter.api.Assertions.assertEquals;
class ManualInputReaderStrategyTest {
private InputStream originalSystemIn;
private final ByteArrayInputStream testInput = new ByteArrayInputStream(new byte[0]);
@BeforeEach
void setUp() {
// Сохраняем оригинальный System.in
originalSystemIn = System.in;
}
@AfterEach
void tearDown() {
// Восстанавливаем оригинальный System.in после теста
System.setIn(originalSystemIn);
}
@Test
@DisplayName("getData должен вернуть пустую коллекцию при отказе от добавления первого клиента")
void testGetDataReturnsEmptyCollectionWhenUserDeclinesFirstClient() throws IOException {
// Arrange: пользователь отказывается добавлять первого клиента
String input = "н\n"; // 'нет' на вопрос «Добавляем клиента?»
System.setIn(new ByteArrayInputStream(input.getBytes()));
ClientInputStrategy strategy = new ManualInputReaderStrategy();
// Act
CustomCollection<Client> clients = strategy.getData();
// Assert
assertEquals(0, clients.size());
}
@Test
@DisplayName("getData должен корректно добавить одного клиента с валидными данными")
void testGetDataAddsOneValidClient() throws IOException {
// Arrange: последовательность ввода для одного клиента
String input = "да\n" + // добавляем клиента
"Иван Иванов\n" + // имя
"+79991234567\n" + // телефон
"1\n" + // ID
"да\n" + // подтверждение данных
"нет\n"; // отказ от добавления следующего клиента
System.setIn(new ByteArrayInputStream(input.getBytes()));
ClientInputStrategy strategy = new ManualInputReaderStrategy();
// Act
CustomCollection<Client> clients = strategy.getData();
// Assert
assertEquals(1, clients.size());
Client client = clients.get(0);
assertEquals("Иван Иванов", client.getName());
assertEquals("+79991234567", client.getPhoneNumber());
assertEquals(1, client.getIdNumber());
}
@Test
@DisplayName("getData должен пропускать клиента при отмене подтверждения данных")
void testGetDataSkipsClientWhenUserCancelsConfirmation() throws IOException {
// Arrange: добавляем клиента, но отменяем подтверждение данных
String input = "да\n" +
"Мария Петрова\n" +
"+79997654321\n" +
"2\n" +
"нет\n" + // отмена подтверждения
"нет\n"; // отказ от следующего клиента
System.setIn(new ByteArrayInputStream(input.getBytes()));
ClientInputStrategy strategy = new ManualInputReaderStrategy();
// Act
CustomCollection<Client> clients = strategy.getData();
// Assert: клиент не добавлен
assertEquals(0, clients.size());
}
@Test
@DisplayName("promptForNumber должен запрашивать повторный ввод при неверном формате телефона")
void testPromptForNumberRepeatsOnInvalidPhoneFormat() throws IOException {
// Arrange: неверный формат телефона, затем корректный
String input = "да\n" +
"Анна Сидорова\n" +
"79998887766\n" + // без +7
"+79998887766\n" + // корректный формат
"3\n" +
"да\n" +
"нет\n";
System.setIn(new ByteArrayInputStream(input.getBytes()));
ClientInputStrategy strategy = new ManualInputReaderStrategy();
// Act
CustomCollection<Client> clients = strategy.getData();
// Assert: клиент добавлен с корректным номером
assertEquals(1, clients.size());
assertEquals("+79998887766", clients.get(0).getPhoneNumber());
}
@Test
@DisplayName("promptForId должен отклонять занятый ID и запрашивать новый")
void testPromptForIdRejectsDuplicateId() throws IOException {
// Arrange: попытка ввести дублирующий ID
String input = "да\n" +
"Иван Иванов\n" +
"+79991234567\n" +
"1\n" +
"да\n" + // подтверждение первого клиента
"да\n" + // добавляем второго клиента
"Мария Петрова\n" +
"+79997654321\n" +
"1\n" + // дублирующий ID
"2\n" + // новый ID
"да\n" +
"нет\n";
System.setIn(new ByteArrayInputStream(input.getBytes()));
ClientInputStrategy strategy = new ManualInputReaderStrategy();
// Act
CustomCollection<Client> clients = strategy.getData();
// Assert: два клиента с разными ID
assertEquals(2, clients.size());
assertEquals(1, clients.get(0).getIdNumber());
assertEquals(2, clients.get(1).getIdNumber());
}
@Test
@DisplayName("promptForId должен отклонять ID вне диапазона 0–1000")
void testPromptForIdRejectsOutOfRangeId() throws IOException {
// Arrange: ID вне диапазона, затем корректный
String input = "да\n" +
"Анна Сидорова\n" +
"+79998887766\n" +
"-5\n" + // меньше 0
"1500\n" + // больше 1000
"5\n" + // корректный ID
"да\n" +
"нет\n";
System.setIn(new ByteArrayInputStream(input.getBytes()));
ClientInputStrategy strategy = new ManualInputReaderStrategy();
// Act
CustomCollection<Client> clients = strategy.getData();
// Assert: клиент добавлен с ID=5
assertEquals(1, clients.size());
assertEquals(5, clients.get(0).getIdNumber());
}
@Test
@DisplayName("getData должен остановить ввод при достижении лимита в 1000 клиентов")
void testGetDataStopsAtLimitOf1000Clients() throws IOException {
// Arrange: имитируем достижение лимита
StringBuilder inputBuilder = new StringBuilder();
for (int i = 0; i < 1000; i++) {
inputBuilder.append("да\n");
inputBuilder.append("Иван Иванов").append("\n");
inputBuilder.append("+7").append(String.format("%010d", i)).append("\n");
inputBuilder.append(i).append("\n");
inputBuilder.append("да\n");
}
inputBuilder.append("да\n"); // попытка добавить 1001-го клиента
System.setIn(new ByteArrayInputStream(inputBuilder.toString().getBytes()));
ClientInputStrategy strategy = new ManualInputReaderStrategy();
// Act
CustomCollection<Client> clients = strategy.getData();
// Assert: добавлено ровно 1000 клиентов
assertEquals(1000, clients.size());
}
}