/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jena.tdb.base.buffer; import static org.apache.jena.tdb.base.record.RecordLib.intToRecord ; import static org.apache.jena.tdb.base.record.RecordLib.r ; import java.util.Iterator; import java.util.List; import org.apache.jena.atlas.junit.BaseTest ; import org.apache.jena.tdb.base.buffer.BufferException ; import org.apache.jena.tdb.base.buffer.RecordBuffer ; import org.apache.jena.tdb.base.record.Record ; import org.apache.jena.tdb.base.record.RecordFactory ; import org.apache.jena.tdb.base.record.RecordLib ; import org.apache.jena.tdb.sys.SystemTDB ; import org.junit.AfterClass ; import org.junit.BeforeClass; import org.junit.Test; public class TestRecordBuffer extends BaseTest { static RecordFactory recordFactory = new RecordFactory(RecordLib.TestRecordLength, 0) ; static boolean originalNullOut ; @BeforeClass static public void beforeClass() { originalNullOut = SystemTDB.NullOut ; SystemTDB.NullOut = true ; } @AfterClass static public void afterClass() { SystemTDB.NullOut = originalNullOut ; } @Test public void recBuffer01() { RecordBuffer rb = make(4, 4) ; contains(rb, 2, 4, 6, 8) ; } @Test public void recBuffer02() { RecordBuffer rb = make(4, 4) ; int idx = -1 ; idx = find(rb, 6) ; assertEquals(2, idx) ; idx = find(rb, 8) ; assertEquals(3, idx) ; idx = find(rb, 4) ; assertEquals(1, idx) ; idx = find(rb, 2) ; assertEquals(0, idx) ; idx = find(rb, 3) ; assertEquals(-2, idx) ; idx = find(rb, 0) ; assertEquals(-1, idx) ; idx = find(rb, 10) ; assertEquals(-5, idx) ; } // Shift at LHS @Test public void recBuffer03() { RecordBuffer rb = make(4,5) ; contains(rb, 2, 4, 6, 8) ; rb.shiftUp(0) ; rb.set(0, r(0)) ; contains(rb, 0, 2, 4, 6, 8) ; rb.shiftDown(0) ; contains(rb, 2, 4, 6, 8) ; } @Test public void recBuffer04() { RecordBuffer rb = make(4,5) ; contains(rb, 2, 4, 6, 8) ; rb.shiftDown(0) ; contains(rb, 4, 6, 8) ; rb.shiftUp(0) ; rb.set(0,r(1)) ; contains(rb, 1, 4, 6, 8) ; } // Shift at middle @Test public void recBuffer05() { RecordBuffer rb = make(4,5) ; contains(rb, 2, 4, 6, 8) ; rb.shiftUp(2) ; rb.set(2, r(0)) ; contains(rb, 2, 4, 0, 6, 8) ; rb.shiftDown(2) ; contains(rb, 2, 4, 6, 8) ; } @Test public void recBuffer06() { RecordBuffer rb = make(4,5) ; contains(rb, 2, 4, 6, 8) ; rb.shiftDown(2) ; contains(rb, 2, 4, 8) ; rb.shiftUp(2) ; contains(rb, 2, 4, -1, 8) ; } // Shift RHS - out of bounds @Test public void recBuffer07() { RecordBuffer rb = make(4,5) ; contains(rb, 2, 4, 6, 8) ; rb.shiftUp(3) ; rb.set(3, r(1)) ; contains(rb, 2, 4, 6, 1, 8) ; rb.shiftDown(3) ; contains(rb, 2, 4, 6, 8) ; } @Test public void recBuffer08() { RecordBuffer rb = make(4,5) ; contains(rb, 2, 4, 6, 8) ; rb.shiftDown(3) ; contains(rb, 2, 4, 6) ; rb.shiftUp(2) ; contains(rb, 2, 4, -1, 6) ; } // Errors @Test(expected=BufferException.class) public void recBuffer09() { RecordBuffer rb = make(4,5) ; contains(rb, 2, 4, 6, 8) ; rb.shiftDown(4) ; } @Test(expected=BufferException.class) public void recBuffer10() { RecordBuffer rb = make(4,5) ; contains(rb, 2, 4, 6, 8) ; rb.shiftUp(4) ; } @Test(expected=BufferException.class) public void recBuffer11() { RecordBuffer rb = make(5,5) ; contains(rb, 2, 4, 6, 8, 10) ; rb.add(r(12)) ; } // Copy, duplicate, clear @Test public void recBuffer12() { RecordBuffer rb = make(5,5) ; contains(rb, 2, 4, 6, 8, 10) ; RecordBuffer rb2 = rb.duplicate() ; rb2.set(1, r(99)) ; contains(rb, 2, 4, 6, 8, 10) ; contains(rb2, 2, 99, 6, 8, 10) ; } @Test public void recBuffer13() { RecordBuffer rb = make(5,5) ; contains(rb, 2, 4, 6, 8, 10) ; rb.clear(1, 3) ; contains(rb, 2, -1, -1, -1, 10) ; } @Test public void recBuffer14() { RecordBuffer rb = make(5,5) ; contains(rb, 2, 4, 6, 8, 10) ; RecordBuffer rb2 = make(5,5) ; contains(rb2, 2, 4, 6, 8, 10) ; rb.copy(0, rb2, 1, 4) ; contains(rb2, 2, 2, 4, 6, 8) ; } // Remove tests @Test public void recBuffer15() { RecordBuffer rb = make(5,5) ; contains(rb, 2, 4, 6, 8, 10) ; rb.removeTop() ; contains(rb, 2, 4, 6, 8) ; rb.remove(1) ; contains(rb, 2, 6, 8) ; rb.remove(2) ; contains(rb, 2, 6) ; rb.remove(0) ; contains(rb, 6) ; rb.remove(0) ; contains(rb) ; } @Test public void recBufferIterate01() { RecordBuffer rb = make(5,5) ; same(rb.iterator(), 2,4,6,8,10) ; } @Test public void recBufferIterate02() { RecordBuffer rb = make(3,5) ; Iterator<Record> iter = rb.iterator() ; same(iter, 2, 4, 6) ; } @Test public void recBufferIterate03() { RecordBuffer rb = make(3,5) ; Iterator<Record> iter = rb.iterator( intToRecord(4), null) ; same(iter, 4, 6) ; } @Test public void recBufferIterate04() { RecordBuffer rb = make(3,5) ; Iterator<Record> iter = rb.iterator( intToRecord(3), null) ; same(iter, 4, 6) ; } @Test public void recBufferIterate05() { RecordBuffer rb = make(3,5) ; Iterator<Record> iter = rb.iterator( intToRecord(1), null) ; same(iter, 2, 4, 6) ; } @Test public void recBufferIterate06() { RecordBuffer rb = make(3,5) ; Iterator<Record> iter = rb.iterator( null, intToRecord(1)) ; same(iter) ; } @Test public void recBufferIterate07() { RecordBuffer rb = make(3,5) ; Iterator<Record> iter = rb.iterator( null, intToRecord(2)) ; same(iter ) ; } @Test public void recBufferIterate08() { RecordBuffer rb = make(3,5) ; Iterator<Record> iter = rb.iterator( null, intToRecord(3)) ; same(iter,2 ) ; } @Test public void recBufferIterate09() { RecordBuffer rb = make(5,5) ; Iterator<Record> iter = rb.iterator( null, intToRecord(99)) ; same(iter, 2, 4, 6, 8, 10) ; } @Test public void recBufferIterate10() { RecordBuffer rb = make(5,5) ; Iterator<Record> iter = rb.iterator( intToRecord(4), intToRecord(8)) ; same(iter, 4, 6 ) ; } @Test public void recBufferIterate11() { RecordBuffer rb = make(5,5) ; Iterator<Record> iter = rb.iterator( intToRecord(3), intToRecord(9)) ; same(iter, 4, 6, 8 ) ; } // ---- Support private static void contains(RecordBuffer rb, int... vals) { assertEquals("Length mismatch: ", vals.length, rb.size()) ; for ( int i = 0 ; i < vals.length ; i++ ) if ( vals[i] == -1 ) assertTrue(rb.isClear(i)) ; else { Record r = RecordLib.intToRecord(vals[i]) ; Record r2 = rb.get(i) ; int x = RecordLib.recordToInt(r2) ; assertEquals("Value mismatch: ", vals[i], x) ; } } private static void same(Iterator<Record> iter, int... vals) { List<Integer> list = RecordLib.toIntList(iter) ; assertEquals("Length mismatch: ", vals.length, list.size()) ; for ( int i = 0 ; i < vals.length ; i++ ) { int x = list.get(i) ; assertEquals("Value mismatch: ", vals[i], x) ; } } public int find(RecordBuffer rb, int v) { return rb.find(r(v)) ; } private static RecordBuffer make(int n, int len) { RecordBuffer rb = new RecordBuffer(recordFactory, len) ; for ( int i = 0 ; i < n ; i++ ) { Record r = RecordLib.intToRecord(2*i+2) ; rb.add(r) ; } return rb ; } }