package terms.meta;

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

import org.junit.jupiter.api.Test;

import java.util.Set;

import models.algebra.Variable;
import models.terms.DependencyTerm;
import models.terms.RDLTerm;
import models.terms.Resource;
import models.terms.meta.MatchConstraint;
import models.terms.meta.MetaEvaluatableTermVariable;
import models.terms.meta.MetaRDLTerm;
import models.terms.meta.MetaResource;
import utils.Utils;
public class SubstituteTest {
	
	@Test
	void MetaDependencyTermSubstituteTest() {
		MetaResource x = new MetaResource(new Variable("x"));
		MetaResource y = new MetaResource(new Variable("y"));
		MetaEvaluatableTermVariable z =  new MetaEvaluatableTermVariable(new Variable("z"));
		
		
		MetaRDLTerm metaTerm1 = new MetaRDLTerm(x, y, z);
		
		Resource a = new Resource("a", Utils.INT, 1);
		Resource b = new Resource("b", Utils.INT, 1);
		Resource c = new Resource("c", Utils.INT, 1);
		
		DependencyTerm t1 = new DependencyTerm(a, b, c);
		DependencyTerm t2 = new DependencyTerm(a, b, t1);
		
		Set<MatchConstraint> result = metaTerm1.isMatchedBy(t1);
		for (MatchConstraint constraint: result) {
			RDLTerm assignedTerm = metaTerm1.substitute(constraint.getBinding());
			assertEquals(t1, assignedTerm);
		}
		result = metaTerm1.isMatchedBy(t2);
		for (MatchConstraint constraint: result) {
			RDLTerm assignedTerm = metaTerm1.substitute(constraint.getBinding());
			assertEquals(t2, assignedTerm);
		}
	}
	
}
