package tests.formulas.meta;

import static org.junit.jupiter.api.Assertions.*;
import static tests.Utils.*;

import org.junit.jupiter.api.Test;

import models.algebra.Variable;
import models.formulas.DependencyFormula;
import models.formulas.EquationFormula;
import models.formulas.meta.MetaDependencyFormula;
import models.formulas.meta.MetaEquationFormula;
import models.terms.Dependency;
import models.terms.DependencyTerm;
import models.terms.EvaluatableTerm;
import models.terms.Resource;
import models.terms.meta.MetaEvaluatableTermVariable;
import models.terms.meta.MetaRDLTerm;
import models.terms.meta.MetaResource;

public class MetaEquationFormulaTest {

	@Test
	void MetaEquationFormulaMatchingTest() {
		
		Resource a = new Resource("a", INT, 0);
		Resource b = new Resource("b", INT, 0);
		Resource c = new Resource("c", INT, 0);
		Resource d = new Resource("d", INT, 0);
		EvaluatableTerm te1 = new DependencyTerm(a, b, c);
		EvaluatableTerm te2 = new DependencyTerm(a, b, d);
		EquationFormula formula = new EquationFormula(te1, te2);
		
		
		MetaEvaluatableTermVariable se = new MetaEvaluatableTermVariable(new Variable("se"));
		MetaResource v = new MetaResource(new Variable("v"));
		MetaEvaluatableTermVariable te = new MetaEvaluatableTermVariable(new Variable("te"));
		MetaEvaluatableTermVariable ue = new MetaEvaluatableTermVariable(new Variable("ue"));
		MetaRDLTerm left = new MetaRDLTerm(se, v, te);
		MetaRDLTerm right = new MetaRDLTerm(se, v, ue);
		MetaEquationFormula metaFormula = new MetaEquationFormula(left, right);
		
		// [a : b -> c] = [a : b -> d] matches [se : v -> te] = [se : v -> ue]
		assertTrue(metaFormula.isMatchedBy(formula));
		
	}
	
	@Test
	void MetaDependencyFormulaMatchingTest() {
		Resource a = new Resource("a", INT, 0);
		Resource b = new Resource("b", INT, 0);
		Resource c = new Resource("c", INT, 0);
		EvaluatableTerm te1 = new DependencyTerm(a, b, c);
		Resource d = new Resource("d", INT, 0);
		Dependency d1 = new Dependency(te1, d);
		DependencyFormula depF = new DependencyFormula(d1);
		
		MetaEvaluatableTermVariable te = new MetaEvaluatableTermVariable(new Variable("te"));
		MetaResource w = new MetaResource(new Variable("w"));
		MetaRDLTerm dep = new MetaRDLTerm(te, w);
		MetaDependencyFormula metaDepF = new MetaDependencyFormula(dep);
		
		//[a : b -> c] : d matches te : w
		assertTrue(metaDepF.isMatchedBy(depF));
	}
	
}
