package com.juliasoft.beedeedee.factories;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import java.util.Arrays;
import java.util.BitSet;
import java.util.Collection;
import java.util.Iterator;
import org.junit.Test;
import com.juliasoft.beedeedee.bdd.Assignment;
import com.juliasoft.beedeedee.factories.EquivalenceRelation;
import com.juliasoft.beedeedee.factories.Pair;
public class EquivalenceRelationTest {
@Test
public void testIntersect1() {
EquivalenceRelation e1 = new EquivalenceRelation(new int[][] {{1, 2}});
EquivalenceRelation e2 = new EquivalenceRelation(new int[][] {{1, 3}});
EquivalenceRelation intersection = e1.intersection(e2);
// no common pair
assertTrue(intersection.isEmpty());
}
@Test
public void testIntersect2() {
EquivalenceRelation e1 = new EquivalenceRelation(new int[][] {{1, 2}});
EquivalenceRelation e2 = new EquivalenceRelation(new int[][] {{1, 2, 3}});
EquivalenceRelation intersection = e1.intersection(e2);
// one common pair, (1, 2)
assertEquals(1, intersection.size());
BitSet next = intersection.iterator().next();
assertEquals(1, (int) next.nextSetBit(0));
assertEquals(2, (int) next.nextSetBit(2));
}
@Test
public void testIntersect3() {
EquivalenceRelation e1 = new EquivalenceRelation(new int[][] {{1, 2}, {3, 4, 6}});
EquivalenceRelation e2 = new EquivalenceRelation(new int[][] {{1, 2, 5}, {4, 6}});
EquivalenceRelation intersection = e1.intersection(e2);
// two common pairs, (1, 2), (4, 6)
assertEquals(2, intersection.size());
Iterator<BitSet> it = intersection.iterator();
BitSet class1 = it.next();
BitSet class2 = it.next();
BitSet expected1 = new BitSet();
BitSet expected2 = new BitSet();
expected1.set(1, 3);
expected2.set(4);
expected2.set(6);
assertTrue((expected1.equals(class1) && expected2.equals(class2))
|| (expected1.equals(class2) && expected2.equals(class1)));
}
@Test
public void testPairGeneration1() {
EquivalenceRelation e = new EquivalenceRelation(new int[][] {{1, 2}});
Collection<Pair> pairs = e.pairs();
assertEquals(1, pairs.size());
assertTrue(pairs.contains(new Pair(1, 2)));
}
@Test
public void testPairGeneration2() {
EquivalenceRelation e = new EquivalenceRelation(new int[][] {{1, 2}, {3, 5, 8}});
Collection<Pair> pairs = e.pairs();
assertEquals(4, pairs.size());
assertTrue(pairs.contains(new Pair(1, 2)));
assertTrue(pairs.contains(new Pair(3, 5)));
assertTrue(pairs.contains(new Pair(3, 8)));
assertTrue(pairs.contains(new Pair(5, 8)));
}
@Test
public void testAddPair1() {
EquivalenceRelation e = new EquivalenceRelation(new int[][] {{1, 2}, {3, 4}});
e = e.addPairs(Arrays.asList(new Pair(5, 6)));
// new class {(5, 6)} was created
assertEquals(3, e.size());
}
@Test
public void testAddPair2() {
EquivalenceRelation e = new EquivalenceRelation(new int[][] {{1, 2}, {3, 4}});
e = e.addPairs(Arrays.asList(new Pair(4, 5)));
// 5 was added to 4's class
assertEquals(2, e.size());
BitSet expected1 = new BitSet();
expected1.set(1);
expected1.set(2);
BitSet expected2 = new BitSet();
expected2.set(3);
expected2.set(4);
expected2.set(5);
for (BitSet eqClass : e) {
assertTrue(eqClass.equals(expected1) || eqClass.equals(expected2));
}
}
@Test
public void testAddPair3() {
EquivalenceRelation e = new EquivalenceRelation(new int[][] {{1, 2}, {3, 4}});
e = e.addPairs(Arrays.asList(new Pair(2, 3)));
// eq. classes were joined
assertEquals(1, e.size());
BitSet expected = new BitSet();
expected.set(1, 5);
assertEquals(expected, e.iterator().next());
}
@Test
public void testAddPair4() {
// bug exhibited in Julia analyzer
EquivalenceRelation e = new EquivalenceRelation(new int[][] {{0, 2, 9, 11}});
// [(1, 2), (7, 10), (7, 11), (10, 11)]
e = e.addPairs(Arrays.asList(new Pair(1, 2), new Pair(7, 10), new Pair(7, 11), new Pair(10, 11)));
// KO [{0, 1, 2, 9, 11}, {0, 1, 2, 7, 9, 10, 11}]
// eq. classes were joined
assertEquals(1, e.size());
BitSet expected = new BitSet();
// OK [{0, 1, 2, 7, 9, 10, 11}]
expected.set(0, 3);
expected.set(7);
expected.set(9, 12);
assertEquals(expected, e.iterator().next());
}
@Test
public void testMaxVar() {
EquivalenceRelation e = new EquivalenceRelation(new int[][] {{1, 2}, {3, 4}});
assertEquals(4, e.maxVar());
}
@Test
public void testContainsVar() {
EquivalenceRelation e = new EquivalenceRelation(new int[][] {{1, 2}, {3, 4}});
assertTrue(e.containsVar(3));
assertFalse(e.containsVar(7));
}
@Test
public void testUpdateAssignment() {
Assignment a = mock(Assignment.class);
when(a.holds(2)).thenReturn(true);
EquivalenceRelation e = new EquivalenceRelation(new int[][] {{1, 2}, {3, 4}});
e.updateAssignment(a);
verify(a).put(1, true);
}
@Test
public void testRemoveVar1() {
EquivalenceRelation e = new EquivalenceRelation(new int[][] {{1, 2}});
e = e.removeVar(1);
assertTrue(e.isEmpty()); // a class must contain at least 2 elements
}
@Test
public void testRemoveVar2() {
EquivalenceRelation e = new EquivalenceRelation(new int[][] {{1, 2, 3}});
e = e.removeVar(1);
Collection<Pair> pairs = e.pairs();
assertEquals(1, pairs.size());
assertTrue(pairs.contains(new Pair(2, 3)));
}
@Test
public void testRemoveVar3() {
EquivalenceRelation e = new EquivalenceRelation(new int[][] {{1, 2, 3}});
EquivalenceRelation copy = e;
e = e.removeVar(4);
assertEquals(copy, e);
}
@Test
public void testNextLeader1() {
EquivalenceRelation e = new EquivalenceRelation(new int[][] {{1, 2, 3}});
BitSet excludedVars = new BitSet();
excludedVars.set(1, 4);
assertEquals(-1, e.nextLeader(1, excludedVars));
}
@Test
public void testNextLeader2() {
EquivalenceRelation e = new EquivalenceRelation(new int[][] {{1, 2, 3}});
BitSet excludedVars = new BitSet();
excludedVars.set(1, 3);
assertEquals(3, e.nextLeader(1, excludedVars));
}
@Test
public void testNextLeader3() {
EquivalenceRelation e = new EquivalenceRelation(new int[][] {{1, 2}, {3, 4, 5}});
BitSet excludedVars = new BitSet();
excludedVars.set(1);
excludedVars.set(2);
excludedVars.set(4);
assertEquals(-1, e.nextLeader(1, excludedVars));
assertEquals(5, e.nextLeader(3, excludedVars));
assertEquals(3, e.nextLeader(4, excludedVars));
}
}