/
StringUtilTest.java
156 lines (131 loc) · 8.04 KB
/
StringUtilTest.java
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
package org.jsoup.internal;
import org.jsoup.Jsoup;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import java.util.Collections;
import static org.jsoup.internal.StringUtil.normaliseWhitespace;
import static org.jsoup.internal.StringUtil.resolve;
import static org.junit.jupiter.api.Assertions.*;
public class StringUtilTest {
@Test
public void join() {
assertEquals("", StringUtil.join(Collections.singletonList(""), " "));
assertEquals("one", StringUtil.join(Collections.singletonList("one"), " "));
assertEquals("one two three", StringUtil.join(Arrays.asList("one", "two", "three"), " "));
}
@Test public void padding() {
// memoization is up to 21 blocks (0 to 20 spaces) and exits early before min checks making maxPaddingWidth unused
assertEquals("", StringUtil.padding(0, -1));
assertEquals(" ", StringUtil.padding(20, -1));
// this test escapes memoization and continues through
assertEquals(" ", StringUtil.padding(21, -1));
// this test escapes memoization and using unlimited length (-1) will allow requested spaces
assertEquals(" ", StringUtil.padding(30, -1));
assertEquals(" ", StringUtil.padding(45, -1));
// we tap out at 0 for this test
assertEquals("", StringUtil.padding(0, 0));
// we tap out at 5 for this test because we do not escape memoization
assertEquals(" ", StringUtil.padding(5, 0));
// as memoization is escaped, setting zero for max padding will not allow any requested width
assertEquals("", StringUtil.padding(21, 0));
// we tap out at 30 for these tests making > 30 use 30
assertEquals("", StringUtil.padding(0, 30));
assertEquals(" ", StringUtil.padding(1, 30));
assertEquals(" ", StringUtil.padding(2, 30));
assertEquals(" ", StringUtil.padding(15, 30));
assertEquals(" ", StringUtil.padding(45, 30));
// Testing deprecated version capped at 30
assertEquals(" ", StringUtil.padding(45));
}
@Test public void paddingInACan() {
String[] padding = StringUtil.padding;
assertEquals(21, padding.length);
for (int i = 0; i < padding.length; i++) {
assertEquals(i, padding[i].length());
}
}
@Test public void isBlank() {
assertTrue(StringUtil.isBlank(null));
assertTrue(StringUtil.isBlank(""));
assertTrue(StringUtil.isBlank(" "));
assertTrue(StringUtil.isBlank(" \r\n "));
assertFalse(StringUtil.isBlank("hello"));
assertFalse(StringUtil.isBlank(" hello "));
}
@Test public void isNumeric() {
assertFalse(StringUtil.isNumeric(null));
assertFalse(StringUtil.isNumeric(" "));
assertFalse(StringUtil.isNumeric("123 546"));
assertFalse(StringUtil.isNumeric("hello"));
assertFalse(StringUtil.isNumeric("123.334"));
assertTrue(StringUtil.isNumeric("1"));
assertTrue(StringUtil.isNumeric("1234"));
}
@Test public void isWhitespace() {
assertTrue(StringUtil.isWhitespace('\t'));
assertTrue(StringUtil.isWhitespace('\n'));
assertTrue(StringUtil.isWhitespace('\r'));
assertTrue(StringUtil.isWhitespace('\f'));
assertTrue(StringUtil.isWhitespace(' '));
assertFalse(StringUtil.isWhitespace('\u00a0'));
assertFalse(StringUtil.isWhitespace('\u2000'));
assertFalse(StringUtil.isWhitespace('\u3000'));
}
@Test public void normaliseWhiteSpace() {
assertEquals(" ", normaliseWhitespace(" \r \n \r\n"));
assertEquals(" hello there ", normaliseWhitespace(" hello \r \n there \n"));
assertEquals("hello", normaliseWhitespace("hello"));
assertEquals("hello there", normaliseWhitespace("hello\nthere"));
}
@Test public void normaliseWhiteSpaceHandlesHighSurrogates() {
String test71540chars = "\ud869\udeb2\u304b\u309a 1";
String test71540charsExpectedSingleWhitespace = "\ud869\udeb2\u304b\u309a 1";
assertEquals(test71540charsExpectedSingleWhitespace, normaliseWhitespace(test71540chars));
String extractedText = Jsoup.parse(test71540chars).text();
assertEquals(test71540charsExpectedSingleWhitespace, extractedText);
}
@Test public void resolvesRelativeUrls() {
assertEquals("http://example.com/one/two?three", resolve("http://example.com", "./one/two?three"));
assertEquals("http://example.com/one/two?three", resolve("http://example.com?one", "./one/two?three"));
assertEquals("http://example.com/one/two?three#four", resolve("http://example.com", "./one/two?three#four"));
assertEquals("https://example.com/one", resolve("http://example.com/", "https://example.com/one"));
assertEquals("http://example.com/one/two.html", resolve("http://example.com/two/", "../one/two.html"));
assertEquals("https://example2.com/one", resolve("https://example.com/", "//example2.com/one"));
assertEquals("https://example.com:8080/one", resolve("https://example.com:8080", "./one"));
assertEquals("https://example2.com/one", resolve("http://example.com/", "https://example2.com/one"));
assertEquals("https://example.com/one", resolve("wrong", "https://example.com/one"));
assertEquals("https://example.com/one", resolve("https://example.com/one", ""));
assertEquals("", resolve("wrong", "also wrong"));
assertEquals("ftp://example.com/one", resolve("ftp://example.com/two/", "../one"));
assertEquals("ftp://example.com/one/two.c", resolve("ftp://example.com/one/", "./two.c"));
assertEquals("ftp://example.com/one/two.c", resolve("ftp://example.com/one/", "two.c"));
// examples taken from rfc3986 section 5.4.2
assertEquals("http://example.com/g", resolve("http://example.com/b/c/d;p?q", "../../../g"));
assertEquals("http://example.com/g", resolve("http://example.com/b/c/d;p?q", "../../../../g"));
assertEquals("http://example.com/g", resolve("http://example.com/b/c/d;p?q", "/./g"));
assertEquals("http://example.com/g", resolve("http://example.com/b/c/d;p?q", "/../g"));
assertEquals("http://example.com/b/c/g.", resolve("http://example.com/b/c/d;p?q", "g."));
assertEquals("http://example.com/b/c/.g", resolve("http://example.com/b/c/d;p?q", ".g"));
assertEquals("http://example.com/b/c/g..", resolve("http://example.com/b/c/d;p?q", "g.."));
assertEquals("http://example.com/b/c/..g", resolve("http://example.com/b/c/d;p?q", "..g"));
assertEquals("http://example.com/b/g", resolve("http://example.com/b/c/d;p?q", "./../g"));
assertEquals("http://example.com/b/c/g/", resolve("http://example.com/b/c/d;p?q", "./g/."));
assertEquals("http://example.com/b/c/g/h", resolve("http://example.com/b/c/d;p?q", "g/./h"));
assertEquals("http://example.com/b/c/h", resolve("http://example.com/b/c/d;p?q", "g/../h"));
assertEquals("http://example.com/b/c/g;x=1/y", resolve("http://example.com/b/c/d;p?q", "g;x=1/./y"));
assertEquals("http://example.com/b/c/y", resolve("http://example.com/b/c/d;p?q", "g;x=1/../y"));
assertEquals("http://example.com/b/c/g?y/./x", resolve("http://example.com/b/c/d;p?q", "g?y/./x"));
assertEquals("http://example.com/b/c/g?y/../x", resolve("http://example.com/b/c/d;p?q", "g?y/../x"));
assertEquals("http://example.com/b/c/g#s/./x", resolve("http://example.com/b/c/d;p?q", "g#s/./x"));
assertEquals("http://example.com/b/c/g#s/../x", resolve("http://example.com/b/c/d;p?q", "g#s/../x"));
}
@Test
void isAscii() {
assertTrue(StringUtil.isAscii(""));
assertTrue(StringUtil.isAscii("example.com"));
assertTrue(StringUtil.isAscii("One Two"));
assertFalse(StringUtil.isAscii("🧔"));
assertFalse(StringUtil.isAscii("测试"));
assertFalse(StringUtil.isAscii("测试.com"));
}
}