package org.basex.data; import static org.junit.Assert.*; import java.io.*; 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 UpdateTextTest extends DataUpdateTest { /** * Tests insert as last child. * @throws IOException I/O exception */ @Test public void insertTextAsOnly1() throws IOException { final Data data = context.data(); final int nextid = data.meta.lastid; insertText(3, 0, T_JUNIT, Data.TEXT); assertEquals(size + 1, data.meta.size); assertEquals(3, data.parent(4, Data.TEXT)); 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.atom(4)); reload(); assertEquals(size + 1, data.meta.size); assertEquals(3, data.parent(4, Data.TEXT)); 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.atom(4)); } /** * Tests insert as last child. * @throws IOException I/O exception */ @Test public void insertTextAsOnly2() throws IOException { final Data data = context.data(); final int nextid = data.meta.lastid; insertText(3, 1, T_JUNIT, Data.TEXT); assertEquals(size + 1, data.meta.size); assertEquals(3, data.parent(4, Data.TEXT)); 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.atom(4)); reload(); assertEquals(size + 1, data.meta.size); assertEquals(3, data.parent(4, Data.TEXT)); 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.atom(4)); } /** * Tests insert as last child. * @throws IOException I/O exception */ @Test public void insertTextAsOnly3() throws IOException { final Data data = context.data(); final int nextid = data.meta.lastid; insertText(3, 2, T_JUNIT, Data.TEXT); assertEquals(size + 1, data.meta.size); assertEquals(3, data.parent(4, Data.TEXT)); 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.atom(4)); reload(); assertEquals(size + 1, data.meta.size); assertEquals(3, data.parent(4, Data.TEXT)); 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.atom(4)); } /** * Tests insert as last child. * @throws IOException I/O exception */ @Test public void insertTextAfterAttsAsFirst() throws IOException { final Data data = context.data(); final int nextid = data.meta.lastid; insertText(6, 1, T_JUNIT, Data.TEXT); assertEquals(size + 1, data.meta.size); assertEquals(Data.TEXT, data.kind(9)); assertEquals(6, data.parent(9, Data.TEXT)); assertArraysEquals(T_JUNIT, data.atom(9)); 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.TEXT, data.kind(9)); assertEquals(6, data.parent(9, Data.TEXT)); assertArraysEquals(T_JUNIT, data.atom(9)); 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 insertTextAfterAttsAsSecond() throws IOException { final Data data = context.data(); final int nextid = data.meta.lastid; insertText(6, 2, T_JUNIT, Data.TEXT); assertEquals(size + 1, data.meta.size); assertEquals(Data.ELEM, data.kind(9)); assertArraysEquals(T_JUNIT, data.atom(11)); assertEquals(6, data.parent(11, Data.TEXT)); 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.atom(11)); assertEquals(6, data.parent(11, Data.TEXT)); 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 insertTextAfterAttsAsLast() throws IOException { final Data data = context.data(); final int nextid = data.meta.lastid; insertText(6, 0, T_JUNIT, Data.TEXT); assertEquals(size + 1, data.meta.size); assertEquals(Data.ELEM, data.kind(9)); assertArraysEquals(T_JUNIT, data.atom(11)); assertEquals(6, data.parent(11, Data.TEXT)); 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.atom(11)); assertEquals(6, data.parent(11, Data.TEXT)); assertEquals(6, data.parent(9, Data.ELEM)); assertEquals(4, data.parent(12, Data.ELEM)); assertEquals(nextid + 1, data.meta.lastid); } /** * Tests insert text before text. * @throws IOException I/O exception */ @Test(expected = IOException.class) public void insertTextBeforeText() throws IOException { insertText(9, 1, T_FOO, Data.TEXT); } /** * Tests insert text before text. * @throws IOException I/O exception */ @Test(expected = IOException.class) public void insertTextAfterTextAsSecond() throws IOException { insertText(9, 2, T_FOO, Data.TEXT); } /** * Tests insert text before text. * @throws IOException I/O exception */ @Test(expected = IOException.class) public void insertTextAfterTextAsLast() throws IOException { insertText(9, 0, T_FOO, Data.TEXT); } /** * Tests updateText. * @throws IOException I/O exception */ @Test public void updateText() throws IOException { final Data data = context.data(); data.startUpdate(context.options); data.update(10, Data.TEXT, T_JUNIT); data.finishUpdate(context.options); assertEquals(Data.TEXT, data.kind(10)); assertArraysEquals(T_JUNIT, data.text(10, true)); reload(); assertEquals(Data.TEXT, data.kind(10)); assertArraysEquals(T_JUNIT, data.text(10, true)); } /** * Inserts a value in the database. * @param par parent node * @param pos inserting position * @param val value to be inserted * @param kind node kind * @throws IOException I/O exception */ private static void insertText(final int par, final int pos, final byte[] val, final byte kind) throws IOException { final Data data = context.data(); int pre = par; int k = data.kind(pre); if(pos == 0) { pre += data.size(pre, k); } else { pre += data.attSize(pre, k); for(int p = 1; p < pos && data.parent(pre, k) == par; pre += data.size(pre, k), ++p) k = data.kind(pre); } if(kind == Data.TEXT && (data.kind(pre) == Data.TEXT || data.parent(pre - 1, data.kind(pre - 1)) == par && data.kind(pre - 1) == Data.TEXT)) throw new IOException("May not insert TEXT before/after TEXT!"); final MemData md = new MemData(context.options); md.text(pre - par, val, kind); md.insert(0); data.startUpdate(context.options); data.insert(pre, par, new DataClip(md)); data.finishUpdate(context.options); } }