package org.apache.lucene.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import org.junit.Test; import org.apache.lucene.util.LuceneTestCase; import org.apache.lucene.util.Vint8; /* * 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. */ /** * Tests the {@link Vint8} class. */ public class Vint8Test extends LuceneTestCase { /** * Tests the position wrapper. * @throws Exception For any reason. */ @Test public void testPosition() throws Exception { Vint8.Position pos = new Vint8.Position(); assertEquals(0, pos.pos); pos = new Vint8.Position(12345); assertEquals(12345, pos.pos); } private static int[] testValues = { -1000000000, -1, 0, (1 << 7) - 1, 1 << 7, (1 << 14) - 1, 1 << 14, (1 << 21) - 1, 1 << 21, (1 << 28) - 1, 1 << 28 }; private static int[] bytesNeededTestValues = { 5, 5, 1, 1, 2, 2, 3, 3, 4, 4, 5 }; /** * Tests the {@code bytesNeeded} method. */ @Test public void testBytesNeeded() { assertEquals(5, Vint8.MAXIMUM_BYTES_NEEDED); for (int j = 0; j < testValues.length; j++) { assertEquals(bytesNeededTestValues[j], Vint8.bytesNeeded(testValues[j])); } } /** * Tests encoding and decoding to and from a stream. */ @Test public void testStreamEncodingAndDecoding() throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(256); int expectedSize = 0; for (int j = 0; j < testValues.length; j++) { Vint8.encode(testValues[j], baos); expectedSize += bytesNeededTestValues[j]; } assertEquals(expectedSize, baos.size()); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); for (int j = 0; j < testValues.length; j++) { assertEquals(testValues[j], Vint8.decode(bais)); } assertEquals(0, bais.available()); } /** * Tests encoding and decoding to and from an array. */ @Test public void testArrayEncodingAndDecoding() throws IOException { byte[] byteArray = new byte[256]; int position = 0, expectedSize = 0; for (int j = 0; j < testValues.length; j++) { position += Vint8.encode(testValues[j], byteArray, position); expectedSize += bytesNeededTestValues[j]; } assertEquals(expectedSize, position); Vint8.Position pos = new Vint8.Position(); for (int j = 0; j < testValues.length; j++) { assertEquals(testValues[j], Vint8.decode(byteArray, pos)); } assertEquals(expectedSize, pos.pos); } /** * The result of encoding the test values with the current algorithm. If these * values are changed to match an algorithm change, compatibility with legacy * data will be broken. */ private static final byte[] encodedTestValues = { -4, -93, -108, -20, 0, -1, -1, -1, -1, 127, 0, 127, -127, 0, -1, 127, -127, -128, 0, -1, -1, 127, -127, -128, -128, 0, -1, -1, -1, 127, -127, -128, -128, -128, 0 }; /** * Tests algorithm. */ @Test public void testLegacyCompatibility() throws IOException { /* To generate the encoded test values: byte[] byteArray = new byte[256]; int position = 0, expectedSize = 0; for (int j = 0; j < testValues.length; j++) { position += Vint8.encode(testValues[j], byteArray, position); expectedSize += bytesNeededTestValues[j]; } assertEquals(expectedSize, position); Vint8.Position pos = new Vint8.Position(); for (int j = 0; j < expectedSize; j++) { System.out.print(byteArray[j] + ", "); } System.out.flush(); pos.pos = 0; */ Vint8.Position pos = new Vint8.Position(); for (int j = 0; j < testValues.length; j++) { assertEquals(testValues[j], Vint8.decode(encodedTestValues, pos)); } } } // end class Vint8Test