package org.basex.data;
import static org.junit.Assert.*;
import java.io.*;
import org.basex.util.*;
import org.junit.*;
/**
* This class tests the update features of the {@link Data} class.
*
* @author BaseX Team 2005-17, BSD License
* @author Tim Petrowsky
*/
public final class UpdateElementTest extends DataUpdateTest {
/**
* Tests insert as last child.
* @throws IOException I/O exception
*/
@Test
public void insertElementAsOnly1() throws IOException {
final Data data = context.data();
final long nextid = data.meta.lastid;
insertElement(3, 0, T_JUNIT, Data.ELEM);
assertEquals(size + 1, data.meta.size);
assertEquals(3, data.parent(4, Data.ELEM));
assertEquals(Data.ATTR, data.kind(9));
assertEquals(Data.ELEM, data.kind(5));
assertEquals(1, data.parent(5, Data.ELEM));
assertEquals(5, data.parent(6, Data.ELEM));
assertEquals(nextid + 1, data.meta.lastid);
assertArraysEquals(T_JUNIT, data.name(4, Data.ELEM));
reload();
assertEquals(size + 1, data.meta.size);
assertEquals(3, data.parent(4, Data.ELEM));
assertEquals(Data.ATTR, data.kind(9));
assertEquals(1, data.parent(5, Data.ELEM));
assertEquals(5, data.parent(6, Data.ELEM));
assertEquals(nextid + 1, data.meta.lastid);
assertArraysEquals(T_JUNIT, data.name(4, Data.ELEM));
}
/**
* Tests insert as last child.
* @throws IOException I/O exception
*/
@Test
public void insertElementAsOnly2() throws IOException {
final Data data = context.data();
final long nextid = data.meta.lastid;
insertElement(3, 1, T_JUNIT, Data.ELEM);
assertEquals(size + 1, data.meta.size);
assertEquals(3, data.parent(4, Data.ELEM));
assertEquals(Data.ATTR, data.kind(9));
assertEquals(Data.ELEM, data.kind(5));
assertEquals(1, data.parent(5, Data.ELEM));
assertEquals(5, data.parent(6, Data.ELEM));
assertEquals(nextid + 1, data.meta.lastid);
assertArraysEquals(T_JUNIT, data.name(4, Data.ELEM));
reload();
assertEquals(size + 1, data.meta.size);
assertEquals(3, data.parent(4, Data.ELEM));
assertEquals(Data.ATTR, data.kind(9));
assertEquals(1, data.parent(5, Data.ELEM));
assertEquals(5, data.parent(6, Data.ELEM));
assertEquals(nextid + 1, data.meta.lastid);
assertArraysEquals(T_JUNIT, data.name(4, Data.ELEM));
}
/**
* Tests insert as last child.
* @throws IOException I/O exception
*/
@Test
public void insertElementAsOnly3() throws IOException {
final Data data = context.data();
final long nextid = data.meta.lastid;
insertElement(3, 2, T_JUNIT, Data.ELEM);
assertEquals(size + 1, data.meta.size);
assertEquals(3, data.parent(4, Data.ELEM));
assertEquals(Data.ATTR, data.kind(9));
assertEquals(Data.ELEM, data.kind(5));
assertEquals(1, data.parent(5, Data.ELEM));
assertEquals(5, data.parent(6, Data.ELEM));
assertEquals(nextid + 1, data.meta.lastid);
assertArraysEquals(T_JUNIT, data.name(4, Data.ELEM));
reload();
assertEquals(size + 1, data.meta.size);
assertEquals(3, data.parent(4, Data.ELEM));
assertEquals(Data.ATTR, data.kind(9));
assertEquals(1, data.parent(5, Data.ELEM));
assertEquals(5, data.parent(6, Data.ELEM));
assertEquals(nextid + 1, data.meta.lastid);
assertArraysEquals(T_JUNIT, data.name(4, Data.ELEM));
}
/**
* Tests insert as last child.
* @throws IOException I/O exception
*/
@Test
public void insertElementAfterAttsAsFirst() throws IOException {
final Data data = context.data();
final long nextid = data.meta.lastid;
insertElement(6, 1, T_JUNIT, Data.ELEM);
assertEquals(size + 1, data.meta.size);
assertEquals(Data.ELEM, data.kind(9));
assertEquals(6, data.parent(9, Data.ELEM));
assertArraysEquals(T_JUNIT, data.name(9, Data.ELEM));
assertEquals(6, data.parent(10, Data.ELEM));
assertEquals(4, data.parent(12, Data.ELEM));
assertEquals(nextid + 1, data.meta.lastid);
reload();
assertEquals(size + 1, data.meta.size);
assertEquals(Data.ELEM, data.kind(9));
assertEquals(6, data.parent(9, Data.ELEM));
assertArraysEquals(T_JUNIT, data.name(9, Data.ELEM));
assertEquals(6, data.parent(10, Data.ELEM));
assertEquals(4, data.parent(12, Data.ELEM));
assertEquals(nextid + 1, data.meta.lastid);
}
/**
* Tests insert as last child.
* @throws IOException I/O exception
*/
@Test
public void insertElementAfterAttsAsSecond() throws IOException {
final Data data = context.data();
final long nextid = data.meta.lastid;
insertElement(6, 2, T_JUNIT, Data.ELEM);
assertEquals(size + 1, data.meta.size);
assertEquals(Data.ELEM, data.kind(9));
assertArraysEquals(T_JUNIT, data.name(11, Data.ELEM));
assertEquals(6, data.parent(11, Data.ELEM));
assertEquals(6, data.parent(9, Data.ELEM));
assertEquals(4, data.parent(12, Data.ELEM));
assertEquals(nextid + 1, data.meta.lastid);
reload();
assertEquals(size + 1, data.meta.size);
assertEquals(Data.ELEM, data.kind(9));
assertArraysEquals(T_JUNIT, data.name(11, Data.ELEM));
assertEquals(6, data.parent(11, Data.ELEM));
assertEquals(6, data.parent(9, Data.ELEM));
assertEquals(4, data.parent(12, Data.ELEM));
assertEquals(nextid + 1, data.meta.lastid);
}
/**
* Tests insert as last child.
* @throws IOException I/O exception
*/
@Test
public void insertElementAfterAttsAsLast() throws IOException {
final Data data = context.data();
final long nextid = data.meta.lastid;
insertElement(6, 0, T_JUNIT, Data.ELEM);
assertEquals(size + 1, data.meta.size);
assertEquals(Data.ELEM, data.kind(9));
assertArraysEquals(T_JUNIT, data.name(11, Data.ELEM));
assertEquals(6, data.parent(11, Data.ELEM));
assertEquals(6, data.parent(9, Data.ELEM));
assertEquals(4, data.parent(12, Data.ELEM));
assertEquals(nextid + 1, data.meta.lastid);
reload();
assertEquals(size + 1, data.meta.size);
assertEquals(Data.ELEM, data.kind(9));
assertArraysEquals(T_JUNIT, data.name(11, Data.ELEM));
assertEquals(6, data.parent(11, Data.ELEM));
assertEquals(6, data.parent(9, Data.ELEM));
assertEquals(4, data.parent(12, Data.ELEM));
assertEquals(nextid + 1, data.meta.lastid);
}
/**
* Tests updateTagName.
* @throws IOException I/O exception
*/
@Test
public void updateElementName() throws IOException {
final Data data = context.data();
data.startUpdate(context.options);
data.update(6, Data.ELEM, T_JUNIT, Token.EMPTY);
data.finishUpdate(context.options);
assertEquals(Data.ELEM, data.kind(6));
assertArraysEquals(T_JUNIT, data.name(6, Data.ELEM));
reload();
assertEquals(Data.ELEM, data.kind(6));
assertArraysEquals(T_JUNIT, data.name(6, Data.ELEM));
}
/**
* Inserts a tag.
* @param par parent node
* @param pos inserting position
* @param name tag name
* @param kind node kind
* @throws IOException I/O exception
*/
private static void insertElement(final int par, final int pos, final byte[] name, final int kind)
throws IOException {
int root;
final Data data = context.data();
if(pos == 0) {
root = par + data.size(par, kind);
} else {
root = par + data.attSize(par, kind);
int currPos = 1;
while(currPos < pos) {
final int k = data.kind(root);
if(data.parent(root, k) != par) break;
root += data.size(root, k);
++currPos;
}
}
final MemData md = new MemData(context.options);
md.elem(1, md.elemNames.put(name), 1, 1, 0, false);
md.insert(0);
data.startUpdate(context.options);
data.insert(root, par, new DataClip(md));
data.finishUpdate(context.options);
}
}