tboudreau@18301
|
1 |
package org.netbeans.lib.callgraph.util;
|
tboudreau@18301
|
2 |
|
tboudreau@18301
|
3 |
import java.util.ArrayList;
|
tboudreau@18373
|
4 |
import java.util.Arrays;
|
tboudreau@18373
|
5 |
import java.util.Collections;
|
tboudreau@18301
|
6 |
import java.util.HashSet;
|
tboudreau@18301
|
7 |
import java.util.List;
|
tboudreau@18301
|
8 |
import java.util.Random;
|
tboudreau@18301
|
9 |
import java.util.Set;
|
tboudreau@18301
|
10 |
import org.junit.Test;
|
tboudreau@18301
|
11 |
import static org.junit.Assert.*;
|
tboudreau@18374
|
12 |
import org.netbeans.lib.callgraph.util.EightBitStrings.Concatenation;
|
tboudreau@18301
|
13 |
|
tboudreau@18301
|
14 |
/**
|
tboudreau@18301
|
15 |
*
|
tboudreau@18301
|
16 |
* @author tim
|
tboudreau@18301
|
17 |
*/
|
tboudreau@18301
|
18 |
public class SmallStringTest {
|
tboudreau@18301
|
19 |
|
tboudreau@18301
|
20 |
@Test
|
tboudreau@18301
|
21 |
public void testCreate() {
|
tboudreau@18301
|
22 |
EightBitStrings strings = new EightBitStrings(false);
|
tboudreau@18301
|
23 |
CharSequence testOne = strings.create("A first test one");
|
tboudreau@18301
|
24 |
CharSequence testTwo = strings.create("A second test one");
|
tboudreau@18301
|
25 |
assertNotEquals(testOne, testTwo);
|
tboudreau@18301
|
26 |
|
tboudreau@18301
|
27 |
CharSequence hello = strings.create("Hello world");
|
tboudreau@18301
|
28 |
CharSequence hello2 = strings.create("Hello world");
|
tboudreau@18301
|
29 |
assertEquals(hello, hello2);
|
tboudreau@18301
|
30 |
assertSame(hello, hello2);
|
tboudreau@18301
|
31 |
assertEquals(hello.hashCode(), "Hello world".hashCode());
|
tboudreau@18301
|
32 |
assertEquals("Hello world", hello.toString());
|
tboudreau@18301
|
33 |
assertEquals("Hello world".length(), hello.length());
|
tboudreau@18301
|
34 |
|
tboudreau@18301
|
35 |
CharSequence worlds = strings.create("Hello worlds");
|
tboudreau@18301
|
36 |
assertNotEquals(hello2, worlds);
|
tboudreau@18301
|
37 |
|
tboudreau@18301
|
38 |
assertEquals(hello, "Hello world");
|
tboudreau@18301
|
39 |
// assertEquals("Hello world", hello);
|
tboudreau@18301
|
40 |
}
|
tboudreau@18301
|
41 |
|
tboudreau@18301
|
42 |
@Test
|
tboudreau@18301
|
43 |
public void testInterning() {
|
tboudreau@18301
|
44 |
EightBitStrings strings = new EightBitStrings(false);
|
tboudreau@18301
|
45 |
List<String> all = new ArrayList<>(500);
|
tboudreau@18301
|
46 |
List<CharSequence> seqs = new ArrayList<>();
|
tboudreau@18301
|
47 |
for (int i = 0; i < 500; i++) {
|
tboudreau@18301
|
48 |
String s = randomString(5 + r.nextInt(20));
|
tboudreau@18301
|
49 |
all.add(s);
|
tboudreau@18301
|
50 |
seqs.add(strings.create(s));
|
tboudreau@18301
|
51 |
}
|
tboudreau@18301
|
52 |
int size = strings.internTableSize();
|
tboudreau@18301
|
53 |
Set<CharSequence> xseqs = new HashSet<>(seqs);
|
tboudreau@18301
|
54 |
int oldSize = xseqs.size();
|
tboudreau@18301
|
55 |
for (String again : all) {
|
tboudreau@18301
|
56 |
CharSequence ss = strings.create(again);
|
tboudreau@18301
|
57 |
xseqs.add(ss);
|
tboudreau@18301
|
58 |
assertEquals(size, strings.internTableSize());
|
tboudreau@18301
|
59 |
assertEquals(oldSize, xseqs.size());
|
tboudreau@18301
|
60 |
}
|
tboudreau@18301
|
61 |
}
|
tboudreau@18301
|
62 |
|
tboudreau@18301
|
63 |
@Test
|
tboudreau@18301
|
64 |
public void testConcatenations() {
|
tboudreau@18301
|
65 |
EightBitStrings strings = new EightBitStrings(false);
|
tboudreau@18301
|
66 |
CharSequence concat = strings.concat("Hello ", "there ", "how ", "are ", "you?");
|
tboudreau@18301
|
67 |
CharSequence concat2 = strings.concat("Hello ", "there ", "how ", "are ", "you?");
|
tboudreau@18301
|
68 |
assertEquals("Hello there how are you?", concat.toString());
|
tboudreau@18301
|
69 |
assertEquals("Hello there how are you?".hashCode(), concat.toString().hashCode());
|
tboudreau@18301
|
70 |
assertEquals(concat, concat2);
|
tboudreau@18373
|
71 |
}
|
tboudreau@18301
|
72 |
|
tboudreau@18373
|
73 |
@Test
|
tboudreau@18373
|
74 |
public void testSorting() {
|
tboudreau@18373
|
75 |
EightBitStrings strings = new EightBitStrings(false);
|
tboudreau@18373
|
76 |
ComparableCharSequence a = strings.concat(strings.create("a"), strings.create("b"), strings.create("c"), strings.create("d"));
|
tboudreau@18373
|
77 |
ComparableCharSequence b = strings.concat(strings.create("a"), strings.create("b"), strings.create("cd"));
|
tboudreau@18373
|
78 |
ComparableCharSequence c = strings.concat(strings.create("ab"), strings.create("cd"));
|
tboudreau@18373
|
79 |
ComparableCharSequence d = strings.concat(strings.create("a"), strings.create("bcd"));
|
tboudreau@18373
|
80 |
ComparableCharSequence e = strings.concat(strings.create("abcd"));
|
tboudreau@18373
|
81 |
assertEquals(4, a.length());
|
tboudreau@18373
|
82 |
assertEquals(4, b.length());
|
tboudreau@18373
|
83 |
assertEquals(4, c.length());
|
tboudreau@18373
|
84 |
assertEquals(4, d.length());
|
tboudreau@18373
|
85 |
assertEquals(4, e.length());
|
tboudreau@18373
|
86 |
for (ComparableCharSequence c1 : new ComparableCharSequence[]{a, b, c, d, e}) {
|
tboudreau@18373
|
87 |
for (ComparableCharSequence c2 : new ComparableCharSequence[]{a, b, c, d, e}) {
|
tboudreau@18373
|
88 |
assertEquals(c1, c2);
|
tboudreau@18373
|
89 |
assertEquals(0, c1.compareTo(c2));
|
tboudreau@18373
|
90 |
}
|
tboudreau@18373
|
91 |
}
|
tboudreau@18373
|
92 |
|
tboudreau@18373
|
93 |
ComparableCharSequence cs = strings.concatQuoted(Arrays.asList(strings.create("a"), strings.create("b"), strings.create("c"), strings.create("d")));
|
tboudreau@18373
|
94 |
assertEquals("\"a\" \"b\" \"c\" \"d\"", cs.toString());
|
tboudreau@18373
|
95 |
|
tboudreau@18373
|
96 |
strings = new EightBitStrings(true);
|
tboudreau@18373
|
97 |
a = strings.concat("a", "b", "c", "d");
|
tboudreau@18373
|
98 |
b = strings.concat("a", "b", "cd");
|
tboudreau@18373
|
99 |
c = strings.concat("ab", "cd");
|
tboudreau@18373
|
100 |
d = strings.concat("a", "bcd");
|
tboudreau@18373
|
101 |
e = strings.concat("abcd");
|
tboudreau@18373
|
102 |
assertEquals(4, a.length());
|
tboudreau@18373
|
103 |
assertEquals(4, b.length());
|
tboudreau@18373
|
104 |
assertEquals(4, c.length());
|
tboudreau@18373
|
105 |
assertEquals(4, d.length());
|
tboudreau@18373
|
106 |
assertEquals(4, e.length());
|
tboudreau@18373
|
107 |
for (ComparableCharSequence c1 : new ComparableCharSequence[]{a, b, c, d, e}) {
|
tboudreau@18373
|
108 |
for (ComparableCharSequence c2 : new ComparableCharSequence[]{a, b, c, d, e}) {
|
tboudreau@18373
|
109 |
assertEquals(c1, c2);
|
tboudreau@18373
|
110 |
assertEquals(0, c1.compareTo(c2));
|
tboudreau@18373
|
111 |
}
|
tboudreau@18373
|
112 |
}
|
tboudreau@18373
|
113 |
|
tboudreau@18373
|
114 |
strings = new EightBitStrings(false);
|
tboudreau@18373
|
115 |
a = strings.concat(strings.create("abc"), strings.create("def"));
|
tboudreau@18373
|
116 |
b = strings.concat("bcd", strings.create("efg"));
|
tboudreau@18373
|
117 |
c = strings.concat("cde", strings.create("fgh"));
|
tboudreau@18373
|
118 |
d = strings.create("defghi");
|
tboudreau@18373
|
119 |
e = strings.create("efghij");
|
tboudreau@18373
|
120 |
List<ComparableCharSequence> l = Arrays.asList(e, c, d, a, b);
|
tboudreau@18373
|
121 |
Collections.sort(l);
|
tboudreau@18373
|
122 |
assertEquals(l, Arrays.asList(a, b, c, d, e));
|
tboudreau@18301
|
123 |
}
|
tboudreau@18374
|
124 |
|
tboudreau@18374
|
125 |
List<String> stringsOf(List<CharSequence> cs) {
|
tboudreau@18374
|
126 |
List<String> result = new ArrayList<>();
|
tboudreau@18374
|
127 |
for (CharSequence c : cs) {
|
tboudreau@18374
|
128 |
if (c == null) {
|
tboudreau@18374
|
129 |
break;
|
tboudreau@18374
|
130 |
}
|
tboudreau@18374
|
131 |
result.add(c.toString());
|
tboudreau@18374
|
132 |
}
|
tboudreau@18374
|
133 |
return result;
|
tboudreau@18374
|
134 |
}
|
tboudreau@18374
|
135 |
|
tboudreau@18374
|
136 |
@Test
|
tboudreau@18374
|
137 |
public void testAggressive() {
|
tboudreau@18374
|
138 |
EightBitStrings strings = new EightBitStrings(false, true);
|
tboudreau@18374
|
139 |
ComparableCharSequence c = strings.concat("com.foo.", "bar.baz.", "Hey$You");
|
tboudreau@18374
|
140 |
assertEquals("com.foo.bar.baz.Hey$You", c.toString());
|
tboudreau@18374
|
141 |
ComparableCharSequence c2 = strings.concat("com.foo.", "bar.whoodle.", "Hey$You");
|
tboudreau@18374
|
142 |
List<String> interned = stringsOf(strings.dumpInternTable());
|
tboudreau@18374
|
143 |
for (String cs : interned) {
|
tboudreau@18374
|
144 |
if (cs == null) {
|
tboudreau@18374
|
145 |
break;
|
tboudreau@18374
|
146 |
}
|
tboudreau@18374
|
147 |
System.out.println(" " + cs);
|
tboudreau@18374
|
148 |
}
|
tboudreau@18374
|
149 |
assertTrue(interned.contains("com"));
|
tboudreau@18374
|
150 |
assertTrue(interned.contains("foo"));
|
tboudreau@18374
|
151 |
assertTrue(interned.contains("bar"));
|
tboudreau@18374
|
152 |
assertTrue(interned.contains("baz"));
|
tboudreau@18374
|
153 |
assertTrue(interned.contains("Hey"));
|
tboudreau@18374
|
154 |
assertTrue(interned.contains("You"));
|
tboudreau@18374
|
155 |
assertTrue(interned.contains("whoodle"));
|
tboudreau@18374
|
156 |
assertTrue(interned.contains("."));
|
tboudreau@18374
|
157 |
assertTrue(interned.contains("$"));
|
tboudreau@18374
|
158 |
assertTrue(interned.contains("\""));
|
tboudreau@18374
|
159 |
}
|
tboudreau@18301
|
160 |
|
tboudreau@18374
|
161 |
@Test
|
tboudreau@18374
|
162 |
public void testConcatQuoted() {
|
tboudreau@18374
|
163 |
EightBitStrings strings = new EightBitStrings(false);
|
tboudreau@18374
|
164 |
List<Object> l = Arrays.asList(strings.create("hey"), false, 23, strings.create("bar"), "baz");
|
tboudreau@18374
|
165 |
CharSequence cc = strings.concatQuoted(l);
|
tboudreau@18374
|
166 |
assertEquals("\"hey\" false 23 \"bar\" \"baz\"", cc.toString());
|
tboudreau@18374
|
167 |
}
|
tboudreau@18374
|
168 |
|
tboudreau@18301
|
169 |
private static String randomString(int len) {
|
tboudreau@18301
|
170 |
char[] c = new char[len];
|
tboudreau@18301
|
171 |
for (int i = 0; i < c.length; i++) {
|
tboudreau@18301
|
172 |
c[i] = randomChar();
|
tboudreau@18301
|
173 |
}
|
tboudreau@18301
|
174 |
return new String(c);
|
tboudreau@18301
|
175 |
}
|
tboudreau@18301
|
176 |
|
tboudreau@18301
|
177 |
private static char randomChar() {
|
tboudreau@18301
|
178 |
return alpha[r.nextInt(alpha.length)];
|
tboudreau@18301
|
179 |
}
|
tboudreau@18301
|
180 |
|
tboudreau@18301
|
181 |
static final Random r = new Random(320392);
|
tboudreau@18301
|
182 |
private static final char[] alpha = "abcdefghijklmnopqrstuvwxyz".toCharArray();
|
tboudreau@18301
|
183 |
|
tboudreau@18301
|
184 |
}
|