package org.basex.local.single; import static org.junit.Assert.*; import java.util.*; import java.util.List; import org.basex.*; import org.basex.core.*; import org.basex.core.cmd.*; import org.junit.*; import org.junit.Test; import org.junit.runner.*; import org.junit.runners.*; import org.junit.runners.Parameterized.Parameters; /** * This test class performs some incremental updates. * * @author BaseX Team 2005-17, BSD License * @author Christian Gruen */ @RunWith(Parameterized.class) public final class UpdIndexTest extends SandboxTest { /** * Test parameters. * @return parameters */ @Parameters public static List<Object[]> params() { return Arrays.asList(new Object[][] { { false, false }, { true, false }, { false, true }, { true, true } }); } /** Number of steps. */ private static final int STEPS = 10; /** Maximum number of entries. */ private static final int MAX = 2000 / STEPS; /** Incremental index update flag. */ private final boolean updindex; /** Main memory flag. */ private final boolean mainmem; /** * Constructor. * @param updindex incremental index update flag. * @param mainmem main memory flag */ public UpdIndexTest(final boolean updindex, final boolean mainmem) { this.updindex = updindex; this.mainmem = mainmem; } /** * Initializes the test. */ @Before public void init() { set(MainOptions.UPDINDEX, updindex); set(MainOptions.MAINMEM, mainmem); execute(new CreateDB(NAME, "<xml/>")); set(MainOptions.AUTOFLUSH, false); set(MainOptions.TOKENINDEX, true); } /** * Finishes the test. */ @After public void finish() { set(MainOptions.TOKENINDEX, false); execute(new DropDB(NAME)); } /** * Incremental test. */ @Test public void insertInto() { for(int a = 0; a < STEPS; a++) { final int n = MAX * a; for(int i = 0; i < n; i++) query("insert node <x/> into /*"); query("count(//x)", n); query("delete node //x"); query("count(//x)", 0); } } /** * Incremental test. */ @Test public void insertBefore() { for(int a = 0; a < STEPS; a++) { final int n = MAX * a; for(int i = 0; i < n; i++) { query("insert node <x/> before /*[1]"); } query("count(//x)", n); query("delete node //x"); query("count(//x)", 0); } } /** * Incremental test. */ @Test public void insertAfter() { for(int a = 0; a < STEPS; a++) { final int n = MAX * a; for(int i = 0; i < n; i++) { query("insert node <x/> after /*[last()]"); } query("count(//x)", n); query("delete node //x"); query("count(//x)", 0); } } /** * Incremental test. */ @Test public void insertDeep() { for(int a = 0; a < STEPS; a++) { final int n = MAX * a; for(int i = 0; i < n; i++) { query("insert node <x/> into //*[not(*)]"); } query("count(//x)", n); query("delete node //x"); query("count(//x)", 0); } } /** * Incremental test. */ @Test public void replaceValue() { final Random rnd = new Random(); final StringBuilder sb = new StringBuilder(); for(int i = 0; i < MAX * STEPS; i++) { final char ch = (char) ('@' + (rnd.nextInt() & 0x1F)); sb.append(ch == '@' ? ' ' : ch); query("replace value of node /* with '" + sb + '\''); query("string-length(/*)", sb.length()); } } /** * Checks if a query yields the specified string. * @param query query to be run * @param result query result */ static void query(final String query, final Object result) { assertEquals(result.toString(), query(query)); } }