package terms.meta;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import java.util.HashMap;
import java.util.Map;
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.MetaDependencyTerm;
import models.terms.meta.MetaRDLTerm;
import models.terms.meta.MetaResource;
import models.terms.meta.OrderVariableConstraint;
import utils.Utils;
public class MetaDependencyTermTest {
Resource a = new Resource("a", Utils.INT, 1);
Resource b = new Resource("b", Utils.INT, 1);
Resource c = new Resource("c", Utils.INT, 1);
Resource d = new Resource("d", Utils.INT, 1);
Resource e = new Resource("e", Utils.INT, 1);
Resource f = new Resource("f", Utils.INT, 1);
Resource g = new Resource("g", Utils.INT, 1);
@Test
void MatchTest() {
DependencyTerm t1 = new DependencyTerm(a, b, c, d, e);
DependencyTerm t2 = new DependencyTerm(a, g, f, b, c);
MetaResource x = new MetaResource(new Variable("x"));
MetaResource y = new MetaResource(new Variable("y"));
MetaResource z = new MetaResource(new Variable("z"));
MetaResource w = new MetaResource(new Variable("w"));
MetaResource p = new MetaResource(new Variable("p"));
MetaResource o = new MetaResource(new Variable("o"));
MetaResource n = new MetaResource(new Variable("n"));
MetaRDLTerm mt1 = new MetaDependencyTerm(x, y, z, w, p);
MetaRDLTerm mt2 = new MetaDependencyTerm(x, w, p, y, z);
MetaRDLTerm mt3 = new MetaDependencyTerm(x, p, w, y, z);
MetaRDLTerm mt4 = new MetaDependencyTerm(x, n, o, w, p);
Map<Variable, RDLTerm> binding = new HashMap<>();
Map<Variable, OrderVariableConstraint> orderConstraint = new HashMap<>();
Map<Variable, RDLTerm> correctBinding = new HashMap<>();
correctBinding.put(x.getVariableName(), a);
correctBinding.put(y.getVariableName(), d);
correctBinding.put(z.getVariableName(), e);
correctBinding.put(w.getVariableName(), b);
correctBinding.put(p.getVariableName(), c);
mt4.toString();
Set<MatchConstraint> tmp = mt1.isMatchedBy(t1, new MatchConstraint(binding, orderConstraint));
assertTrue(! tmp.isEmpty());
tmp = mt2.isMatchedBy(t1, tmp);
assertTrue(! tmp.isEmpty());
assertFalse(! mt3.isMatchedBy(t1, tmp).isEmpty());
assertTrue(! mt4.isMatchedBy(t2, tmp).isEmpty());
RDLTerm t = mt1.substitute(tmp.iterator().next().getBinding());
assertEquals(t, t1);
}
@Test
void MatchTest2() {
MetaResource x = new MetaResource(new Variable("x"));
MetaResource y = new MetaResource(new Variable("y"));
MetaResource z = new MetaResource(new Variable("z"));
MetaResource v = new MetaResource(new Variable("v"));
MetaResource w = new MetaResource(new Variable("w"));
MetaResource p = new MetaResource(new Variable("p"));
MetaResource q = new MetaResource(new Variable("q"));
DependencyTerm t1 = new DependencyTerm(a, b, c, d, e);
DependencyTerm t2 = new DependencyTerm(a, d, e, f, g);
MetaRDLTerm mt1 = new MetaDependencyTerm(x, p, q, v, w);
MetaRDLTerm mt2 = new MetaDependencyTerm(x, v, w, y, z);
Map<Variable, RDLTerm> binding = new HashMap<>();
Map<Variable, OrderVariableConstraint> orderConstraint = new HashMap<>();
Set<MatchConstraint> tmp = mt1.isMatchedBy(t1, new MatchConstraint(binding, orderConstraint));
assertTrue(! tmp.isEmpty());
tmp = mt2.isMatchedBy(t2, tmp);
assertTrue(! tmp.isEmpty());
}
@Test
void MatchTest3() {
DependencyTerm t1 = new DependencyTerm(a, b, c, d, e);
DependencyTerm t2 = new DependencyTerm(c, f, g);
MetaResource o = new MetaResource(new Variable("o"));
MetaResource p = new MetaResource(new Variable("p"));
MetaResource q = new MetaResource(new Variable("q"));
MetaResource r = new MetaResource(new Variable("r"));
MetaResource s = new MetaResource(new Variable("s"));
MetaResource t = new MetaResource(new Variable("t"));
MetaResource u = new MetaResource(new Variable("u"));
MetaRDLTerm mt1 = new MetaDependencyTerm(o, p, q, r, s);
MetaRDLTerm mt2 = new MetaDependencyTerm(s, t, u);
Set<MatchConstraint> tmp = mt1.isMatchedBy(t1);
assertTrue(! tmp.isEmpty());
tmp = mt2.isMatchedBy(t2, tmp);
assertTrue(! tmp.isEmpty());
}
}