BindingSetSerializerTest.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.util.function.BiConsumer;
import java.util.function.Function;
import java.util.function.Predicate;

import org.eclipse.rdf4j.model.Value;
import org.eclipse.rdf4j.model.ValueFactory;
import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
import org.eclipse.rdf4j.query.BindingSet;
import org.eclipse.rdf4j.query.MutableBindingSet;
import org.eclipse.rdf4j.query.impl.MapBindingSet;
import org.junit.jupiter.api.Test;
import org.mapdb.DataInput2;
import org.mapdb.DataOutput2;

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

	@Test
	void noBinding() throws IOException {
		BindingSet toSerialize = new MapBindingSet();
		final BindingSetSerializer valueSerializer = createSerializer();
		final BindingSet deserialized = serializeDeserialize(toSerialize, valueSerializer);
		assertEquals(toSerialize, deserialized);
	}

	@Test
	void oneBinding() throws IOException {
		MapBindingSet toSerialize = new MapBindingSet();
		toSerialize.setBinding("a", vf.createLiteral(1));
		final BindingSetSerializer valueSerializer = createSerializer();
		final BindingSet deserialized = serializeDeserialize(toSerialize, valueSerializer);
		assertEquals(toSerialize, deserialized);
	}

	@Test
	void twoBinding() throws IOException {
		MapBindingSet toSerialize = new MapBindingSet();
		toSerialize.setBinding("a", vf.createLiteral(1));
		toSerialize.setBinding("v", vf.createLiteral(1));
		final BindingSetSerializer valueSerializer = createSerializer();
		final BindingSet deserialized = serializeDeserialize(toSerialize, valueSerializer);
		assertEquals(toSerialize, deserialized);
	}

	@Test
	void secondBindingIri() throws IOException {
		final BindingSetSerializer valueSerializer = createSerializer();

		MapBindingSet toSerialize = new MapBindingSet();
		toSerialize.setBinding("a", vf.createLiteral(1));
		toSerialize.setBinding("v", vf.createIRI("http://example.org/lala"));
		BindingSet deserialized = serializeDeserialize(toSerialize, valueSerializer);
		assertEquals(toSerialize, deserialized);
	}

	@Test
	void multipleNumbersOfBindingsIri() throws IOException {
		final BindingSetSerializer valueSerializer = createSerializer();

		MapBindingSet toSerialize = new MapBindingSet();
		toSerialize.setBinding("a", vf.createLiteral(1));
		toSerialize.setBinding("v", vf.createIRI("http://example.org/lala"));
		BindingSet deserialized = serializeDeserialize(toSerialize, valueSerializer);
		assertEquals(toSerialize, deserialized);

		toSerialize = new MapBindingSet();
		toSerialize.setBinding("a", vf.createLiteral(2));
		deserialized = serializeDeserialize(toSerialize, valueSerializer);
		assertEquals(toSerialize, deserialized);

		toSerialize = new MapBindingSet();
		toSerialize.setBinding("a", vf.createLiteral(1));
		toSerialize.setBinding("b", vf.createLiteral(4));
		toSerialize.setBinding("c", vf.createLiteral(1));
		deserialized = serializeDeserialize(toSerialize, valueSerializer);
		assertEquals(toSerialize, deserialized);
	}

	private BindingSet serializeDeserialize(BindingSet oneInt, BindingSetSerializer valueSerializer)
			throws IOException {

		final DataOutput2 dataOutput2 = new DataOutput2();
		valueSerializer.serialize(dataOutput2, oneInt);

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

	private BindingSetSerializer createSerializer() {
		Function<String, Predicate<BindingSet>> getHas = (n) -> {
			return (b) -> b.hasBinding(n);
		};
		Function<String, Function<BindingSet, Value>> getGet = (n) -> {
			return (b) -> b.getValue(n);
		};
		Function<String, BiConsumer<Value, MutableBindingSet>> getSet = (n) -> {
			return (v, b) -> b.setBinding(n, v);
		};
		final BindingSetSerializer valueSerializer = new BindingSetSerializer(new ValueSerializer(vf),
				MapBindingSet::new, getHas, getGet, getSet);
		return valueSerializer;
	}
}