/** * Replication Benchmarker * https://github.com/score-team/replication-benchmarker/ * Copyright (C) 2013 LORIA / Inria / SCORE Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package crdt.tree.graphtree; import crdt.tree.graphtree.connection.GraphCompact; import collect.HashMapSet; import crdt.tree.graphtree.connection.GraphReappear; import crdt.tree.graphtree.connection.GraphRoot; import java.util.Map; import java.util.HashMap; import crdt.tree.graphtree.connection.GraphSkip; import java.util.HashSet; import java.util.Iterator; import crdt.set.SetOperation; import crdt.tree.PseudoSet; import collect.Node; import java.util.Set; import collect.Tree; import collect.HashTree; import org.junit.Test; import static org.junit.Assert.*; import static collect.Utils.*; /** * * @author score */ public class ConnectPoliciesTest<T> { char a='a', b='b',c='c',d='d', e='e',m='m', x='x',k='k', y='y', z='z'; Set<Character> node = toSet(a, b, c, d, e, x , k, y, z); Edge edgeRA = new Edge(null, a);Edge edgeRB = new Edge(null, b); Edge edgeRC = new Edge(null, c);Edge edgeRD = new Edge(null, d); Edge edgeAZ = new Edge(a, z); Edge edgeBX = new Edge(b, x);Edge edgeBY = new Edge(b, y); Edge edgeCZ = new Edge(c, z); Edge edgeDE = new Edge(d, e);Edge edgeED = new Edge(e, d); Set<Edge> edge = toSet(edgeRA, edgeRB,edgeRC, edgeRD, edgeAZ, edgeBX, edgeBY, edgeCZ, edgeDE, edgeED); @Test public void testSkipEmpty() { GraphConnectionPolicyNoInc graphPolicy = new GraphSkip(); graphPolicy.update(new PseudoSet(), new SetOperation(SetOperation.OpType.add, a)); graphPolicy.connect(); assertEquals(0, graphPolicy.lookup().keySet().size()); assertEquals(0, graphPolicy.lookup().values().size()); } @Test public void testSkip() { GraphConnectionPolicyNoInc graphPolicy = new GraphSkip(); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.add, a)); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.add, edgeRA)); node.remove(b); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.del, b)); edge.remove(edgeRB); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.del, edgeRB)); HashMapSet<Character, Edge<T>> test = new HashMapSet(); test.put(null, edgeRA); test.put(null, edgeRC); test.put(null, edgeRD); test.put(c, edgeCZ); test.put(a,edgeAZ); test.put(e,edgeED); test.put(d, edgeDE); HashMapSet<Character, Edge<T>> look = graphPolicy.lookup(); Iterator itr = test.keySet().iterator(); while(itr.hasNext()) { Character ch = (Character) itr.next(); for(Edge<T> edg : look.getAll(ch)) { assertTrue(look.containsValue(ch, edg)); } } itr = look.keySet().iterator(); while(itr.hasNext()) { Character ch = (Character) itr.next(); for(Edge<T> edg : test.getAll(ch)) { assertTrue(test.containsValue(ch, edg)); } } } @Test public void testRootEmpty() { GraphConnectionPolicyNoInc graphPolicy = new GraphRoot(); graphPolicy.update(new PseudoSet(), new SetOperation(SetOperation.OpType.add, a)); graphPolicy.connect(); assertEquals(0, graphPolicy.lookup().keySet().size()); assertEquals(0, graphPolicy.lookup().values().size()); } @Test public void testRoot() { GraphConnectionPolicy graphPolicy = new GraphRoot(); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.add, a)); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.add, edgeRA)); node.remove(b); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.del, b)); edge.remove(edgeRB); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.del, edgeRB)); HashMapSet<Character, Edge<T>> test = new HashMapSet(); test.put(null, edgeRA); test.put(null, edgeRC); test.put(c, edgeCZ);test.put(a,edgeAZ); test.put(null, edgeRD);test.put(e,edgeED); test.put(d, edgeDE); test.put(null, new Edge(null, x)); test.put(null, new Edge(null, y)); HashMapSet<Character, Edge<T>> look = graphPolicy.lookup(); Iterator itr = test.keySet().iterator(); while(itr.hasNext()) { Character ch = (Character) itr.next(); for(Edge<T> edg : look.getAll(ch)) { assertTrue(look.containsValue(ch, edg)); } } itr = look.keySet().iterator(); while(itr.hasNext()) { Character ch = (Character) itr.next(); for(Edge<T> edg : test.getAll(ch)) { assertTrue(test.containsValue(ch, edg)); } } } @Test public void testReappearEmpty() { GraphConnectionPolicyNoInc graphPolicy = new GraphReappear(); graphPolicy.update(new PseudoSet(), new SetOperation(SetOperation.OpType.add, a)); graphPolicy.connect(); assertEquals(0, graphPolicy.lookup().keySet().size()); assertEquals(0, graphPolicy.lookup().values().size()); } @Test public void testReappear() { GraphConnectionPolicyNoInc graphPolicy = new GraphReappear(); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.add, a)); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.add, edgeRA)); node.add(k); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.add, k)); final Edge edgeXK = new Edge(x, k); edge.add(edgeXK); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.add, edgeXK)); node.remove(x); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.del, x)); edge.remove(edgeBX); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.del, edgeBX)); node.remove(b); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.del, b)); edge.remove(edgeRB); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.del, edgeRB)); node.remove(y); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.del, y)); edge.remove(edgeBY); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.del, edgeBY)); HashMapSet<Character, Edge<T>> test = new HashMapSet(); test.put(null, edgeRA); test.put(null, edgeRB); test.put(b, edgeBX); test.put(null, edgeRC); test.put(c, edgeCZ);test.put(a,edgeAZ); test.put(null, edgeRD);test.put(e,edgeED); test.put(d, edgeDE); test.put(x, edgeXK); HashMapSet<Character, Edge<T>> look = graphPolicy.lookup(); Iterator itr = test.keySet().iterator(); while(itr.hasNext()) { Character ch = (Character) itr.next(); for(Edge<T> edg : look.getAll(ch)) { assertTrue(look.containsValue(ch, edg)); } } itr = look.keySet().iterator(); while(itr.hasNext()) { Character ch = (Character) itr.next(); for(Edge<T> edg : test.getAll(ch)) { assertTrue(test.containsValue(ch, edg)); } } } //Test Reapperar : 2 father for the same node @Test public void testReappearSameFather() { GraphConnectionPolicyNoInc graphPolicy = new GraphReappear(); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.add, a)); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.add, edgeRA)); //add k under x node.add(k); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.add, k)); final Edge edgeXK = new Edge(x, k); edge.add(edgeXK); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.add, edgeXK)); //add k under A <--- Shortest node.add(k); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.add, k)); Edge edgeAK = new Edge(a, k); edge.add(edgeAK); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.add, edgeAK)); //add m under k node.add(m); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.add, m)); Edge edgeKM = new Edge(k, m); edge.add(edgeKM); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.add, edgeKM)); //make (k,m) orphan node.remove(b); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.del, b)); edge.remove(edgeRB); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.del, edgeRB)); node.remove(a); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.del, a)); edge.remove(edgeRA); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.del, edgeRA)); node.remove(k); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.del, k)); edge.remove(edgeAK); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.del, edgeAK)); node.remove(x); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.del, x)); edge.remove(edgeBX); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.del, edgeBX)); edge.remove(edgeXK); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.del, edgeXK)); //remove y,z and here edges node.remove(y); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.del, y)); edge.remove(edgeBY); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.del, edgeBY)); node.remove(z); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.del, z)); edge.remove(edgeAZ); edge.remove(edgeCZ); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.del, edgeAZ)); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.del, edgeCZ)); HashMapSet<Character, Edge<T>> test = new HashMapSet(); test.put(null, edgeRA); test.put(null, edgeRB); test.put(b, edgeBX); test.put(null, edgeRC); test.put(null, edgeRD);test.put(e,edgeED); test.put(d, edgeDE); test.put(x, edgeXK); test.put(k, edgeKM); test.put(a, edgeAK); HashMapSet<Character, Edge<T>> look = graphPolicy.lookup(); Iterator itr = test.keySet().iterator(); while(itr.hasNext()) { Character ch = (Character) itr.next(); for(Edge<T> edg : look.getAll(ch)) { assertTrue(look.containsValue(ch, edg)); } } itr = look.keySet().iterator(); while(itr.hasNext()) { Character ch = (Character) itr.next(); for(Edge<T> edg : test.getAll(ch)) { assertTrue(test.containsValue(ch, edg)); } } } @Test public void testCompactEmpty() { GraphConnectionPolicyNoInc graphPolicy = new GraphCompact(); graphPolicy.update(new PseudoSet(), new SetOperation(SetOperation.OpType.add, a)); graphPolicy.connect(); assertEquals(0, graphPolicy.lookup().keySet().size()); assertEquals(0, graphPolicy.lookup().values().size()); } @Test public void testCompact() { GraphConnectionPolicyNoInc graphPolicy = new GraphCompact(); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.add, a)); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.add, edgeRA)); //add k under x node.add(k); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.add, k)); final Edge edgeXK = new Edge(x, k); edge.add(edgeXK); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.add, edgeXK)); //add k under A <--- Shortest node.add(k); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.add, k)); Edge edgeAK = new Edge(a, k); edge.add(edgeAK); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.add, edgeAK)); //add m under k node.add(m); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.add, m)); Edge edgeKM = new Edge(k, m); edge.add(edgeKM); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.add, edgeKM)); //make (k,m) orphan node.remove(a); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.del, a)); edge.remove(edgeRA); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.del, edgeRA)); node.remove(k); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.del, k)); edge.remove(edgeAK); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.del, edgeAK)); node.remove(x); graphPolicy.update(new PseudoSet(node), new SetOperation(SetOperation.OpType.del, x)); edge.remove(edgeBX); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.del, edgeBX)); edge.remove(edgeXK); graphPolicy.update(new PseudoSet(edge), new SetOperation(SetOperation.OpType.del, edgeXK)); HashMapSet<Character, Edge<T>> test = new HashMapSet(); test.put(null, new Edge(null,k)); test.put(null, edgeRB);test.put(b, edgeBY); test.put(b, new Edge(b,k)); test.put(null, edgeRC); test.put(c, edgeCZ);test.put(a,edgeAZ); test.put(null, edgeRD);test.put(e,edgeED); test.put(d, edgeDE); test.put(k, new Edge(k, m)); HashMapSet<Character, Edge<T>> look = graphPolicy.lookup(); Iterator itr = test.keySet().iterator(); while(itr.hasNext()) { Character ch = (Character) itr.next(); for(Edge<T> edg : look.getAll(ch)) { assertTrue(look.containsValue(ch, edg)); } } itr = look.keySet().iterator(); while(itr.hasNext()) { Character ch = (Character) itr.next(); for(Edge<T> edg : test.getAll(ch)) { assertTrue(test.containsValue(ch, edg)); } } } void display(HashMapSet<Character, Edge<T>> look) { Iterator itr = look.keySet().iterator(); while(itr.hasNext()) { Character ch = (Character) itr.next(); System.out.print(ch); for(Edge edg : look.getAll(ch)) { System.out.println("("+edg.getFather()+"-->"+edg.getSon()+")"); } } } }