package org.yamcs.parameter;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.junit.Test;
import org.yamcs.parameter.ParameterValue;
import org.yamcs.parameter.ParameterValueList;
import org.yamcs.xtce.Parameter;
public class ParameterValueListTest {
@Test
public void test1() {
int n = 10000;
Parameter[] params = new Parameter[n];
List<ParameterValue> pvalues= new ArrayList<ParameterValue>(n+1);
for (int i = 0; i<n; i++) {
params[i] = new Parameter("parameter"+i);
ParameterValue pv = new ParameterValue(params[i]);
pvalues.add(pv);
}
ParameterValue pv2bis = new ParameterValue(params[2]);
pvalues.add(pv2bis);
//bulk create
ParameterValueList pvlist1 = new ParameterValueList(pvalues);
assertEquals(n+1, pvlist1.getSize());
ParameterValue pv10 = pvlist1.getLastInserted(params[10]);
assertEquals(pvalues.get(10), pv10);
ParameterValue pv2 = pvlist1.getLastInserted(params[2]);
assertEquals(pvalues.get(n), pv2);
assertEquals(pvalues.get(2), pvlist1.getFirstInserted(params[2]));
assertEquals(1, pvlist1.count(params[0]));
assertEquals(2, pvlist1.count(params[2]));
List<ParameterValue> foreachresult1 = new ArrayList<ParameterValue>();
pvlist1.forEach(params[1], (ParameterValue pv) -> foreachresult1.add(pv));
assertEquals(Arrays.asList(pvalues.get(1)), foreachresult1);
List<ParameterValue> foreachresult2 = new ArrayList<ParameterValue>();
pvlist1.forEach(params[2], (ParameterValue pv) -> foreachresult2.add(pv));
assertEquals(Arrays.asList(pvalues.get(2), pvalues.get(n)), foreachresult2);
List<ParameterValue> pvalues1 = new ArrayList<ParameterValue>(pvalues);
pvalues1.removeAll(pvlist1);
assertTrue(pvalues1.isEmpty());
////////////one by one
ParameterValueList pvlist2 = new ParameterValueList();
for(ParameterValue pv:pvalues) {
pvlist2.add(pv);
}
assertEquals(n+1, pvlist2.getSize());
List<ParameterValue> pvalues2 = new ArrayList<ParameterValue>(pvalues);
pvalues2.removeAll(pvlist2);
assertTrue(pvalues2.isEmpty());
//add all
ParameterValueList pvlist3 = new ParameterValueList();
pvlist3.addAll(pvalues);
assertEquals(n+1, pvlist3.getSize());
List<ParameterValue> pvalues3 = new ArrayList<ParameterValue>(pvalues);
pvalues3.removeAll(pvlist3);
assertTrue(pvalues3.isEmpty());
}
@Test
public void testRemove() {
Parameter p = new Parameter("parameter");
ParameterValue pv1 = new ParameterValue(p);
pv1.setStringValue("pv1");
ParameterValue pv2 = new ParameterValue(p);
pv2.setStringValue("pv2");
ParameterValueList pvlist = new ParameterValueList();
pvlist.add(pv1);
assertEquals(1, pvlist.getSize());
assertEquals(pv1, pvlist.removeFirst(p));
assertEquals(0, pvlist.getSize());
pvlist.add(pv1);
assertEquals(pv1, pvlist.removeLast(p));
assertEquals(0, pvlist.getSize());
pvlist.add(pv1);
pvlist.add(pv2);
assertEquals(pv1, pvlist.removeFirst(p));
assertEquals(1, pvlist.getSize());
assertEquals(pv2, pvlist.getLastInserted(p));
pvlist.add(pv1);
assertEquals(pv1, pvlist.removeLast(p));
assertEquals(1, pvlist.getSize());
assertEquals(pv2, pvlist.getLastInserted(p));
assertEquals(pv2, pvlist.removeLast(p));
assertEquals(0, pvlist.getSize());
}
@Test
public void testRemoveMany() {
int n = 10;
int m = 5;
Parameter[] params = new Parameter[2*n];
List<ParameterValue> pvalues= new ArrayList<ParameterValue>(n*m);
for (int i = 0; i<2*n; i++) {
params[i] = new Parameter("parameter"+i);
}
for(int j=0;j<m; j++) {
for(int i=0;i<2*n; i++) {
ParameterValue pv = new ParameterValue(params[i]);
pv.setStringValue(i+":"+j);
pvalues.add(pv);
}
}
//bulk create with collisions
ParameterValueList pvlist = new ParameterValueList(4, pvalues);
assertEquals(2*n*m, pvlist.getSize());
for(int j=0; j<m; j++) {
for(int i=0;i<n;i++) {
ParameterValue pv = pvlist.removeFirst(params[i]);
assertEquals(pvalues.get(j*2*n+i), pv );
}
for(int i=n;i<2*n;i++) {
ParameterValue pv = pvlist.removeLast(params[i]);
assertEquals(pvalues.get((m-j-1)*2*n+i), pv );
}
assertEquals(2*n*(m-j-1), pvlist.getSize());
}
}
@Test
public void testIterator() {
Parameter p = new Parameter("p1");
ParameterValue pv1 = new ParameterValue(p);
pv1.setStringValue("pv1");
ParameterValue pv2 = new ParameterValue(p);
pv2.setStringValue("pv2");
ParameterValueList pvlist = new ParameterValueList();
Iterator<ParameterValue> it = pvlist.iterator();
assertFalse(it.hasNext());
pvlist.add(pv1);
it = pvlist.iterator();
assertTrue(it.hasNext());
assertEquals(pv1, it.next());
assertFalse(it.hasNext());
pvlist.removeFirst(p);
pvlist.add(pv2);
pvlist.add(pv1);
it = pvlist.iterator();
assertTrue(it.hasNext());
assertEquals(pv2, it.next());
assertTrue(it.hasNext());
assertEquals(pv1, it.next());
assertFalse(it.hasNext());
}
@Test
public void testIterator1() {
int n = 10000;
Parameter[] params = new Parameter[n];
List<ParameterValue> pvalues= new ArrayList<ParameterValue>(n+1);
for (int i = 0; i<n; i++) {
params[i] = new Parameter("parameter"+i);
ParameterValue pv = new ParameterValue(params[i]);
pvalues.add(pv);
}
ParameterValue pv2bis = new ParameterValue(params[2]);
pvalues.add(pv2bis);
ParameterValueList pvlist = new ParameterValueList(pvalues);
Iterator<ParameterValue> it = pvlist.iterator();
for (int i = 0; i<n; i++) {
assertTrue(it.hasNext());
ParameterValue pv = it.next();
assertEquals(pvalues.get(i), pv);
}
assertTrue(it.hasNext());
ParameterValue pv = it.next();
assertEquals(pv2bis, pv);
assertFalse(it.hasNext());
pvlist.removeLast(params[2]);
it = pvlist.iterator();
for (int i = 0; i<n; i++) {
assertTrue(it.hasNext());
pv = it.next();
assertEquals(pvalues.get(i), pv);
}
assertFalse(it.hasNext());
}
}