/******************************************************************************* * Copyright (c) 2016 Google, Inc and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Sergey Prigogin (Google) - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.core.parser.tests; import java.util.Random; import org.eclipse.cdt.core.parser.util.CharArrayObjectMap; import junit.framework.TestCase; /** * Tests for {@link CharArrayObjectMap}. */ public class CharArrayObjectMapTest extends TestCase { public void testMapAdd() { CharArrayObjectMap map = new CharArrayObjectMap(4); char[] key1 = "key1".toCharArray(); Integer value1 = 43; map.put(key1, value1); char[] key2 = "key1".toCharArray(); Object value2 = map.get(key2); assertEquals(value1, value2); for (int i = 0; i < 25; ++i) { map.put(("ikey" + i).toCharArray(), Integer.valueOf(i)); } for (int i = 0; i < 25; ++i) { Object ivalue1 = map.get(("ikey" + i).toCharArray()); assertEquals(i, ivalue1); } } public void testDuplicates() { CharArrayObjectMap map = new CharArrayObjectMap(4); String[] keys = new String[] { "a", "b", "c", "c", "value", "value", "context", "context", "result", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "z" }; for (int i = 0; i < keys.length; i++) { String key = keys[i]; map.put(key.toCharArray(), key + i); } assertEquals(29, map.size()); for (int i = 0; i < keys.length; i++) { String key = keys[i]; if (i != 2 && i != 4 && i != 6 && i != 31) { assertEquals(key + i, map.get(key.toCharArray())); } } } public void testCollisionRatio() { Random random = new Random(239); CharArrayObjectMap map = new CharArrayObjectMap(1); for (int i = 0; i < 20000; i++) { int r = random.nextInt(); map.put(("key" + Integer.toUnsignedString(i)).toCharArray(), i); double collisionRatio = (double) map.countCollisions() / map.size(); assertTrue(String.format("Collision ratio %.3f is unexpectedly high for map size of %d.", collisionRatio, map.size()), collisionRatio <= 0.4); } } }