package inferencerule;
import static org.junit.jupiter.api.Assertions.*;

import java.util.HashSet;
import java.util.Set;

import org.junit.jupiter.api.Test;

import inference.ProofSystem;
import models.formulas.DependencyFormula;
import models.formulas.EquationFormula;
import models.formulas.Formula;
import models.terms.DependencyTerm;
import models.terms.RDLTerm;
import models.terms.Resource;
import utils.Utils;

public class EqualityAxiomTest {
	
	Resource a = new Resource("a", 1);
	Resource b = new Resource("b", 1);
	Resource c = new Resource("c", 1);
	Resource d = new Resource("d", 1);
	Resource e = new Resource("e", 1);
	Resource f = new Resource("f", 1);
	Resource g = new Resource("g", 1);
	Resource h = new Resource("h", 1);
	Resource i = new Resource("i", 1);
	Resource j = new Resource("j", 1);
	Resource k = new Resource("k", 1);
	Resource l = new Resource("l", 1);
	Resource m = new Resource("m", 2);
	Resource n = new Resource("n", 2);
	
	@Test
	void ReflexivityTest() {
		Set<RDLTerm> terms = new HashSet<>();
		terms.add(a);
		terms.add(b);
		Set<Formula> formulas = ProofSystem.reflexivity.apply(new HashSet<>(), terms);
		assertTrue(formulas.contains(new EquationFormula(a, a)));
		assertTrue(formulas.contains(new EquationFormula(b, b)));
	}
	
	@Test
	void SymmetryTest() {
		Set<Formula> formulas = ProofSystem.symmetry.apply(Set.of(new EquationFormula(a, b), new EquationFormula(new DependencyTerm(a, b, c), d)), Set.of());
		assertTrue(formulas.contains(new EquationFormula(b, a)));
		assertTrue(formulas.contains(new EquationFormula(d, new DependencyTerm(a, b, c))));
	}
	
	@Test
	void TransitivityTest() {
		Set<Formula> formulas = ProofSystem.transitivity.apply(Set.of(new EquationFormula(a, b), new EquationFormula(b, c), new EquationFormula(c, d)), Set.of());
		assertTrue(formulas.contains(new EquationFormula(a, c)));
		assertTrue(formulas.contains(new EquationFormula(b, d)));
		assertFalse(formulas.contains(new EquationFormula(a, d)));
	}
	
	@Test
	void RightSubTest() {
		EquationFormula eq1 = new EquationFormula(a, b);
		DependencyFormula d1 = new DependencyFormula(c, d);
		Set<Formula> formulas = ProofSystem.rightSubstitution.apply(Set.of(eq1, d1), Set.of(e, f));
		assertTrue(formulas.isEmpty());
		EquationFormula eq2 = Utils.in(e, d);
		formulas = ProofSystem.rightSubstitution.apply(Set.of(eq1, d1, eq2), Set.of(e, f));
		assertEquals(formulas.size(), 1);
	}
	
	@Test
	void LeftSubTest() {
	}
	
	@Test
	void IdentityTest() {
	}
	
	@Test
	void MapCompositionTest() {
	}
	
	@Test
	void ConstantnessTest() {
		
	}
	
	@Test
	void RightNormalizationTest() {
	}
	
	@Test
	void PseudoConstantnessTest() {
	}
	
	@Test
	void UncurryingTest() {
	}
	
	@Test
	void ArgumentDependencyExtractionTest() {
	}
	
}
