callgraph/src/test/java/org/netbeans/lib/callgraph/util/SmallStringTest.java
author Tim Boudreau <tboudreau@netbeans.org>
Sat, 03 Sep 2016 02:41:36 -0400
changeset 18374 04a79821e760
parent 18373 3527a32a19f0
child 18400 c87c223efe6a
permissions -rw-r--r--
Eliminate duplicates in graph files
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
}