/* * Copyright 2013 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.template.soy.msgs.restricted; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; /** * Tests the compact interner. * */ @RunWith(JUnit4.class) public class CompactInternerTest { public static final String LOCALE = "xx"; private CompactInterner interner; @Before public void setUp() throws Exception { interner = new CompactInterner(); } @Test public void testSimple() { String firstHello = new String("hello"); String firstGoodbye = new String("goodbye"); interner.intern(firstHello); interner.intern(firstGoodbye); assertSame(firstHello, interner.intern(firstHello)); assertSame(firstHello, interner.intern(new String("hello"))); assertSame(firstGoodbye, interner.intern(firstGoodbye)); assertSame(firstGoodbye, interner.intern(new String("goodbye"))); } @Test public void testThousandsOfItems() { // A deterministic test with enough iterations to catch dumb errors. int iterations = 100000; Long[] longs = new Long[iterations]; String[] strings = new String[iterations]; // Place the items in the interner the first time. for (int i = 0; i < iterations; i++) { longs[i] = new Long(i); assertSame(longs[i], interner.intern(longs[i])); strings[i] = "String Number " + i; assertSame(strings[i], interner.intern(strings[i])); } // Second time, make sure we get the same objects. for (int i = 0; i < iterations; i++) { assertSame(longs[i], interner.intern(new Long(i))); assertSame(strings[i], interner.intern("String Number " + i)); } } @Test public void testPerformance() { // Do some testing. The number of iterations has no effect on these metrics. int iterations = 100000; double maxCost = 0; double maxOverhead = 0; // Prime the table first. int i = 0; for (; i < iterations / 10; i++) { interner.intern(new Integer(i)); } // Now, expand the table to the full size. During this time, we record the maximum cost and // overhead. Taking the max overhead is important because the table's properties vary // dramatically right before and after a rehash, and this way we're guaranteed to see the worst // cases. for (; i < iterations; i++) { interner.intern(new Integer(i)); maxCost = Math.max(maxCost, interner.getAverageCollisions()); maxOverhead = Math.max(maxOverhead, interner.getOverhead()); } assertTrue( "Cost was " + maxCost + " but should have been under " + CompactInterner.getAverageCollisionsBound(), maxCost <= CompactInterner.getAverageCollisionsBound()); assertTrue( "Overhead was " + maxOverhead + " but should have been under " + CompactInterner.getWorstCaseOverhead(), maxOverhead < CompactInterner.getWorstCaseOverhead()); } }