ValueSerializerTest.java

/*******************************************************************************
 * Copyright (c) 2023 Eclipse RDF4J contributors.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Distribution License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 *******************************************************************************/
package org.eclipse.rdf4j.collection.factory.mapdb;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;

import org.eclipse.rdf4j.model.IRI;
import org.eclipse.rdf4j.model.Literal;
import org.eclipse.rdf4j.model.Value;
import org.eclipse.rdf4j.model.ValueFactory;
import org.eclipse.rdf4j.model.base.CoreDatatype;
import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
import org.junit.jupiter.api.Test;
import org.mapdb.DataInput2;
import org.mapdb.DataOutput2;

public class ValueSerializerTest {
	private static final ValueFactory vf = SimpleValueFactory.getInstance();

	@Test
	void literalOneInt() throws IOException {
		Literal oneInt = vf.createLiteral(1);
		Value doneInt = serializeDeserialize(oneInt);
		assertEquals(oneInt, doneInt);
	}

	@Test
	void literalOneIntCoreDatatype() throws IOException {
		Literal oneInt = vf.createLiteral("1", CoreDatatype.XSD.INT);
		Value doneInt = serializeDeserialize(oneInt);
		assertEquals(oneInt, doneInt);
	}

	@Test
	void literalTwoInt() throws IOException {
		Literal twoInt = vf.createLiteral(2);
		Value dTwoInt = serializeDeserialize(twoInt);
		assertEquals(twoInt, dTwoInt);
	}

	@Test
	void literalTwoFloat() throws IOException {
		Literal toSerialize = vf.createLiteral(2.0f);
		Value deserialized = serializeDeserialize(toSerialize);
		assertEquals(toSerialize, deserialized);
	}

	@Test
	void literalTwoDouble() throws IOException {
		Literal toSerialize = vf.createLiteral(2.0d);
		Value deserialized = serializeDeserialize(toSerialize);
		assertEquals(toSerialize, deserialized);
	}

	@Test
	void literalTwoBigInteger() throws IOException {
		Literal toSerialize = vf.createLiteral(BigInteger.valueOf(20000000));
		Value deserialized = serializeDeserialize(toSerialize);
		assertEquals(toSerialize, deserialized);
	}

	@Test
	void literalTwoBigDecimal() throws IOException {
		Literal toSerialize = vf.createLiteral(BigDecimal.valueOf(20000030.3443));
		Value deserialized = serializeDeserialize(toSerialize);
		assertEquals(toSerialize, deserialized);
	}

	@Test
	void iriExampleOrg() throws IOException {
		Value toSerialize = vf.createIRI("https://example.org/lala");
		Value deserialized = serializeDeserialize(toSerialize);
		assertEquals(toSerialize, deserialized);
	}

	@Test
	void tripleOfExampleOrg() throws IOException {
		final IRI iri = vf.createIRI("https://example.org/lala");
		Value toSerialize = vf.createTriple(iri, iri, iri);
		Value deserialized = serializeDeserialize(toSerialize);
		assertEquals(toSerialize, deserialized);
	}

	@Test
	void bnode() throws IOException {
		Value toSerialize = vf.createBNode("111");
		Value deserialized = serializeDeserialize(toSerialize);
		assertEquals(toSerialize, deserialized);
	}

	@Test
	void newCoreDatatype() throws IOException {
		CoreDatatype n = new CoreDatatype() {

			@Override
			public IRI getIri() {
				return vf.createIRI("https://example.org/lala");
			}

		};
		Value toSerialize = vf.createLiteral("111", n);
		Value deserialized = serializeDeserialize(toSerialize);
		assertEquals(toSerialize, deserialized);
	}

	private Value serializeDeserialize(Value oneInt) throws IOException {
		final ValueSerializer valueSerializer = new ValueSerializer(vf);
		final DataOutput2 dataOutput2 = new DataOutput2();
		valueSerializer.serialize(dataOutput2, oneInt);

		final DataInput2 input = new DataInput2.ByteArray(dataOutput2.copyBytes());
		Value doneInt = valueSerializer.deserialize(input, 0);
		return doneInt;
	}
}