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.Dependency;
import models.terms.RDLTerm;
import models.terms.Resource;
import models.terms.meta.MatchConstraint;
import models.terms.meta.MetaDependency;
import models.terms.meta.MetaDynamicDependency;
import models.terms.meta.MetaRDLTerm;
import models.terms.meta.MetaResource;
import models.terms.meta.MetaTermGenerator;
import utils.Utils;
public class MetaDynamicDependencyTest {
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("d", Utils.INT, 1);
Resource f = new Resource("d", Utils.INT, 1);
Resource g = new Resource("d", Utils.INT, 1);
@Test
void DynamicDependencyMatchTest() {
MetaDynamicDependency md1 = new MetaDynamicDependency((ci, cd, mi, md, context) -> new MetaResource(new Variable("x" + ci)));
Dependency d1 = new Dependency(a, b, c, d);
assertFalse(md1.isMatchedBy(d1).isEmpty());
Dependency d2 = new Dependency(new Dependency(a, b), c);
Dependency d3 = new Dependency(d2, d, e);
MetaDynamicDependency md2 = new MetaDynamicDependency(new MetaTermGenerator() {
@Override
public MetaRDLTerm generate(int curIndex, int curDepth, int maxIndex, int maxDepth, Map<Variable, Object> context) {
if (curDepth != maxDepth && curIndex == 0) {
return new MetaDynamicDependency(this);
}
return new MetaResource(new Variable("x" + curDepth + "_" + curIndex));
}
});
assertFalse(md2.isMatchedBy(d2).isEmpty());
assertFalse(md2.isMatchedBy(d3).isEmpty());
MetaResource x = new MetaResource(new Variable("x"));
MetaResource y = new MetaResource(new Variable("y"));
Dependency d4 = new Dependency(a, b);
MetaDynamicDependency md3 = new MetaDynamicDependency((ci, cd, mi, md, context) -> new MetaResource(new Variable("x" + ci)), x, y);
Set<MatchConstraint> constraint = new MetaDependency(x, y).isMatchedBy(d4);
Dependency d5 = new Dependency(a, b, c);
constraint = md3.isMatchedBy(d5, constraint);
assertFalse(constraint.isEmpty());
Map<Variable, RDLTerm> binding = new HashMap<>();
binding.put(new Variable("x"), a);
binding.put(new Variable("y"), b);
binding.put(new Variable("x2"), c);
assertEquals(constraint.iterator().next().getBinding(), binding);
}
}