@Test
  public void moveTest() {
    CRDTMessage m = tree2.move(Arrays.asList(0, 1), Arrays.asList(2), 1);
    tree.applyRemote(m);

    assertEquals("null{a{d,},b,c{g,e{f,},h,},}", tree.getRoot().nodetail());
    assertEquals("null{a{d,},b,c{g,e{f,},h,},}", tree2.getRoot().nodetail());
  }
  @Test
  public void removeTest() throws PreconditionException {
    CRDTMessage m = tree2.remove(Arrays.asList(0, 1));
    tree.applyOneRemote(m);

    assertEquals("null{a{d,},b,c{g,h,},}", tree.getRoot().nodetail());
    assertEquals("null{a{d,},b,c{g,h,},}", tree2.getRoot().nodetail());
  }
  @Test
  public void switchTest() {
    CRDTMessage m = tree2.move(Arrays.asList(0), new LinkedList(), 1);
    tree.applyOneRemote(m);

    assertEquals("null{b,a{d,e{f,},},c{g,h,},}", tree.getRoot().nodetail());
    assertEquals("null{b,a{d,e{f,},},c{g,h,},}", tree2.getRoot().nodetail());
  }
  @Test
  public void ChLabelTest() {
    CRDTMessage m = tree2.rename(Arrays.asList(0), "ZoidBerg");
    tree.applyOneRemote(m);

    assertEquals("null{ZoidBerg{d,e{f,},},b,c{g,h,},}", tree.getRoot().nodetail());
    assertEquals("null{ZoidBerg{d,e{f,},},b,c{g,h,},}", tree2.getRoot().nodetail());
  }
 @Test
 public void moveTestop() throws PreconditionException {
   OrderedTreeOperation<String> op1 =
       new OrderedTreeOperation<String>(MOVE, Arrays.asList(0, 1), Arrays.asList(2), 1, null);
   CRDTMessage m = tree2.applyLocal(op1);
   tree.applyRemote(m);
   assertEquals("null{a{d,},b,c{g,e{f,},h,},}", tree.getRoot().nodetail());
   assertEquals("null{a{d,},b,c{g,e{f,},h,},}", tree2.getRoot().nodetail());
 }
  @Test
  public void removeTestop() throws PreconditionException {

    CRDTMessage m = tree2.applyLocal(new OrderedTreeOperation<String>(Arrays.asList(0, 1)));
    tree.applyOneRemote(m);

    assertEquals("null{a{d,},b,c{g,h,},}", tree.getRoot().nodetail());
    assertEquals("null{a{d,},b,c{g,h,},}", tree2.getRoot().nodetail());
  }
  @Test
  public void switchTestop() throws PreconditionException {
    OrderedTreeOperation<String> op1 =
        new OrderedTreeOperation<String>(MOVE, Arrays.asList(0), new LinkedList(), 1, null);
    CRDTMessage m = tree2.applyLocal(op1);
    tree.applyOneRemote(m);

    assertEquals("null{b,a{d,e{f,},},c{g,h,},}", tree.getRoot().nodetail());
    assertEquals("null{b,a{d,e{f,},},c{g,h,},}", tree2.getRoot().nodetail());
  }
  @Test
  public void ChLabelTestop() throws PreconditionException {
    OpType rename = OrderedTreeOperation.OpType.chContent;
    OrderedTreeOperation<String> op1 =
        new OrderedTreeOperation<String>(rename, Arrays.asList(0), null, 0, "ZoidBerg");
    CRDTMessage m = tree2.applyLocal(op1);
    tree.applyOneRemote(m);

    assertEquals("null{ZoidBerg{d,e{f,},},b,c{g,h,},}", tree.getRoot().nodetail());
    assertEquals("null{ZoidBerg{d,e{f,},},b,c{g,h,},}", tree2.getRoot().nodetail());
  }
 @Test
 public void removeAll2Test() throws Exception {
   tree.setRemoveEntireSubtree(true);
   tree2.setRemoveEntireSubtree(true);
   StandardSizeCalculator sdc = new StandardSizeCalculator(true);
   long s1 = sdc.serializ(tree);
   long s2 = sdc.serializ(tree2);
   long s3 = sdc.serializ(tree3);
   assertTrue(s3 < s1);
   assertTrue(s3 < s2);
   CRDTMessage mess1 = tree2.remove(Arrays.asList(0)); // f
   CRDTMessage mess2 = tree2.remove(Arrays.asList(0)); // f
   CRDTMessage mess3 = tree2.remove(Arrays.asList(0)); // f
   tree.applyRemote(mess1);
   tree.applyRemote(mess3);
   tree.applyRemote(mess2);
   assertEquals("null", tree2.getRoot().nodetail());
   assertEquals("null", tree.getRoot().nodetail());
   long sa1 = sdc.serializ(tree);
   long sa2 = sdc.serializ(tree2);
   assertEquals(1, tree.map.size());
   assertEquals(1, tree2.map.size());
   assertEquals(s3, sa1);
   assertEquals(s3, sa2);
 }
 @Test
 public void removeAllTest() throws PreconditionException, IOException {
   StandardSizeCalculator sdc = new StandardSizeCalculator(true);
   long s1 = sdc.serializ(tree);
   long s2 = sdc.serializ(tree2);
   long s3 = sdc.serializ(tree3);
   assertTrue(s3 < s1);
   assertTrue(s3 < s2);
   CRDTMessage mess1 = tree2.remove(Arrays.asList(0, 1, 0)); // f
   CRDTMessage mess2 = tree2.remove(Arrays.asList(2, 1)); // h
   CRDTMessage mess3 = tree2.remove(Arrays.asList(2, 0)); // g
   CRDTMessage mess4 = tree2.remove(Arrays.asList(0, 1)); // e
   CRDTMessage mess5 = tree2.remove(Arrays.asList(0, 0)); // d
   CRDTMessage mess6 = tree2.remove(Arrays.asList(2)); // c
   CRDTMessage mess7 = tree2.remove(Arrays.asList(1)); // b
   CRDTMessage mess8 = tree2.remove(Arrays.asList(0)); // a
   tree.applyOneRemote(mess1);
   tree.applyOneRemote(mess4);
   tree.applyOneRemote(mess5);
   tree.applyOneRemote(mess6);
   tree.applyOneRemote(mess3);
   tree.applyOneRemote(mess7);
   tree.applyOneRemote(mess8);
   tree.applyOneRemote(mess2);
   assertEquals("null", tree.getRoot().nodetail());
   assertEquals("null", tree2.getRoot().nodetail());
   long sa1 = sdc.serializ(tree);
   long sa2 = sdc.serializ(tree2);
   assertEquals(s3, sa1);
   assertEquals(s3, sa2);
 }
  @Test
  public void addTest() {

    assertEquals("null{a{d,e{f,},},b,c{g,h,},}", tree.getRoot().nodetail());
    assertEquals("null{a{d,e{f,},},b,c{g,h,},}", tree2.getRoot().nodetail());
  }
 @Before
 public void setUp() throws PreconditionException {
   tree = new FCTreeGf();
   tree2 = new FCTreeGf();
   tree3 = new FCTreeGf();
   tree.setReplicaNumber(1);
   tree2.setReplicaNumber(2);
   tree3.setReplicaNumber(3);
   CRDTMessage mess1 = tree.add(new ArrayList(), 0, "a");
   CRDTMessage mess2 = tree.add(new ArrayList(), 1, "b");
   CRDTMessage mess3 = tree.add(new ArrayList(), 2, "c");
   CRDTMessage mess4 = tree.add(Arrays.asList(0), 0, "d");
   CRDTMessage mess5 = tree.add(Arrays.asList(0), 1, "e");
   CRDTMessage mess6 = tree.add(Arrays.asList(0, 1), 1, "f");
   CRDTMessage mess7 = tree.add(Arrays.asList(2), 0, "g");
   CRDTMessage mess8 = tree.add(Arrays.asList(2), 1, "h");
   tree2.applyOneRemote(mess1);
   tree2.applyOneRemote(mess4);
   tree2.applyOneRemote(mess5);
   tree2.applyOneRemote(mess6);
   tree2.applyOneRemote(mess3);
   tree2.applyOneRemote(mess7);
   tree2.applyOneRemote(mess8);
   tree2.applyOneRemote(mess2);
 }