package net.varkhan.base.containers.set;
import junit.framework.TestCase;
import net.varkhan.base.containers.Iterator;
import net.varkhan.base.containers.Visitable;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
/**
* <b></b>.
* <p/>
*
* @author varkhan
* @date 11/28/13
* @time 11:49 AM
*/
public abstract class AbstractWeightingSetTest extends TestCase {
protected static final char[] keychars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-".toCharArray();
protected String[] genKeyStrings(Random rand, int num, int minl, int maxl, char[] characters) {
String[] keys = new String[num];
for(int i=0; i<num; i++) {
StringBuilder buf=new StringBuilder();
int len=minl+rand.nextInt(maxl-minl);
for(int j=0;j<len;j++) buf.append(characters[rand.nextInt(characters.length)]);
keys[i]=buf.toString();
}
return keys;
}
protected double[] genValWeights(Random rand, int num, int minv, int maxv) {
double[] vals = new double[num];
for(int i=0; i<num; i++) {
vals[i] = minv+rand.nextInt(maxv-minv);
}
return vals;
}
public <K> void featureTestSize(Random rand, K[] keys, double[] vals, WeightingSet<K> cset) throws Exception {
Map<K, Double> cmap = new HashMap<K, Double>(keys.length);
double weight = 0;
for(int i=0;i<keys.length;i++) {
K k=keys[i];
if(vals[i]!=0) {
double v;
if(cmap.containsKey(k)) cmap.put(k, v=(cmap.get(k)+vals[i]));
else cmap.put(k, v=vals[i]);
cset.add(k,vals[i]);
weight += vals[i];
}
}
assertEquals("size()",cmap.size(),cset.size());
assertEquals("weight()",weight,cset.weight());
}
public <K> void featureTestClear(Random rand, K[] keys, double[] vals, WeightingSet<K> cset) throws Exception {
Map<K, Double> cmap = new HashMap<K, Double>(keys.length);
for(int i=0;i<keys.length;i++) {
K k=keys[i];
if(vals[i]!=0) {
double v;
if(cmap.containsKey(k)) cmap.put(k, v=(cmap.get(k)+vals[i]));
else cmap.put(k, v=vals[i]);
cset.add(k,vals[i]);
}
}
assertTrue("size()", cmap.size()>0);
assertTrue("weight()", cset.weight()>0);
cset.clear();
assertEquals("size()", 0, cset.size());
assertEquals("weight()", 0.0, cset.weight());
}
public <K> void featureTestWeight(Random rand, K[] keys, double[] vals, WeightingSet<K> cset) throws Exception {
Map<K, Double> cmap = new HashMap<K, Double>(keys.length);
for(int i=0;i<keys.length;i++) {
K k=keys[i];
assertEquals("weight(.)",cmap.containsKey(k)?cmap.get(k):0,cset.weight(k));
if(vals[i]!=0) {
double v;
if(cmap.containsKey(k)) cmap.put(k, v=(cmap.get(k)+vals[i]));
else cmap.put(k, v=vals[i]);
cset.add(k,vals[i]);
assertEquals("weight(.)",v,cset.weight(k));
}
}
}
public <K> void featureTestHas(Random rand, K[] keys, double[] vals, WeightingSet<K> cset) throws Exception {
Map<K, Double> cmap = new HashMap<K, Double>(keys.length);
for(int i=0;i<keys.length;i++) {
K k=keys[i];
assertEquals("has(.)", cmap.containsKey(k), cset.has(k));
if(vals[i]!=0) {
double v;
if(cmap.containsKey(k)) cmap.put(k, v=(cmap.get(k)+vals[i]));
else cmap.put(k, v=vals[i]);
cset.add(k,vals[i]);
assertEquals("has(.)",cmap.containsKey(k),cset.has(k));
}
}
}
public <K> void featureTestDel(Random rand, K[] keys, double[] vals, WeightingSet<K> cset) throws Exception {
Map<K, Double> cmap = new HashMap<K, Double>(keys.length);
double weight = 0;
for(int i=0;i<keys.length;i++) {
K k=keys[i];
if(vals[i]!=0) {
double v;
if(cmap.containsKey(k)) cmap.put(k, v=(cmap.get(k)+vals[i]));
else cmap.put(k, v=vals[i]);
cset.add(k,vals[i]);
weight += vals[i];
}
}
while(cmap.size()>0) {
K k = keys[rand.nextInt(keys.length)];
if(!cmap.containsKey(k)) continue;
assertEquals("weight(.)",cmap.get(k).doubleValue(),cset.weight(k));
cset.del(k);
weight-=cmap.get(k).doubleValue();
cmap.remove(k);
assertEquals("size()", cmap.size(), cset.size());
}
assertEquals("size()",0,cset.size());
assertEquals("weight()",0.0,cset.weight());
}
public <K> void featureTestIterator(Random rand, K[] keys, double[] vals, WeightingSet<K> cset) throws Exception {
Map<K, Double> cmap = new HashMap<K, Double>(keys.length);
for(int i=0;i<keys.length;i++) {
K k=keys[i];
if(vals[i]!=0) {
double v;
if(cmap.containsKey(k)) cmap.put(k, v=(cmap.get(k)+vals[i]));
else cmap.put(k, v=vals[i]);
cset.add(k,vals[i]);
}
}
int num = 0;
for(Iterator<? extends K> iterator=cset.iterator();iterator.hasNext();) {
K k=iterator.next();
assertTrue("next()",cmap.containsKey(k));
num ++;
}
assertEquals("", cmap.size(), num);
assertEquals("size()", cmap.size(), cset.size());
}
public <K> void featureTestVisit(Random rand, K[] keys, double[] vals, WeightingSet<K> cset) throws Exception {
Map<K, Double> cmap = new HashMap<K, Double>(keys.length);
for(int i=0;i<keys.length;i++) {
K k=keys[i];
if(vals[i]!=0) {
double v;
if(cmap.containsKey(k)) cmap.put(k, v=(cmap.get(k)+vals[i]));
else cmap.put(k, v=vals[i]);
cset.add(k,vals[i]);
}
}
assertEquals("visit()",cmap.size(),cset.visit(new Visitable.Visitor<K,Map<K,Double>>() {
@Override
public long invoke(K obj, Map<K,Double> map) {
assertTrue(map.containsKey(obj));
return 1;
}
}, cmap));
}
public <K> void featureTestString(Random rand, K[] keys, double[] vals, WeightingSet<K> cset) throws Exception {
Map<K, Double> cmap = new HashMap<K, Double>(keys.length);
for(int i=0;i<keys.length;i++) {
K k=keys[i];
if(vals[i]!=0) {
double v;
if(cmap.containsKey(k)) cmap.put(k, v=(cmap.get(k)+vals[i]));
else cmap.put(k, v=vals[i]);
cset.add(k,vals[i]);
}
}
String s = cset.toString();
assertTrue("toString() : { ",s.startsWith("{ "));
assertTrue("toString() : { ",s.endsWith(" }"));
for(int i=0;i<keys.length;i++) {
String k = keys[i]+":"+cset.weight(keys[i]);
if(cset.weight(keys[i])==0) assertFalse("toString() : "+k,s.contains(k+", ")||s.contains(k+" }"));
else assertTrue("toString() : "+k,s.contains(k+", ")||s.contains(k+" }"));
}
System.out.println("toString OK");
}
}