1 package org.netbeans.lib.callgraph.util;
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.Collections;
6 import java.util.HashSet;
8 import java.util.Random;
10 import org.junit.Test;
11 import static org.junit.Assert.*;
12 import org.netbeans.lib.callgraph.util.EightBitStrings.Concatenation;
18 public class SmallStringTest {
21 public void testCreate() {
22 EightBitStrings strings = new EightBitStrings(false);
23 CharSequence testOne = strings.create("A first test one");
24 CharSequence testTwo = strings.create("A second test one");
25 assertNotEquals(testOne, testTwo);
27 CharSequence hello = strings.create("Hello world");
28 CharSequence hello2 = strings.create("Hello world");
29 assertEquals(hello, hello2);
30 assertSame(hello, hello2);
31 assertEquals(hello.hashCode(), "Hello world".hashCode());
32 assertEquals("Hello world", hello.toString());
33 assertEquals("Hello world".length(), hello.length());
35 CharSequence worlds = strings.create("Hello worlds");
36 assertNotEquals(hello2, worlds);
38 assertEquals(hello, "Hello world");
39 // assertEquals("Hello world", hello);
43 public void testInterning() {
44 EightBitStrings strings = new EightBitStrings(false);
45 List<String> all = new ArrayList<>(500);
46 List<CharSequence> seqs = new ArrayList<>();
47 for (int i = 0; i < 500; i++) {
48 String s = randomString(5 + r.nextInt(20));
50 seqs.add(strings.create(s));
52 int size = strings.internTableSize();
53 Set<CharSequence> xseqs = new HashSet<>(seqs);
54 int oldSize = xseqs.size();
55 for (String again : all) {
56 CharSequence ss = strings.create(again);
58 assertEquals(size, strings.internTableSize());
59 assertEquals(oldSize, xseqs.size());
64 public void testConcatenations() {
65 EightBitStrings strings = new EightBitStrings(false);
66 CharSequence concat = strings.concat("Hello ", "there ", "how ", "are ", "you?");
67 CharSequence concat2 = strings.concat("Hello ", "there ", "how ", "are ", "you?");
68 assertEquals("Hello there how are you?", concat.toString());
69 assertEquals("Hello there how are you?".hashCode(), concat.toString().hashCode());
70 assertEquals(concat, concat2);
74 public void testSorting() {
75 EightBitStrings strings = new EightBitStrings(false);
76 ComparableCharSequence a = strings.concat(strings.create("a"), strings.create("b"), strings.create("c"), strings.create("d"));
77 ComparableCharSequence b = strings.concat(strings.create("a"), strings.create("b"), strings.create("cd"));
78 ComparableCharSequence c = strings.concat(strings.create("ab"), strings.create("cd"));
79 ComparableCharSequence d = strings.concat(strings.create("a"), strings.create("bcd"));
80 ComparableCharSequence e = strings.concat(strings.create("abcd"));
81 assertEquals(4, a.length());
82 assertEquals(4, b.length());
83 assertEquals(4, c.length());
84 assertEquals(4, d.length());
85 assertEquals(4, e.length());
86 for (ComparableCharSequence c1 : new ComparableCharSequence[]{a, b, c, d, e}) {
87 for (ComparableCharSequence c2 : new ComparableCharSequence[]{a, b, c, d, e}) {
89 assertEquals(0, c1.compareTo(c2));
93 ComparableCharSequence cs = strings.concatQuoted(Arrays.asList(strings.create("a"), strings.create("b"), strings.create("c"), strings.create("d")));
94 assertEquals("\"a\" \"b\" \"c\" \"d\"", cs.toString());
96 strings = new EightBitStrings(true);
97 a = strings.concat("a", "b", "c", "d");
98 b = strings.concat("a", "b", "cd");
99 c = strings.concat("ab", "cd");
100 d = strings.concat("a", "bcd");
101 e = strings.concat("abcd");
102 assertEquals(4, a.length());
103 assertEquals(4, b.length());
104 assertEquals(4, c.length());
105 assertEquals(4, d.length());
106 assertEquals(4, e.length());
107 for (ComparableCharSequence c1 : new ComparableCharSequence[]{a, b, c, d, e}) {
108 for (ComparableCharSequence c2 : new ComparableCharSequence[]{a, b, c, d, e}) {
109 assertEquals(c1, c2);
110 assertEquals(0, c1.compareTo(c2));
114 strings = new EightBitStrings(false);
115 a = strings.concat(strings.create("abc"), strings.create("def"));
116 b = strings.concat("bcd", strings.create("efg"));
117 c = strings.concat("cde", strings.create("fgh"));
118 d = strings.create("defghi");
119 e = strings.create("efghij");
120 List<ComparableCharSequence> l = Arrays.asList(e, c, d, a, b);
122 assertEquals(l, Arrays.asList(a, b, c, d, e));
125 List<String> stringsOf(List<CharSequence> cs) {
126 List<String> result = new ArrayList<>();
127 for (CharSequence c : cs) {
131 result.add(c.toString());
137 public void testAggressive() {
138 EightBitStrings strings = new EightBitStrings(false, true);
139 ComparableCharSequence c = strings.concat("com.foo.", "bar.baz.", "Hey$You");
140 assertEquals("com.foo.bar.baz.Hey$You", c.toString());
141 ComparableCharSequence c2 = strings.concat("com.foo.", "bar.whoodle.", "Hey$You");
142 List<String> interned = stringsOf(strings.dumpInternTable());
143 for (String cs : interned) {
147 System.out.println(" " + cs);
149 assertTrue(interned.contains("com"));
150 assertTrue(interned.contains("foo"));
151 assertTrue(interned.contains("bar"));
152 assertTrue(interned.contains("baz"));
153 assertTrue(interned.contains("Hey"));
154 assertTrue(interned.contains("You"));
155 assertTrue(interned.contains("whoodle"));
156 assertTrue(interned.contains("."));
157 assertTrue(interned.contains("$"));
158 assertTrue(interned.contains("\""));
162 public void testConcatQuoted() {
163 EightBitStrings strings = new EightBitStrings(false);
164 List<Object> l = Arrays.asList(strings.create("hey"), false, 23, strings.create("bar"), "baz");
165 CharSequence cc = strings.concatQuoted(l);
166 assertEquals("\"hey\" false 23 \"bar\" \"baz\"", cc.toString());
169 private static String randomString(int len) {
170 char[] c = new char[len];
171 for (int i = 0; i < c.length; i++) {
174 return new String(c);
177 private static char randomChar() {
178 return alpha[r.nextInt(alpha.length)];
181 static final Random r = new Random(320392);
182 private static final char[] alpha = "abcdefghijklmnopqrstuvwxyz".toCharArray();