173 lines
5.9 KiB
Java
173 lines
5.9 KiB
Java
/*
|
|
* Copyright (C) 2011 The Guava Authors
|
|
*
|
|
* Licensed 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 com.google.common.hash;
|
|
|
|
import static org.mockito.Mockito.inOrder;
|
|
import static org.mockito.Mockito.mock;
|
|
import static org.mockito.Mockito.verify;
|
|
|
|
import com.google.common.base.Charsets;
|
|
import com.google.common.testing.EqualsTester;
|
|
import com.google.common.testing.SerializableTester;
|
|
import java.io.OutputStream;
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.charset.Charset;
|
|
import java.util.Arrays;
|
|
import junit.framework.TestCase;
|
|
import org.mockito.InOrder;
|
|
|
|
/**
|
|
* Tests for HashExtractors.
|
|
*
|
|
* @author Dimitris Andreou
|
|
*/
|
|
public class FunnelsTest extends TestCase {
|
|
public void testForBytes() {
|
|
PrimitiveSink primitiveSink = mock(PrimitiveSink.class);
|
|
Funnels.byteArrayFunnel().funnel(new byte[] {4, 3, 2, 1}, primitiveSink);
|
|
verify(primitiveSink).putBytes(new byte[] {4, 3, 2, 1});
|
|
}
|
|
|
|
public void testForBytes_null() {
|
|
assertNullsThrowException(Funnels.byteArrayFunnel());
|
|
}
|
|
|
|
public void testForStrings() {
|
|
PrimitiveSink primitiveSink = mock(PrimitiveSink.class);
|
|
Funnels.unencodedCharsFunnel().funnel("test", primitiveSink);
|
|
verify(primitiveSink).putUnencodedChars("test");
|
|
}
|
|
|
|
public void testForStrings_null() {
|
|
assertNullsThrowException(Funnels.unencodedCharsFunnel());
|
|
}
|
|
|
|
public void testForStringsCharset() {
|
|
for (Charset charset : Charset.availableCharsets().values()) {
|
|
PrimitiveSink primitiveSink = mock(PrimitiveSink.class);
|
|
Funnels.stringFunnel(charset).funnel("test", primitiveSink);
|
|
verify(primitiveSink).putString("test", charset);
|
|
}
|
|
}
|
|
|
|
public void testForStringsCharset_null() {
|
|
for (Charset charset : Charset.availableCharsets().values()) {
|
|
assertNullsThrowException(Funnels.stringFunnel(charset));
|
|
}
|
|
}
|
|
|
|
public void testForInts() {
|
|
Integer value = 1234;
|
|
PrimitiveSink primitiveSink = mock(PrimitiveSink.class);
|
|
Funnels.integerFunnel().funnel(value, primitiveSink);
|
|
verify(primitiveSink).putInt(1234);
|
|
}
|
|
|
|
public void testForInts_null() {
|
|
assertNullsThrowException(Funnels.integerFunnel());
|
|
}
|
|
|
|
public void testForLongs() {
|
|
Long value = 1234L;
|
|
PrimitiveSink primitiveSink = mock(PrimitiveSink.class);
|
|
Funnels.longFunnel().funnel(value, primitiveSink);
|
|
verify(primitiveSink).putLong(1234);
|
|
}
|
|
|
|
public void testForLongs_null() {
|
|
assertNullsThrowException(Funnels.longFunnel());
|
|
}
|
|
|
|
public void testSequential() {
|
|
@SuppressWarnings({"unchecked", "DoNotMock"})
|
|
Funnel<Object> elementFunnel = mock(Funnel.class);
|
|
PrimitiveSink primitiveSink = mock(PrimitiveSink.class);
|
|
Funnel<Iterable<?>> sequential = Funnels.sequentialFunnel(elementFunnel);
|
|
sequential.funnel(Arrays.asList("foo", "bar", "baz", "quux"), primitiveSink);
|
|
InOrder inOrder = inOrder(elementFunnel);
|
|
inOrder.verify(elementFunnel).funnel("foo", primitiveSink);
|
|
inOrder.verify(elementFunnel).funnel("bar", primitiveSink);
|
|
inOrder.verify(elementFunnel).funnel("baz", primitiveSink);
|
|
inOrder.verify(elementFunnel).funnel("quux", primitiveSink);
|
|
}
|
|
|
|
private static void assertNullsThrowException(Funnel<?> funnel) {
|
|
PrimitiveSink primitiveSink =
|
|
new AbstractStreamingHasher(4, 4) {
|
|
@Override
|
|
protected HashCode makeHash() {
|
|
throw new UnsupportedOperationException();
|
|
}
|
|
|
|
@Override
|
|
protected void process(ByteBuffer bb) {
|
|
while (bb.hasRemaining()) {
|
|
bb.get();
|
|
}
|
|
}
|
|
};
|
|
try {
|
|
funnel.funnel(null, primitiveSink);
|
|
fail();
|
|
} catch (NullPointerException ok) {
|
|
}
|
|
}
|
|
|
|
public void testAsOutputStream() throws Exception {
|
|
PrimitiveSink sink = mock(PrimitiveSink.class);
|
|
OutputStream out = Funnels.asOutputStream(sink);
|
|
byte[] bytes = {1, 2, 3, 4};
|
|
out.write(255);
|
|
out.write(bytes);
|
|
out.write(bytes, 1, 2);
|
|
verify(sink).putByte((byte) 255);
|
|
verify(sink).putBytes(bytes);
|
|
verify(sink).putBytes(bytes, 1, 2);
|
|
}
|
|
|
|
public void testSerialization() {
|
|
assertSame(
|
|
Funnels.byteArrayFunnel(), SerializableTester.reserialize(Funnels.byteArrayFunnel()));
|
|
assertSame(Funnels.integerFunnel(), SerializableTester.reserialize(Funnels.integerFunnel()));
|
|
assertSame(Funnels.longFunnel(), SerializableTester.reserialize(Funnels.longFunnel()));
|
|
assertSame(
|
|
Funnels.unencodedCharsFunnel(),
|
|
SerializableTester.reserialize(Funnels.unencodedCharsFunnel()));
|
|
assertEquals(
|
|
Funnels.sequentialFunnel(Funnels.integerFunnel()),
|
|
SerializableTester.reserialize(Funnels.sequentialFunnel(Funnels.integerFunnel())));
|
|
assertEquals(
|
|
Funnels.stringFunnel(Charsets.US_ASCII),
|
|
SerializableTester.reserialize(Funnels.stringFunnel(Charsets.US_ASCII)));
|
|
}
|
|
|
|
public void testEquals() {
|
|
new EqualsTester()
|
|
.addEqualityGroup(Funnels.byteArrayFunnel())
|
|
.addEqualityGroup(Funnels.integerFunnel())
|
|
.addEqualityGroup(Funnels.longFunnel())
|
|
.addEqualityGroup(Funnels.unencodedCharsFunnel())
|
|
.addEqualityGroup(Funnels.stringFunnel(Charsets.UTF_8))
|
|
.addEqualityGroup(Funnels.stringFunnel(Charsets.US_ASCII))
|
|
.addEqualityGroup(
|
|
Funnels.sequentialFunnel(Funnels.integerFunnel()),
|
|
SerializableTester.reserialize(Funnels.sequentialFunnel(Funnels.integerFunnel())))
|
|
.addEqualityGroup(Funnels.sequentialFunnel(Funnels.longFunnel()))
|
|
.testEquals();
|
|
}
|
|
}
|