/** * 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.mahout.math; import org.junit.Test; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInput; import java.io.DataInputStream; import java.io.DataOutput; import java.io.DataOutputStream; /** * Tests {@link Varint}. */ public final class VarintTest extends MahoutTestCase { @Test public void testUnsignedLong() throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutput out = new DataOutputStream(baos); Varint.writeUnsignedVarLong(0L, out); for (long i = 1L; i > 0L && i <= (1L << 62); i <<= 1) { Varint.writeUnsignedVarLong(i-1, out); Varint.writeUnsignedVarLong(i, out); } Varint.writeUnsignedVarLong(Long.MAX_VALUE, out); DataInput in = new DataInputStream(new ByteArrayInputStream(baos.toByteArray())); assertEquals(0L, Varint.readUnsignedVarLong(in)); for (long i = 1L; i > 0L && i <= (1L << 62); i <<= 1) { assertEquals(i-1, Varint.readUnsignedVarLong(in)); assertEquals(i, Varint.readUnsignedVarLong(in)); } assertEquals(Long.MAX_VALUE, Varint.readUnsignedVarLong(in)); } @Test public void testSignedPositiveLong() throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutput out = new DataOutputStream(baos); Varint.writeSignedVarLong(0L, out); for (long i = 1L; i <= (1L << 61); i <<= 1) { Varint.writeSignedVarLong(i-1, out); Varint.writeSignedVarLong(i, out); } Varint.writeSignedVarLong((1L << 62) - 1, out); Varint.writeSignedVarLong((1L << 62), out); Varint.writeSignedVarLong(Long.MAX_VALUE, out); DataInput in = new DataInputStream(new ByteArrayInputStream(baos.toByteArray())); assertEquals(0L, Varint.readSignedVarLong(in)); for (long i = 1L; i <= (1L << 61); i <<= 1) { assertEquals(i-1, Varint.readSignedVarLong(in)); assertEquals(i, Varint.readSignedVarLong(in)); } assertEquals((1L << 62) - 1, Varint.readSignedVarLong(in)); assertEquals((1L << 62), Varint.readSignedVarLong(in)); assertEquals(Long.MAX_VALUE, Varint.readSignedVarLong(in)); } @Test public void testSignedNegativeLong() throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutput out = new DataOutputStream(baos); for (long i = -1L; i >= -(1L << 62); i <<= 1) { Varint.writeSignedVarLong(i, out); Varint.writeSignedVarLong(i+1, out); } Varint.writeSignedVarLong(Long.MIN_VALUE, out); Varint.writeSignedVarLong(Long.MIN_VALUE+1, out); DataInput in = new DataInputStream(new ByteArrayInputStream(baos.toByteArray())); for (long i = -1L; i >= -(1L << 62); i <<= 1) { assertEquals(i, Varint.readSignedVarLong(in)); assertEquals(i+1, Varint.readSignedVarLong(in)); } assertEquals(Long.MIN_VALUE, Varint.readSignedVarLong(in)); assertEquals(Long.MIN_VALUE+1, Varint.readSignedVarLong(in)); } @Test public void testUnsignedInt() throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutput out = new DataOutputStream(baos); Varint.writeUnsignedVarInt(0, out); for (int i = 1; i > 0 && i <= (1 << 30); i <<= 1) { Varint.writeUnsignedVarLong(i-1, out); Varint.writeUnsignedVarLong(i, out); } Varint.writeUnsignedVarLong(Integer.MAX_VALUE, out); DataInput in = new DataInputStream(new ByteArrayInputStream(baos.toByteArray())); assertEquals(0, Varint.readUnsignedVarInt(in)); for (int i = 1; i > 0 && i <= (1 << 30); i <<= 1) { assertEquals(i-1, Varint.readUnsignedVarInt(in)); assertEquals(i, Varint.readUnsignedVarInt(in)); } assertEquals(Integer.MAX_VALUE, Varint.readUnsignedVarInt(in)); } @Test public void testSignedPositiveInt() throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutput out = new DataOutputStream(baos); Varint.writeSignedVarInt(0, out); for (int i = 1; i <= (1 << 29); i <<= 1) { Varint.writeSignedVarLong(i-1, out); Varint.writeSignedVarLong(i, out); } Varint.writeSignedVarInt((1 << 30) - 1, out); Varint.writeSignedVarInt((1 << 30), out); Varint.writeSignedVarInt(Integer.MAX_VALUE, out); DataInput in = new DataInputStream(new ByteArrayInputStream(baos.toByteArray())); assertEquals(0, Varint.readSignedVarInt(in)); for (int i = 1; i <= (1 << 29); i <<= 1) { assertEquals(i-1, Varint.readSignedVarInt(in)); assertEquals(i, Varint.readSignedVarInt(in)); } assertEquals((1L << 30) - 1, Varint.readSignedVarInt(in)); assertEquals((1L << 30), Varint.readSignedVarInt(in)); assertEquals(Integer.MAX_VALUE, Varint.readSignedVarInt(in)); } @Test public void testSignedNegativeInt() throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutput out = new DataOutputStream(baos); for (int i = -1; i >= -(1 << 30); i <<= 1) { Varint.writeSignedVarInt(i, out); Varint.writeSignedVarInt(i+1, out); } Varint.writeSignedVarInt(Integer.MIN_VALUE, out); Varint.writeSignedVarInt(Integer.MIN_VALUE+1, out); DataInput in = new DataInputStream(new ByteArrayInputStream(baos.toByteArray())); for (int i = -1; i >= -(1 << 30); i <<= 1) { assertEquals(i, Varint.readSignedVarInt(in)); assertEquals(i+1, Varint.readSignedVarInt(in)); } assertEquals(Integer.MIN_VALUE, Varint.readSignedVarInt(in)); assertEquals(Integer.MIN_VALUE+1, Varint.readSignedVarInt(in)); } @Test public void testUnsignedSize() throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutput out = new DataOutputStream(baos); int expectedSize = 0; for (int exponent = 0; exponent <= 62; exponent++) { Varint.writeUnsignedVarLong(1L << exponent, out); expectedSize += 1 + exponent / 7; assertEquals(expectedSize, baos.size()); } } @Test public void testSignedSize() throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutput out = new DataOutputStream(baos); int expectedSize = 0; for (int exponent = 0; exponent <= 61; exponent++) { Varint.writeSignedVarLong(1L << exponent, out); expectedSize += 1 + ((exponent + 1) / 7); assertEquals(expectedSize, baos.size()); } for (int exponent = 0; exponent <= 61; exponent++) { Varint.writeSignedVarLong(-(1L << exponent)-1, out); expectedSize += 1 + ((exponent + 1) / 7); assertEquals(expectedSize, baos.size()); } } }