1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.codec.language.bm;
19
20 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
21 import static org.junit.jupiter.api.Assertions.assertEquals;
22 import static org.junit.jupiter.api.Assertions.assertFalse;
23 import static org.junit.jupiter.api.Assertions.assertNotNull;
24 import static org.junit.jupiter.api.Assertions.assertNotSame;
25 import static org.junit.jupiter.api.Assertions.assertThrows;
26 import static org.junit.jupiter.api.Assertions.assertTrue;
27
28 import org.junit.jupiter.api.Test;
29
30
31
32
33
34
35 class PhoneticEngineBuilderTest {
36
37
38
39
40
41
42
43 private static String repeat(final int length) {
44 final char[] chars = new char[length];
45 java.util.Arrays.fill(chars, 'a');
46 return new String(chars);
47 }
48
49
50
51
52 @Test
53 void testBuilderGet() {
54 final PhoneticEngine engine = PhoneticEngine.builder().get();
55 assertNotNull(engine);
56 }
57
58
59
60
61 @Test
62 void testBuilderNotNull() {
63 assertNotNull(PhoneticEngine.builder());
64 }
65
66
67
68
69 @Test
70 void testBuilderReturnsNewInstance() {
71 assertNotSame(PhoneticEngine.builder(), PhoneticEngine.builder());
72 }
73
74
75
76
77 @Test
78 void testDefaultMaxInputLengthAllowsInputAtLimit() {
79
80 final PhoneticEngine engine = PhoneticEngine.builder().get();
81 final String input = repeat(666);
82 assertDoesNotThrow(() -> engine.encode(input));
83 }
84
85
86
87
88
89 @Test
90 void testDefaultMaxInputLengthRejectsInputBeyondLimit() {
91 final PhoneticEngine engine = PhoneticEngine.builder().get();
92 final String input = repeat(667);
93 assertThrows(IllegalArgumentException.class, () -> engine.encode(input));
94 }
95
96
97
98
99 @Test
100 void testDefaultValues() {
101 final PhoneticEngine engine = PhoneticEngine.builder().get();
102 assertEquals(NameType.GENERIC, engine.getNameType());
103 assertEquals(RuleType.APPROX, engine.getRuleType());
104 assertTrue(engine.isConcat());
105 assertEquals(20, engine.getMaxPhonemes());
106 }
107
108
109
110
111 @Test
112 void testEngineEncodeAshkenaziApprox() {
113
114 final PhoneticEngine engine = PhoneticEngine.builder()
115 .setNameType(NameType.ASHKENAZI)
116 .setRuleType(RuleType.APPROX)
117 .setConcat(true)
118 .setMaxPhonemes(10)
119 .get();
120
121 final String result = engine.encode("Renault");
122 assertEquals("rYnDlt|rYnalt|rYnult|rinDlt|rinalt|rinolt|rinult", result);
123 }
124
125
126
127
128 @Test
129 void testEngineEncodeGenericApprox() {
130
131 final PhoneticEngine engine = PhoneticEngine.builder()
132 .setNameType(NameType.GENERIC)
133 .setRuleType(RuleType.APPROX)
134 .setConcat(true)
135 .setMaxPhonemes(10)
136 .get();
137
138 final String result = engine.encode("Renault");
139 assertEquals("rinD|rinDlt|rina|rinalt|rino|rinolt|rinu|rinult", result);
140 }
141
142
143
144
145 @Test
146 void testEngineEncodeGenericExact() {
147
148 final PhoneticEngine engine = PhoneticEngine.builder()
149 .setNameType(NameType.GENERIC)
150 .setRuleType(RuleType.EXACT)
151 .setConcat(true)
152 .setMaxPhonemes(10)
153 .get();
154
155 final String result = engine.encode("SntJohn-Smith");
156 assertEquals("sntjonsmit", result);
157 }
158
159
160
161
162 @Test
163 void testGetReturnsDifferentInstances() {
164 final PhoneticEngine.Builder builder = PhoneticEngine.builder();
165 final PhoneticEngine engine1 = builder.get();
166 final PhoneticEngine engine2 = builder.get();
167 assertNotSame(engine1, engine2);
168 }
169
170
171
172
173 @Test
174 void testMethodChaining() {
175
176 final PhoneticEngine.Builder builder = PhoneticEngine.builder();
177 assertNotNull(builder
178 .setNameType(NameType.SEPHARDIC)
179 .setRuleType(RuleType.APPROX)
180 .setConcat(true)
181 .setMaxPhonemes(15)
182 .get());
183
184 }
185
186
187
188
189 @Test
190 void testSetAll() {
191
192 final PhoneticEngine original = PhoneticEngine.builder()
193 .setNameType(NameType.ASHKENAZI)
194 .setRuleType(RuleType.EXACT)
195 .setConcat(false)
196 .setMaxPhonemes(5)
197 .get();
198
199 final PhoneticEngine copy = PhoneticEngine.builder().setAll(original).get();
200 assertEquals(original.getNameType(), copy.getNameType());
201 assertEquals(original.getRuleType(), copy.getRuleType());
202 assertEquals(original.isConcat(), copy.isConcat());
203 assertEquals(original.getMaxPhonemes(), copy.getMaxPhonemes());
204 }
205
206
207
208
209 @Test
210 void testSetConcatFalse() {
211 final PhoneticEngine engine = PhoneticEngine.builder().setConcat(false).get();
212 assertFalse(engine.isConcat());
213 }
214
215
216
217
218 @Test
219 void testSetConcatTrue() {
220 final PhoneticEngine engine = PhoneticEngine.builder().setConcat(true).get();
221 assertTrue(engine.isConcat());
222 }
223
224
225
226
227
228 @Test
229 void testSetMaxInputLengthAllowsInputAtCustomLimit() {
230 final int customLimit = 10;
231 final PhoneticEngine engine = PhoneticEngine.builder().setMaxInputLength(customLimit).get();
232 final String input = repeat(customLimit);
233 assertDoesNotThrow(() -> engine.encode(input));
234 }
235
236
237
238
239
240 @Test
241 void testSetMaxInputLengthMaxValue() {
242 final PhoneticEngine engine = PhoneticEngine.builder().setMaxInputLength(Integer.MAX_VALUE).get();
243
244 final String input = repeat(10_000);
245 assertDoesNotThrow(() -> engine.encode(input));
246 }
247
248
249
250
251
252 @Test
253 void testSetMaxInputLengthRejectsInputBeyondCustomLimit() {
254 final int customLimit = 10;
255 final PhoneticEngine engine = PhoneticEngine.builder().setMaxInputLength(customLimit).get();
256 final String input = repeat(customLimit + 1);
257 assertThrows(IllegalArgumentException.class, () -> engine.encode(input));
258 }
259
260
261
262
263
264 @Test
265 void testSetMaxInputLengthReturnsBuilder() {
266 final PhoneticEngine.Builder builder = PhoneticEngine.builder();
267 assertNotNull(builder.setMaxInputLength(100));
268 }
269
270
271
272
273
274 @Test
275 void testSetMaxInputLengthWithOtherSettings() {
276
277 final PhoneticEngine engine = PhoneticEngine.builder()
278 .setNameType(NameType.ASHKENAZI)
279 .setRuleType(RuleType.APPROX)
280 .setConcat(true)
281 .setMaxPhonemes(10)
282 .setMaxInputLength(5)
283 .get();
284
285 assertNotNull(engine);
286 assertDoesNotThrow(() -> engine.encode("abcde"));
287 assertThrows(IllegalArgumentException.class, () -> engine.encode("abcdef"));
288 }
289
290
291
292
293
294 @Test
295 void testSetMaxInputLengthZeroNullInputThrowsNpe() {
296 final PhoneticEngine engine = PhoneticEngine.builder().setMaxInputLength(0).get();
297 assertThrows(NullPointerException.class, () -> engine.encode(null));
298 }
299
300
301
302
303
304 @Test
305 void testSetMaxInputLengthZeroRejectsAnyInput() {
306 final PhoneticEngine engine = PhoneticEngine.builder().setMaxInputLength(0).get();
307 assertThrows(IllegalArgumentException.class, () -> engine.encode("a"));
308 }
309
310
311
312
313 @Test
314 void testSetMaxPhonemes() {
315 final int maxPhonemes = 10;
316 final PhoneticEngine engine = PhoneticEngine.builder().setMaxPhonemes(maxPhonemes).get();
317 assertEquals(maxPhonemes, engine.getMaxPhonemes());
318 }
319
320
321
322
323 @Test
324 void testSetMaxPhonemesMaxValue() {
325 final PhoneticEngine engine = PhoneticEngine.builder().setMaxPhonemes(Integer.MAX_VALUE).get();
326 assertEquals(Integer.MAX_VALUE, engine.getMaxPhonemes());
327 }
328
329
330
331
332 @Test
333 void testSetNameTypeAshkenazi() {
334 final PhoneticEngine engine = PhoneticEngine.builder().setNameType(NameType.ASHKENAZI).get();
335 assertEquals(NameType.ASHKENAZI, engine.getNameType());
336 }
337
338
339
340
341 @Test
342 void testSetNameTypeGeneric() {
343 final PhoneticEngine engine = PhoneticEngine.builder().setNameType(NameType.GENERIC).get();
344 assertEquals(NameType.GENERIC, engine.getNameType());
345 }
346
347
348
349
350 @Test
351 void testSetNameTypeSephardic() {
352 final PhoneticEngine engine = PhoneticEngine.builder().setNameType(NameType.SEPHARDIC).get();
353 assertEquals(NameType.SEPHARDIC, engine.getNameType());
354 }
355
356
357
358
359 @Test
360 void testSetRuleTypeApprox() {
361 final PhoneticEngine engine = PhoneticEngine.builder().setRuleType(RuleType.APPROX).get();
362 assertEquals(RuleType.APPROX, engine.getRuleType());
363 }
364
365
366
367
368 @Test
369 void testSetRuleTypeExact() {
370 final PhoneticEngine engine = PhoneticEngine.builder().setRuleType(RuleType.EXACT).get();
371 assertEquals(RuleType.EXACT, engine.getRuleType());
372 }
373 }