package jbenchmarker.rgaTreeSplitBalanced;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.List;
import jbenchmarker.core.SequenceOperation;
import jbenchmarker.core.SequenceOperation.OpType;
import jbenchmarker.factories.RGATreeSplitBalancedFactory;
import org.junit.Before;
import org.junit.Test;
import crdt.PreconditionException;
import crdt.simulator.IncorrectTraceException;
import jbenchmarker.rgaTreeSplitBalanced.RgaSDocument.Position;
public class RgaSDocumentTest {
static List<String> input(String A){
List<String> a= new ArrayList<String>();
for (int i=0; i<A.length(); i++){
a.add((A.substring(i,i+1)));
}
return a;
}
static void apply(RgaSDocument rgadoc, SequenceOperation so, RgaSMerge merge) throws IncorrectTraceException{
if (so.getType()==OpType.insert){
merge.localInsert(so);
}
else if (so.getType()==OpType.delete){
merge.localDelete(so);
}
}
private static final int REPLICA_ID = 7;
private RgaSMerge replica;
@Before
public void setUp() throws Exception {
replica = (RgaSMerge) new RGATreeSplitBalancedFactory().create(REPLICA_ID);
}
@Test
public void testEmpty() {
assertEquals("", replica.lookup());
}
@Test
public void testGetPosition() {
RgaSDocument rgadoc = new RgaSDocument();
Position position;
RgaSS3Vector s3v1 = new RgaSS3Vector(0,1,0);
RgaSS3Vector s3v2 = new RgaSS3Vector(0,2,0);
RgaSS3Vector s3v3 = new RgaSS3Vector(0,3,0);
RgaSNode node1 = new RgaSNode(s3v1,null,null,input("abcdef"),false, null);
RgaSNode node2 = new RgaSNode(s3v2,null,null,input("ghijkl"),false, null);
RgaSNode node3 = new RgaSNode(s3v3,null,null,input("mnopq"),false, null);
rgadoc.getHead().setNext(node1);
node1.setNext(node2);
node2.setNext(node3);
position= rgadoc.getPosition(rgadoc.getHead(),0);
assertEquals("abcdef,0", position.node.getContentAsString()+","+position.offset);
position= rgadoc.getPosition(rgadoc.getHead(),4);
assertEquals("abcdef,4", position.node.getContentAsString()+","+position.offset);
position= rgadoc.getPosition(rgadoc.getHead(),6);
assertEquals("ghijkl,0", position.node.getContentAsString()+","+position.offset);
position= rgadoc.getPosition(rgadoc.getHead(),7);
assertEquals("ghijkl,1", position.node.getContentAsString()+","+position.offset);
position= rgadoc.getPosition(rgadoc.getHead(),12);
assertEquals("mnopq,0", position.node.getContentAsString()+","+position.offset);
position= rgadoc.getPosition(rgadoc.getHead(),15);
assertEquals("mnopq,3", position.node.getContentAsString()+","+position.offset);
}
@Test
public void testRemoteSplit() throws PreconditionException {
RgaSDocument rgadoc = new RgaSDocument();
RgaSMerge merge0 = new RgaSMerge(rgadoc,0);
SequenceOperation so1 = new SequenceOperation (OpType.insert, 0, 0, input("abcdefghijklmnopq"));
apply(rgadoc, so1, merge0);
assertEquals("Insertion au début","abcdefghijklmnopq", rgadoc.view());
rgadoc.remoteSplit(rgadoc.getHead().getNextVisible(), 0);
assertEquals("Split au début","->|abcdefghijklmnopq|", rgadoc.viewWithSeparator());
assertEquals("Split au début",0, rgadoc.getHead().getNextVisible().getKey().getOffset());
rgadoc.remoteSplit(rgadoc.getHead().getNextVisible(), 17);
assertEquals("Split à la fin","->|abcdefghijklmnopq|", rgadoc.viewWithSeparator());
assertEquals("Split au début",0, rgadoc.getHead().getNextVisible().getKey().getOffset());
rgadoc.remoteSplit(rgadoc.getHead().getNextVisible(), 9);
assertEquals("Split au milieu","->|abcdefghi|->|jklmnopq|", rgadoc.viewWithSeparator());
assertEquals("Verif offset",9, rgadoc.getHead().getNextVisible().getNextVisible().getKey().getOffset());
rgadoc.remoteSplit(rgadoc.getHead().getNextVisible().getNextVisible(), 14);
assertEquals("Split au milieu","->|abcdefghi|->|jklmn|->|opq|", rgadoc.viewWithSeparator());
assertEquals("Verif offset",9, rgadoc.getHead().getNextVisible().getNextVisible().getKey().getOffset());
assertEquals("Verif offset",14, rgadoc.getHead().getNextVisible().getNextVisible().getNextVisible().getKey().getOffset());
}
@Test
public void testRemoteInsert() throws PreconditionException {
replica.applyLocal(SequenceOperation.insert(0, "abcdejk"));
assertEquals("Insertion du contenu initial", "abcdejk", replica.lookup());
replica.applyLocal(SequenceOperation.insert(3, "fg"));
assertEquals("Insertion au milieu","abcfgdejk", replica.lookup());
replica.applyLocal(SequenceOperation.insert(5, "hi"));
assertEquals("Insertion au milieu","abcfghidejk", replica.lookup());
replica.applyLocal(SequenceOperation.insert(11, "lmnop"));
assertEquals("Insertion à la fin","abcfghidejklmnop", replica.lookup());
}
@Test
public void testRemoteDelete() throws PreconditionException {
replica.applyLocal(SequenceOperation.insert(0,"abcdefghijklmnopq"));
assertEquals("Insertion du contenu","abcdefghijklmnopq", replica.lookup());
System.out.println("\n\nINSERT1");
replica.applyLocal(SequenceOperation.delete(1, 4));
assertEquals("Suppression en début","afghijklmnopq", replica.lookup());
System.out.println("\n\nINSERT2");
replica.applyLocal(SequenceOperation.delete(5, 8));
assertEquals("Suppression au milieu","afghi", replica.lookup());
System.out.println("\nENDINSERT\n\n");
replica.applyLocal(SequenceOperation.delete(1, 3));
assertEquals("Suppression au milieu","ai", replica.lookup());
replica.applyLocal(SequenceOperation.delete(1, 1));
assertEquals("Suppression à la fin","a", replica.lookup());
replica.applyLocal(SequenceOperation.delete(0, 1));
assertEquals("Suppression au début","", replica.lookup());
}
}