Skip to content

Commit 6e9cfe0

Browse files
committed
Improvements for CostSearchPagesRest
1 parent 64fe5ce commit 6e9cfe0

File tree

4 files changed

+227
-185
lines changed

4 files changed

+227
-185
lines changed

projectforge-business/src/main/kotlin/org/projectforge/framework/utils/NumberHelper.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,17 @@ object NumberHelper {
242242
return result
243243
}
244244

245+
/**
246+
* Checks if the input string contains only digits and dots, and ensures at least one digit is present.
247+
*
248+
* @param input The string to be checked. This can be null.
249+
* @return True if the input string contains only digits and dots and includes at least one digit, false otherwise.
250+
*/
251+
fun isDigitsAndDotsOnly(input: String?): Boolean {
252+
input ?: return false
253+
return input.matches(Regex("(?=.*\\d)^[\\d.]+$"))
254+
}
255+
245256
/**
246257
*
247258
*/

projectforge-business/src/test/kotlin/org/projectforge/common/NumberHelperTest.kt

Lines changed: 181 additions & 166 deletions
Original file line numberDiff line numberDiff line change
@@ -29,189 +29,204 @@ import org.projectforge.framework.utils.NumberHelper
2929
import org.projectforge.framework.utils.NumberHelper.extractPhonenumber
3030

