package org.basex.local.single; import static org.basex.query.func.Function.*; 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.basex.util.*; import org.basex.util.list.*; import org.junit.*; import org.junit.Test; import org.junit.runner.*; import org.junit.runners.*; import org.junit.runners.Parameterized.*; /** * This test class performs random incremental updates with random documents. * * @author BaseX Team 2005-17, BSD License * @author Christian Gruen */ @RunWith(Parameterized.class) public final class UpdIndexRandomTest extends SandboxTest { /** Number of different documents. */ private static final int DOCS = 20; /** Number of runs. */ private static final int RUNS = 500; /** * Test parameters. * @return parameters */ @Parameters public static List<Object[]> params() { return Arrays.asList(new Object[][] { { false }, { true } }); } /** Main memory flag. */ private final boolean mainmem; /** * Constructor. * @param mainmem main memory flag */ public UpdIndexRandomTest(final boolean mainmem) { this.mainmem = mainmem; } /** * Initializes the test. */ @Before public void init() { set(MainOptions.MAINMEM, mainmem); set(MainOptions.UPDINDEX, true); set(MainOptions.ATTRINDEX, false); execute(new CreateDB(NAME)); } /** * Incremental test. */ @Test public void insertInto() { final Random rnd = new Random(0); // create random words final int cap = 1000; final StringList words = new StringList(cap); for(int w = 0; w < cap; w++) { final int r = 1 + rnd.nextInt(10); final TokenBuilder tmp = new TokenBuilder(r); for(int i = 0; i < r; i++) tmp.add('A' + rnd.nextInt(26)); words.add(tmp.toString()); } for(int r = 0; r < RUNS; r++) { final String path = "doc" + rnd.nextInt(DOCS); // create random document final TokenBuilder doc = new TokenBuilder("<xml>"); final int offset = rnd.nextInt(cap - DOCS); for(int i = 0; i < DOCS; i++) doc.add("<a>").add(words.get(offset + i)).add("</a>"); doc.add("</xml>"); execute(new Replace(path, doc.toString())); for(int d = 0; d < DOCS; d++) { final String word = words.get(offset + d); final String query = _DB_OPEN.args(NAME, path) + "//a[text() = '" + word + "']"; final String expected = "<a>" + word + "</a>"; final String result = query(query); if(!result.startsWith(expected)) { fail(new TokenBuilder("\nExpected: " + expected + "\nResult: " + result + "\nRun: " + r + "\nDoc: " + d + "\nQuery: " + query + "\nDocument: " + doc).toString()); } } } } }