blob: 60231f44591b7189990f70de6bba069ef8ec9214 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.lucene.analysis;
import java.util.*;
import org.apache.lucene.util.LuceneTestCase;
public class TestCharArrayMap extends LuceneTestCase {
public void doRandom(int iter, boolean ignoreCase) {
CharArrayMap<Integer> map = new CharArrayMap<>(1, ignoreCase);
HashMap<String,Integer> hmap = new HashMap<>();
char[] key;
for (int i=0; i<iter; i++) {
int len = random().nextInt(5);
key = new char[len];
for (int j=0; j<key.length; j++) {
key[j] = (char)random().nextInt(127);
}
String keyStr = new String(key);
String hmapKey = ignoreCase ? keyStr.toLowerCase(Locale.ROOT) : keyStr;
int val = random().nextInt();
Object o1 = map.put(key, val);
Object o2 = hmap.put(hmapKey,val);
assertEquals(o1,o2);
// add it again with the string method
assertEquals(val, map.put(keyStr,val).intValue());
assertEquals(val, map.get(key,0,key.length).intValue());
assertEquals(val, map.get(key).intValue());
assertEquals(val, map.get(keyStr).intValue());
assertEquals(hmap.size(), map.size());
}
}
public void testCharArrayMap() {
int num = 5 * RANDOM_MULTIPLIER;
for (int i = 0; i < num; i++) { // pump this up for more random testing
doRandom(1000,false);
doRandom(1000,true);
}
}
public void testMethods() {
CharArrayMap<Integer> cm = new CharArrayMap<>(2, false);
HashMap<String,Integer> hm = new HashMap<>();
hm.put("foo",1);
hm.put("bar",2);
cm.putAll(hm);
assertEquals(hm.size(), cm.size());
hm.put("baz", 3);
cm.putAll(hm);
assertEquals(hm.size(), cm.size());
CharArraySet cs = cm.keySet();
int n=0;
for (Object o : cs) {
assertTrue(cm.containsKey(o));
char[] co = (char[]) o;
assertTrue(cm.containsKey(co, 0, co.length));
n++;
}
assertEquals(hm.size(), n);
assertEquals(hm.size(), cs.size());
assertEquals(cm.size(), cs.size());
cs.clear();
assertEquals(0, cs.size());
assertEquals(0, cm.size());
// keySet() should not allow adding new keys
expectThrows(UnsupportedOperationException.class, () -> {
cs.add("test");
});
cm.putAll(hm);
assertEquals(hm.size(), cs.size());
assertEquals(cm.size(), cs.size());
Iterator<Map.Entry<Object,Integer>> iter1 = cm.entrySet().iterator();
n=0;
while (iter1.hasNext()) {
Map.Entry<Object,Integer> entry = iter1.next();
Object key = entry.getKey();
Integer val = entry.getValue();
assertEquals(cm.get(key), val);
entry.setValue(val*100);
assertEquals(val*100, (int)cm.get(key));
n++;
}
assertEquals(hm.size(), n);
cm.clear();
cm.putAll(hm);
assertEquals(cm.size(), n);
CharArrayMap<Integer>.EntryIterator iter2 = cm.entrySet().iterator();
n=0;
while (iter2.hasNext()) {
char[] keyc = iter2.nextKey();
Integer val = iter2.currentValue();
assertEquals(hm.get(new String(keyc)), val);
iter2.setValue(val*100);
assertEquals(val*100, (int)cm.get(keyc));
n++;
}
assertEquals(hm.size(), n);
cm.entrySet().clear();
assertEquals(0, cm.size());
assertEquals(0, cm.entrySet().size());
assertTrue(cm.isEmpty());
}
// TODO: break this up into simpler test methods vs. "telling a story"
public void testModifyOnUnmodifiable(){
CharArrayMap<Integer> map = new CharArrayMap<>(2, false);
map.put("foo",1);
map.put("bar",2);
final int size = map.size();
assertEquals(2, size);
assertTrue(map.containsKey("foo"));
assertEquals(1, map.get("foo").intValue());
assertTrue(map.containsKey("bar"));
assertEquals(2, map.get("bar").intValue());
CharArrayMap<Integer> unmodifiableMap = CharArrayMap.unmodifiableMap(map);
assertEquals("Map size changed due to unmodifiableMap call" , size, unmodifiableMap.size());
String NOT_IN_MAP = "SirGallahad";
assertFalse("Test String already exists in map", unmodifiableMap.containsKey(NOT_IN_MAP));
assertNull("Test String already exists in map", unmodifiableMap.get(NOT_IN_MAP));
expectThrows(UnsupportedOperationException.class, () -> unmodifiableMap.put(NOT_IN_MAP.toCharArray(), 3));
assertFalse("Test String has been added to unmodifiable map", unmodifiableMap.containsKey(NOT_IN_MAP));
assertNull("Test String has been added to unmodifiable map", unmodifiableMap.get(NOT_IN_MAP));
assertEquals("Size of unmodifiable map has changed", size, unmodifiableMap.size());
expectThrows(UnsupportedOperationException.class, () -> unmodifiableMap.put(NOT_IN_MAP, 3));
assertFalse("Test String has been added to unmodifiable map", unmodifiableMap.containsKey(NOT_IN_MAP));
assertNull("Test String has been added to unmodifiable map", unmodifiableMap.get(NOT_IN_MAP));
assertEquals("Size of unmodifiable map has changed", size, unmodifiableMap.size());
expectThrows(UnsupportedOperationException.class, () -> unmodifiableMap.put(new StringBuilder(NOT_IN_MAP), 3));
assertFalse("Test String has been added to unmodifiable map", unmodifiableMap.containsKey(NOT_IN_MAP));
assertNull("Test String has been added to unmodifiable map", unmodifiableMap.get(NOT_IN_MAP));
assertEquals("Size of unmodifiable map has changed", size, unmodifiableMap.size());
expectThrows(UnsupportedOperationException.class, unmodifiableMap::clear);
assertEquals("Size of unmodifiable map has changed", size, unmodifiableMap.size());
expectThrows(UnsupportedOperationException.class, () -> unmodifiableMap.entrySet().clear());
assertEquals("Size of unmodifiable map has changed", size, unmodifiableMap.size());
expectThrows(UnsupportedOperationException.class, () -> unmodifiableMap.keySet().clear());
assertEquals("Size of unmodifiable map has changed", size, unmodifiableMap.size());
expectThrows(UnsupportedOperationException.class, () -> unmodifiableMap.put((Object) NOT_IN_MAP, 3));
assertFalse("Test String has been added to unmodifiable map", unmodifiableMap.containsKey(NOT_IN_MAP));
assertNull("Test String has been added to unmodifiable map", unmodifiableMap.get(NOT_IN_MAP));
assertEquals("Size of unmodifiable map has changed", size, unmodifiableMap.size());
expectThrows(UnsupportedOperationException.class, () -> unmodifiableMap.putAll(Collections.singletonMap(NOT_IN_MAP, 3)));
assertFalse("Test String has been added to unmodifiable map", unmodifiableMap.containsKey(NOT_IN_MAP));
assertNull("Test String has been added to unmodifiable map", unmodifiableMap.get(NOT_IN_MAP));
assertEquals("Size of unmodifiable map has changed", size, unmodifiableMap.size());
assertTrue(unmodifiableMap.containsKey("foo"));
assertEquals(1, unmodifiableMap.get("foo").intValue());
assertTrue(unmodifiableMap.containsKey("bar"));
assertEquals(2, unmodifiableMap.get("bar").intValue());
}
public void testToString() {
CharArrayMap<Integer> cm = new CharArrayMap<>(Collections.singletonMap("test",1), false);
assertEquals("[test]",cm.keySet().toString());
assertEquals("[1]",cm.values().toString());
assertEquals("[test=1]",cm.entrySet().toString());
assertEquals("{test=1}",cm.toString());
cm.put("test2", 2);
assertTrue(cm.keySet().toString().contains(", "));
assertTrue(cm.values().toString().contains(", "));
assertTrue(cm.entrySet().toString().contains(", "));
assertTrue(cm.toString().contains(", "));
}
}