/*
* Copyright 2017 MongoDB, Inc.
*
* 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 org.bson.codecs;
import org.bson.BsonBinaryReader;
import org.bson.BsonBinaryWriter;
import org.bson.BsonWriter;
import org.bson.ByteBufNIO;
import org.bson.codecs.configuration.CodecRegistry;
import org.bson.io.BasicOutputBuffer;
import org.bson.io.ByteBufferBsonInput;
import org.bson.io.OutputBuffer;
import org.junit.Assert;
import java.nio.ByteBuffer;
import static java.util.Arrays.asList;
import static org.bson.codecs.configuration.CodecRegistries.fromProviders;
abstract class CodecTestCase {
abstract DocumentCodecProvider getDocumentCodecProvider();
CodecRegistry getRegistry() {
return fromProviders(asList(new ValueCodecProvider(), getDocumentCodecProvider()));
}
@SuppressWarnings("unchecked")
<T> void roundTrip(final T value) {
Codec<T> codec = (Codec<T>) getRegistry().get(value.getClass());
OutputBuffer encoded = encode(codec, value);
Assert.assertEquals("Codec Round Trip", value, decode(codec, encoded));
}
<T> OutputBuffer encode(final Codec<T> codec, final T value) {
OutputBuffer buffer = new BasicOutputBuffer();
BsonWriter writer = new BsonBinaryWriter(buffer);
codec.encode(writer, value, EncoderContext.builder().build());
return buffer;
}
<T> T decode(final Codec<T> codec, final OutputBuffer buffer) {
BsonBinaryReader reader = new BsonBinaryReader(new ByteBufferBsonInput(new ByteBufNIO(ByteBuffer.wrap(buffer.toByteArray()))));
return codec.decode(reader, DecoderContext.builder().build());
}
}