VarProviderCloneHookTest.java

/*******************************************************************************
 * Copyright (c) 2025 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.query.algebra;

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

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.eclipse.rdf4j.model.ValueFactory;
import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
import org.junit.jupiter.api.Test;

class VarProviderCloneHookTest {

	private final ValueFactory vf = SimpleValueFactory.getInstance();

	@Test
	void clonePreservesProviderSpecificState() {
		Var var = Var.of("x", vf.createLiteral("v"), false, false);
		KindAwareVar kinded = assertInstanceOf(KindAwareVar.class, var);

		kinded.setKind("special");

		Var cloned = kinded.clone();
		KindAwareVar clonedKinded = assertInstanceOf(KindAwareVar.class, cloned);

		assertEquals("special", clonedKinded.getKind(), "clone must retain provider-managed state");
		assertEquals(kinded, cloned, "clone should be equal to original when provider state matches");
		assertEquals(kinded.hashCode(), cloned.hashCode(), "hash codes should match when provider state matches");

		Set<Var> vars = new HashSet<>();
		vars.add(kinded);
		vars.add(cloned);
		assertEquals(1, vars.size(), "HashSet should treat clone as duplicate");

		Map<Var, String> map = new HashMap<>();
		map.put(kinded, "payload");
		assertEquals("payload", map.get(cloned), "Map lookup via clone should succeed");
	}

	@Test
	void defaultBehaviorStillUsesNameValueAndFlags() {
		Var first = Var.of("y", vf.createLiteral("v"), false, false);
		Var second = Var.of("y", vf.createLiteral("v"), false, false);

		assertEquals(first, second, "default provider behavior should remain compatible");
		assertEquals(first.hashCode(), second.hashCode(), "hashCode compatibility must remain intact");

		Var cloned = first.clone();
		assertTrue(first.equals(cloned) && cloned.equals(first), "clones must remain equal under default state");
	}
}