3131
class NumberHelperTest {
32-
@Test
33-
fun randomAlphaNumericTest() {
34-
Assertions.assertEquals(62, NumberHelper.ALPHA_NUMERICS_CHARSET.length)
35-
var str = NumberHelper.getSecureRandomAlphanumeric(1000)
36-
Assertions.assertEquals(1000, str.length)
37-
for (ch in NumberHelper.ALPHA_NUMERICS_CHARSET) {
38-
if (str.any { it == ch }) {
39-
// found
40-
continue
41-
}
42-
var found = false
43-
for (i in 0..1000) {
44-
str = NumberHelper.getSecureRandomAlphanumeric(1000)
45-
if (str.contains(ch)) {
46-
found = true
47-
break
32+
@Test
33+
fun randomAlphaNumericTest() {
34+
Assertions.assertEquals(62, NumberHelper.ALPHA_NUMERICS_CHARSET.length)
35+
var str = NumberHelper.getSecureRandomAlphanumeric(1000)
36+
Assertions.assertEquals(1000, str.length)
37+
for (ch in NumberHelper.ALPHA_NUMERICS_CHARSET) {
38+
if (str.any { it == ch }) {
39+
// found
40+
continue
41+
}
42+
var found = false
43+
for (i in 0..1000) {
44+
str = NumberHelper.getSecureRandomAlphanumeric(1000)
45+
if (str.contains(ch)) {
46+
found = true
47+
break
48+
}
49+
}
50+
Assertions.assertTrue(
51+
found,
52+
"After generating 1,000 secure strings of length 1,000, the char '$ch' wasn't generated!"
53+
)
4854
}
49-
}
50-
Assertions.assertTrue(
51-
found,
52-
"After generating 1,000 secure strings of length 1,000, the char '$ch' wasn't generated!"
53-
)
5455
}
55-
}
5656

57-
@Test
58-
fun randomReducedAlphaNumericTest() {
59-
Assertions.assertEquals(58, NumberHelper.REDUCED_ALPHA_NUMERICS_CHARSET.length)
60-
var str = NumberHelper.getSecureRandomReducedAlphanumeric(1000)
61-
Assertions.assertEquals(1000, str.length)
62-
for (ch in NumberHelper.REDUCED_ALPHA_NUMERICS_CHARSET) {
63-
if (str.any { it == ch }) {
64-
// found
65-
continue
66-
}
67-
var found = false
68-
for (i in 0..1000) {
69-
str = NumberHelper.getSecureRandomReducedAlphanumeric(1000)
70-
if (str.contains(ch)) {
71-
found = true
72-
break
73-
}
74-
}
75-
Assertions.assertTrue(
76-
found,
77-
"After generating 1,000 secure strings of length 1,000, the char '$ch' wasn't generated!"
78-
)
57+
@Test
58+
fun isDigitsAndDotsOnly() {
59+
Assertions.assertTrue(NumberHelper.isDigitsAndDotsOnly("5.100.87.0"))
60+
Assertions.assertTrue(NumberHelper.isDigitsAndDotsOnly("5100870"))
61+
Assertions.assertTrue(NumberHelper.isDigitsAndDotsOnly("123..."))
62+
Assertions.assertTrue(NumberHelper.isDigitsAndDotsOnly(".123"))
63+
Assertions.assertTrue(NumberHelper.isDigitsAndDotsOnly("123."))
64+
Assertions.assertTrue(NumberHelper.isDigitsAndDotsOnly("12.34.56"))
65+
Assertions.assertFalse(NumberHelper.isDigitsAndDotsOnly("5 100,87.00"))
66+
Assertions.assertFalse(NumberHelper.isDigitsAndDotsOnly("hallo 2435"))
67+
Assertions.assertFalse(NumberHelper.isDigitsAndDotsOnly("..."))
68+
Assertions.assertFalse(NumberHelper.isDigitsAndDotsOnly(""))
69+
Assertions.assertFalse(NumberHelper.isDigitsAndDotsOnly(null))
7970
}
80-
}
8171

82-
@Test
83-
fun checkRandomReducedAlphaNumericTest() {
84-
Assertions.assertFalse(NumberHelper.checkSecureRandomReducedAlphanumeric(null, 5))
85-
Assertions.assertFalse(NumberHelper.checkSecureRandomReducedAlphanumeric("", 5))
86-
Assertions.assertFalse(NumberHelper.checkSecureRandomReducedAlphanumeric("1234", 5))
87-
Assertions.assertTrue(NumberHelper.checkSecureRandomReducedAlphanumeric("12345", 5))
88-
Assertions.assertFalse(NumberHelper.checkSecureRandomReducedAlphanumeric("1Ildsfdsfas", 5))
89-
for (i in 0..100) {
90-
Assertions.assertTrue(
91-
NumberHelper.checkSecureRandomReducedAlphanumeric(
92-
NumberHelper.getSecureRandomReducedAlphanumeric(
93-
10
94-
), 10
95-
)
96-
)
72+
@Test
73+
fun randomReducedAlphaNumericTest() {
74+
Assertions.assertEquals(58, NumberHelper.REDUCED_ALPHA_NUMERICS_CHARSET.length)
75+
var str = NumberHelper.getSecureRandomReducedAlphanumeric(1000)
76+
Assertions.assertEquals(1000, str.length)
77+
for (ch in NumberHelper.REDUCED_ALPHA_NUMERICS_CHARSET) {
78+
if (str.any { it == ch }) {
79+
// found
80+
continue
81+
}
82+
var found = false
83+
for (i in 0..1000) {
84+
str = NumberHelper.getSecureRandomReducedAlphanumeric(1000)
85+
if (str.contains(ch)) {
86+
found = true
87+
break
88+
}
89+
}
90+
Assertions.assertTrue(
91+
found,
92+
"After generating 1,000 secure strings of length 1,000, the char '$ch' wasn't generated!"
93+
)
94+
}
9795
}
98-
}
9996

100-
@Test
101-
fun checkRandomReducedAlphaNumericWithSpecialCharsTest() {
102-
Assertions.assertFalse(NumberHelper.checkSecureRandomReducedAlphanumericWithSpecialChars("", 5))
103-
Assertions.assertFalse(NumberHelper.checkSecureRandomReducedAlphanumericWithSpecialChars("1234", 5))
104-
Assertions.assertFalse(NumberHelper.checkSecureRandomReducedAlphanumericWithSpecialChars("12345", 5))
105-
Assertions.assertTrue(NumberHelper.checkSecureRandomReducedAlphanumericWithSpecialChars("123!5", 5))
106-
Assertions.assertFalse(NumberHelper.checkSecureRandomReducedAlphanumericWithSpecialChars("1Ildsfdsfas", 5))
107-
for (i in 0..100) {
108-
Assertions.assertTrue(
109-
NumberHelper.checkSecureRandomReducedAlphanumericWithSpecialChars(
110-
NumberHelper.getSecureRandomReducedAlphanumericWithSpecialChars(
111-
10
112-
), 10
113-
)
114-
)
115-
}
116-
// Use shorter strings, so the probability for missing special chars is increased.
117-
for (i in 0..100) {
118-
Assertions.assertTrue(
119-
NumberHelper.checkSecureRandomReducedAlphanumericWithSpecialChars(
120-
NumberHelper.getSecureRandomReducedAlphanumericWithSpecialChars(
121-
3
122-
), 3
123-
)
124-
)
97+
@Test
98+
fun checkRandomReducedAlphaNumericTest() {
99+
Assertions.assertFalse(NumberHelper.checkSecureRandomReducedAlphanumeric(null, 5))
100+
Assertions.assertFalse(NumberHelper.checkSecureRandomReducedAlphanumeric("", 5))
101+
Assertions.assertFalse(NumberHelper.checkSecureRandomReducedAlphanumeric("1234", 5))
102+
Assertions.assertTrue(NumberHelper.checkSecureRandomReducedAlphanumeric("12345", 5))
103+
Assertions.assertFalse(NumberHelper.checkSecureRandomReducedAlphanumeric("1Ildsfdsfas", 5))
104+
for (i in 0..100) {
105+
Assertions.assertTrue(
106+
NumberHelper.checkSecureRandomReducedAlphanumeric(
107+
NumberHelper.getSecureRandomReducedAlphanumeric(
108+
10
109+
), 10
110+
)
111+
)
112+
}
125113
}
126-
}
127114

128-
@Test
129-
fun checkRandomAlphaNumericTest() {
130-
Assertions.assertFalse(NumberHelper.checkSecureRandomAlphanumeric(null, 5))
131-
Assertions.assertFalse(NumberHelper.checkSecureRandomAlphanumeric("", 5))
132-
Assertions.assertFalse(NumberHelper.checkSecureRandomAlphanumeric("1234", 5))
133-
Assertions.assertTrue(NumberHelper.checkSecureRandomAlphanumeric("12345", 5))
134-
Assertions.assertTrue(NumberHelper.checkSecureRandomAlphanumeric("1Ildsfdsfas", 5))
135-
for (i in 0..100) {
136-
Assertions.assertTrue(
137-
NumberHelper.checkSecureRandomAlphanumeric(
138-
NumberHelper.getSecureRandomAlphanumeric(
139-
10
140-
), 10
141-
)
142-
)
115+
@Test
116+
fun checkRandomReducedAlphaNumericWithSpecialCharsTest() {
117+
Assertions.assertFalse(NumberHelper.checkSecureRandomReducedAlphanumericWithSpecialChars("", 5))
118+
Assertions.assertFalse(NumberHelper.checkSecureRandomReducedAlphanumericWithSpecialChars("1234", 5))
119+
Assertions.assertFalse(NumberHelper.checkSecureRandomReducedAlphanumericWithSpecialChars("12345", 5))
120+
Assertions.assertTrue(NumberHelper.checkSecureRandomReducedAlphanumericWithSpecialChars("123!5", 5))
121+
Assertions.assertFalse(NumberHelper.checkSecureRandomReducedAlphanumericWithSpecialChars("1Ildsfdsfas", 5))
122+
for (i in 0..100) {
123+
Assertions.assertTrue(
124+
NumberHelper.checkSecureRandomReducedAlphanumericWithSpecialChars(
125+
NumberHelper.getSecureRandomReducedAlphanumericWithSpecialChars(
126+
10
127+
), 10
128+
)
129+
)
130+
}
131+
// Use shorter strings, so the probability for missing special chars is increased.
132+
for (i in 0..100) {
133+
Assertions.assertTrue(
134+
NumberHelper.checkSecureRandomReducedAlphanumericWithSpecialChars(
135+
NumberHelper.getSecureRandomReducedAlphanumericWithSpecialChars(
136+
3
137+
), 3
138+
)
139+
)
140+
}
143141
}
144-
}
145142

146-
@Test
147-
fun checkRandomDigitsTest() {
148-
val digits = mutableSetOf<Char>()
149-
for (i in 0..1000) {
150-
val code = NumberHelper.getSecureRandomDigits(6)
151-
Assertions.assertEquals(6, code.length, "Code '$code' not of size 6.")
152-
code.forEach {ch ->
153-
Assertions.assertTrue(ch.isDigit(), "Invalid character in '$code': '$ch'")
154-
digits.add(ch)
155-
}
143+
@Test
144+
fun checkRandomAlphaNumericTest() {
145+
Assertions.assertFalse(NumberHelper.checkSecureRandomAlphanumeric(null, 5))
146+
Assertions.assertFalse(NumberHelper.checkSecureRandomAlphanumeric("", 5))
147+
Assertions.assertFalse(NumberHelper.checkSecureRandomAlphanumeric("1234", 5))
148+
Assertions.assertTrue(NumberHelper.checkSecureRandomAlphanumeric("12345", 5))
149+
Assertions.assertTrue(NumberHelper.checkSecureRandomAlphanumeric("1Ildsfdsfas", 5))
150+
for (i in 0..100) {
151+
Assertions.assertTrue(
152+
NumberHelper.checkSecureRandomAlphanumeric(
153+
NumberHelper.getSecureRandomAlphanumeric(
154+
10
155+
), 10
156+
)
157+
)
158+
}
156159
}
157-
Assertions.assertEquals(10, digits.size)
158-
for (ch in '0'..'9') {
159-
Assertions.assertTrue(digits.contains(ch), "Digit '$ch' not found!")
160+
161+
@Test
162+
fun checkRandomDigitsTest() {
163+
val digits = mutableSetOf<Char>()
164+
for (i in 0..1000) {
165+
val code = NumberHelper.getSecureRandomDigits(6)
166+
Assertions.assertEquals(6, code.length, "Code '$code' not of size 6.")
167+
code.forEach { ch ->
168+
Assertions.assertTrue(ch.isDigit(), "Invalid character in '$code': '$ch'")
169+
digits.add(ch)
170+
}
171+
}
172+
Assertions.assertEquals(10, digits.size)
173+
for (ch in '0'..'9') {
174+
Assertions.assertTrue(digits.contains(ch), "Digit '$ch' not found!")
175+
}
160176
}
161-
}
162177

163-
fun randomAlphaNumericPerformanceTest() {
164-
val length = 1000
165-
val time = System.currentTimeMillis()
166-
for (i in 0..1000) {
167-
NumberHelper.getSecureRandomAlphanumeric(length)
178+
fun randomAlphaNumericPerformanceTest() {
179+
val length = 1000
180+
val time = System.currentTimeMillis()
181+
for (i in 0..1000) {
182+
NumberHelper.getSecureRandomAlphanumeric(length)
183+
}
184+
println("Generating 1,000 secure strings each of length $length takes ${System.currentTimeMillis() - time}ms.")
168185
}
169-
println("Generating 1,000 secure strings each of length $length takes ${System.currentTimeMillis() - time}ms.")
170-
}
171186

172-
@Test
173-
fun rangeTest() {
174-
Assertions.assertNull(NumberHelper.ensureRange(0, 4, null))
175-
Assertions.assertEquals(2, NumberHelper.ensureRange(0, 4, 2))
176-
Assertions.assertEquals(0, NumberHelper.ensureRange(0, 4, 0))
177-
Assertions.assertEquals(0, NumberHelper.ensureRange(0, 4, -1))
178-
Assertions.assertEquals(4, NumberHelper.ensureRange(0, 4, 5))
179-
Assertions.assertEquals(4, NumberHelper.ensureRange(0, 4, 4))
180-
}
187+
@Test
188+
fun rangeTest() {
189+
Assertions.assertNull(NumberHelper.ensureRange(0, 4, null))
190+
Assertions.assertEquals(2, NumberHelper.ensureRange(0, 4, 2))
191+
Assertions.assertEquals(0, NumberHelper.ensureRange(0, 4, 0))
192+
Assertions.assertEquals(0, NumberHelper.ensureRange(0, 4, -1))
193+
Assertions.assertEquals(4, NumberHelper.ensureRange(0, 4, 5))
194+
Assertions.assertEquals(4, NumberHelper.ensureRange(0, 4, 4))
195+
}
181196

182-
@Test
183-
fun extractPhonenumber() {
184-
Assertions.assertNull(extractPhonenumber(null, null))
185-
Assertions.assertEquals("", extractPhonenumber("", "+49"))
186-
Assertions.assertEquals("", extractPhonenumber("+", "+49"))
187-
Assertions.assertEquals("4", extractPhonenumber("+4", "+49"))
188-
Assertions.assertEquals("0", extractPhonenumber("+49", "+49"))
189-
Assertions.assertEquals("01", extractPhonenumber("+491", "+49"))
190-
Assertions.assertEquals("05613167930", extractPhonenumber("0561 / 316793-0", null))
191-
Assertions.assertEquals("00495613167930", extractPhonenumber("+49 561 / 316793-0", null))
192-
Assertions.assertEquals("05613167930", extractPhonenumber("+49 561 / 316793-0", "+49"))
193-
Assertions.assertEquals("00445613167930", extractPhonenumber("+44 561 / 316793-0", "+49"))
194-
Assertions.assertEquals("00445613167930", extractPhonenumber("+44 561 / 31:6793-0", "+49"))
195-
Assertions.assertEquals("00445613167930", extractPhonenumber("+44 561 / 31 h6793-0", "+49"))
196-
Assertions.assertEquals(
197-
"1234567890",
198-
extractPhonenumber("\u202D1234567890\u202C", "+49")
199-
) // Apple white spaces from contacts.
197+
@Test
198+
fun extractPhonenumber() {
199+
Assertions.assertNull(extractPhonenumber(null, null))
200+
Assertions.assertEquals("", extractPhonenumber("", "+49"))
201+
Assertions.assertEquals("", extractPhonenumber("+", "+49"))
202+
Assertions.assertEquals("4", extractPhonenumber("+4", "+49"))
203+
Assertions.assertEquals("0", extractPhonenumber("+49", "+49"))
204+
Assertions.assertEquals("01", extractPhonenumber("+491", "+49"))
205+
Assertions.assertEquals("05613167930", extractPhonenumber("0561 / 316793-0", null))
206+
Assertions.assertEquals("00495613167930", extractPhonenumber("+49 561 / 316793-0", null))
207+
Assertions.assertEquals("05613167930", extractPhonenumber("+49 561 / 316793-0", "+49"))
208+
Assertions.assertEquals("00445613167930", extractPhonenumber("+44 561 / 316793-0", "+49"))
209+
Assertions.assertEquals("00445613167930", extractPhonenumber("+44 561 / 31:6793-0", "+49"))
210+
Assertions.assertEquals("00445613167930", extractPhonenumber("+44 561 / 31 h6793-0", "+49"))
211+
Assertions.assertEquals(
212+
"1234567890",
213+
extractPhonenumber("\u202D1234567890\u202C", "+49")
214+
) // Apple white spaces from contacts.
200215

201-
Assertions.assertEquals("007123456", extractPhonenumber("+7123456", "+49"))
202-
Assertions.assertEquals("007123456", extractPhonenumber("+7 123456", "+49"))
203-
Assertions.assertEquals("012345678", extractPhonenumber("+49 (0) 12345 - 678", "+49"))
204-
Assertions.assertEquals("004112345678", extractPhonenumber("+41 (0) 12345 - 678", "+49"))
205-
}
216+
Assertions.assertEquals("007123456", extractPhonenumber("+7123456", "+49"))
217+
Assertions.assertEquals("007123456", extractPhonenumber("+7 123456", "+49"))
218+
Assertions.assertEquals("012345678", extractPhonenumber("+49 (0) 12345 - 678", "+49"))
219+
Assertions.assertEquals("004112345678", extractPhonenumber("+41 (0) 12345 - 678", "+49"))
220+
}
206221

207-
@Test
208-
fun formatPhonenumber() {
209-
NumberHelper.TEST_COUNTRY_PREFIX_USAGE_IN_TESTCASES_ONLY = "+49"
210-
Assertions.assertEquals("12345678", NumberHelper.formatPhonenumber("12345678"))
211-
Assertions.assertEquals("0", NumberHelper.formatPhonenumber("0"))
212-
Assertions.assertEquals("00", NumberHelper.formatPhonenumber("00"))
213-
Assertions.assertEquals("+1", NumberHelper.formatPhonenumber("001"))
214-
Assertions.assertEquals("+1 12345", NumberHelper.formatPhonenumber("001 12345"))
215-
Assertions.assertEquals("+49 12345 6789", NumberHelper.formatPhonenumber("012345 6789"))
216-
}
222+
@Test
223+
fun formatPhonenumber() {
224+
NumberHelper.TEST_COUNTRY_PREFIX_USAGE_IN_TESTCASES_ONLY = "+49"
225+
Assertions.assertEquals("12345678", NumberHelper.formatPhonenumber("12345678"))
226+
Assertions.assertEquals("0", NumberHelper.formatPhonenumber("0"))
227+
Assertions.assertEquals("00", NumberHelper.formatPhonenumber("00"))
228+
Assertions.assertEquals("+1", NumberHelper.formatPhonenumber("001"))
229+
Assertions.assertEquals("+1 12345", NumberHelper.formatPhonenumber("001 12345"))
230+
Assertions.assertEquals("+49 12345 6789", NumberHelper.formatPhonenumber("012345 6789"))
231+
}
217232
}

0 commit comments

Comments
 (0)